-
Notifications
You must be signed in to change notification settings - Fork 4
/
manifest.js
110 lines (97 loc) · 3.68 KB
/
manifest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const lineReaderComponent = require('readline');
const baseExamplesPath = path.join(__dirname, 'Examples');
const manifestPath = path.join(__dirname, 'index.json');
/***
* Reads the first two lines of a FSH file, returning the name and description properties
*/
async function getMetadata(filePath, fileName) {
let metaData = {name: fileName.replace('.fsh', '')};
let lineReader = lineReaderComponent.createInterface({
input: fs.createReadStream(filePath)
});
const parseLines = async () => {
for await (const line of lineReader) {
if (line.includes('@Name:')) {
const splitLine = line.split('@Name:');
metaData.name = splitLine[1].trim();
} else if (line.includes('@Description')) {
const splitLine = line.split('@Description:');
metaData.description = splitLine[1].trim();
}
if (Object.keys(metaData).length == 2) return;
}
}
await parseLines();
return metaData;
}
/***
* Returns an array of manifest objects when provided a directory's filepath
*/
async function getChildren(relativeDir = '') {
let workingArray = [];
// First we'll take in all files in the provided directory
const files = fs.readdirSync(path.join(baseExamplesPath, relativeDir)).sort();
for (const file of files) {
const relativeFilePath = path.join(relativeDir, file);
const fullFilePath = path.join(baseExamplesPath, relativeFilePath); // We're appending the child file name to the base directory name
let fileStats = fs.statSync(fullFilePath); // This contains directory information
if (file.endsWith('fsh')) {
const metaData = await getMetadata(fullFilePath, file);
workingArray.push({
path: encodeURI(relativeFilePath.split(path.sep).join('/')),
...metaData,
type: 'file'
});
} else if (fileStats.isDirectory()) {
const children = await getChildren(relativeFilePath);
if (children.length) {
workingArray.push({
name: file,
path: encodeURI(relativeFilePath.split(path.sep).join('/')),
type: 'category',
children
});
}
}
}
return workingArray;
}
async function generateManifest() {
let oldManifest;
if (fs.existsSync(manifestPath)) {
oldManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
} else {
oldManifest = { timestamp: 'n/a', children: [] };
}
console.log('Old Manifest:');
console.log('=============')
console.log(`${'Timestamp:'.padEnd(15)} ${oldManifest.timestamp}`);
oldManifest.children?.forEach(c => {
console.log(`${(c.name + ':').padEnd(15)} ${c.children?.length ?? 0} entries`)
});
console.log();
const examplesArr = await getChildren();
let newManifest = { timestamp: moment(Date.now()).format(), children: examplesArr };
console.log('New Manifest:');
console.log('=============')
console.log(`${'Timestamp:'.padEnd(15)} ${newManifest.timestamp}`);
newManifest.children?.forEach(c => {
const oldCount = oldManifest.children?.find(oc => oc.name === c.name)?.children?.length ?? 0;
const newCount = c.children?.length ?? 0;
const delta = newCount - oldCount;
const extra = delta !== 0 ? ` (${delta > 0 ? '+': ''}${delta})` : '';
console.log(`${(c.name + ':').padEnd(15)} ${newCount} entries${extra}`);
});
oldManifest.children?.forEach(c => {
if (!newManifest.children.some(nc => nc.name == c.name)) {
const oldCount = c.children?.length ?? 0;
console.log(`${(c.name + ':').padEnd(15)} 0 entries (-${oldCount})`);
}
});
console.log();
fs.writeFileSync(manifestPath, JSON.stringify(newManifest, null, '\t'), 'utf-8');
}
generateManifest();