2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
8 const ConstDependency = require("./dependencies/ConstDependency");
9 const ProvidedDependency = require("./dependencies/ProvidedDependency");
10 const { approve } = require("./javascript/JavascriptParserHelpers");
12 /** @typedef {import("./Compiler")} Compiler */
16 * @param {Record<string, string | string[]>} definitions the provided identifiers
18 constructor(definitions) {
19 this.definitions = definitions;
24 * @param {Compiler} compiler the compiler instance
28 const definitions = this.definitions;
29 compiler.hooks.compilation.tap(
31 (compilation, { normalModuleFactory }) => {
32 compilation.dependencyTemplates.set(
34 new ConstDependency.Template()
36 compilation.dependencyFactories.set(
40 compilation.dependencyTemplates.set(
42 new ProvidedDependency.Template()
44 const handler = (parser, parserOptions) => {
45 Object.keys(definitions).forEach(name => {
46 const request = [].concat(definitions[name]);
47 const splittedName = name.split(".");
48 if (splittedName.length > 0) {
49 splittedName.slice(1).forEach((_, i) => {
50 const name = splittedName.slice(0, i + 1).join(".");
51 parser.hooks.canRename.for(name).tap("ProvidePlugin", approve);
55 parser.hooks.expression.for(name).tap("ProvidePlugin", expr => {
56 const nameIdentifier = name.includes(".")
57 ? `__webpack_provided_${name.replace(/\./g, "_dot_")}`
59 const dep = new ProvidedDependency(
66 parser.state.module.addDependency(dep);
70 parser.hooks.call.for(name).tap("ProvidePlugin", expr => {
71 const nameIdentifier = name.includes(".")
72 ? `__webpack_provided_${name.replace(/\./g, "_dot_")}`
74 const dep = new ProvidedDependency(
80 dep.loc = expr.callee.loc;
81 parser.state.module.addDependency(dep);
82 parser.walkExpressions(expr.arguments);
87 normalModuleFactory.hooks.parser
88 .for("javascript/auto")
89 .tap("ProvidePlugin", handler);
90 normalModuleFactory.hooks.parser
91 .for("javascript/dynamic")
92 .tap("ProvidePlugin", handler);
93 normalModuleFactory.hooks.parser
94 .for("javascript/esm")
95 .tap("ProvidePlugin", handler);
101 module.exports = ProvidePlugin;