Skip to content

Commit 3c85960

Browse files
committed
feat: improve serialize-javascript
1 parent fa181bf commit 3c85960

File tree

13 files changed

+231
-159
lines changed

13 files changed

+231
-159
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ es-legacy
44
umd
55
tslib
66
tses
7+
src/version.ts
8+
test/utils/version.ts
79
types-legacy/*/*.d.ts
810
node_modules
911
npm-debug.log

e2e/specs/version.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import playwright from '../../test/engines/playwright';
2+
import testVersion from '../../test/test-suites/version';
3+
4+
testVersion(playwright);

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,17 @@
115115
],
116116
"scripts": {
117117
"build": "run-p build:*",
118-
"build:es": "run-s task:build-es task:update-es-enum task:add-es-extensions task:add-umd-banner",
119-
"build:es-legacy": "cross-env LEGACY=1 run-s task:build-es-legacy task:update-es-legacy-enum task:add-umd-banner task:add-es-legacy-extensions",
120-
"build:lib": "run-s ts2lib task:copy-lib task:copy-dts task:types-legacy",
121-
"build:tses": "run-s ts2es task:add-tses-extensions",
118+
"build:es": "run-s gv task:build-es task:update-es-enum task:add-es-extensions task:add-umd-banner",
119+
"build:es-legacy": "cross-env LEGACY=1 run-s gv task:build-es-legacy task:update-es-legacy-enum task:add-umd-banner task:add-es-legacy-extensions",
120+
"build:lib": "run-s gv ts2lib task:copy-lib task:copy-dts task:types-legacy",
121+
"build:tses": "run-s gv ts2es task:add-tses-extensions",
122+
"clean": "shx rm -rf lib es es-legacy umd tses tslib types-legacy/pre-v5/*.d.ts",
122123
"e2e": "run-s task:bundle-e2e task:run-e2e",
123124
"e2e:debug": "run-s task:bundle-e2e task:run-e2e-debug",
124125
"e2e:ui": "run-s task:bundle-e2e task:run-e2e-ui",
125-
"prepare": "husky",
126+
"gv": "node scripts/generate-version.js",
127+
"init-husky": "husky",
128+
"prepare": "run-s gv init-husky",
126129
"prepare-legacy-node": "node ./scripts/prepare-legacy.js",
127130
"prepublishOnly": "run-s build test-all",
128131
"task:add-es-extensions": "tsx scripts/add-esm-extensions.ts es",
@@ -147,8 +150,8 @@
147150
"task:update-tses-enum": "tsx scripts/update-enum-ts.ts tses",
148151
"test": "npm run task:jest",
149152
"test-all": "run-s task:jest test-node-cjs test-node-esm e2e",
150-
"test-node-cjs": "run-s ts2lib task:jest-cjs",
151-
"test-node-esm": "run-s build:tses task:jest-esm",
153+
"test-node-cjs": "run-s build:lib ts2lib task:jest-cjs",
154+
"test-node-esm": "run-s build:es build:tses task:jest-esm",
152155
"ts2es": "tsc -p tsconfig.es.json",
153156
"ts2lib": "tsc -p tsconfig.lib.json"
154157
},

scripts/add-esm-extensions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function processDir(dir: string) {
2121
} else if (file.endsWith('.js')) {
2222
let content = readFileSync(fullPath, 'utf8');
2323
content = content.replace(/from\s+(['"])([./][^'"]+)['"]/g, (match, quote, importPath) => {
24-
if (!importPath.endsWith('.js')) {
24+
if (!importPath.endsWith('.js') && !importPath.endsWith('.json')) {
2525
return `from ${quote}${importPath}.js${quote}`;
2626
}
2727
return match;

scripts/generate-version.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const path = require('path');
2+
const fs = require('fs');
3+
4+
const root = path.resolve(__dirname, '..');
5+
6+
generate(path.join(root, 'src/version.ts'));
7+
generate(path.join(root, 'test/utils/version.ts'));
8+
9+
/** @param {string} outFile */
10+
function generate(outFile) {
11+
try {
12+
const pkgPath = path.join(root, 'package.json');
13+
const pkgRaw = fs.readFileSync(pkgPath, 'utf8');
14+
const pkg = JSON.parse(pkgRaw);
15+
const version = pkg.version;
16+
if (!version || typeof version !== 'string') {
17+
throw new Error('Missing version field in package.json');
18+
}
19+
20+
const content = `export const version = '${version}';\n`;
21+
22+
if (fs.existsSync(outFile)) {
23+
const existing = fs.readFileSync(outFile, 'utf8');
24+
if (existing !== content) {
25+
fs.writeFileSync(outFile, content, 'utf8');
26+
}
27+
} else {
28+
fs.writeFileSync(outFile, content, 'utf8');
29+
}
30+
} catch (err) {
31+
console.error('Error generating version.ts:', err);
32+
process.exitCode = 1;
33+
}
34+
}

scripts/make-e2e-bundle.ts

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { nodeResolve } from '@rollup/plugin-node-resolve';
2-
import { cpSync, readFileSync, writeFileSync } from 'fs';
32
import { rollup } from 'rollup';
43

54
async function build() {
@@ -26,60 +25,40 @@ async function build() {
2625
});
2726

