forked from stackblitz/alien-signals
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.js
More file actions
75 lines (68 loc) · 2.11 KB
/
build.js
File metadata and controls
75 lines (68 loc) · 2.11 KB
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
const path = require('path');
const ts = require('typescript');
const config = ts.getParsedCommandLineOfConfigFile(
path.join(__dirname, 'tsconfig.json'),
undefined,
{
...ts.sys,
onUnRecoverableConfigFileDiagnostic: () => { },
}
);
if (config === undefined) {
console.error('Failed to parse tsconfig.json');
process.exit(1);
}
const typesProgram = ts.createProgram({
rootNames: config.fileNames,
configFileParsingDiagnostics: config.errors,
options: {
...config.options,
outDir: 'types',
declaration: true,
emitDeclarationOnly: true,
},
});
const cjsProgram = ts.createProgram({
rootNames: config.fileNames,
configFileParsingDiagnostics: config.errors,
options: {
...config.options,
outDir: 'cjs',
removeComments: true,
module: ts.ModuleKind.CommonJS,
},
});
const esmProgram = ts.createProgram({
rootNames: config.fileNames,
configFileParsingDiagnostics: config.errors,
options: {
...config.options,
outDir: 'esm',
removeComments: true,
module: ts.ModuleKind.ESNext,
},
});
const iifeRe = /(export\s*)?var\s+([A-Za-z_$][\w$]*)\s*;\s*\(\s*function\s*\(\s*\2\s*\)\s*\{\s*([\s\S]*?)\s*\}\s*\)\s*\(\s*\2\s*\|\|\s*\(\s*(?:exports\.\2\s*=\s*)?\2\s*=\s*\{\}\s*\)\s*\)\s*;?/g;
const entryRe = /\[\s*(['"])([^'"]+)\1\s*\]\s*=\s*([^\]]+?)\s*\]/g;
function transformEnumsToConst(js) {
return js.replace(iifeRe, (whole, esmExport, name, body) => {
const props = Array.from(body.matchAll(entryRe), ([, , k, v]) => ` ${k}: ${v},`)
if (!props.length)
return whole;
const left = esmExport ? `export const ${name}` : `exports.${name}`;
return `${left} = {\n${props.join("\n")}\n};`;
});
}
typesProgram.emit(undefined, ts.sys.writeFile);
cjsProgram.emit(undefined, (fileName, text) => {
fileName = fileName.slice(0, -'.js'.length) + '.cjs';
text = text.replace(/\.\/system\.js/g, './system.cjs');
text = transformEnumsToConst(text);
ts.sys.writeFile(fileName, text);
});
esmProgram.emit(undefined, (fileName, text) => {
fileName = fileName.slice(0, -'.js'.length) + '.mjs';
text = text.replace(/\.\/system\.js/g, './system.mjs');
text = transformEnumsToConst(text);
ts.sys.writeFile(fileName, text);
});