Skip to content

Commit 2cbd468

Browse files
authored
Merge pull request webpack#6250 from webpack/bugfix/json-concat
fix a bug with json modules in concatenated modules
2 parents 2fab927 + 87fdb61 commit 2cbd468

File tree

4 files changed

+60
-24
lines changed

4 files changed

+60
-24
lines changed

lib/optimize/ConcatenatedModule.js

Lines changed: 57 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,46 @@ const ensureNsObjSource = (info, moduleToInfoMap, requestShortener, strictHarmon
3434
};
3535

3636
const getExternalImport = (importedModule, info, exportName, asCall, strictHarmonyModule) => {
37-
if(exportName === true) {
38-
if(info.interop && strictHarmonyModule) {
39-
return `Object(/* fake namespace object for non-esm import */{ "default": ${info.name} })`;
40-
}
41-
return info.name;
42-
}
4337
const used = importedModule.isUsed(exportName);
4438
if(!used) return "/* unused reexport */undefined";
45-
if(info.interop && strictHarmonyModule) {
46-
if(exportName === "default") {
47-
return info.name;
48-
} else {
49-
return "/* non-default import from non-esm module */undefined";
50-
}
51-
}
52-
if(info.interop && exportName === "default") {
53-
return asCall ? `${info.interopName}()` : `${info.interopName}.a`;
54-
}
5539
const comment = used !== exportName ? ` ${Template.toNormalComment(exportName)}` : "";
40+
switch(importedModule.buildMeta.exportsType) {
41+
case "named":
42+
if(exportName === "default") {
43+
return info.name;
44+
} else if(exportName === true) {
45+
info.interopNamespaceObjectUsed = true;
46+
return info.interopNamespaceObjectName;
47+
} else {
48+
break;
49+
}
50+
case "namespace":
51+
if(exportName === true) {
52+
return info.name;
53+
} else {
54+
break;
55+
}
56+
default:
57+
if(strictHarmonyModule) {
58+
if(exportName === "default") {
59+
return info.name;
60+
} else if(exportName === true) {
61+
info.interopNamespaceObjectUsed = true;
62+
return info.interopNamespaceObjectName;
63+
} else {
64+
return "/* non-default import from non-esm module */undefined";
65+
}
66+
} else {
67+
if(exportName === "default") {
68+
info.interopDefaultAccessUsed = true;
69+
return asCall ? `${info.interopDefaultAccessName}()` : `${info.interopDefaultAccessName}.a`;
70+
} else if(exportName === true) {
71+
return info.name;
72+
} else {
73+
break;
74+
}
75+
}
76+
}
5677
const reference = `${info.name}[${JSON.stringify(used)}${comment}]`;
5778
if(asCall)
5879
return `Object(${reference})`;
@@ -407,8 +428,10 @@ class ConcatenatedModule extends Module {
407428
module: info.module,
408429
index: idx,
409430
name: undefined,
410-
interopName: undefined,
411-
interop: undefined
431+
interopNamespaceObjectUsed: false,
432+
interopNamespaceObjectName: undefined,
433+
interopDefaultAccessUsed: false,
434+
interopDefaultAccessName: undefined
412435
};
413436
default:
414437
throw new Error(`Unsupported concatenation entry type ${info.type}`);
@@ -579,14 +602,18 @@ class ConcatenatedModule extends Module {
579602
}
580603
case "external":
581604
{
582-
info.interop = info.module.buildMeta && !info.module.buildMeta.exportsType;
583605
const externalName = this.findNewName("", allUsedNames, null, info.module.readableIdentifier(requestShortener));
584606
allUsedNames.add(externalName);
585607
info.name = externalName;
586-
if(info.interop) {
608+
if(info.module.buildMeta.exportsType === "named" || !info.module.buildMeta.exportsType) {
609+
const externalNameInterop = this.findNewName("namespaceObject", allUsedNames, null, info.module.readableIdentifier(requestShortener));
610+
allUsedNames.add(externalNameInterop);
611+
info.interopNamespaceObjectName = externalNameInterop;
612+
}
613+
if(!info.module.buildMeta.exportsType) {
587614
const externalNameInterop = this.findNewName("default", allUsedNames, null, info.module.readableIdentifier(requestShortener));
588615
allUsedNames.add(externalNameInterop);
589-
info.interopName = externalNameInterop;
616+
info.interopDefaultAccessName = externalNameInterop;
590617
}
591618
break;
592619
}
@@ -646,8 +673,15 @@ class ConcatenatedModule extends Module {
646673
case "external":
647674
result.add(`\n// EXTERNAL MODULE: ${info.module.readableIdentifier(requestShortener)}\n`);
648675
result.add(`var ${info.name} = __webpack_require__(${JSON.stringify(info.module.id)});\n`);
649-
if(info.interop) {
650-
result.add(`var ${info.interopName} = /*#__PURE__*/__webpack_require__.n(${info.name});\n`);
676+
if(info.interopNamespaceObjectUsed) {
677+
if(info.module.buildMeta.exportsType === "named") {
678+
result.add(`var ${info.interopNamespaceObjectName} = /*#__PURE__*/Object.assign({ /* fake namespace object */ }, ${info.name}, { "default": ${info.name} });\n`);
679+
} else if(!info.module.buildMeta.exportsType) {
680+
result.add(`var ${info.interopNamespaceObjectName} = /*#__PURE__*/{ /* fake namespace object */ "default": ${info.name} };\n`);
681+
}
682+
}
683+
if(info.interopDefaultAccessUsed) {
684+
result.add(`var ${info.interopDefaultAccessName} = /*#__PURE__*/__webpack_require__.n(${info.name});\n`);
651685
}
652686
break;
653687
default:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "../import-by-name";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "../import-with-default";

test/statsCases/parse-error/expected.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Asset Size Chunks Chunk Names
2-
main.js 3.09 KiB 0 main
2+
main.js 3.04 KiB 0 main
33
[0] ./b.js 169 bytes {0} [built] [failed] [1 error]
44
[1] ./index.js + 1 modules 35 bytes {0} [built]
55
| ./index.js 15 bytes [built]

0 commit comments

Comments
 (0)