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