Skip to content

Commit 4407e8c

Browse files
authored
refactor(build): transform enums to const instead of hardcode (#89)
1 parent 13f7542 commit 4407e8c

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

build.js

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,6 @@ const typesProgram = ts.createProgram({
2525
},
2626
});
2727

28-
const readFile = ts.sys.readFile;
29-
ts.sys.readFile = (fileName) => {
30-
if (path.basename(fileName) === 'system.ts') {
31-
return `export const ReactiveFlags2 = {
32-
None: 0,
33-
Mutable: 1,
34-
Watching: 2,
35-
RecursedCheck: 4,
36-
Recursed: 8,
37-
Dirty: 16,
38-
Pending: 32,
39-
};\n` + readFile(fileName);
40-
}
41-
return readFile(fileName);
42-
}
43-
4428
const cjsProgram = ts.createProgram({
4529
rootNames: config.fileNames,
4630
configFileParsingDiagnostics: config.errors,
@@ -62,16 +46,30 @@ const esmProgram = ts.createProgram({
6246
},
6347
});
6448

49+
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;
50+
const entryRe = /\[\s*(['"])([^'"]+)\1\s*\]\s*=\s*([^\]]+?)\s*\]/g;
51+
52+
function transformEnumsToConst(js) {
53+
return js.replace(iifeRe, (whole, esmExport, name, body) => {
54+
const props = Array.from(body.matchAll(entryRe), ([, , k, v]) => ` ${k}: ${v},`)
55+
if (!props.length)
56+
return whole;
57+
58+
const left = esmExport ? `export const ${name}` : `exports.${name}`;
59+
return `${left} = {\n${props.join("\n")}\n};`;
60+
});
61+
}
62+
6563
typesProgram.emit(undefined, ts.sys.writeFile);
6664
cjsProgram.emit(undefined, (fileName, text) => {
6765
fileName = fileName.slice(0, -'.js'.length) + '.cjs';
6866
text = text.replace(/\.\/system\.js/g, './system.cjs');
69-
text = text.replace(/ReactiveFlags2/g, 'ReactiveFlags');
67+
text = transformEnumsToConst(text);
7068
ts.sys.writeFile(fileName, text);
7169
});
7270
esmProgram.emit(undefined, (fileName, text) => {
7371
fileName = fileName.slice(0, -'.js'.length) + '.mjs';
7472
text = text.replace(/\.\/system\.js/g, './system.mjs');
75-
text = text.replace(/ReactiveFlags2/g, 'ReactiveFlags');
73+
text = transformEnumsToConst(text);
7674
ts.sys.writeFile(fileName, text);
7775
});

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"skipLibCheck": true,
88
"rootDir": "src",
99
"isolatedModules": false,
10+
"preserveConstEnums": true,
1011
},
1112
"include": [ "src" ],
1213
}

0 commit comments

Comments
 (0)