Skip to content

Commit 600937c

Browse files
authored
fix: do not transform esX for rspack.target field (#237)
1 parent 2aa68a5 commit 600937c

File tree

6 files changed

+112
-14
lines changed

6 files changed

+112
-14
lines changed

e2e/cases/shims/esm/rslib.config.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,23 @@ import { generateBundleEsmConfig } from '@e2e/helper';
22
import { defineConfig } from '@rslib/core';
33

44
export default defineConfig({
5-
lib: [generateBundleEsmConfig()],
5+
lib: [
6+
generateBundleEsmConfig({
7+
output: {
8+
distPath: {
9+
root: './dist/normal',
10+
},
11+
},
12+
}),
13+
generateBundleEsmConfig({
14+
syntax: 'esnext',
15+
output: {
16+
distPath: {
17+
root: './dist/with-syntax',
18+
},
19+
},
20+
}),
21+
],
622
output: {
723
target: 'node',
824
},

e2e/cases/shims/index.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ import { describe, expect, test } from 'vitest';
55
test('shims for __dirname and __filename in ESM', async () => {
66
const fixturePath = join(__dirname, 'esm');
77
const { entries } = await buildAndGetResults(fixturePath);
8+
89
for (const shim of [
910
'import { fileURLToPath as __webpack_fileURLToPath__ } from "url";',
1011
'var src_dirname = __webpack_dirname__(__webpack_fileURLToPath__(import.meta.url));',
1112
'var src_filename = __webpack_fileURLToPath__(import.meta.url);',
1213
// import.meta.url should not be substituted
1314
'const importMetaUrl = import.meta.url;',
1415
]) {
15-
expect(entries.esm).toContain(shim);
16+
expect(entries.esm0).toContain(shim);
1617
}
18+
expect(entries.esm0).toBe(entries.esm1);
1719
});
1820

1921
describe('shims for `import.meta.url` in CJS', () => {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"test:e2e": "cd e2e && pnpm run test",
2323
"test:unit": "vitest run --project unit*",
2424
"test:unit:watch": "vitest --project unit*",
25+
"testu": "pnpm run test:unit -u && pnpm run test:artifact -u",
2526
"update:rsbuild": "npx taze minor --include /rsbuild/ -w -r -l",
2627
"watch": "pnpm build --watch"
2728
},

packages/core/src/config.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { logger } from './utils/logger';
4646
import {
4747
ESX_TO_BROWSERSLIST,
4848
transformSyntaxToBrowserslist,
49+
transformSyntaxToRspackTarget,
4950
} from './utils/syntax';
5051
import { loadTsconfig } from './utils/tsconfig';
5152

@@ -578,19 +579,15 @@ const composeSyntaxConfig = (
578579
target?: RsbuildConfigOutputTarget,
579580
): RsbuildConfig => {
580581
// Defaults to ESNext, Rslib will assume all of the latest JavaScript and CSS features are supported.
581-
582582
if (syntax) {
583-
const resolvedBrowserslist = transformSyntaxToBrowserslist(syntax, target);
584583
return {
585584
tools: {
586585
rspack: (config) => {
587-
config.target = resolvedBrowserslist.map(
588-
(item) => `browserslist:${item}` as const,
589-
);
586+
config.target = transformSyntaxToRspackTarget(syntax);
590587
},
591588
},
592589
output: {
593-
overrideBrowserslist: resolvedBrowserslist,
590+
overrideBrowserslist: transformSyntaxToBrowserslist(syntax, target),
594591
},
595592
};
596593
}

packages/core/src/utils/syntax.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { RsbuildConfig } from '@rsbuild/core';
1+
import type { RsbuildConfig, Rspack } from '@rsbuild/core';
22
import type {
33
EcmaScriptVersion,
44
FixedEcmaVersions,
@@ -37,6 +37,12 @@ const calcEsnextBrowserslistByTarget = (target: RsbuildConfigOutputTarget) => {
3737
return LATEST_TARGET_VERSIONS.web;
3838
};
3939

40+
const RSPACK_TARGET_UNLISTED_MODERN_ECMA_VERSIONS: EcmaScriptVersion[] = [
41+
'es2023',
42+
'es2024',
43+
'esnext',
44+
] satisfies EcmaScriptVersion[];
45+
4046
/**
4147
* The esX to browserslist mapping is transformed from esbuild:
4248
* https://github.com/evanw/esbuild/blob/main/internal/compat/js_table.go
@@ -158,6 +164,40 @@ export const ESX_TO_BROWSERSLIST: Record<
158164
},
159165
} as const;
160166

167+
export function transformSyntaxToRspackTarget(
168+
syntax: Syntax,
169+
): Rspack.Configuration['target'] {
170+
const handleSyntaxItem = (syntaxItem: EcmaScriptVersion | string): string => {
171+
const normalizedSyntaxItem = syntaxItem.toLowerCase();
172+
173+
if (normalizedSyntaxItem.startsWith('es')) {
174+
if (normalizedSyntaxItem in ESX_TO_BROWSERSLIST) {
175+
// The latest EcmaScript version supported by Rspack's `target` is es2022.
176+
// Higher versions are treated as es2022.
177+
if (
178+
RSPACK_TARGET_UNLISTED_MODERN_ECMA_VERSIONS.includes(
179+
normalizedSyntaxItem as EcmaScriptVersion,
180+
)
181+
) {
182+
return 'es2022';
183+
}
184+
185+
return normalizedSyntaxItem;
186+
}
187+
188+
throw new Error(`Unsupported ES version: ${syntaxItem}`);
189+
}
190+
191+
return `browserslist:${syntaxItem}`;
192+
};
193+
194+
if (Array.isArray(syntax)) {
195+
return syntax.map(handleSyntaxItem) as Rspack.Configuration['target'];
196+
}
197+
198+
return [handleSyntaxItem(syntax)] as Rspack.Configuration['target'];
199+
}
200+
161201
export function transformSyntaxToBrowserslist(
162202
syntax: Syntax,
163203
target?: NonNullable<RsbuildConfig['output']>['target'],
@@ -166,6 +206,7 @@ export function transformSyntaxToBrowserslist(
166206
syntaxItem: EcmaScriptVersion | string,
167207
): string[] => {
168208
const normalizedSyntaxItem = syntaxItem.toLowerCase();
209+
169210
if (normalizedSyntaxItem.startsWith('es')) {
170211
if (normalizedSyntaxItem in ESX_TO_BROWSERSLIST) {
171212
const browserslistItem =

packages/core/tests/syntax.test.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { describe, expect, test } from 'vitest';
2-
import { transformSyntaxToBrowserslist } from '../src/utils/syntax';
2+
import {
3+
transformSyntaxToBrowserslist,
4+
transformSyntaxToRspackTarget,
5+
} from '../src/utils/syntax';
36

4-
describe('Correctly resolve syntax', () => {
5-
test('esX', async () => {
7+
describe('transformSyntaxToBrowserslist', () => {
8+
test('esX', () => {
69
expect(transformSyntaxToBrowserslist('es6')).toMatchInlineSnapshot(`
710
[
811
"Chrome >= 63.0.0",
@@ -56,7 +59,7 @@ describe('Correctly resolve syntax', () => {
5659
);
5760
});
5861

59-
test('browserslist', async () => {
62+
test('browserslist', () => {
6063
expect(
6164
transformSyntaxToBrowserslist(['fully supports es6-module']),
6265
).toMatchInlineSnapshot(`
@@ -75,7 +78,7 @@ describe('Correctly resolve syntax', () => {
7578
`);
7679
});
7780

78-
test('combined', async () => {
81+
test('combined', () => {
7982
expect(
8083
transformSyntaxToBrowserslist(['Chrome 123', 'es5']),
8184
).toMatchInlineSnapshot(`
@@ -97,3 +100,41 @@ describe('Correctly resolve syntax', () => {
97100
);
98101
});
99102
});
103+
104+
describe('transformSyntaxToRspackTarget', () => {
105+
test('esX', () => {
106+
const es2023 = transformSyntaxToRspackTarget('es2023');
107+
const es2024 = transformSyntaxToRspackTarget('es2024');
108+
const esnext = transformSyntaxToRspackTarget('esnext');
109+
110+
expect(es2023).toEqual(es2024);
111+
expect(es2023).toEqual(esnext);
112+
113+
expect(es2023).toMatchInlineSnapshot(
114+
`
115+
[
116+
"es2022",
117+
]
118+
`,
119+
);
120+
121+
expect(transformSyntaxToRspackTarget('es2015')).toMatchInlineSnapshot(
122+
`
123+
[
124+
"es2015",
125+
]
126+
`,
127+
);
128+
});
129+
130+
test('combined', () => {
131+
expect(
132+
transformSyntaxToRspackTarget(['Chrome 123', 'es2023']),
133+
).toMatchInlineSnapshot(`
134+
[
135+
"browserslist:Chrome 123",
136+
"es2022",
137+
]
138+
`);
139+
});
140+
});

0 commit comments

Comments
 (0)