webpack/lib/dependencies/CommonJsRequireDependencyPa...

133 lines
3.9 KiB
JavaScript
Raw Normal View History

2013-01-31 01:49:25 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
2013-01-31 01:49:25 +08:00
const CommonJsRequireDependency = require("./CommonJsRequireDependency");
const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
const RequireHeaderDependency = require("./RequireHeaderDependency");
const LocalModuleDependency = require("./LocalModuleDependency");
const ContextDependencyHelpers = require("./ContextDependencyHelpers");
2018-07-27 04:37:36 +08:00
const { getLocalModule } = require("./LocalModulesHelpers");
2018-07-03 21:35:24 +08:00
const {
toConstantDependencyWithWebpackRequire
} = require("../JavascriptParserHelpers");
class CommonJsRequireDependencyParserPlugin {
constructor(options) {
this.options = options;
}
apply(parser) {
const options = this.options;
2017-11-27 22:27:41 +08:00
const processItem = (expr, param) => {
2018-02-25 09:00:20 +08:00
if (param.isString()) {
2017-11-27 22:27:41 +08:00
const dep = new CommonJsRequireDependency(param.string, param.range);
dep.loc = expr.loc;
dep.optional = !!parser.scope.inTry;
parser.state.current.addDependency(dep);
return true;
}
};
const processContext = (expr, param) => {
2018-02-25 09:00:20 +08:00
const dep = ContextDependencyHelpers.create(
CommonJsRequireContextDependency,
expr.range,
param,
expr,
options
);
if (!dep) return;
2017-11-27 22:27:41 +08:00
dep.loc = expr.loc;
dep.optional = !!parser.scope.inTry;
parser.state.current.addDependency(dep);
return true;
};
2018-02-25 09:00:20 +08:00
parser.hooks.expression
.for("require.cache")
.tap(
"CommonJsRequireDependencyParserPlugin",
2018-07-03 16:24:29 +08:00
toConstantDependencyWithWebpackRequire(parser, "__webpack_require__.c")
2018-02-25 09:00:20 +08:00
);
parser.hooks.expression
.for("require")
.tap("CommonJsRequireDependencyParserPlugin", expr => {
const dep = new CommonJsRequireContextDependency(
{
request: options.unknownContextRequest,
recursive: options.unknownContextRecursive,
regExp: options.unknownContextRegExp,
mode: "sync"
},
expr.range
);
dep.critical =
options.unknownContextCritical &&
"require function is used in a way in which dependencies cannot be statically extracted";
dep.loc = expr.loc;
2018-02-25 09:00:20 +08:00
dep.optional = !!parser.scope.inTry;
parser.state.current.addDependency(dep);
return true;
2018-02-25 09:00:20 +08:00
});
2018-04-04 03:47:41 +08:00
2018-04-06 14:53:40 +08:00
const createHandler = callNew => expr => {
2018-04-01 23:21:26 +08:00
if (expr.arguments.length !== 1) return;
let localModule;
const param = parser.evaluateExpression(expr.arguments[0]);
if (param.isConditional()) {
let isExpression = false;
const prevLength = parser.state.current.dependencies.length;
const dep = new RequireHeaderDependency(expr.callee.range);
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
for (const p of param.options) {
const result = processItem(expr, p);
if (result === undefined) {
isExpression = true;
2018-02-25 09:00:20 +08:00
}
}
2018-04-01 23:21:26 +08:00
if (isExpression) {
parser.state.current.dependencies.length = prevLength;
2018-02-25 09:00:20 +08:00
} else {
return true;
}
2018-04-01 23:21:26 +08:00
}
if (
param.isString() &&
2018-07-27 04:37:36 +08:00
(localModule = getLocalModule(parser.state, param.string))
2018-04-01 23:21:26 +08:00
) {
2018-04-06 14:30:26 +08:00
const dep = new LocalModuleDependency(localModule, expr.range, callNew);
2018-04-01 23:21:26 +08:00
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
return true;
} else {
const result = processItem(expr, param);
if (result === undefined) {
processContext(expr, param);
} else {
const dep = new RequireHeaderDependency(expr.callee.range);
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
}
return true;
}
2018-04-04 03:47:41 +08:00
};
parser.hooks.call
.for("require")
2018-04-06 14:53:40 +08:00
.tap("CommonJsRequireDependencyParserPlugin", createHandler(false));
2018-04-04 03:47:41 +08:00
parser.hooks.new
.for("require")
2018-04-06 14:53:40 +08:00
.tap("CommonJsRequireDependencyParserPlugin", createHandler(true));
parser.hooks.call
.for("module.require")
.tap("CommonJsRequireDependencyParserPlugin", createHandler(false));
parser.hooks.new
.for("module.require")
.tap("CommonJsRequireDependencyParserPlugin", createHandler(true));
}
}
module.exports = CommonJsRequireDependencyParserPlugin;