Skip to content

Commit 11eefd5

Browse files
committed
added import(), fixes webpack#3098
1 parent 1ad3a6f commit 11eefd5

25 files changed

Lines changed: 201 additions & 131 deletions

File tree

lib/Parser.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5-
var acorn = require("acorn");
5+
var acorn = require("acorn-dynamic-import").default;
66
var Tapable = require("tapable");
77
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
88

@@ -838,6 +838,7 @@ Parser.prototype.walkClassExpression = function walkClassExpression(expression)
838838
};
839839

840840
Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
841+
var result;
841842
function walkIIFE(functionExpression, args) {
842843
var params = functionExpression.params;
843844
args = args.map(function(arg) {
@@ -875,11 +876,18 @@ Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
875876
} else if(expression.callee.type === "FunctionExpression" && expression.arguments) {
876877
// (function(...) { }(...))
877878
walkIIFE.call(this, expression.callee, expression.arguments);
879+
} else if(expression.callee.type === "Import") {
880+
result = this.applyPluginsBailResult1("import-call", expression);
881+
if(result === true)
882+
return;
883+
884+
if(expression.arguments)
885+
this.walkExpressions(expression.arguments);
878886
} else {
879887

880888
var callee = this.evaluateExpression(expression.callee);
881889
if(callee.isIdentifier()) {
882-
var result = this.applyPluginsBailResult("call " + callee.identifier, expression);
890+
result = this.applyPluginsBailResult("call " + callee.identifier, expression);
883891
if(result === true)
884892
return;
885893
}
@@ -1077,12 +1085,14 @@ var POSSIBLE_AST_OPTIONS = [{
10771085
ranges: true,
10781086
locations: true,
10791087
ecmaVersion: 2017,
1080-
sourceType: "module"
1088+
sourceType: "module",
1089+
plugins: { dynamicImport: true }
10811090
}, {
10821091
ranges: true,
10831092
locations: true,
10841093
ecmaVersion: 2017,
1085-
sourceType: "script"
1094+
sourceType: "script",
1095+
plugins: { dynamicImport: true }
10861096
}]
10871097

10881098
Parser.prototype.parse = function parse(source, initialState) {
@@ -1105,6 +1115,7 @@ Parser.prototype.parse = function parse(source, initialState) {
11051115
locations: true,
11061116
ecmaVersion: 2017,
11071117
sourceType: "module",
1118+
plugins: { dynamicImport: true },
11081119
onComment: comments
11091120
});
11101121
}
@@ -1130,7 +1141,8 @@ Parser.prototype.evaluate = function evaluate(source) {
11301141
ranges: true,
11311142
locations: true,
11321143
ecmaVersion: 2017,
1133-
sourceType: "module"
1144+
sourceType: "module",
1145+
plugins: { dynamicImport: true }
11341146
});
11351147
if(!ast || typeof ast !== "object" || ast.type !== "Program")
11361148
throw new Error("evaluate: Source couldn't be parsed");

lib/WebpackOptionsApply.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var LoaderPlugin = require("./dependencies/LoaderPlugin");
2828
var CommonJsPlugin = require("./dependencies/CommonJsPlugin");
2929
var HarmonyModulesPlugin = require("./dependencies/HarmonyModulesPlugin");
3030
var SystemPlugin = require("./dependencies/SystemPlugin");
31+
var ImportPlugin = require("./dependencies/ImportPlugin");
3132
var AMDPlugin = require("./dependencies/AMDPlugin");
3233
var RequireContextPlugin = require("./dependencies/RequireContextPlugin");
3334
var RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
@@ -248,6 +249,7 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
248249
new AMDPlugin(options.module, options.amd || {}),
249250
new CommonJsPlugin(options.module),
250251
new HarmonyModulesPlugin(options.module),
252+
new ImportPlugin(options.module),
251253
new SystemPlugin(options.module)
252254
);
253255

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ContextDependency = require("./ContextDependency");
6+
var CriticalDependencyWarning = require("./CriticalDependencyWarning");
7+
8+
function ImportContextDependency(request, recursive, regExp, range, valueRange) {
9+
ContextDependency.call(this, request, recursive, regExp);
10+
this.range = range;
11+
this.valueRange = valueRange;
12+
this.async = true;
13+
}
14+
module.exports = ImportContextDependency;
15+
16+
ImportContextDependency.prototype = Object.create(ContextDependency.prototype);
17+
ImportContextDependency.prototype.constructor = ImportContextDependency;
18+
ImportContextDependency.prototype.type = "System.import context";
19+
20+
ImportContextDependency.prototype.getWarnings = function() {
21+
if(this.critical) {
22+
return [
23+
new CriticalDependencyWarning(this.critical)
24+
];
25+
}
26+
};
27+
28+
ImportContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
6+
var ImportDependency = require("./ImportDependency");
7+
8+
function ImportDependenciesBlock(request, range, module, loc) {
9+
AsyncDependenciesBlock.call(this, null, module, loc);
10+
this.range = range;
11+
var dep = new ImportDependency(request, this);
12+
dep.loc = loc;
13+
this.addDependency(dep);
14+
}
15+
module.exports = ImportDependenciesBlock;
16+
17+
ImportDependenciesBlock.prototype = Object.create(AsyncDependenciesBlock.prototype);
18+
ImportDependenciesBlock.prototype.constructor = ImportDependenciesBlock;

