| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const ParserHelpers = require("./ParserHelpers");const ConstDependency = require("./dependencies/ConstDependency");const NullFactory = require("./NullFactory");class ProvidePlugin {	constructor(definitions) {		this.definitions = definitions;	}	apply(compiler) {		const definitions = this.definitions;		compiler.hooks.compilation.tap(			"ProvidePlugin",			(compilation, { normalModuleFactory }) => {				compilation.dependencyFactories.set(ConstDependency, new NullFactory());				compilation.dependencyTemplates.set(					ConstDependency,					new ConstDependency.Template()				);				const handler = (parser, parserOptions) => {					Object.keys(definitions).forEach(name => {						var request = [].concat(definitions[name]);						var splittedName = name.split(".");						if (splittedName.length > 0) {							splittedName.slice(1).forEach((_, i) => {								const name = splittedName.slice(0, i + 1).join(".");								parser.hooks.canRename									.for(name)									.tap("ProvidePlugin", ParserHelpers.approve);							});						}						parser.hooks.expression.for(name).tap("ProvidePlugin", expr => {							let nameIdentifier = name;							const scopedName = name.includes(".");							let expression = `require(${JSON.stringify(request[0])})`;							if (scopedName) {								nameIdentifier = `__webpack_provided_${name.replace(									/\./g,									"_dot_"								)}`;							}							if (request.length > 1) {								expression += request									.slice(1)									.map(r => `[${JSON.stringify(r)}]`)									.join("");							}							if (								!ParserHelpers.addParsedVariableToModule(									parser,									nameIdentifier,									expression								)							) {								return false;							}							if (scopedName) {								ParserHelpers.toConstantDependency(									parser,									nameIdentifier								)(expr);							}							return true;						});					});				};				normalModuleFactory.hooks.parser					.for("javascript/auto")					.tap("ProvidePlugin", handler);				normalModuleFactory.hooks.parser					.for("javascript/dynamic")					.tap("ProvidePlugin", handler);				// Disable ProvidePlugin for javascript/esm, see https://github.com/webpack/webpack/issues/7032			}		);	}}module.exports = ProvidePlugin;
 |