diff --git a/lib/dependencies/CommonJsImportsParserPlugin.js b/lib/dependencies/CommonJsImportsParserPlugin.js index 3340df1af..d9744396d 100644 --- a/lib/dependencies/CommonJsImportsParserPlugin.js +++ b/lib/dependencies/CommonJsImportsParserPlugin.js @@ -141,7 +141,9 @@ class CommonJsImportsParserPlugin { regExp: options.unknownContextRegExp, mode: "sync" }, - expr.range + expr.range, + undefined, + parser.scope.inShorthand ); dep.critical = options.unknownContextCritical && diff --git a/lib/dependencies/CommonJsRequireContextDependency.js b/lib/dependencies/CommonJsRequireContextDependency.js index 8536e6cfd..1f810db03 100644 --- a/lib/dependencies/CommonJsRequireContextDependency.js +++ b/lib/dependencies/CommonJsRequireContextDependency.js @@ -10,11 +10,12 @@ const ContextDependency = require("./ContextDependency"); const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall"); class CommonJsRequireContextDependency extends ContextDependency { - constructor(options, range, valueRange) { + constructor(options, range, valueRange, inShorthand) { super(options); this.range = range; this.valueRange = valueRange; + this.inShorthand = inShorthand; } get type() { @@ -26,6 +27,7 @@ class CommonJsRequireContextDependency extends ContextDependency { write(this.range); write(this.valueRange); + write(this.inShorthand); super.serialize(context); } @@ -35,6 +37,7 @@ class CommonJsRequireContextDependency extends ContextDependency { this.range = read(); this.valueRange = read(); + this.inShorthand = read(); super.deserialize(context); } diff --git a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js index 9b73dcb38..a6b8a0047 100644 --- a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +++ b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js @@ -5,6 +5,7 @@ "use strict"; +const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency"); const ContextDependency = require("./ContextDependency"); /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */ @@ -24,13 +25,16 @@ class ContextDependencyTemplateAsRequireCall extends ContextDependency.Template { runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements } ) { const dep = /** @type {ContextDependency} */ (dependency); - const moduleExports = runtimeTemplate.moduleExports({ + let moduleExports = runtimeTemplate.moduleExports({ module: moduleGraph.getModule(dep), chunkGraph, request: dep.request, runtimeRequirements }); + if (dep instanceof CommonJsRequireContextDependency && dep.inShorthand) { + moduleExports = `${dep.inShorthand}: ${moduleExports}`; + } if (moduleGraph.getModule(dep)) { if (dep.valueRange) { if (Array.isArray(dep.replaces)) { diff --git a/test/configCases/parsing/issue-14545/index.js b/test/configCases/parsing/issue-14545/index.js new file mode 100644 index 000000000..afaf9c0ba --- /dev/null +++ b/test/configCases/parsing/issue-14545/index.js @@ -0,0 +1,4 @@ +it("should generate valid code when 'require' encounters object shorthand syntax", function() { + expect(require("./module").obj.require).toEqual(require("./module").obj.r); + expect(require("./module").obj.require).toBeTypeOf("function"); +}); diff --git a/test/configCases/parsing/issue-14545/module.js b/test/configCases/parsing/issue-14545/module.js new file mode 100644 index 000000000..0b7649cbf --- /dev/null +++ b/test/configCases/parsing/issue-14545/module.js @@ -0,0 +1 @@ +export const obj = {require, r: require} diff --git a/test/configCases/parsing/issue-14545/webpack.config.js b/test/configCases/parsing/issue-14545/webpack.config.js new file mode 100644 index 000000000..91e80ba3b --- /dev/null +++ b/test/configCases/parsing/issue-14545/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + unknownContextRegExp: /^\.\//, + unknownContextCritical: false, + exprContextRegExp: /^\.\//, + exprContextCritical: false + } +};