diff --git a/e2e/cases/output/charset/index.test.ts b/e2e/cases/output/charset/index.test.ts index 1a1a813e71..f4ce4c8b0a 100644 --- a/e2e/cases/output/charset/index.test.ts +++ b/e2e/cases/output/charset/index.test.ts @@ -1,7 +1,42 @@ -import { build } from '@e2e/helper'; +import { build, dev, rspackOnlyTest } from '@e2e/helper'; import { expect, test } from '@playwright/test'; -test('should allow to set output.charset to ascii', async ({ page }) => { +rspackOnlyTest( + 'should allow to set output.charset to ascii in development mode', + async ({ page }) => { + const rsbuild = await dev({ + cwd: __dirname, + page, + rsbuildConfig: { + dev: { + writeToDisk: true, + }, + output: { + charset: 'ascii', + }, + }, + }); + + expect(await page.evaluate('window.a')).toBe('你好 world!'); + + const files = await rsbuild.getDistFiles(); + + const [, content] = Object.entries(files).find( + ([name]) => name.endsWith('.js') && name.includes('static/js/index'), + )!; + + // in Rspack is: \\u4f60\\u597D world! + expect( + content.toLocaleLowerCase().includes('\\u4f60\\u597d world!'), + ).toBeTruthy(); + + await rsbuild.close(); + }, +); + +test('should allow to set output.charset to ascii in production mode', async ({ + page, +}) => { const rsbuild = await build({ cwd: __dirname, page, @@ -28,7 +63,9 @@ test('should allow to set output.charset to ascii', async ({ page }) => { await rsbuild.close(); }); -test('should allow to set output.charset to utf8', async ({ page }) => { +test('should allow to set output.charset to utf8 in production mode', async ({ + page, +}) => { const rsbuild = await build({ cwd: __dirname, rsbuildConfig: { diff --git a/packages/core/src/plugins/swc.ts b/packages/core/src/plugins/swc.ts index da6e89cd79..b2de020dd3 100644 --- a/packages/core/src/plugins/swc.ts +++ b/packages/core/src/plugins/swc.ts @@ -62,10 +62,15 @@ function applyScriptCondition({ } } -function getDefaultSwcConfig( - browserslist: string[], - cacheRoot: string, -): SwcLoaderOptions { +function getDefaultSwcConfig({ + browserslist, + cacheRoot, + config, +}: { + browserslist: string[]; + cacheRoot: string; + config: NormalizedEnvironmentConfig; +}): SwcLoaderOptions { return { jsc: { externalHelpers: true, @@ -81,6 +86,9 @@ function getDefaultSwcConfig( */ keepImportAttributes: true, }, + output: { + charset: config.output.charset, + }, }, isModule: 'unknown', env: { @@ -137,7 +145,11 @@ export const pluginSwc = (): RsbuildPlugin => ({ return; } - const swcConfig = getDefaultSwcConfig(browserslist, cacheRoot); + const swcConfig = getDefaultSwcConfig({ + browserslist, + cacheRoot, + config, + }); applyTransformImport(swcConfig, config.source.transformImport); applySwcDecoratorConfig(swcConfig, config); diff --git a/packages/core/tests/__snapshots__/builder.test.ts.snap b/packages/core/tests/__snapshots__/builder.test.ts.snap index 7ff38ad805..0781524d6c 100644 --- a/packages/core/tests/__snapshots__/builder.test.ts.snap +++ b/packages/core/tests/__snapshots__/builder.test.ts.snap @@ -147,6 +147,9 @@ exports[`should use Rspack as the default bundler > apply Rspack correctly 1`] = "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -196,6 +199,9 @@ exports[`should use Rspack as the default bundler > apply Rspack correctly 1`] = "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/core/tests/__snapshots__/default.test.ts.snap b/packages/core/tests/__snapshots__/default.test.ts.snap index 51aa1d62d3..eceef3fe2d 100644 --- a/packages/core/tests/__snapshots__/default.test.ts.snap +++ b/packages/core/tests/__snapshots__/default.test.ts.snap @@ -147,6 +147,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -196,6 +199,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -625,6 +631,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly when prod "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -674,6 +683,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly when prod "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1103,6 +1115,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly when targe "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1148,6 +1163,9 @@ exports[`applyDefaultPlugins > should apply default plugins correctly when targe "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1539,6 +1557,9 @@ exports[`tools.rspack > should match snapshot 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1588,6 +1609,9 @@ exports[`tools.rspack > should match snapshot 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/core/tests/__snapshots__/environments.test.ts.snap b/packages/core/tests/__snapshots__/environments.test.ts.snap index 90c4c99c2a..883e8cb30e 100644 --- a/packages/core/tests/__snapshots__/environments.test.ts.snap +++ b/packages/core/tests/__snapshots__/environments.test.ts.snap @@ -1442,6 +1442,9 @@ exports[`environment config > tools.rspack / bundlerChain can be configured in e "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1491,6 +1494,9 @@ exports[`environment config > tools.rspack / bundlerChain can be configured in e "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1832,6 +1838,9 @@ exports[`environment config > tools.rspack / bundlerChain can be configured in e "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1877,6 +1886,9 @@ exports[`environment config > tools.rspack / bundlerChain can be configured in e "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/core/tests/__snapshots__/swc.test.ts.snap b/packages/core/tests/__snapshots__/swc.test.ts.snap index b4b0967035..a9e6d39b86 100644 --- a/packages/core/tests/__snapshots__/swc.test.ts.snap +++ b/packages/core/tests/__snapshots__/swc.test.ts.snap @@ -42,6 +42,9 @@ exports[`plugin-swc > should add browserslist 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -88,6 +91,9 @@ exports[`plugin-swc > should add browserslist 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -158,6 +164,9 @@ exports[`plugin-swc > should add pluginImport 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -214,6 +223,9 @@ exports[`plugin-swc > should add pluginImport 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -340,6 +352,9 @@ exports[`plugin-swc > should allow to use \`tools.swc\` to configure swc-loader "keepImportAttributes": true, }, "externalHelpers": false, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -389,6 +404,9 @@ exports[`plugin-swc > should allow to use \`tools.swc\` to configure swc-loader "keepImportAttributes": true, }, "externalHelpers": false, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -453,6 +471,9 @@ exports[`plugin-swc > should apply environment config correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -514,6 +535,9 @@ exports[`plugin-swc > should apply environment config correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -574,6 +598,9 @@ exports[`plugin-swc > should apply environment config correctly 2`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -626,6 +653,9 @@ exports[`plugin-swc > should apply environment config correctly 2`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -695,6 +725,9 @@ exports[`plugin-swc > should apply pluginImport correctly when ConfigChain 1`] = "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -754,6 +787,9 @@ exports[`plugin-swc > should apply pluginImport correctly when ConfigChain 1`] = "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -834,6 +870,9 @@ exports[`plugin-swc > should disable pluginImport when return undefined 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -883,6 +922,9 @@ exports[`plugin-swc > should disable pluginImport when return undefined 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -949,6 +991,9 @@ exports[`plugin-swc > should disable preset_env in target other than web 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -994,6 +1039,9 @@ exports[`plugin-swc > should disable preset_env in target other than web 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1064,6 +1112,9 @@ exports[`plugin-swc > should disable preset_env mode 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1113,6 +1164,9 @@ exports[`plugin-swc > should disable preset_env mode 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1190,6 +1244,9 @@ exports[`plugin-swc > should enable entry mode preset_env 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1243,6 +1300,9 @@ exports[`plugin-swc > should enable entry mode preset_env 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1320,6 +1380,9 @@ exports[`plugin-swc > should enable usage mode preset_env 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1374,6 +1437,9 @@ exports[`plugin-swc > should enable usage mode preset_env 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1451,6 +1517,9 @@ exports[`plugin-swc > should has correct core-js 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1504,6 +1573,9 @@ exports[`plugin-swc > should has correct core-js 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1570,6 +1642,9 @@ exports[`plugin-swc > should has correct core-js 2`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -1615,6 +1690,9 @@ exports[`plugin-swc > should has correct core-js 2`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/plugin-babel/tests/__snapshots__/index.test.ts.snap b/packages/plugin-babel/tests/__snapshots__/index.test.ts.snap index 62b50388e7..8c5b2d3005 100644 --- a/packages/plugin-babel/tests/__snapshots__/index.test.ts.snap +++ b/packages/plugin-babel/tests/__snapshots__/index.test.ts.snap @@ -40,6 +40,9 @@ exports[`plugins/babel > babel-loader should works with builtin:swc-loader 1`] = "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -123,6 +126,9 @@ exports[`plugins/babel > should apply environment config correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -202,6 +208,9 @@ exports[`plugins/babel > should apply environment config correctly 2`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -284,6 +293,9 @@ exports[`plugins/babel > should set babel-loader 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -364,6 +376,9 @@ exports[`plugins/babel > should set babel-loader when config is add 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/plugin-react/tests/__snapshots__/index.test.ts.snap b/packages/plugin-react/tests/__snapshots__/index.test.ts.snap index 791ebfb326..91557d4361 100644 --- a/packages/plugin-react/tests/__snapshots__/index.test.ts.snap +++ b/packages/plugin-react/tests/__snapshots__/index.test.ts.snap @@ -44,6 +44,9 @@ exports[`plugins/react > should configuring \`tools.swc\` to override react runt "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -130,6 +133,9 @@ exports[`plugins/react > should work with swc-loader 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/plugin-svelte/tests/__snapshots__/index.test.ts.snap b/packages/plugin-svelte/tests/__snapshots__/index.test.ts.snap index 8292525e5d..d6a708dbc1 100644 --- a/packages/plugin-svelte/tests/__snapshots__/index.test.ts.snap +++ b/packages/plugin-svelte/tests/__snapshots__/index.test.ts.snap @@ -47,6 +47,9 @@ exports[`plugin-svelte > should add rule for \`.svelte.js\` and \`.svelte.ts\` a "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -103,6 +106,9 @@ exports[`plugin-svelte > should add rule for \`.svelte.js\` and \`.svelte.ts\` a "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -161,6 +167,9 @@ exports[`plugin-svelte > should add rule for \`.svelte.js\` and \`.svelte.ts\` a "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -217,6 +226,9 @@ exports[`plugin-svelte > should add rule for \`.svelte.js\` and \`.svelte.ts\` a "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -258,6 +270,9 @@ exports[`plugin-svelte > should add svelte loader and resolve config properly 1` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -354,6 +369,9 @@ exports[`plugin-svelte > should override default svelte-loader options throw opt "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -406,6 +424,9 @@ exports[`plugin-svelte > should set dev and hotReload to false in production mod "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -462,6 +483,9 @@ exports[`plugin-svelte > should support pass custom preprocess options 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -518,6 +542,9 @@ exports[`plugin-svelte > should turn off HMR by hand correctly 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", diff --git a/packages/plugin-svgr/tests/__snapshots__/index.test.ts.snap b/packages/plugin-svgr/tests/__snapshots__/index.test.ts.snap index 8a1bf0f434..1ef9dfd98f 100644 --- a/packages/plugin-svgr/tests/__snapshots__/index.test.ts.snap +++ b/packages/plugin-svgr/tests/__snapshots__/index.test.ts.snap @@ -41,6 +41,9 @@ exports[`svgr > configure SVGR options 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -138,6 +141,9 @@ exports[`svgr > exportType default / mixedImport false 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -203,6 +209,9 @@ exports[`svgr > exportType default / mixedImport false 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -299,6 +308,9 @@ exports[`svgr > exportType default / mixedImport true 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -364,6 +376,9 @@ exports[`svgr > exportType default / mixedImport true 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -460,6 +475,9 @@ exports[`svgr > exportType named / mixedImport false 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -525,6 +543,9 @@ exports[`svgr > exportType named / mixedImport false 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -621,6 +642,9 @@ exports[`svgr > exportType named / mixedImport true 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript", @@ -686,6 +710,9 @@ exports[`svgr > exportType named / mixedImport true 1`] = ` "keepImportAttributes": true, }, "externalHelpers": true, + "output": { + "charset": "utf8", + }, "parser": { "decorators": true, "syntax": "typescript",