Skip to content

Commit a7a4184

Browse files
committed
remove error for CommonJs/AMD in ESM
there are too many weird modules detect harmony modules before parsing exports is now undefined in ESM module.exports is now read-only in ESM and returns undefined define is now undefined in ESM webpack#3917
1 parent f745f02 commit a7a4184

30 files changed

+178
-181
lines changed

buildin/harmony-module.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module.exports = function(originalModule) {
2+
if(!originalModule.webpackPolyfill) {
3+
var module = Object.create(originalModule);
4+
// module.parent = undefined by default
5+
if(!module.children) module.children = [];
6+
Object.defineProperty(module, "loaded", {
7+
enumerable: true,
8+
configurable: false,
9+
get: function() {
10+
return module.l;
11+
}
12+
});
13+
Object.defineProperty(module, "id", {
14+
enumerable: true,
15+
configurable: false,
16+
get: function() {
17+
return module.i;
18+
}
19+
});
20+
Object.defineProperty(module, "exports", {
21+
enumerable: true,
22+
configurable: false,
23+
get: function() {
24+
return undefined;
25+
}
26+
});
27+
module.webpackPolyfill = 1;
28+
}
29+
return module;
30+
};

lib/FunctionModuleTemplatePlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = FunctionModuleTemplatePlugin;
1010
FunctionModuleTemplatePlugin.prototype.apply = function(moduleTemplate) {
1111
moduleTemplate.plugin("render", function(moduleSource, module) {
1212
var source = new ConcatSource();
13-
var defaultArguments = ["module", "exports"];
13+
var defaultArguments = [module.moduleArgument || "module", module.exportsArgument || "exports"];
1414
if((module.arguments && module.arguments.length !== 0) || module.hasDependencies(d => d.requireWebpackRequire !== false)) {
1515
defaultArguments.push("__webpack_require__");
1616
}

lib/NodeStuffPlugin.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
2828
if(parserOptions.node)
2929
localOptions = Object.assign({}, localOptions, parserOptions.node);
3030

31-
function ignore() {
32-
return true;
33-
}
34-
3531
function setConstant(expressionName, value) {
3632
parser.plugin("expression " + expressionName, function() {
3733
this.state.current.addVariable(expressionName, JSON.stringify(value));
@@ -98,13 +94,20 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
9894
this.state.current.addDependency(dep);
9995
return true;
10096
});
101-
parser.plugin("expression module.exports", ignore);
97+
parser.plugin("expression module.exports", function() {
98+
var module = this.state.module;
99+
var isHarmony = module.meta && module.meta.harmonyModule;
100+
if(!isHarmony)
101+
return true;
102+
});
102103
parser.plugin("evaluate Identifier module.hot", function(expr) {
103104
return new BasicEvaluatedExpression().setBoolean(false).setRange(expr.range);
104105
});
105106
parser.plugin("expression module", function() {
106-
var moduleJsPath = path.join(__dirname, "..", "buildin", "module.js");
107-
if(this.state.module.context) {
107+
var module = this.state.module;
108+
var isHarmony = module.meta && module.meta.harmonyModule;
109+
var moduleJsPath = path.join(__dirname, "..", "buildin", isHarmony ? "harmony-module.js" : "module.js");
110+
if(module.context) {
108111
moduleJsPath = path.relative(this.state.module.context, moduleJsPath);
109112
if(!/^[A-Z]:/i.test(moduleJsPath)) {
110113
moduleJsPath = "./" + moduleJsPath.replace(/\\/g, "/");

lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,11 @@ AMDRequireDependenciesBlockParserPlugin.prototype.apply = function(parser) {
148148
} else if(param.isString()) {
149149
var dep, localModule;
150150
if(param.string === "require") {
151-
dep = new ConstDependency("__webpack_require__", param.string);
152-
} else if(["exports", "module"].indexOf(param.string) >= 0) {
153-
dep = new ConstDependency(param.string, param.range);
151+
dep = new ConstDependency("__webpack_require__", param.range);
152+
} else if(param.string === "module") {
153+
dep = new ConstDependency(this.state.module.moduleArgument || "module", param.range);
154+
} else if(param.string === "exports") {
155+
dep = new ConstDependency(this.state.module.exportsArgument || "exports", param.range);
154156
} else if(localModule = LocalModulesHelpers.getLocalModule(this.state, param.string)) { // eslint-disable-line no-cond-assign
155157
dep = new LocalModuleDependency(localModule, param.range);
156158
} else {

lib/dependencies/CommonJsInHarmonyDependency.js

Lines changed: 0 additions & 36 deletions
This file was deleted.

lib/dependencies/CommonJsInHarmonyDependencyParserPlugin.js

Lines changed: 0 additions & 37 deletions
This file was deleted.

lib/dependencies/CommonJsInHarmonyWarning.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

lib/dependencies/CommonJsPlugin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Author Tobias Koppers @sokra
44
*/
55
"use strict";
6+
67
var ConstDependency = require("./ConstDependency");
78
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
89
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");

lib/dependencies/HarmonyCompatiblilityDependency.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ HarmonyCompatiblilityDependency.Template = class HarmonyExportDependencyTemplate
2020
apply(dep, source) {
2121
const usedExports = dep.originModule.usedExports;
2222
if(usedExports && !Array.isArray(usedExports)) {
23-
const content = "Object.defineProperty(exports, \"__esModule\", { value: true });\n";
23+
const exportName = dep.originModule.exportsArgument || "exports";
24+
const content = `Object.defineProperty(${exportName}, \"__esModule\", { value: true });\n`;
2425
source.insert(-1, content);
2526
}
2627
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
"use strict";
6+
7+
const HarmonyCompatiblilityDependency = require("./HarmonyCompatiblilityDependency");
8+
9+
module.exports = class HarmonyDetectionParserPlugin {
10+
apply(parser) {
11+
parser.plugin("program", (ast) => {
12+
var isHarmony = ast.body.some(statement => {
13+
return /^(Import|Export).*Declaration$/.test(statement.type);
14+
});
15+
if(isHarmony) {
16+
let module = parser.state.module;
17+
const dep = new HarmonyCompatiblilityDependency(module);
18+
dep.loc = {
19+
start: {
20+
line: -1,
21+
column: 0
22+
},
23+
end: {
24+
line: -1,
25+
column: 0
26+
},
27+
index: -2
28+
};
29+
module.addDependency(dep);
30+
module.meta.harmonyModule = true;
31+
module.strict = true;
32+
module.exportsArgument = "__webpack_exports__";
33+
}
34+
});
35+
var nonHarmonyIdentifiers = ["define", "exports"];
36+
nonHarmonyIdentifiers.forEach(identifer => {
37+
parser.plugin(`evaluate typeof ${identifer}`, nullInHarmony);
38+
parser.plugin(`typeof ${identifer}`, skipInHarmony);
39+
parser.plugin(`evaluate ${identifer}`, nullInHarmony);
40+
parser.plugin(`expression ${identifer}`, skipInHarmony);
41+
parser.plugin(`call ${identifer}`, skipInHarmony);
42+
});
43+
44+
function skipInHarmony() {
45+
let module = this.state.module;
46+
if(module && module.meta && module.meta.harmonyModule)
47+
return true;
48+
}
49+
50+
function nullInHarmony() {
51+
let module = this.state.module;
52+
if(module && module.meta && module.meta.harmonyModule)
53+
return null;
54+
}
55+
}
56+
};

0 commit comments

Comments
 (0)