| /* |
| 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; |