From 7e6b0c8fec6d19a7dd9e41d89893b8d336a2d31d Mon Sep 17 00:00:00 2001 From: fi3ework Date: Wed, 16 Oct 2024 23:58:22 +0800 Subject: [PATCH] fix!: correct ECMA version browserslist mapping --- packages/core/src/types/config/index.ts | 1 - packages/core/src/utils/syntax.ts | 153 ++++++++---------- packages/core/tests/config.test.ts | 14 +- packages/core/tests/syntax.test.ts | 90 ++++++++--- .../syntax/__fixtures__/src/foo.ts | 9 -- .../syntax/__fixtures__/src/index.ts | 12 +- .../syntax/__snapshots__/index.test.ts.snap | 16 +- 7 files changed, 164 insertions(+), 131 deletions(-) delete mode 100644 tests/integration/syntax/__fixtures__/src/foo.ts diff --git a/packages/core/src/types/config/index.ts b/packages/core/src/types/config/index.ts index 38e1a999..ac61422b 100644 --- a/packages/core/src/types/config/index.ts +++ b/packages/core/src/types/config/index.ts @@ -5,7 +5,6 @@ export type Format = 'esm' | 'cjs' | 'umd'; export type FixedEcmaVersions = | 'es5' - | 'es6' | 'es2015' | 'es2016' | 'es2017' diff --git a/packages/core/src/utils/syntax.ts b/packages/core/src/utils/syntax.ts index 2ac88272..41460190 100644 --- a/packages/core/src/utils/syntax.ts +++ b/packages/core/src/utils/syntax.ts @@ -56,112 +56,95 @@ export const ESX_TO_BROWSERSLIST: Record< > & Record string[]> = { - es6: { - Chrome: '63.0.0', - Edge: '79.0.0', - Firefox: '67.0.0', - iOS: '13.0.0', - Node: ['node > 12.20.0 and node < 13.0.0', 'node > 13.2.0'], - Opera: '50.0.0', - Safari: '13.0.0', + es5: { + chrome: '5.0.0', + edge: '12.0.0', + firefox: '2.0.0', + ie: '9.0.0', + ios: '6.0.0', + node: '0.4.0', + opera: '10.10.0', + safari: '3.1.0', }, es2015: { - Chrome: '63.0.0', - Edge: '79.0.0', - Firefox: '67.0.0', - iOS: '13.0.0', - Node: '10.0.0', - Opera: '50.0.0', - Safari: '13.0.0', + chrome: '63.0.0', + edge: '79.0.0', + firefox: '67.0.0', + ios: '13.0.0', + node: '13.2.0', + opera: '50.0.0', + safari: '13.0.0', }, es2016: { - Chrome: '52.0.0', - Edge: '14.0.0', - Firefox: '52.0.0', - iOS: '10.3.0', - Node: '7.0.0', - Opera: '39.0.0', - Safari: '10.1.0', + chrome: '63.0.0', + edge: '79.0.0', + firefox: '67.0.0', + ios: '13.0.0', + node: '13.2.0', + opera: '50.0.0', + safari: '13.0.0', }, es2017: { - Chrome: '55.0.0', - Edge: '15.0.0', - Firefox: '52.0.0', - iOS: '11.0.0', - Node: '7.6.0', - Opera: '42.0.0', - Safari: '11.0.0', + chrome: '63.0.0', + edge: '79.0.0', + firefox: '67.0.0', + ios: '13.0.0', + node: '13.2.0', + opera: '50.0.0', + safari: '13.0.0', }, es2018: { - Chrome: '64.0.0', - Edge: '79.0.0', - Firefox: '78.0.0', - iOS: '16.4.0', - Node: [ - 'node > 18.20.0 and node < 19.0.0', - 'node > 20.12.0 and node < 21.0.0', - 'node > 21.3.0', - ], - Opera: '51.0.0', - Safari: '16.4.0', + chrome: '64.0.0', + edge: '79.0.0', + firefox: '78.0.0', + ios: '16.4.0', + node: '13.2.0', + opera: '51.0.0', + safari: '16.4.0', }, es2019: { - Chrome: '66.0.0', - Edge: '79.0.0', - Firefox: '58.0.0', - iOS: '11.3.0', - Node: '10.0.0', - Opera: '53.0.0', - Safari: '11.1.0', + chrome: '66.0.0', + edge: '79.0.0', + firefox: '78.0.0', + ios: '16.4.0', + node: '13.2.0', + opera: '53.0.0', + safari: '16.4.0', }, es2020: { - Chrome: '91.0.0', - Edge: '91.0.0', - Firefox: '80.0.0', - iOS: '14.5.0', - Node: '16.1.0', - Opera: '77.0.0', - Safari: '14.1.0', + chrome: '91.0.0', + edge: '91.0.0', + firefox: '80.0.0', + ios: '16.4.0', + node: '16.1.0', + opera: '77.0.0', + safari: '16.4.0', }, es2021: { - Chrome: '85.0.0', - Edge: '85.0.0', - Firefox: '79.0.0', - iOS: '14.0.0', - Node: '15.0.0', - Opera: '71.0.0', - Safari: '14.0.0', + chrome: '91.0.0', + edge: '91.0.0', + firefox: '80.0.0', + ios: '16.4.0', + node: '16.1.0', + opera: '77.0.0', + safari: '16.4.0', }, es2022: { - Chrome: '91.0.0', - Edge: '94.0.0', - Firefox: '93.0.0', - iOS: '16.4.0', - Node: '16.11.0', - Opera: '80.0.0', - Safari: '16.4.0', + chrome: '91.0.0', + firefox: '93.0.0', + ios: '16.4.0', + node: '16.11.0', + safari: '16.4.0', }, es2023: { - Chrome: '74.0.0', - Edge: '79.0.0', - Firefox: '67.0.0', - iOS: '13.4.0', - Node: '12.5.0', - Opera: '62.0.0', - Safari: '13.1.0', + chrome: '91.0.0', + firefox: '93.0.0', + ios: '16.4.0', + node: '16.11.0', + safari: '16.4.0', }, es2024: calcEsnextBrowserslistByTarget, esnext: calcEsnextBrowserslistByTarget, - es5: { - Chrome: '5.0.0', - Edge: '12.0.0', - Firefox: '2.0.0', - ie: '9.0.0', - iOS: '6.0.0', - Node: '0.4.0', - Opera: '10.10.0', - Safari: '3.1.0', - }, } as const; export function transformSyntaxToRspackTarget( diff --git a/packages/core/tests/config.test.ts b/packages/core/tests/config.test.ts index f94ad43a..7ad92da7 100644 --- a/packages/core/tests/config.test.ts +++ b/packages/core/tests/config.test.ts @@ -303,13 +303,13 @@ describe('syntax', () => { composedRsbuildConfig[0].config.output?.overrideBrowserslist, ).toMatchInlineSnapshot(` [ - "Chrome >= 63.0.0", - "Edge >= 79.0.0", - "Firefox >= 67.0.0", - "iOS >= 13.0.0", - "Node >= 10.0.0", - "Opera >= 50.0.0", - "Safari >= 13.0.0", + "chrome >= 63.0.0", + "edge >= 79.0.0", + "firefox >= 67.0.0", + "ios >= 13.0.0", + "node >= 13.2.0", + "opera >= 50.0.0", + "safari >= 13.0.0", ] `); }); diff --git a/packages/core/tests/syntax.test.ts b/packages/core/tests/syntax.test.ts index 50035930..07510fc7 100644 --- a/packages/core/tests/syntax.test.ts +++ b/packages/core/tests/syntax.test.ts @@ -1,35 +1,75 @@ import { describe, expect, test } from 'vitest'; import { + ESX_TO_BROWSERSLIST, transformSyntaxToBrowserslist, transformSyntaxToRspackTarget, } from '../src/utils/syntax'; +const compareSemver = (a: string, b: string) => { + const [aMajor, aMinor, aPatch] = a.split('.').map(Number); + const [bMajor, bMinor, bPatch] = b.split('.').map(Number); + + if (aMajor !== bMajor) { + return aMajor - bMajor; + } + if (aMinor !== bMinor) { + return aMinor - bMinor; + } + return aPatch - bPatch; +}; + +test('ECMA version mapped browserslist queries should increments', () => { + const sortedVersions = [ + 'es5', + 'es2015', + 'es2016', + 'es2017', + 'es2018', + 'es2019', + 'es2020', + 'es2021', + 'es2022', + 'es2023', + 'es2024', + 'esnext', + ]; + + for (let i = 1; i < sortedVersions.length; i++) { + const prev = sortedVersions[i - 1]; + const current = sortedVersions[i]; + for (const query of Object.keys(ESX_TO_BROWSERSLIST[current])) { + const prevQuery = ESX_TO_BROWSERSLIST[prev][query]; + const currQuery = ESX_TO_BROWSERSLIST[current][query]; + if (prevQuery && currQuery) { + expect(compareSemver(currQuery, prevQuery)).toBeGreaterThanOrEqual(0); + } + } + } +}); + describe('transformSyntaxToBrowserslist', () => { test('esX', () => { - expect(transformSyntaxToBrowserslist('es6')).toMatchInlineSnapshot(` + expect(transformSyntaxToBrowserslist('es2015')).toMatchInlineSnapshot(` [ - "Chrome >= 63.0.0", - "Edge >= 79.0.0", - "Firefox >= 67.0.0", - "iOS >= 13.0.0", - "node > 12.20.0 and node < 13.0.0", - "node > 13.2.0", - "Opera >= 50.0.0", - "Safari >= 13.0.0", + "chrome >= 63.0.0", + "edge >= 79.0.0", + "firefox >= 67.0.0", + "ios >= 13.0.0", + "node >= 13.2.0", + "opera >= 50.0.0", + "safari >= 13.0.0", ] `); expect(transformSyntaxToBrowserslist('es2018')).toMatchInlineSnapshot(` [ - "Chrome >= 64.0.0", - "Edge >= 79.0.0", - "Firefox >= 78.0.0", - "iOS >= 16.4.0", - "node > 18.20.0 and node < 19.0.0", - "node > 20.12.0 and node < 21.0.0", - "node > 21.3.0", - "Opera >= 51.0.0", - "Safari >= 16.4.0", + "chrome >= 64.0.0", + "edge >= 79.0.0", + "firefox >= 78.0.0", + "ios >= 16.4.0", + "node >= 13.2.0", + "opera >= 51.0.0", + "safari >= 16.4.0", ] `); @@ -84,14 +124,14 @@ describe('transformSyntaxToBrowserslist', () => { ).toMatchInlineSnapshot(` [ "Chrome 123", - "Chrome >= 5.0.0", - "Edge >= 12.0.0", - "Firefox >= 2.0.0", + "chrome >= 5.0.0", + "edge >= 12.0.0", + "firefox >= 2.0.0", "ie >= 9.0.0", - "iOS >= 6.0.0", - "Node >= 0.4.0", - "Opera >= 10.10.0", - "Safari >= 3.1.0", + "ios >= 6.0.0", + "node >= 0.4.0", + "opera >= 10.10.0", + "safari >= 3.1.0", ] `); diff --git a/tests/integration/syntax/__fixtures__/src/foo.ts b/tests/integration/syntax/__fixtures__/src/foo.ts deleted file mode 100644 index 7ce034c3..00000000 --- a/tests/integration/syntax/__fixtures__/src/foo.ts +++ /dev/null @@ -1,9 +0,0 @@ -class Foo { - constructor() { - this.#bar(); - } - - #bar() {} -} - -export { Foo }; diff --git a/tests/integration/syntax/__fixtures__/src/index.ts b/tests/integration/syntax/__fixtures__/src/index.ts index 38eca28a..0edafff1 100644 --- a/tests/integration/syntax/__fixtures__/src/index.ts +++ b/tests/integration/syntax/__fixtures__/src/index.ts @@ -1 +1,11 @@ -export { Foo } from './foo'; +export class Foo { + constructor() { + this.#bar(); + } + + #bar() {} +} + +export function foo(options: unknown = {}): void { + console.log(options); +} diff --git a/tests/integration/syntax/__snapshots__/index.test.ts.snap b/tests/integration/syntax/__snapshots__/index.test.ts.snap index 56b3903b..6d8475a6 100644 --- a/tests/integration/syntax/__snapshots__/index.test.ts.snap +++ b/tests/integration/syntax/__snapshots__/index.test.ts.snap @@ -7,7 +7,10 @@ exports[`should downgrade class private method by default 1`] = ` } #bar() {} } -export { Foo }; +function foo(options = {}) { + console.log(options); +} +export { Foo, foo }; " `; @@ -31,7 +34,11 @@ class Foo { } } function bar() {} -export { Foo }; +function foo() { + let options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; + console.log(options); +} +export { Foo, foo }; " `; @@ -42,6 +49,9 @@ exports[`should downgrade class private method with output.syntax config 2`] = ` } #bar() {} } -export { Foo }; +function foo(options = {}) { + console.log(options); +} +export { Foo, foo }; " `;