-
Notifications
You must be signed in to change notification settings - Fork 18
/
indexWriter.js
126 lines (116 loc) · 3.69 KB
/
indexWriter.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const os = require('os');
const path = require('path');
const fs = require('fs');
const fileExclusions = [
'.js',
'.less',
'.md',
'.png',
'.jpg',
'.json',
'.xml',
'webpack.config.js',
'jest.config.js',
'.yarnignore',
'NOTICE',
'LICENSE',
'.d.ts',
'.DS_Store',
'.html'
];
const directoryExclusions = [
'tests',
'typings',
'dist',
'.dist',
'node_modules',
'css'
];
// At some point a few of these can be auto indexed
const packagesExclusions = [
'esp-js-di',
'esp-js-polimer',
'esp-js-react',
'esp-js-ui-rxcompat',
'esp-js-api',
'esp-js-di-api',
'esp-js-react-agile-board',
];
const logger = (message) => {
console.log(`IndexWriter: ${message}`);
};
const fileSorter = (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
const tryRecursivelyWriteIndexFiles = function (directory) {
if (directoryExclusions.includes(path.basename(directory))) {
return;
}
let files = fs.readdirSync(directory).sort(fileSorter);
let directoryExports = '';
let sideEffectImport = '';
let fileExports = '';
let newLine = os.platform() === 'win32' ? '\r\n' : '\n';
files.forEach(function (file) {
let directory1 = directory + '/' + file;
if (fs.statSync(directory1).isDirectory()) {
if (tryRecursivelyWriteIndexFiles(directory1)) {
if (file.includes('.global')) {
sideEffectImport += `import './${file}'; // directory${newLine}`;
} else {
directoryExports += `export * from './${file}';${newLine}`;
}
}
}
else {
const baseName = path.basename(file);
let excludeFile = baseName === 'index.ts' || fileExclusions.some(exclusion => {
return baseName.toLowerCase().endsWith(exclusion.toLowerCase());
});
if (!excludeFile) {
if (file.includes('.global')) {
sideEffectImport += `import './${path.parse(file).name}';${newLine}`;
} else {
fileExports += `export * from './${path.parse(file).name}';${newLine}`;
}
}
}
});
let finalOutput = ``;
if (directoryExports) {
finalOutput += directoryExports;
}
if (sideEffectImport) {
finalOutput += sideEffectImport;
}
if (fileExports) {
finalOutput += fileExports;
}
if (finalOutput === '') {
finalOutput = 'export { };';
}
let blurb = `// Auto-generated ${newLine}`;
let indexFile = `${directory}/index.ts`;
finalOutput = `${blurb}${finalOutput}`;
fs.writeFileSync(indexFile, finalOutput);
return true;
};
const writeAllIndexFiles = (packagesDirectory) => {
let directories = fs.readdirSync(packagesDirectory).sort(fileSorter);
directories.forEach(function (directory) {
let fullDirectoryPath = `${packagesDirectory}/${directory}`;
if (!fs.statSync(fullDirectoryPath).isDirectory()) {
return;
}
if (packagesExclusions.includes(path.basename(directory))) {
return;
}
let fullSrcDirectoryPath = `${packagesDirectory}/${directory}/src`;
if (!fs.statSync(fullSrcDirectoryPath).isDirectory()) {
return;
}
// we jump in one extra level and only write index files for anything under a package-name/src directory
logger(`Writing all index files under directory ${fullSrcDirectoryPath}`);
tryRecursivelyWriteIndexFiles(fullSrcDirectoryPath, true);
});
};
writeAllIndexFiles(path.join(__dirname, 'examples'));
writeAllIndexFiles(path.join(__dirname, 'packages'));