Skip to content

Commit eb47e13

Browse files
authored
fix: align esX browserslist expression to SWC (#1287)
1 parent 83c20a4 commit eb47e13

File tree

5 files changed

+102
-118
lines changed

5 files changed

+102
-118
lines changed

packages/core/src/utils/syntax.ts

Lines changed: 59 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -50,94 +50,83 @@ export const ESX_TO_BROWSERSLIST: Record<
5050
Record<LatestEcmaVersions, (target: RsbuildConfigOutputTarget) => string[]> =
5151
{
5252
es5: {
53-
chrome: '5.0.0',
54-
edge: '12.0.0',
55-
firefox: '2.0.0',
56-
ie: '9.0.0',
57-
ios: '6.0.0',
58-
node: '0.4.0',
59-
opera: '10.10.0',
60-
safari: '3.1.0',
53+
chrome: '13',
54+
edge: '12',
55+
firefox: '2',
56+
ios: '6',
57+
node: '0.6',
58+
safari: '5.1',
6159
},
62-
es6: {
63-
chrome: '51.0.0',
64-
edge: '15.0.0',
65-
firefox: '54.0.0',
66-
safari: '10.0.0',
67-
opera: '38.0.0',
68-
samsung: '5.0.0',
60+
get es6() {
61+
return ESX_TO_BROWSERSLIST.es2015;
6962
},
7063
es2015: {
71-
chrome: '51.0.0',
72-
edge: '15.0.0',
73-
firefox: '54.0.0',
74-
safari: '10.0.0',
75-
opera: '38.0.0',
76-
samsung: '5.0.0',
64+
chrome: '51',
65+
edge: '79',
66+
firefox: '53',
67+
ios: '16.3',
68+
node: '6.5',
69+
safari: '16.3',
7770
},
7871
es2016: {
79-
chrome: '52.0.0',
80-
edge: '15.0.0',
81-
firefox: '54.0.0',
82-
safari: '10.3.0',
83-
opera: '39.0.0',
84-
samsung: '6.2.0',
72+
chrome: '52',
73+
edge: '79',
74+
firefox: '53',
75+
ios: '16.3',
76+
node: '7',
77+
safari: '16.3',
8578
},
8679
es2017: {
87-
chrome: '57.0.0',
88-
edge: '15.0.0',
89-
firefox: '54.0.0',
90-
safari: '11.0.0',
91-
opera: '44.0.0',
92-
samsung: '6.2.0',
80+
chrome: '55',
81+
edge: '79',
82+
firefox: '53',
83+
ios: '16.3',
84+
node: '7.6',
85+
safari: '16.3',
9386
},
9487
es2018: {
95-
chrome: '64.0.0',
96-
edge: '79.0.0',
97-
firefox: '78.0.0',
98-
safari: '16.4.0',
99-
opera: '51.0.0',
100-
samsung: '8.2.0',
88+
chrome: '64',
89+
edge: '79',
90+
firefox: '78',
91+
ios: '16.3',
92+
node: '10',
93+
safari: '16.3',
10194
},
10295
es2019: {
103-
chrome: '73.0.0',
104-
edge: '79.0.0',
105-
firefox: '78.0.0',
106-
safari: '17.0.0',
107-
opera: '60.0.0',
108-
samsung: '11.1.0',
96+
chrome: '66',
97+
edge: '79',
98+
firefox: '78',
99+
ios: '16.3',
100+
node: '10',
101+
safari: '16.3',
109102
},
110103
es2020: {
111-
chrome: '80.0.0',
112-
edge: '80.0.0',
113-
firefox: '80.0.0',
114-
safari: '17.0.0',
115-
opera: '67.0.0',
116-
samsung: '13.0.0',
104+
chrome: '91',
105+
edge: '91',
106+
firefox: '80',
107+
ios: '16.3',
108+
node: '16.9',
109+
safari: '16.3',
117110
},
118111
es2021: {
119-
chrome: '85.0.0',
120-
edge: '85.0.0',
121-
firefox: '80.0.0',
122-
safari: '17.0.0',
123-
opera: '71.0.0',
124-
samsung: '14.0.0',
112+
chrome: '91',
113+
edge: '91',
114+
firefox: '80',
115+
ios: '16.3',
116+
node: '16.9',
117+
safari: '16.3',
125118
},
126119
es2022: {
127-
chrome: '94.0.0',
128-
edge: '94.0.0',
129-
firefox: '93.0.0',
130-
safari: '17.0.0',
131-
opera: '80.0.0',
132-
samsung: '17.0.0',
120+
chrome: '94',
121+
edge: '94',
122+
firefox: '93',
123+
ios: '16.4',
124+
node: '16.11',
125+
safari: '16.4',
133126
},
134-
es2023: {
135-
chrome: '110.0.0',
136-
edge: '110.0.0',
137-
firefox: '115.0.0',
138-
safari: '17.0.0',
139-
opera: '96.0.0',
140-
samsung: '21.0.0',
127+
// ES2023 did not introduce new ECMA syntax, so map it to ES2022.
128+
get es2023() {
129+
return ESX_TO_BROWSERSLIST.es2022;
141130
},
142131
es2024: calcEsnextBrowserslistByTarget,
143132
esnext: calcEsnextBrowserslistByTarget,

packages/core/tests/config.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -419,12 +419,12 @@ describe('syntax', () => {
419419
composedRsbuildConfig[0]!.config.output?.overrideBrowserslist,
420420
).toMatchInlineSnapshot(`
421421
[
422-
"chrome >= 51.0.0",
423-
"edge >= 15.0.0",
424-
"firefox >= 54.0.0",
425-
"safari >= 10.0.0",
426-
"opera >= 38.0.0",
427-
"samsung >= 5.0.0",
422+
"chrome >= 51",
423+
"edge >= 79",
424+
"firefox >= 53",
425+
"ios >= 16.3",
426+
"node >= 6.5",
427+
"safari >= 16.3",
428428
]
429429
`);
430430
});

packages/core/tests/syntax.test.ts

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,21 @@ import {
77
} from '../src/utils/syntax';
88

99
const compareSemver = (a: string, b: string) => {
10-
const [aMajor, aMinor, aPatch] = a.split('.').map(Number) as [
11-
number,
12-
number,
13-
number,
14-
];
15-
const [bMajor, bMinor, bPatch] = b.split('.').map(Number) as [
16-
number,
17-
number,
18-
number,
19-
];
20-
21-
if (aMajor !== bMajor) {
22-
return aMajor - bMajor;
23-
}
24-
if (aMinor !== bMinor) {
25-
return aMinor - bMinor;
26-
}
10+
const extract = (v: string) => {
11+
const parts = String(v)
12+
.split('.')
13+
.map((p) => {
14+
return Number(p);
15+
});
16+
while (parts.length < 3) parts.push(0);
17+
return parts.slice(0, 3) as [number, number, number];
18+
};
19+
20+
const [aMajor, aMinor, aPatch] = extract(a);
21+
const [bMajor, bMinor, bPatch] = extract(b);
22+
23+
if (aMajor !== bMajor) return aMajor - bMajor;
24+
if (aMinor !== bMinor) return aMinor - bMinor;
2725
return aPatch - bPatch;
2826
};
2927

@@ -74,25 +72,25 @@ describe('transformSyntaxToBrowserslist', () => {
7472
transformSyntaxToBrowserslist('es2015', 'web'),
7573
).toMatchInlineSnapshot(`
7674
[
77-
"chrome >= 51.0.0",
78-
"edge >= 15.0.0",
79-
"firefox >= 54.0.0",
80-
"safari >= 10.0.0",
81-
"opera >= 38.0.0",
82-
"samsung >= 5.0.0",
75+
"chrome >= 51",
76+
"edge >= 79",
77+
"firefox >= 53",
78+
"ios >= 16.3",
79+
"node >= 6.5",
80+
"safari >= 16.3",
8381
]
8482
`);
8583

8684
expect(
8785
transformSyntaxToBrowserslist('es2018', 'web'),
8886
).toMatchInlineSnapshot(`
8987
[
90-
"chrome >= 64.0.0",
91-
"edge >= 79.0.0",
92-
"firefox >= 78.0.0",
93-
"safari >= 16.4.0",
94-
"opera >= 51.0.0",
95-
"samsung >= 8.2.0",
88+
"chrome >= 64",
89+
"edge >= 79",
90+
"firefox >= 78",
91+
"ios >= 16.3",
92+
"node >= 10",
93+
"safari >= 16.3",
9694
]
9795
`);
9896

@@ -147,14 +145,12 @@ describe('transformSyntaxToBrowserslist', () => {
147145
).toMatchInlineSnapshot(`
148146
[
149147
"Chrome 123",
150-
"chrome >= 5.0.0",
151-
"edge >= 12.0.0",
152-
"firefox >= 2.0.0",
153-
"ie >= 9.0.0",
154-
"ios >= 6.0.0",
155-
"node >= 0.4.0",
156-
"opera >= 10.10.0",
157-
"safari >= 3.1.0",
148+
"chrome >= 13",
149+
"edge >= 12",
150+
"firefox >= 2",
151+
"ios >= 6",
152+
"node >= 0.6",
153+
"safari >= 5.1",
158154
]
159155
`);
160156

tests/integration/cli/build/build.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('build command', async () => {
153153
const files = await globContentJSON(path.join(fixturePath, 'dist'));
154154
expect(files).toMatchInlineSnapshot(`
155155
{
156-
"<ROOT>/tests/integration/cli/build/no-config/dist/a/index.js": "var withoutConfig = 1000;
156+
"<ROOT>/tests/integration/cli/build/no-config/dist/a/index.js": "const withoutConfig = 1000;
157157
export { withoutConfig };
158158
",
159159
}

tests/integration/syntax/__snapshots__/index.test.ts.snap

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,9 @@ class Foo {
8181
}
8282
}
8383
function bar() {}
84-
function foo() {
85-
var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
86-
var a = {};
87-
var b = _object_spread_props(_object_spread({}, a), {
84+
function foo(options = {}) {
85+
const a = {};
86+
const b = _object_spread_props(_object_spread({}, a), {
8887
b: 1
8988
});
9089
console.log(options, b);

0 commit comments

Comments
 (0)