2827
// Bundle serialize-javascript
29-
const serializePath = './e2e/fixtures/scripts/serialize-javascript.js';
30-
changeFormat('./tslib/test/utils/serialize-javascript.js', serializePath, 'SerializeJavascript');
3128
const serializeJavascript = await rollup({
32-
input: serializePath,
29+
input: 'tses/test/utils/serialize-javascript.js',
3330
plugins: [nodeResolve()],
3431
});
3532
await serializeJavascript.write({
3633
file: 'e2e/fixtures/scripts/serialize-javascript-bundle.js',
3734
format: 'iife',
35+
name: 'SerializeJavascript',
3836
});
3937

4038
// Bundle week-config
41-
const weekConfigPath = './e2e/fixtures/scripts/week-config.js';
42-
changeFormat('./tslib/test/data/week-config.js', weekConfigPath, 'WeekConfig', (content) => {
43-
return content.replace('require("../src")', 'window.EnumPlus');
44-
});
4539
const weekConfig = await rollup({
46-
input: weekConfigPath,
40+
input: 'tses/test/data/week-config.js',
4741
plugins: [nodeResolve()],
4842
});
4943
await weekConfig.write({
5044
file: 'e2e/fixtures/scripts/week-config-bundle.js',
5145
format: 'iife',
46+
name: 'WeekConfig',
5247
});
5348

5449
// Bundle week-data
55-
const weekDataPath = './e2e/fixtures/scripts/week-data.js';
56-
changeFormat('./tslib/test/data/week-data.js', weekDataPath, 'WeekData');
5750
const weekDataConfig = await rollup({
58-
input: weekDataPath,
51+
input: 'tses/test/data/week-data.js',
5952
plugins: [nodeResolve()],
6053
});
6154
await weekDataConfig.write({
6255
file: 'e2e/fixtures/scripts/week-data-bundle.js',
6356
format: 'iife',
57+
name: 'WeekData',
6458
});
6559
}
6660

6761
build().catch((e) => {
6862
console.error(e);
6963
process.exit(1);
7064
});
71-
72-
function changeFormat(src: string, dest: string, name: string, replacer?: (content: string) => string) {
73-
cpSync(src, dest, {
74-
force: true,
75-
});
76-
let content = readFileSync(dest, 'utf-8');
77-
content = `var exports = {};\n` + content;
78-
if (name) {
79-
content += `\n window.${name} = exports;`;
80-
}
81-
if (replacer) {
82-
content = replacer(content);
83-
}
84-
writeFileSync(dest, content);
85-
}

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type { ToListConfig, IEnumItems } from './enum-items';
1717
export type { EnumItemClass, EnumItemOptions } from './enum-item';
1818
export type { IEnum, EnumInterface, EnumInitOptions } from './enum';
1919

20+
export { version } from './version';
2021
export { KEYS, ITEMS, VALUES, LABELS, META, IS_ENUM_ITEM, IS_ENUM_ITEMS, IS_ENUM, defaultLocalize } from './utils';
2122
export type { PluginFunc } from './enum';
2223
export { Enum } from './enum';

test/engines/playwright.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ export class PlaywrightEngine extends TestEngineBase {
6464
SerializeJavascript,
6565
};
6666
// console.log('window', runtimeContext);
67-
const { stringify: serialize, parse: deserialize } = SerializeJavascript;
68-
const args = deserialize(contextStr) as { evaluateFn: (context: RuntimeContext) => Data };
67+
const { stringify, parse } = SerializeJavascript;
68+
const args = parse(contextStr) as { evaluateFn: (context: RuntimeContext) => Data };
6969
const { evaluateFn, ...rest } = args;
7070

7171
// Set the initial state to en-US before executing evaluation, equal to setup in jest.
@@ -77,7 +77,7 @@ export class PlaywrightEngine extends TestEngineBase {
7777
// console.log(evaluateResult);
7878

7979
// Serialize the evaluation result and pass it to assertion method
80-
const serializedStr = serialize({
80+
const serializedStr = stringify({
8181
_enumLocalize: EnumPlus.Enum.localize,
8282
_lang: WeekConfig.lang,
8383
...evaluateResult,

test/test-suites/enum-collection.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ const testEnumCollection = (engine: TestEngineBase) => {
3535
engine.expect(week.label(1)).toBe(week.items.label(1));
3636
engine.expect(week.key(1)).toBe(week.items.key(1));
3737
engine.expect(week.has(1)).toBe(week.items.has(1));
38-
console.log(week.findBy('key', 'Monday') === week.items.findBy('key', 'Monday'));
3938
engine.expect(week.findBy('key', 'Monday')).toBe(week.items.findBy('key', 'Monday'));
4039
engine.expect(week.findBy('value', 1)).toEqual(week.items.findBy('value', 1));
4140
engine.expect(week.findBy('label', 'weekday.monday')).toEqual(week.items.findBy('label', 'weekday.monday'));
@@ -70,7 +69,7 @@ const testEnumCollection = (engine: TestEngineBase) => {
7069

7170
const strangerEnumConfig = {
7271
...strangeEnumConfig,
73-
items: { value: 101, label: 'bar' },
72+
items: { value: 100, label: 'bar' },
7473
} as const;
7574
const strangerEnum = Enum(strangerEnumConfig);
7675
return {
@@ -132,7 +131,7 @@ const testEnumCollection = (engine: TestEngineBase) => {
132131
});
133132
engine.expect(strangeEnum.items.toValueMap()).toEqual(map);
134133

135-
engine.expect(strangerEnum.items).toBe(101);
134+
engine.expect(strangerEnum.items).toBe(100);
136135
const standardEnumItems = Object.keys(strangerEnumConfig).map((key) => ({
137136
key,
138137
value: strangerEnumConfig[key as keyof typeof strangerEnumConfig].value,

0 commit comments

Comments
 (0)