Skip to content

Commit 8c8544a

Browse files
committed
Produce correct code and emit better error
when trying to use unsupported AMD construct fixes webpack#2360
1 parent b3bc542 commit 8c8544a

File tree

5 files changed

+56
-2
lines changed

5 files changed

+56
-2
lines changed

lib/dependencies/AMDPlugin.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var AMDRequireItemDependency = require("./AMDRequireItemDependency");
88
var AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
99
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
1010
var AMDDefineDependency = require("./AMDDefineDependency");
11+
var UnsupportedDependency = require("./UnsupportedDependency");
1112
var LocalModuleDependency = require("./LocalModuleDependency");
1213
var ConstDependency = require("./ConstDependency");
1314

@@ -68,6 +69,9 @@ AMDPlugin.prototype.apply = function(compiler) {
6869
compilation.dependencyFactories.set(AMDDefineDependency, new NullFactory());
6970
compilation.dependencyTemplates.set(AMDDefineDependency, new AMDDefineDependency.Template());
7071

72+
compilation.dependencyFactories.set(UnsupportedDependency, new NullFactory());
73+
compilation.dependencyTemplates.set(UnsupportedDependency, new UnsupportedDependency.Template());
74+
7175
compilation.dependencyFactories.set(LocalModuleDependency, new NullFactory());
7276
compilation.dependencyTemplates.set(LocalModuleDependency, new LocalModuleDependency.Template());
7377
});

lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ var AMDRequireItemDependency = require("./AMDRequireItemDependency");
66
var AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
77
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
88
var AMDRequireDependenciesBlock = require("./AMDRequireDependenciesBlock");
9+
var UnsupportedDependency = require("./UnsupportedDependency");
910
var LocalModuleDependency = require("./LocalModuleDependency");
1011
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
1112
var LocalModulesHelpers = require("./LocalModulesHelpers");
1213
var ConstDependency = require("./ConstDependency");
1314
var getFunctionExpression = require("./getFunctionExpression");
15+
var UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
1416

1517
function AMDRequireDependenciesBlockParserPlugin(options) {
1618
this.options = options;
@@ -48,7 +50,14 @@ AMDRequireDependenciesBlockParserPlugin.prototype.apply = function(parser) {
4850
this.inScope([], function() {
4951
result = this.applyPluginsBailResult("call require:amd:array", expr, param);
5052
}.bind(this));
51-
if(!result) return;
53+
if(!result) {
54+
dep = new UnsupportedDependency("unsupported", expr.range);
55+
old.addDependency(dep);
56+
if(this.state.module)
57+
this.state.module.errors.push(new UnsupportedFeatureWarning(this.state.module, "Cannot statically analyse 'require(..., ...)' in line " + expr.loc.start.line));
58+
dep = null;
59+
return true;
60+
}
5261
var fnData = getFunctionExpression(expr.arguments[1]);
5362
if(fnData) {
5463
this.inScope(fnData.fn.params.filter(function(i) {
@@ -69,7 +78,8 @@ AMDRequireDependenciesBlockParserPlugin.prototype.apply = function(parser) {
6978
}
7079
} finally {
7180
this.state.current = old;
72-
this.state.current.addBlock(dep);
81+
if(dep)
82+
this.state.current.addBlock(dep);
7383
}
7484
return true;
7585
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var NullDependency = require("./NullDependency");
6+
var DepBlockHelpers = require("./DepBlockHelpers");
7+
8+
function UnsupportedDependency(request, range) {
9+
NullDependency.call(this);
10+
this.request = request;
11+
this.range = range;
12+
}
13+
module.exports = UnsupportedDependency;
14+
15+
UnsupportedDependency.prototype = Object.create(NullDependency.prototype);
16+
UnsupportedDependency.prototype.constructor = UnsupportedDependency;
17+
18+
UnsupportedDependency.Template = function UnsupportedDependencyTemplate() {};
19+
20+
UnsupportedDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
21+
source.replace(dep.range[0], dep.range[1], require("./WebpackMissingModule").module(dep.request));
22+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = [
2+
[/Cannot statically analyse/, /in line 12/],
3+
[/Cannot statically analyse/, /in line 4/]
4+
];
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
it("should fail on unsupported use of AMD require 1", function() {
2+
(function() {
3+
var abc = ["./a", "./b"];
4+
require(abc, function(a, b) {});
5+
}).should.throw();
6+
});
7+
8+
it("should fail on unsupported use of AMD require 2", function() {
9+
(function() {
10+
var abc = ["./a", "./b"];
11+
function f(a, b) {}
12+
require(abc, f);
13+
}).should.throw();
14+
});

0 commit comments

Comments
 (0)