From b8e0bcf8b402e92fae8a92fd1af25c81548a2e84 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 17 May 2023 21:47:54 +0300 Subject: [PATCH 1/4] fix: regression --- lib/dependencies/HarmonyExportExpressionDependency.js | 2 +- lib/util/propertyAccess.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dependencies/HarmonyExportExpressionDependency.js b/lib/dependencies/HarmonyExportExpressionDependency.js index 899372fe5ee..d9aa8d83f7e 100644 --- a/lib/dependencies/HarmonyExportExpressionDependency.js +++ b/lib/dependencies/HarmonyExportExpressionDependency.js @@ -174,7 +174,7 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla runtimeRequirements.add(RuntimeGlobals.exports); // This is a little bit incorrect as TDZ is not correct, but we can't use const. content = `/* harmony default export */ ${exportsName}${propertyAccess( - used + typeof used === "string" ? [used] : used )} = `; } else { content = `/* unused harmony default export */ var ${name} = `; diff --git a/lib/util/propertyAccess.js b/lib/util/propertyAccess.js index 50712a6127e..68869984f4b 100644 --- a/lib/util/propertyAccess.js +++ b/lib/util/propertyAccess.js @@ -11,7 +11,7 @@ const { } = require("../util/propertyName"); /** - * @param {ArrayLike} properties properties + * @param {Array} properties properties * @param {number} start start index * @returns {string} chain of property accesses */ From cba05da34eae5cf6cb4496c5d98f837f4f86b783 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 17 May 2023 22:30:08 +0300 Subject: [PATCH 2/4] test: added --- .../import-export-format-2/cjs-module.js | 3 ++ .../export-default-expression.js | 3 ++ .../harmony-module-2.js | 5 ++ .../harmony-module-3.js | 1 + .../import-export-format-2/harmony-module.js | 5 ++ .../import-export-format-2/index.js | 50 +++++++++++++++++++ .../import-export-format-2/webpack.config.js | 25 ++++++++++ 7 files changed, 92 insertions(+) create mode 100644 test/configCases/code-generation/import-export-format-2/cjs-module.js create mode 100644 test/configCases/code-generation/import-export-format-2/export-default-expression.js create mode 100644 test/configCases/code-generation/import-export-format-2/harmony-module-2.js create mode 100644 test/configCases/code-generation/import-export-format-2/harmony-module-3.js create mode 100644 test/configCases/code-generation/import-export-format-2/harmony-module.js create mode 100644 test/configCases/code-generation/import-export-format-2/index.js create mode 100644 test/configCases/code-generation/import-export-format-2/webpack.config.js diff --git a/test/configCases/code-generation/import-export-format-2/cjs-module.js b/test/configCases/code-generation/import-export-format-2/cjs-module.js new file mode 100644 index 00000000000..1286372d8b3 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/cjs-module.js @@ -0,0 +1,3 @@ +const foo = 42; + +module.exports = { foo }; diff --git a/test/configCases/code-generation/import-export-format-2/export-default-expression.js b/test/configCases/code-generation/import-export-format-2/export-default-expression.js new file mode 100644 index 00000000000..db070255f2c --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/export-default-expression.js @@ -0,0 +1,3 @@ +const ___CSS_LOADER_EXPORT___ = {}; +___CSS_LOADER_EXPORT___.locals = {}; +export default ___CSS_LOADER_EXPORT___; diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module-2.js b/test/configCases/code-generation/import-export-format-2/harmony-module-2.js new file mode 100644 index 00000000000..b3b6620c963 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module-2.js @@ -0,0 +1,5 @@ +export const baz = 11; + +import { mod3 } from "./index"; +console.log(mod3.apple); + diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module-3.js b/test/configCases/code-generation/import-export-format-2/harmony-module-3.js new file mode 100644 index 00000000000..11dbbe78d28 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module-3.js @@ -0,0 +1 @@ +export var apple = 45; diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module.js b/test/configCases/code-generation/import-export-format-2/harmony-module.js new file mode 100644 index 00000000000..b4f6c9f9a65 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module.js @@ -0,0 +1,5 @@ +export const bar = 42; + +const def = -12; +export default def; + diff --git a/test/configCases/code-generation/import-export-format-2/index.js b/test/configCases/code-generation/import-export-format-2/index.js new file mode 100644 index 00000000000..ed0e03c8b34 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/index.js @@ -0,0 +1,50 @@ +import { foo as cjsexport_harmonyimport } from "./cjs-module"; +import theDefault, { bar as harmonyexport_harmonyimport } from "./harmony-module"; +import theDefaultExpression from "./export-default-expression"; +const { harmonyexport_cjsimport } = require("./harmony-module").bar; +const harmonyexport_cjsimportdefault = require("./export-default-expression").default; +import { baz as harmonyexport_harmonyimport_2 } from "./harmony-module-2"; + +import * as mod3 from "./harmony-module-3"; +export { mod3 }; +export { theDefaultExpression } + +const { expectSourceToContain, expectSourceToMatch } = require("../../../helpers/expectSource"); +const regexEscape = require("../../../helpers/regexEscape.js"); + +// It's important to use propertyName when generating object members to ensure that the exported property name +// uses the same accessor syntax (quotes vs. dot notatation) as the imported property name on the other end +// (which needs to use propertyAccess). Else, minifiers such as Closure Compiler will not be able to minify correctly. +it("should use the same accessor syntax for import and export", function() { + + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8").toString(); + + // Reference these imports to generate uses in the source. + + cjsexport_harmonyimport; + harmonyexport_harmonyimport; + harmonyexport_cjsimport; + harmonyexport_harmonyimport_2; + theDefault; + theDefaultExpression; + harmonyexport_cjsimportdefault; + + /*********** DO NOT MATCH BELOW THIS LINE ***********/ + + // Checking harmonyexportinitfragment.js formation of standard export fragment + expectSourceToContain(source, "/* harmony export */ bar: () => (/* binding */ bar)"); + + // Checking formation of imports + expectSourceToMatch(source, `${regexEscape("const { harmonyexport_cjsimport } = (__webpack_require__(/*! ./harmony-module */ ")}\\d+${regexEscape(").bar);")}`); + expectSourceToMatch(source, `${regexEscape("const harmonyexport_cjsimportdefault = (__webpack_require__(/*! ./export-default-expression */ ")}\\d+${regexEscape(")[\"default\"]);")}`); + + // Checking concatenatedmodule.js formation of exports + expectSourceToContain(source, "mod3: () => (/* reexport */ harmony_module_3_namespaceObject)"); + + // Checking concatenatedmodule.js formation of namespace objects + expectSourceToContain(source, "apple: () => (apple)"); + + // Do not break default option + expectSourceToContain(source, "[\"default\"] = (___CSS_LOADER_EXPORT___)"); +}); diff --git a/test/configCases/code-generation/import-export-format-2/webpack.config.js b/test/configCases/code-generation/import-export-format-2/webpack.config.js new file mode 100644 index 00000000000..777d038c05b --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + environment: { + arrowFunction: true, + bigIntLiteral: false, + const: false, + destructuring: false, + forOf: false, + dynamicImport: true, + module: false + } + }, + node: { + __dirname: false, + __filename: false + }, + optimization: { + concatenateModules: true, + usedExports: true, + providedExports: true, + minimize: false, + mangleExports: false + } +}; From 06a1f0b38fb6d7cf24e6a2ce7e655e86b1ba3268 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 17 May 2023 22:35:37 +0300 Subject: [PATCH 3/4] revert: return type --- lib/util/propertyAccess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util/propertyAccess.js b/lib/util/propertyAccess.js index 68869984f4b..50712a6127e 100644 --- a/lib/util/propertyAccess.js +++ b/lib/util/propertyAccess.js @@ -11,7 +11,7 @@ const { } = require("../util/propertyName"); /** - * @param {Array} properties properties + * @param {ArrayLike} properties properties * @param {number} start start index * @returns {string} chain of property accesses */ From 81c8fbde2e0e4b8d2e30a5109dedc082ef8c09dc Mon Sep 17 00:00:00 2001 From: Sean Larkin Date: Wed, 17 May 2023 20:22:25 +0000 Subject: [PATCH 4/4] 5.83.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3cf570f8883..31c0801f4bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "5.83.0", + "version": "5.83.1", "author": "Tobias Koppers @sokra", "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", "license": "MIT",