From 362935e34091c8e25f117b9c36bf3617b4af09c4 Mon Sep 17 00:00:00 2001 From: fi3ework Date: Mon, 26 Aug 2024 19:26:46 +0800 Subject: [PATCH] fix: ASI in concatenated module only when necessary --- lib/optimize/ConcatenatedModule.js | 17 +++++++++++++++-- .../scope-hoisting/issue-11897/cjs.js | 0 .../scope-hoisting/issue-11897/iife.js | 0 .../scope-hoisting/issue-11897/index.js | 0 .../scope-hoisting/issue-11897/module.js | 0 .../issue-11897/webpack.config.js | 6 ++++++ 6 files changed, 21 insertions(+), 2 deletions(-) rename test/{cases => configCases}/scope-hoisting/issue-11897/cjs.js (100%) rename test/{cases => configCases}/scope-hoisting/issue-11897/iife.js (100%) rename test/{cases => configCases}/scope-hoisting/issue-11897/index.js (100%) rename test/{cases => configCases}/scope-hoisting/issue-11897/module.js (100%) create mode 100644 test/configCases/scope-hoisting/issue-11897/webpack.config.js diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index 5321875cb..bd68f7767 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -146,6 +146,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) { * @property {string | undefined} interopNamespaceObject2Name * @property {boolean} interopDefaultAccessUsed * @property {string | undefined} interopDefaultAccessName + * @property {boolean} prefixAsi */ /** @@ -172,6 +173,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) { /** @typedef {Set} UsedNames */ +const CHARS_REQUIRING_SEMICOLON = ["[", "(", "+", "-", "/"]; const RESERVED_NAMES = new Set( [ // internal names (should always be renamed) @@ -1467,6 +1469,12 @@ class ConcatenatedModule extends Module { ); const r = /** @type {Range} */ (reference.identifier.range); const source = info.source; + + // in case finalName starts with a character that requires a semicolon + if (CHARS_REQUIRING_SEMICOLON.includes(finalName[0])) { + info.prefixAsi = true; + } + // range is extended by 2 chars to cover the appended "._" source.replace(r[0], r[1] + 1, finalName); } @@ -1660,10 +1668,13 @@ ${defineGetters}` switch (info.type) { case "concatenated": { result.add( - `\n;// CONCATENATED MODULE: ${info.module.readableIdentifier( + `\n// CONCATENATED MODULE: ${info.module.readableIdentifier( requestShortener )}\n` ); + if (/** @type {ConcatenatedModuleInfo} */ (rawInfo).prefixAsi) { + result.add(";"); + } result.add(info.source); if (info.chunkInitFragments) { for (const f of info.chunkInitFragments) chunkInitFragments.push(f); @@ -1825,6 +1836,7 @@ ${defineGetters}` info.chunkInitFragments = chunkInitFragments; info.globalScope = globalScope; info.moduleScope = moduleScope; + info.prefixAsi = CHARS_REQUIRING_SEMICOLON.includes(code[0]); } catch (err) { /** @type {Error} */ (err).message += @@ -1873,7 +1885,8 @@ ${defineGetters}` interopNamespaceObject2Used: false, interopNamespaceObject2Name: undefined, interopDefaultAccessUsed: false, - interopDefaultAccessName: undefined + interopDefaultAccessName: undefined, + prefixAsi: false }; break; case "external": diff --git a/test/cases/scope-hoisting/issue-11897/cjs.js b/test/configCases/scope-hoisting/issue-11897/cjs.js similarity index 100% rename from test/cases/scope-hoisting/issue-11897/cjs.js rename to test/configCases/scope-hoisting/issue-11897/cjs.js diff --git a/test/cases/scope-hoisting/issue-11897/iife.js b/test/configCases/scope-hoisting/issue-11897/iife.js similarity index 100% rename from test/cases/scope-hoisting/issue-11897/iife.js rename to test/configCases/scope-hoisting/issue-11897/iife.js diff --git a/test/cases/scope-hoisting/issue-11897/index.js b/test/configCases/scope-hoisting/issue-11897/index.js similarity index 100% rename from test/cases/scope-hoisting/issue-11897/index.js rename to test/configCases/scope-hoisting/issue-11897/index.js diff --git a/test/cases/scope-hoisting/issue-11897/module.js b/test/configCases/scope-hoisting/issue-11897/module.js similarity index 100% rename from test/cases/scope-hoisting/issue-11897/module.js rename to test/configCases/scope-hoisting/issue-11897/module.js diff --git a/test/configCases/scope-hoisting/issue-11897/webpack.config.js b/test/configCases/scope-hoisting/issue-11897/webpack.config.js new file mode 100644 index 000000000..c939ba33f --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +};