From 2d80f59321f75cee7c41edc6937d7e21be5a3e46 Mon Sep 17 00:00:00 2001 From: fi3ework Date: Thu, 11 Jul 2024 01:43:32 +0800 Subject: [PATCH] feat: implement syntax --- .prettierignore | 3 + CONTRIBUTING.md | 6 +- biome.json | 2 +- e2e/README.md | 4 +- .../alias/__snapshots__/index.test.ts.snap | 4 +- e2e/cases/alias/index.test.ts | 2 +- e2e/cases/define/index.test.ts | 2 +- e2e/cases/externals/browser/index.test.ts | 2 +- e2e/cases/externals/node/index.test.ts | 2 +- .../config/__snapshots__/index.test.ts.snap | 48 ++++++ e2e/cases/syntax/config/index.test.ts | 12 ++ e2e/cases/syntax/config/rslib.config.ts | 23 +++ e2e/cases/syntax/config/src/foo.ts | 9 ++ e2e/cases/syntax/config/src/index.ts | 1 + e2e/cases/syntax/config/tsconfig.json | 10 ++ .../default/__snapshots__/index.test.ts.snap | 19 +++ e2e/cases/syntax/default/index.test.ts | 12 ++ e2e/cases/syntax/default/rslib.config.ts | 12 ++ e2e/cases/syntax/default/src/foo.ts | 9 ++ e2e/cases/syntax/default/src/index.ts | 1 + e2e/cases/syntax/default/tsconfig.json | 10 ++ e2e/package.json | 2 +- package.json | 4 +- packages/core/package.json | 2 +- packages/core/src/config.ts | 26 ++- packages/core/src/types/config/index.ts | 3 - packages/core/src/utils/browserslist.ts | 8 - packages/core/src/utils/syntax.ts | 149 ++++++++++++++++++ packages/core/tests/syntax.test.ts | 50 ++++++ pnpm-lock.yaml | 138 ++++++++-------- 30 files changed, 481 insertions(+), 94 deletions(-) create mode 100644 e2e/cases/syntax/config/__snapshots__/index.test.ts.snap create mode 100644 e2e/cases/syntax/config/index.test.ts create mode 100644 e2e/cases/syntax/config/rslib.config.ts create mode 100644 e2e/cases/syntax/config/src/foo.ts create mode 100644 e2e/cases/syntax/config/src/index.ts create mode 100644 e2e/cases/syntax/config/tsconfig.json create mode 100644 e2e/cases/syntax/default/__snapshots__/index.test.ts.snap create mode 100644 e2e/cases/syntax/default/index.test.ts create mode 100644 e2e/cases/syntax/default/rslib.config.ts create mode 100644 e2e/cases/syntax/default/src/foo.ts create mode 100644 e2e/cases/syntax/default/src/index.ts create mode 100644 e2e/cases/syntax/default/tsconfig.json delete mode 100644 packages/core/src/utils/browserslist.ts create mode 100644 packages/core/src/utils/syntax.ts create mode 100644 packages/core/tests/syntax.test.ts diff --git a/.prettierignore b/.prettierignore index 27e842b2..e30c2647 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,6 @@ dist compiled doc_build +__snapshots__ +LICENSE +scripts/dictionary.txt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 230a6be7..c29e12aa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,6 @@ The project is still under development, so it possible dependents on unstable Rs Current unstable versions are: -| Package | Version | Link | -| ------------ | ------------------------------------------------------- | ------------------------------------------------------- | -| @rspack/core | @rspack/core-canary@1.0.0-canary-26460a2-20240710092718 | [PR](https://github.com/web-infra-dev/rspack/pull/7102) | + diff --git a/biome.json b/biome.json index b04f4649..7ad2859d 100644 --- a/biome.json +++ b/biome.json @@ -25,7 +25,7 @@ }, "javascript": { "formatter": { - "quoteStyle": "single" + "enabled": false } }, "json": { diff --git a/e2e/README.md b/e2e/README.md index fa707b83..ae33923a 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -28,7 +28,7 @@ Rslib will try to cover the common scenarios in the [integration test cases of M | jsx | ⚪️ | | | metafile | ⚪️ | | | minify | ⚪️ | | -| platform | ⚪️ | | +| platform | 🟢 | | | redirect | ⚪️ | | | resolve | ⚪️ | | | shims | ⚪️ | | @@ -37,7 +37,7 @@ Rslib will try to cover the common scenarios in the [integration test cases of M | sourceMap | ⚪️ | | | splitting | ⚪️ | | | style | ⚪️ | | -| target | ⚪️ | | +| target | 🟢 | | | transformImport | ⚪️ | | | transformLodash | ⚪️ | | | tsconfig | ⚪️ | | diff --git a/e2e/cases/alias/__snapshots__/index.test.ts.snap b/e2e/cases/alias/__snapshots__/index.test.ts.snap index 74354970..5dc66e72 100644 --- a/e2e/cases/alias/__snapshots__/index.test.ts.snap +++ b/e2e/cases/alias/__snapshots__/index.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`alias should work 1`] = ` +exports[`source.alias 1`] = ` " ;// CONCATENATED MODULE: ./e2e/cases/alias/src/a.ts const a = 'hello world'; @@ -13,7 +13,7 @@ export { a }; " `; -exports[`alias should work 2`] = ` +exports[`source.alias 2`] = ` "(() => { // webpackBootstrap "use strict"; var __webpack_exports__ = {}; diff --git a/e2e/cases/alias/index.test.ts b/e2e/cases/alias/index.test.ts index d4cdd07a..0b4fc036 100644 --- a/e2e/cases/alias/index.test.ts +++ b/e2e/cases/alias/index.test.ts @@ -1,7 +1,7 @@ import { expect, test } from 'vitest'; import { buildAndGetEntryJsResults } from '#shared'; -test('alias should work', async () => { +test('source.alias', async () => { const fixturePath = __dirname; const { contents } = await buildAndGetEntryJsResults(fixturePath); diff --git a/e2e/cases/define/index.test.ts b/e2e/cases/define/index.test.ts index a844522a..10a38a80 100644 --- a/e2e/cases/define/index.test.ts +++ b/e2e/cases/define/index.test.ts @@ -1,7 +1,7 @@ import { expect, test } from 'vitest'; import { buildAndGetEntryJsResults } from '#shared'; -test('define should work', async () => { +test('source.define', async () => { const fixturePath = __dirname; const { contents } = await buildAndGetEntryJsResults(fixturePath); diff --git a/e2e/cases/externals/browser/index.test.ts b/e2e/cases/externals/browser/index.test.ts index 158de97b..38e1f4d1 100644 --- a/e2e/cases/externals/browser/index.test.ts +++ b/e2e/cases/externals/browser/index.test.ts @@ -2,7 +2,7 @@ import { join } from 'node:path'; import { expect, test } from 'vitest'; import { buildAndGetEntryJsResults } from '#shared'; -test('should fail when platform is not "node"', async () => { +test('should fail to build when `output.target` is not "node"', async () => { const fixturePath = join(__dirname); const build = buildAndGetEntryJsResults(fixturePath); await expect(build).rejects.toThrowError('Rspack build failed!'); diff --git a/e2e/cases/externals/node/index.test.ts b/e2e/cases/externals/node/index.test.ts index 8e5bcdc5..3ac55f37 100644 --- a/e2e/cases/externals/node/index.test.ts +++ b/e2e/cases/externals/node/index.test.ts @@ -2,7 +2,7 @@ import { join } from 'node:path'; import { expect, test } from 'vitest'; import { buildAndGetEntryJsResults } from '#shared'; -test('auto externalize Node.js built-in modules when platform is "node"', async () => { +test('auto externalize Node.js built-in modules when `output.target` is "node"', async () => { const fixturePath = join(__dirname); const { contents } = await buildAndGetEntryJsResults(fixturePath); diff --git a/e2e/cases/syntax/config/__snapshots__/index.test.ts.snap b/e2e/cases/syntax/config/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000..4a6d1c04 --- /dev/null +++ b/e2e/cases/syntax/config/__snapshots__/index.test.ts.snap @@ -0,0 +1,48 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`should downgrade class private method by default 1`] = ` +" +;// CONCATENATED MODULE: ./node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_class_private_method_get.js +function _class_private_method_get(receiver, privateSet, fn) { + if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance"); + + return fn; +} + + +;// CONCATENATED MODULE: ./node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_check_private_redeclaration.js +function _check_private_redeclaration(obj, privateCollection) { + if (privateCollection.has(obj)) { + throw new TypeError("Cannot initialize the same private elements twice on an object"); + } +} + + +;// CONCATENATED MODULE: ./node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_class_private_method_init.js + + +function _class_private_method_init(obj, privateSet) { + _check_private_redeclaration(obj, privateSet); + privateSet.add(obj); +} + + +;// CONCATENATED MODULE: ./e2e/cases/syntax/config/src/foo.ts + + +var _bar = new WeakSet(); +class Foo { + constructor(){ + _class_private_method_init(this, _bar); + _class_private_method_get(this, _bar, bar).call(this); + } +} +function bar() {} + /*#__PURE__*/ + +;// CONCATENATED MODULE: ./e2e/cases/syntax/config/src/index.ts + + +export { Foo }; +" +`; diff --git a/e2e/cases/syntax/config/index.test.ts b/e2e/cases/syntax/config/index.test.ts new file mode 100644 index 00000000..5967448b --- /dev/null +++ b/e2e/cases/syntax/config/index.test.ts @@ -0,0 +1,12 @@ +import { expect, test } from 'vitest'; +import { buildAndGetEntryJsResults } from '#shared'; + +test('should downgrade class private method by default', async () => { + const fixturePath = __dirname; + const { contents } = await buildAndGetEntryJsResults(fixturePath); + + expect(contents.esm).toMatchSnapshot(); + expect(contents.esm).not.toContain('#bar'); + + expect(contents.cjs).toContain('#bar'); +}); diff --git a/e2e/cases/syntax/config/rslib.config.ts b/e2e/cases/syntax/config/rslib.config.ts new file mode 100644 index 00000000..792ed00f --- /dev/null +++ b/e2e/cases/syntax/config/rslib.config.ts @@ -0,0 +1,23 @@ +import { join } from 'node:path'; +import { defineConfig } from '@rslib/core'; +import { generateBundleCjsConfig, generateBundleEsmConfig } from '#shared'; + +export default defineConfig({ + lib: [ + generateBundleEsmConfig(__dirname, { + output: { + syntax: 'es2015', + }, + }), + generateBundleCjsConfig(__dirname, { + output: { + syntax: ['node 20'], + }, + }), + ], + source: { + entry: { + main: join(__dirname, 'src/index.ts'), + }, + }, +}); diff --git a/e2e/cases/syntax/config/src/foo.ts b/e2e/cases/syntax/config/src/foo.ts new file mode 100644 index 00000000..7ce034c3 --- /dev/null +++ b/e2e/cases/syntax/config/src/foo.ts @@ -0,0 +1,9 @@ +class Foo { + constructor() { + this.#bar(); + } + + #bar() {} +} + +export { Foo }; diff --git a/e2e/cases/syntax/config/src/index.ts b/e2e/cases/syntax/config/src/index.ts new file mode 100644 index 00000000..38eca28a --- /dev/null +++ b/e2e/cases/syntax/config/src/index.ts @@ -0,0 +1 @@ +export { Foo } from './foo'; diff --git a/e2e/cases/syntax/config/tsconfig.json b/e2e/cases/syntax/config/tsconfig.json new file mode 100644 index 00000000..ae0b87df --- /dev/null +++ b/e2e/cases/syntax/config/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@rslib/tsconfig/base", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@src/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/e2e/cases/syntax/default/__snapshots__/index.test.ts.snap b/e2e/cases/syntax/default/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000..5ac20c8b --- /dev/null +++ b/e2e/cases/syntax/default/__snapshots__/index.test.ts.snap @@ -0,0 +1,19 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`should downgrade class private method by default 1`] = ` +" +;// CONCATENATED MODULE: ./e2e/cases/syntax/default/src/foo.ts +class Foo { + constructor(){ + this.#bar(); + } + #bar() {} +} + + +;// CONCATENATED MODULE: ./e2e/cases/syntax/default/src/index.ts + + +export { Foo }; +" +`; diff --git a/e2e/cases/syntax/default/index.test.ts b/e2e/cases/syntax/default/index.test.ts new file mode 100644 index 00000000..cb1e7a93 --- /dev/null +++ b/e2e/cases/syntax/default/index.test.ts @@ -0,0 +1,12 @@ +import { expect, test } from 'vitest'; +import { buildAndGetEntryJsResults } from '#shared'; + +test('should downgrade class private method by default', async () => { + const fixturePath = __dirname; + const { contents } = await buildAndGetEntryJsResults(fixturePath); + + expect(contents.esm).toMatchSnapshot(); + expect(contents.esm).toContain('#bar'); + + expect(contents.cjs).toContain('#bar'); +}); diff --git a/e2e/cases/syntax/default/rslib.config.ts b/e2e/cases/syntax/default/rslib.config.ts new file mode 100644 index 00000000..234013cd --- /dev/null +++ b/e2e/cases/syntax/default/rslib.config.ts @@ -0,0 +1,12 @@ +import { join } from 'node:path'; +import { defineConfig } from '@rslib/core'; +import { generateBundleCjsConfig, generateBundleEsmConfig } from '#shared'; + +export default defineConfig({ + lib: [generateBundleEsmConfig(__dirname), generateBundleCjsConfig(__dirname)], + source: { + entry: { + main: join(__dirname, 'src/index.ts'), + }, + }, +}); diff --git a/e2e/cases/syntax/default/src/foo.ts b/e2e/cases/syntax/default/src/foo.ts new file mode 100644 index 00000000..7ce034c3 --- /dev/null +++ b/e2e/cases/syntax/default/src/foo.ts @@ -0,0 +1,9 @@ +class Foo { + constructor() { + this.#bar(); + } + + #bar() {} +} + +export { Foo }; diff --git a/e2e/cases/syntax/default/src/index.ts b/e2e/cases/syntax/default/src/index.ts new file mode 100644 index 00000000..38eca28a --- /dev/null +++ b/e2e/cases/syntax/default/src/index.ts @@ -0,0 +1 @@ +export { Foo } from './foo'; diff --git a/e2e/cases/syntax/default/tsconfig.json b/e2e/cases/syntax/default/tsconfig.json new file mode 100644 index 00000000..ae0b87df --- /dev/null +++ b/e2e/cases/syntax/default/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@rslib/tsconfig/base", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@src/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/e2e/package.json b/e2e/package.json index a2c7e3df..c9a0b24d 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -14,7 +14,7 @@ }, "devDependencies": { "@playwright/test": "1.43.1", - "@rsbuild/core": "1.0.0-alpha.3", + "@rsbuild/core": "1.0.0-alpha.7", "@rslib/core": "workspace:*", "@rslib/tsconfig": "workspace:*", "@types/fs-extra": "^11.0.4", diff --git a/package.json b/package.json index a57e6a86..1dc46563 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "build:examples": "cross-env NX_DAEMON=false nx run-many -t build --projects @examples/* --parallel=10", "check-dependency-version": "check-dependency-version-consistency .", "check-spell": "npx cspell", - "lint": "biome check . --diagnostic-level=warn && pnpm run check-spell", + "lint": "biome check . --diagnostic-level=warn && prettier --check ./**/*.* && pnpm run check-spell", "prebundle": "nx run-many -t prebundle", "prepare": "pnpm run build && simple-git-hooks", "sort-package-json": "npx sort-package-json \"packages/*/package.json\"", @@ -50,7 +50,7 @@ }, "pnpm": { "overrides": { - "@rspack/core": "npm:@rspack/core-canary@1.0.0-canary-26460a2-20240710092718" + "@rspack/core": "v1.0.0-alpha.3" } } } diff --git a/packages/core/package.json b/packages/core/package.json index 0e8ebc0c..3c50bb72 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,7 +38,7 @@ "prebundle": "prebundle" }, "dependencies": { - "@rsbuild/core": "1.0.0-alpha.3" + "@rsbuild/core": "1.0.0-alpha.7" }, "devDependencies": { "@rslib/tsconfig": "workspace:*", diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index 940d521c..73e3f9cb 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -20,6 +20,7 @@ import { getDefaultExtension } from './utils/extension'; import { color } from './utils/helper'; import { nodeBuiltInModules } from './utils/helper'; import { logger } from './utils/logger'; +import { transformSyntaxToBrowserslist } from './utils/syntax'; /** * This function helps you to autocomplete configuration types. @@ -130,6 +131,7 @@ const getDefaultFormatConfig = (format: Format): RsbuildConfig => { rspack: { externalsType: 'commonjs', output: { + chunkFormat: 'commonjs', library: { type: 'commonjs', }, @@ -175,8 +177,28 @@ const getDefaultAutoExtensionConfig = ( }; }; -const getDefaultSyntax = (_syntax?: Syntax): RsbuildConfig => { - return {}; +const getDefaultSyntax = (syntax?: Syntax): RsbuildConfig => { + // Defaults to ESNext, Rslib will assume all of the latest JavaScript and CSS features are supported. + return syntax === undefined + ? { + tools: { + rspack: { + // The highest is 2022 in Rspack + target: 'es2022', + }, + swc(config) { + config.jsc ??= {}; + config.jsc.target = 'esnext'; + delete config.env; + return config; + }, + }, + } + : { + output: { + overrideBrowserslist: transformSyntaxToBrowserslist(syntax), + }, + }; }; export function convertLibConfigToRsbuildConfig( diff --git a/packages/core/src/types/config/index.ts b/packages/core/src/types/config/index.ts index 38ffc178..b31a3052 100644 --- a/packages/core/src/types/config/index.ts +++ b/packages/core/src/types/config/index.ts @@ -18,11 +18,8 @@ export type EcmaScriptVersion = | 'es2024'; export type Syntax = - // Use browserslist config file - | 'browserslist' // ECMAScript versions as an common used addition to browserslist query | EcmaScriptVersion - | EcmaScriptVersion[] // Support inline browserslist query, like defined in package.json | string[]; diff --git a/packages/core/src/utils/browserslist.ts b/packages/core/src/utils/browserslist.ts deleted file mode 100644 index a8492886..00000000 --- a/packages/core/src/utils/browserslist.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { EcmaScriptVersion } from '../types/config'; - -export const esVersionToBrowserList = ( - _esVersion: EcmaScriptVersion, -): string[] => { - // TODO: transform esX to browserslist - return []; -}; diff --git a/packages/core/src/utils/syntax.ts b/packages/core/src/utils/syntax.ts new file mode 100644 index 00000000..ad152ad5 --- /dev/null +++ b/packages/core/src/utils/syntax.ts @@ -0,0 +1,149 @@ +import type { RsbuildConfig } from '@rsbuild/core'; +import type { EcmaScriptVersion, Syntax } from '../types/config'; + +/** + * The esX to browserslist mapping is transformed from esbuild: + * https://github.com/evanw/esbuild/blob/main/internal/compat/js_table.go + * It does not completely align with the browserslist query of Rsbuild now: + * https://github.com/rspack-contrib/browserslist-to-es-version + * TODO: align with Rsbuild, we may should align with SWC + */ +const ESX_TO_BROWSERSLIST: Record< + EcmaScriptVersion, + Record +> = { + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + 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', + }, + es2024: {}, + esnext: {}, + 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', + }, +}; + +export const transformSyntaxToBrowserslist = ( + syntax: Syntax, +): NonNullable['overrideBrowserslist'] => { + // only single esX is allowed + if (typeof syntax === 'string' && syntax.toLowerCase().startsWith('es')) { + if (syntax.toLowerCase() in ESX_TO_BROWSERSLIST) { + return Object.entries(ESX_TO_BROWSERSLIST[syntax]).flatMap( + ([engine, version]) => { + if (Array.isArray(version)) { + return version; + } + + return `${engine} ${version}`; + }, + ); + } + + throw new Error(`Unsupported ES version: ${syntax}`); + } + + // inline browserslist query + if (Array.isArray(syntax)) { + return syntax; + } + + throw new Error(`Unsupported syntax: ${syntax}`); +}; diff --git a/packages/core/tests/syntax.test.ts b/packages/core/tests/syntax.test.ts new file mode 100644 index 00000000..2e4d75be --- /dev/null +++ b/packages/core/tests/syntax.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, test } from 'vitest'; +import { transformSyntaxToBrowserslist } from '../src/utils/syntax'; + +describe('Correctly resolve syntax', () => { + test('esX', async () => { + expect(transformSyntaxToBrowserslist('es6')).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", + ] + `); + + 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", + ] + `); + }); + + test('browserslist', async () => { + expect(transformSyntaxToBrowserslist(['fully supports es6-module'])) + .toMatchInlineSnapshot(` + [ + "fully supports es6-module", + ] + `); + + expect(transformSyntaxToBrowserslist(['node 14', 'Chrome 103'])) + .toMatchInlineSnapshot(` + [ + "node 14", + "Chrome 103", + ] + `); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b5eb99b..10c91be8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@rspack/core': npm:@rspack/core-canary@1.0.0-canary-26460a2-20240710092718 + '@rspack/core': v1.0.0-alpha.3 importers: @@ -64,8 +64,8 @@ importers: specifier: 1.43.1 version: 1.43.1 '@rsbuild/core': - specifier: 1.0.0-alpha.3 - version: 1.0.0-alpha.3 + specifier: 1.0.0-alpha.7 + version: 1.0.0-alpha.7 '@rslib/core': specifier: workspace:* version: link:../packages/core @@ -101,8 +101,8 @@ importers: packages/core: dependencies: '@rsbuild/core': - specifier: 1.0.0-alpha.3 - version: 1.0.0-alpha.3 + specifier: 1.0.0-alpha.7 + version: 1.0.0-alpha.7 devDependencies: '@rslib/tsconfig': specifier: workspace:* @@ -1111,61 +1111,61 @@ packages: cpu: [x64] os: [win32] - '@rsbuild/core@1.0.0-alpha.3': - resolution: {integrity: sha512-RmuxJkxRTfq5BoQWIOm/hR8wl0cCWDFgvn/AxV2jVBf1psTeUEqTn05xtKwLuHJnaqD1hZHagEaHUn+ps3EJRw==} + '@rsbuild/core@1.0.0-alpha.7': + resolution: {integrity: sha512-SKn9uqRbSeXq92KAB4imBF70yEPAe5if4QMeKyNUn2p6st9z035H5rYqxF7ZdODbKIK4SKyHfGSrGGPyJrsOtw==} engines: {node: '>=16.7.0'} hasBin: true - '@rspack/binding-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-Ay1bXormpc9UhLZ5evTBiFqwzOHL0Tc8UDxOjKIjryJfkTMIzw9hfvxvtDkK2nK4j2RutJW13002uktNB8JGAg==} - - '@rspack/binding-darwin-arm64-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-6aCfZnn8L0D+EcxIRSOme4XeXaFLW6J5rQtJ+rL9OkFHi0HE6ikAkOVJpHibiZXD+jfnbRmkxnkSNOVdLYZK4A==} + '@rspack/binding-darwin-arm64@1.0.0-alpha.3': + resolution: {integrity: sha512-PZLdp0tgoti/skzIMijNr2jedKa8LGbhtPs6a0jgIuLY1g0fj/aL3LLGMo4rwoy/zGXeZf40PIJQB8b+w0qt7g==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-2Jv+X+LwqTRcHAGsfalSZYXl5FMENFBvuItU8EFrBWclx+t2OulR+beUp61rkXHI8dFVDQCHCetc2y5M4fBChw==} + '@rspack/binding-darwin-x64@1.0.0-alpha.3': + resolution: {integrity: sha512-NrNfjzsWo3kFh37tpCxNw75xuSGHdGCHIRCjKnvxHQ46aB+Y2wiOdGgSk7SnZHsRWpZyDFw3aBJCayiXlfgdTw==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-TdMhxo6kZnPm1r3q17grmBM4BEHZuvE9mfiPhFkKmc4mX99Aa0Rs+ceW3VCCMhxvpXM3DJawgbGmYQMZNqbl9A==} + '@rspack/binding-linux-arm64-gnu@1.0.0-alpha.3': + resolution: {integrity: sha512-EjzyZWZSjo02ReGUzQPt8sY1hEx2V9lEbg1cqgnE1NpSOS77ratNoAvS3gAzXL6NGWRhYrIH2yaN+6OB9olt/g==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-RZ+1tvqk4DM9t4ZcsYrX6sw5HClCeYBmT/ojB4AOXuUC61kGftHIyoN+2CesxIcts3FjZjLJkcrz6JmaVGW/4Q==} + '@rspack/binding-linux-arm64-musl@1.0.0-alpha.3': + resolution: {integrity: sha512-HJQ52KWNnMOFqbXhaIHTAr54ES5LSunJF6SLnIMgElReC39WvUNDmHhCA5yPebkXgY2SDrLIKDmqxouZmYWulQ==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-w5RWNy4CNAvb0eNv29XmyVJJs4WCeT20NcGVdG4XJNrM1fnSqgKifFGCO0Szl0ReB4Y9OWDaBUGa/a3UbIiU7A==} + '@rspack/binding-linux-x64-gnu@1.0.0-alpha.3': + resolution: {integrity: sha512-VcpKLI2AZmFOTec8C9YJTdMrgZMrgsQkMeQzTY1uOQuIaAaNCuPBFRdlJaRSTAG0t4aaxaVfR1c3JY8GITacfA==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-ZdpzUWr+FkUBwE5D4ZM4JvTueGZ3QahQflHvb/FAiA2Umqhd5lOqCIYKTx9+0f9aM8eBIb6nIqBkzsXiN03UNg==} + '@rspack/binding-linux-x64-musl@1.0.0-alpha.3': + resolution: {integrity: sha512-FypR+RqONTvrgX+SI8sJqhVqv8uhTdq3OHew4ZaL3VN0dp2thmpMX5cJ+XQAsU414OLRTgREU9go2j78n7kvUA==} cpu: [x64] os: [linux] - '@rspack/binding-win32-arm64-msvc-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-HubfKzygijtcrl0AB1/EIWeCwfQdmeOm752lu39TRT5VQCmzNyvp5D/aTbBD9BjHTwYpfMEu0jjE56l8fzR8tg==} + '@rspack/binding-win32-arm64-msvc@1.0.0-alpha.3': + resolution: {integrity: sha512-aAGQE2TJOhlK6jGYXZyon0JKTP5t2o51/exsSzyH6BSqFce/Qd5w1fqgm6FONTuosrwaBxHSz1pprNq6vx87kA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-Xz9tqAcHMYZm8WiyB0QdZT2NHE4Z3QNTlbOikf6KLafZwFKepy5NNpg6xCXIdzz/Zj9Y0uQ44IZ+uTesOPWxrw==} + '@rspack/binding-win32-ia32-msvc@1.0.0-alpha.3': + resolution: {integrity: sha512-OouAliQG6dONL9B+Jy237fhs6bScloAT3uphkDumsiAmH1926MYeSKhsmYU4j8b352iGtZVXaH/wR5svLTUCVQ==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-M6+ffc9PK3/kGVrg29ux7xTma1QLyqr4T1bnHceaUOPajfQv9n9OCStDVZlgjnKRb9F54IF8cQBbfZq7qw3Y8g==} + '@rspack/binding-win32-x64-msvc@1.0.0-alpha.3': + resolution: {integrity: sha512-CLh3p5a15wPQE8zOyBjBjVBrbdaDvAfacXkmCQK4I6lBc3HetkJNyjS8Fntf1CV9sWgJhwABUWHn7kMQeLY9RQ==} cpu: [x64] os: [win32] - '@rspack/core-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-OY3BmGRyID4EV7A+3b9VKWMbZGqlMBEIqmtg1m1qansw5rOqu8zuRJD7CcQD5ugYo8iYxg8Jq0uXlRwZQ5JKNg==} + '@rspack/binding@1.0.0-alpha.3': + resolution: {integrity: sha512-S/JjBWr8PE/l7+2xsk1m77CZnKwQNk+39uIsvHQhoRs+DL9SUDjjkUO4yqjCw6ZUGqEaTv4U/TL9TAmbrTth7g==} + + '@rspack/core@1.0.0-alpha.3': + resolution: {integrity: sha512-TcZZNMpyTjEIBP4zMCpLwXBiATEQ2QG3jKsV+mq55ZGKfqd/l86Zr3SboF15GOQip1wDHlSpA1bvrT18f9h0sw==} engines: {node: '>=16.0.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -1173,8 +1173,12 @@ packages: '@swc/helpers': optional: true - '@rspack/lite-tapable-canary@1.0.0-canary-26460a2-20240710092718': - resolution: {integrity: sha512-AXSXUCE+2M/bt+uMmSMxztLdM0plNyohzKxb0Cimq7Z6Du556WDEOR1XCKGcFPPIofLSkdUagt9jQ9pA03EwSQ==} + '@rspack/lite-tapable@1.0.0-alpha.2': + resolution: {integrity: sha512-SYrWNryAkjBmjF+u1G2jqVkFrH8c+mui2QJJRA9e/UK+xz0l6+9e+CjP3taiT2YYmB3wc1pSUqJZFB9FZViRog==} + engines: {node: '>=16.0.0'} + + '@rspack/lite-tapable@1.0.0-alpha.3': + resolution: {integrity: sha512-oQJ1iYxfBHcuutAva2HP1dqi9Aka/70PB3Vbq4nI+iAhHErtzaRslI/OcqhEbbmBgYf+Xu6g5vvN6Gxfq69gag==} engines: {node: '>=16.0.0'} '@sinclair/typebox@0.27.8': @@ -1897,11 +1901,11 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-rspack-plugin@5.7.2: - resolution: {integrity: sha512-uVXGYq19bcsX7Q/53VqXQjCKXw0eUMHlFGDLTaqzgj/ckverfhZQvXyA6ecFBaF9XUH16jfCTCyALYi0lJcagg==} + html-rspack-plugin@6.0.0-beta.5: + resolution: {integrity: sha512-UzgniuWQ5Nr/8bf09tT+m9RHHrFD4USc1533okdVfZrtSbyVOdFu1G2UzcXZf0yD0IqJAQJsbRrND0+T4bgciQ==} engines: {node: '>=10.13.0'} peerDependencies: - '@rspack/core': npm:@rspack/core-canary@1.0.0-canary-26460a2-20240710092718 + '@rspack/core': v1.0.0-alpha.3 peerDependenciesMeta: '@rspack/core': optional: true @@ -4035,66 +4039,68 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@rsbuild/core@1.0.0-alpha.3': + '@rsbuild/core@1.0.0-alpha.7': dependencies: - '@rspack/core': '@rspack/core-canary@1.0.0-canary-26460a2-20240710092718(@swc/helpers@0.5.11)' + '@rspack/core': 1.0.0-alpha.3(@swc/helpers@0.5.11) '@swc/helpers': 0.5.11 caniuse-lite: 1.0.30001640 core-js: 3.37.1 - html-webpack-plugin: html-rspack-plugin@5.7.2(@rspack/core-canary@1.0.0-canary-26460a2-20240710092718(@swc/helpers@0.5.11)) + html-rspack-plugin: 6.0.0-beta.5(@rspack/core@1.0.0-alpha.3(@swc/helpers@0.5.11)) postcss: 8.4.39 optionalDependencies: fsevents: 2.3.3 - '@rspack/binding-canary@1.0.0-canary-26460a2-20240710092718': - optionalDependencies: - '@rspack/binding-darwin-arm64': '@rspack/binding-darwin-arm64-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-darwin-x64': '@rspack/binding-darwin-x64-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-linux-arm64-gnu': '@rspack/binding-linux-arm64-gnu-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-linux-arm64-musl': '@rspack/binding-linux-arm64-musl-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-linux-x64-gnu': '@rspack/binding-linux-x64-gnu-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-linux-x64-musl': '@rspack/binding-linux-x64-musl-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-win32-arm64-msvc': '@rspack/binding-win32-arm64-msvc-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-win32-ia32-msvc': '@rspack/binding-win32-ia32-msvc-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/binding-win32-x64-msvc': '@rspack/binding-win32-x64-msvc-canary@1.0.0-canary-26460a2-20240710092718' - - '@rspack/binding-darwin-arm64-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-darwin-arm64@1.0.0-alpha.3': optional: true - '@rspack/binding-darwin-x64-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-darwin-x64@1.0.0-alpha.3': optional: true - '@rspack/binding-linux-arm64-gnu-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-linux-arm64-gnu@1.0.0-alpha.3': optional: true - '@rspack/binding-linux-arm64-musl-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-linux-arm64-musl@1.0.0-alpha.3': optional: true - '@rspack/binding-linux-x64-gnu-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-linux-x64-gnu@1.0.0-alpha.3': optional: true - '@rspack/binding-linux-x64-musl-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-linux-x64-musl@1.0.0-alpha.3': optional: true - '@rspack/binding-win32-arm64-msvc-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-win32-arm64-msvc@1.0.0-alpha.3': optional: true - '@rspack/binding-win32-ia32-msvc-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-win32-ia32-msvc@1.0.0-alpha.3': optional: true - '@rspack/binding-win32-x64-msvc-canary@1.0.0-canary-26460a2-20240710092718': + '@rspack/binding-win32-x64-msvc@1.0.0-alpha.3': optional: true - '@rspack/core-canary@1.0.0-canary-26460a2-20240710092718(@swc/helpers@0.5.11)': + '@rspack/binding@1.0.0-alpha.3': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.0.0-alpha.3 + '@rspack/binding-darwin-x64': 1.0.0-alpha.3 + '@rspack/binding-linux-arm64-gnu': 1.0.0-alpha.3 + '@rspack/binding-linux-arm64-musl': 1.0.0-alpha.3 + '@rspack/binding-linux-x64-gnu': 1.0.0-alpha.3 + '@rspack/binding-linux-x64-musl': 1.0.0-alpha.3 + '@rspack/binding-win32-arm64-msvc': 1.0.0-alpha.3 + '@rspack/binding-win32-ia32-msvc': 1.0.0-alpha.3 + '@rspack/binding-win32-x64-msvc': 1.0.0-alpha.3 + + '@rspack/core@1.0.0-alpha.3(@swc/helpers@0.5.11)': dependencies: '@module-federation/runtime-tools': 0.2.3 - '@rspack/binding': '@rspack/binding-canary@1.0.0-canary-26460a2-20240710092718' - '@rspack/lite-tapable': '@rspack/lite-tapable-canary@1.0.0-canary-26460a2-20240710092718' + '@rspack/binding': 1.0.0-alpha.3 + '@rspack/lite-tapable': 1.0.0-alpha.3 caniuse-lite: 1.0.30001640 optionalDependencies: '@swc/helpers': 0.5.11 - '@rspack/lite-tapable-canary@1.0.0-canary-26460a2-20240710092718': {} + '@rspack/lite-tapable@1.0.0-alpha.2': {} + + '@rspack/lite-tapable@1.0.0-alpha.3': {} '@sinclair/typebox@0.27.8': {} @@ -4943,9 +4949,11 @@ snapshots: hosted-git-info@2.8.9: {} - html-rspack-plugin@5.7.2(@rspack/core-canary@1.0.0-canary-26460a2-20240710092718(@swc/helpers@0.5.11)): + html-rspack-plugin@6.0.0-beta.5(@rspack/core@1.0.0-alpha.3(@swc/helpers@0.5.11)): + dependencies: + '@rspack/lite-tapable': 1.0.0-alpha.2 optionalDependencies: - '@rspack/core': '@rspack/core-canary@1.0.0-canary-26460a2-20240710092718(@swc/helpers@0.5.11)' + '@rspack/core': 1.0.0-alpha.3(@swc/helpers@0.5.11) human-id@1.0.2: {}