123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const ConstDependency = require("./ConstDependency");
- const CommonJsRequireDependency = require("./CommonJsRequireDependency");
- const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
- const RequireResolveDependency = require("./RequireResolveDependency");
- const RequireResolveContextDependency = require("./RequireResolveContextDependency");
- const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
- const RequireHeaderDependency = require("./RequireHeaderDependency");
- const NullFactory = require("../NullFactory");
- const RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
- const CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
- const ParserHelpers = require("../ParserHelpers");
- class CommonJsPlugin {
- constructor(options) {
- this.options = options;
- }
- apply(compiler) {
- const options = this.options;
- compiler.hooks.compilation.tap(
- "CommonJsPlugin",
- (compilation, { contextModuleFactory, normalModuleFactory }) => {
- compilation.dependencyFactories.set(
- CommonJsRequireDependency,
- normalModuleFactory
- );
- compilation.dependencyTemplates.set(
- CommonJsRequireDependency,
- new CommonJsRequireDependency.Template()
- );
- compilation.dependencyFactories.set(
- CommonJsRequireContextDependency,
- contextModuleFactory
- );
- compilation.dependencyTemplates.set(
- CommonJsRequireContextDependency,
- new CommonJsRequireContextDependency.Template()
- );
- compilation.dependencyFactories.set(
- RequireResolveDependency,
- normalModuleFactory
- );
- compilation.dependencyTemplates.set(
- RequireResolveDependency,
- new RequireResolveDependency.Template()
- );
- compilation.dependencyFactories.set(
- RequireResolveContextDependency,
- contextModuleFactory
- );
- compilation.dependencyTemplates.set(
- RequireResolveContextDependency,
- new RequireResolveContextDependency.Template()
- );
- compilation.dependencyFactories.set(
- RequireResolveHeaderDependency,
- new NullFactory()
- );
- compilation.dependencyTemplates.set(
- RequireResolveHeaderDependency,
- new RequireResolveHeaderDependency.Template()
- );
- compilation.dependencyFactories.set(
- RequireHeaderDependency,
- new NullFactory()
- );
- compilation.dependencyTemplates.set(
- RequireHeaderDependency,
- new RequireHeaderDependency.Template()
- );
- const handler = (parser, parserOptions) => {
- if (parserOptions.commonjs !== undefined && !parserOptions.commonjs)
- return;
- const requireExpressions = [
- "require",
- "require.resolve",
- "require.resolveWeak"
- ];
- for (let expression of requireExpressions) {
- parser.hooks.typeof
- .for(expression)
- .tap(
- "CommonJsPlugin",
- ParserHelpers.toConstantDependency(
- parser,
- JSON.stringify("function")
- )
- );
- parser.hooks.evaluateTypeof
- .for(expression)
- .tap(
- "CommonJsPlugin",
- ParserHelpers.evaluateToString("function")
- );
- parser.hooks.evaluateIdentifier
- .for(expression)
- .tap(
- "CommonJsPlugin",
- ParserHelpers.evaluateToIdentifier(expression, true)
- );
- }
- parser.hooks.evaluateTypeof
- .for("module")
- .tap("CommonJsPlugin", ParserHelpers.evaluateToString("object"));
- parser.hooks.assign.for("require").tap("CommonJsPlugin", expr => {
- // to not leak to global "require", we need to define a local require here.
- const dep = new ConstDependency("var require;", 0);
- dep.loc = expr.loc;
- parser.state.current.addDependency(dep);
- parser.scope.definitions.add("require");
- return true;
- });
- parser.hooks.canRename
- .for("require")
- .tap("CommonJsPlugin", () => true);
- parser.hooks.rename.for("require").tap("CommonJsPlugin", expr => {
- // define the require variable. It's still undefined, but not "not defined".
- const dep = new ConstDependency("var require;", 0);
- dep.loc = expr.loc;
- parser.state.current.addDependency(dep);
- return false;
- });
- parser.hooks.typeof.for("module").tap("CommonJsPlugin", () => true);
- parser.hooks.evaluateTypeof
- .for("exports")
- .tap("CommonJsPlugin", ParserHelpers.evaluateToString("object"));
- new CommonJsRequireDependencyParserPlugin(options).apply(parser);
- new RequireResolveDependencyParserPlugin(options).apply(parser);
- };
- normalModuleFactory.hooks.parser
- .for("javascript/auto")
- .tap("CommonJsPlugin", handler);
- normalModuleFactory.hooks.parser
- .for("javascript/dynamic")
- .tap("CommonJsPlugin", handler);
- }
- );
- }
- }
- module.exports = CommonJsPlugin;
|