aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js')
-rw-r--r--node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js b/node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
new file mode 100644
index 000000000..73b7d0c8c
--- /dev/null
+++ b/node_modules/webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
@@ -0,0 +1,102 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const RequireEnsureDependenciesBlock = require("./RequireEnsureDependenciesBlock");
+const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
+const getFunctionExpression = require("./getFunctionExpression");
+
+module.exports = class RequireEnsureDependenciesBlockParserPlugin {
+ apply(parser) {
+ parser.plugin("call require.ensure", expr => {
+ let chunkName = null;
+ let chunkNameRange = null;
+ let errorExpressionArg = null;
+ let errorExpression = null;
+ switch(expr.arguments.length) {
+ case 4:
+ {
+ const chunkNameExpr = parser.evaluateExpression(expr.arguments[3]);
+ if(!chunkNameExpr.isString()) return;
+ chunkNameRange = chunkNameExpr.range;
+ chunkName = chunkNameExpr.string;
+ }
+ // falls through
+ case 3:
+ {
+ errorExpressionArg = expr.arguments[2];
+ errorExpression = getFunctionExpression(errorExpressionArg);
+
+ if(!errorExpression && !chunkName) {
+ const chunkNameExpr = parser.evaluateExpression(expr.arguments[2]);
+ if(!chunkNameExpr.isString()) return;
+ chunkNameRange = chunkNameExpr.range;
+ chunkName = chunkNameExpr.string;
+ }
+ }
+ // falls through
+ case 2:
+ {
+ const dependenciesExpr = parser.evaluateExpression(expr.arguments[0]);
+ const dependenciesItems = dependenciesExpr.isArray() ? dependenciesExpr.items : [dependenciesExpr];
+ const successExpressionArg = expr.arguments[1];
+ const successExpression = getFunctionExpression(successExpressionArg);
+
+ if(successExpression) {
+ parser.walkExpressions(successExpression.expressions);
+ }
+ if(errorExpression) {
+ parser.walkExpressions(errorExpression.expressions);
+ }
+
+ const dep = new RequireEnsureDependenciesBlock(expr,
+ successExpression ? successExpression.fn : successExpressionArg,
+ errorExpression ? errorExpression.fn : errorExpressionArg,
+ chunkName, chunkNameRange, parser.state.module, expr.loc);
+ const old = parser.state.current;
+ parser.state.current = dep;
+ try {
+ let failed = false;
+ parser.inScope([], () => {
+ dependenciesItems.forEach(ee => {
+ if(ee.isString()) {
+ const edep = new RequireEnsureItemDependency(ee.string, ee.range);
+ edep.loc = dep.loc;
+ dep.addDependency(edep);
+ } else {
+ failed = true;
+ }
+ });
+ });
+ if(failed) {
+ return;
+ }
+ if(successExpression) {
+ if(successExpression.fn.body.type === "BlockStatement")
+ parser.walkStatement(successExpression.fn.body);
+ else
+ parser.walkExpression(successExpression.fn.body);
+ }
+ old.addBlock(dep);
+ } finally {
+ parser.state.current = old;
+ }
+ if(!successExpression) {
+ parser.walkExpression(successExpressionArg);
+ }
+ if(errorExpression) {
+ if(errorExpression.fn.body.type === "BlockStatement")
+ parser.walkStatement(errorExpression.fn.body);
+ else
+ parser.walkExpression(errorExpression.fn.body);
+ } else if(errorExpressionArg) {
+ parser.walkExpression(errorExpressionArg);
+ }
+ return true;
+ }
+ }
+ });
+ }
+};