forked from homeday-de/homeday-blocks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.js
153 lines (137 loc) · 4.69 KB
/
build.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* eslint-disable */
const _camelCase = require('lodash/camelCase');
const _startCase = require('lodash/startCase');
const pLimit = require('p-limit');
const path = require('path');
const fs = require('fs');
const os = require('os');
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const basePath = './src/';
const componentsPath = `${basePath}components/`;
const servicesPath = `${basePath}services/`;
const outputDirectory = 'dist';
const numberOfCpuCores = os.cpus().length;
const blackListedFiles = [
'tooltipDirective.js',
'formFieldMixin.js',
'FieldBase.vue',
'TextFieldBase.vue',
'HdCheckboxIndicator.vue',
'HdRadioIndicator.vue',
'HdTileSelectItem.vue',
'HdTileSelectEditableItem.vue',
];
(async () => {
console.time('Execution time');
console.log('🚧 Building homeday-blocks...');
cleanUpOutputDirectory();
const components = findFilesByExtension(componentsPath, 'vue');
const componentTypes = findFilesByExtension(componentsPath, 'js')
.concat(findFilesByExtension(componentsPath, 'ts'));
const services = findFilesByExtension(servicesPath, 'js')
.concat(findFilesByExtension(servicesPath, 'ts'));;
const filesToBeCompiled = omitBlackListedFiles(components.concat(componentTypes, services));
const buildResult = await build(filesToBeCompiled);
const filesCompiledSuccessfully = [];
const filesFailedToCompile = [];
buildResult.forEach((result, index) => {
if (result.stdout.includes('Compiled')) {
filesCompiledSuccessfully.push(filesToBeCompiled[index]);
} else if (result.stderr) {
filesFailedToCompile.push(filesToBeCompiled[index]);
}
});
createIndexFile(filesCompiledSuccessfully);
console.log(`✅ ${filesCompiledSuccessfully.length} files compiled successfully.`);
if (filesFailedToCompile.length) console.log(`🚨 ${filesFailedToCompile.length} files did not compile successfully.`, filesFailedToCompile);
console.timeEnd('Execution time');
})();
/**
* Finds files in a path by extension
* @param {string} base
* @param {string} extension
* @param {string[]} [files]
* @param {string[]} [result]
* @returns {string[]}
*/
function findFilesByExtension(base, extension, files, result) {
files = files || fs.readdirSync(base);
result = result || [];
files.forEach(
(file) => {
const newBase = path.join(base, file);
if (fs.statSync(newBase).isDirectory()) {
result = findFilesByExtension(newBase, extension, fs.readdirSync(newBase), result);
} else if (path.parse(file).ext === `.${extension}`) {
result.push(newBase);
}
},
);
return result;
}
/**
* Builds the list of files using Vue-CLI
* @param {string[]} filePaths
* @returns {string[]}
*/
function build(filePaths) {
if (filePaths?.length) {
const limit = pLimit(numberOfCpuCores);
const commands = filePaths.map((filePath) => `npx vue-cli-service build --no-clean --target lib --formats umd-min --name ${getFileName(filePath)} ${filePath}`);
const buildPromises = commands.map((command) => limit(() => exec(command)));
return Promise.all(buildPromises);
}
return [];
}
/**
* Create the library index file (main.js) from the list of file paths
* @param {string[]} filePaths
*/
function createIndexFile(filePaths) {
const indexFileHeader = '// Auto-generated by the build script\n/* eslint-disable */\n';
const indexFileContent = filePaths.map((filePath) => {
const fileName = getFileName(filePath);
return `export { default as ${fileName} } from 'homeday-blocks/${outputDirectory}/${fileName}.umd.min';`;
}).join('\n');
try {
fs.writeFileSync(`${__dirname}//../main.js`, indexFileHeader.concat(indexFileContent));
} catch (error) {
console.error(error);
}
}
/**
* Returns a list of file paths that are not blacklisted
* @param {string[]} filePaths
* @returns {string[]}
*/
function omitBlackListedFiles(filePaths) {
if (filePaths?.length) {
return filePaths.filter( ( filePath ) => !blackListedFiles.includes( path.parse(filePath).base ) );
}
return [];
}
/**
* Converts a string case to PascalCase
* @param {string} string
* @returns {string}
*/
function pascalCase(string){
return _startCase(_camelCase(string)).replace(/ /g, '');
}
/**
* Returns the file name in PascalCase from the file path, services are suffixed with 'Service'
* @param {string} filePath
* @returns {string}
*/
function getFileName(filePath) {
let fileName = path.parse(filePath).name;
if (filePath.includes('services')) fileName += 'Service';
return pascalCase(fileName);
}
/**
* Removes the output directory (dist) if already exists
*/
function cleanUpOutputDirectory() {
fs.rmSync(`${__dirname}/../${outputDirectory}`, {force: true, recursive: true});
}