lib/dependencies/SystemImportDependency.js renamed to lib/dependencies/ImportDependency.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ var ModuleDependency = require("./ModuleDependency");
66
var DepBlockHelpers = require("./DepBlockHelpers");
77
var WebpackMissingModule = require("./WebpackMissingModule");
88

9-
function SystemImportDependency(request, block) {
9+
function ImportDependency(request, block) {
1010
ModuleDependency.call(this, request);
1111
this.block = block;
1212
}
13-
module.exports = SystemImportDependency;
13+
module.exports = ImportDependency;
1414

15-
SystemImportDependency.prototype = Object.create(ModuleDependency.prototype);
16-
SystemImportDependency.prototype.constructor = SystemImportDependency;
17-
SystemImportDependency.prototype.type = "System.import";
15+
ImportDependency.prototype = Object.create(ModuleDependency.prototype);
16+
ImportDependency.prototype.constructor = ImportDependency;
17+
ImportDependency.prototype.type = "import()";
1818

19-
SystemImportDependency.Template = function SystemImportDependencyTemplate() {};
19+
ImportDependency.Template = function ImportDependencyTemplate() {};
2020

21-
SystemImportDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
21+
ImportDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
2222
var depBlock = dep.block;
23-
var promise = DepBlockHelpers.getDepBlockPromise(depBlock, outputOptions, requestShortener, "System.import");
23+
var promise = DepBlockHelpers.getDepBlockPromise(depBlock, outputOptions, requestShortener, "import()");
2424
var comment = "";
2525
if(outputOptions.pathinfo) comment = "/*! " + requestShortener.shorten(dep.request) + " */ ";
2626
if(promise && dep.module) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ImportContextDependency = require("./ImportContextDependency");
6+
var ImportDependenciesBlock = require("./ImportDependenciesBlock");
7+
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
8+
9+
function ImportParserPlugin(options) {
10+
this.options = options;
11+
}
12+
13+
module.exports = ImportParserPlugin;
14+
15+
ImportParserPlugin.prototype.apply = function(parser) {
16+
var options = this.options;
17+
parser.plugin(["call System.import", "import-call"], function(expr) {
18+
if(expr.arguments.length !== 1)
19+
throw new Error("Incorrect number of arguments provided to 'import(module: string) -> Promise'.");
20+
var dep;
21+
var param = this.evaluateExpression(expr.arguments[0]);
22+
if(param.isString()) {
23+
var depBlock = new ImportDependenciesBlock(param.string, expr.range, this.state.module, expr.loc);
24+
this.state.current.addBlock(depBlock);
25+
return true;
26+
} else {
27+
dep = ContextDependencyHelpers.create(ImportContextDependency, expr.range, param, expr, options);
28+
if(!dep) return;
29+
dep.loc = expr.loc;
30+
dep.optional = !!this.scope.inTry;
31+
this.state.current.addDependency(dep);
32+
return true;
33+
}
34+
});
35+
};

lib/dependencies/ImportPlugin.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ImportDependency = require("./ImportDependency");
6+
var ImportContextDependency = require("./ImportContextDependency");
7+
8+
var UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
9+
var ConstDependency = require("./ConstDependency");
10+
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
11+
12+
var ImportParserPlugin = require("./ImportParserPlugin");
13+
14+
function ImportPlugin(options) {
15+
this.options = options;
16+
}
17+
module.exports = ImportPlugin;
18+
19+
ImportPlugin.prototype.apply = function(compiler) {
20+
var options = this.options;
21+
compiler.plugin("compilation", function(compilation, params) {
22+
var normalModuleFactory = params.normalModuleFactory;
23+
var contextModuleFactory = params.contextModuleFactory;
24+
25+
compilation.dependencyFactories.set(ImportDependency, normalModuleFactory);
26+
compilation.dependencyTemplates.set(ImportDependency, new ImportDependency.Template());
27+
28+
compilation.dependencyFactories.set(ImportContextDependency, contextModuleFactory);
29+
compilation.dependencyTemplates.set(ImportContextDependency, new ImportContextDependency.Template());
30+
31+
params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
32+
33+
if(typeof parserOptions.import !== "undefined" && !parserOptions.import)
34+
return;
35+
36+
parser.apply(
37+
new ImportParserPlugin(options)
38+
);
39+
});
40+
});
41+
};

lib/dependencies/SystemImportContextDependency.js

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

lib/dependencies/SystemImportDependenciesBlock.js

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

lib/dependencies/SystemImportParserPlugin.js

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

0 commit comments

Comments
 (0)