| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const ConstDependency = require("./dependencies/ConstDependency"); |
| |
| const NullFactory = require("./NullFactory"); |
| |
| /** @typedef {import("./Compiler")} Compiler */ |
| |
| class CompatibilityPlugin { |
| /** |
| * Apply the plugin |
| * @param {Compiler} compiler Webpack Compiler |
| * @returns {void} |
| */ |
| apply(compiler) { |
| compiler.hooks.compilation.tap( |
| "CompatibilityPlugin", |
| (compilation, { normalModuleFactory }) => { |
| compilation.dependencyFactories.set(ConstDependency, new NullFactory()); |
| compilation.dependencyTemplates.set( |
| ConstDependency, |
| new ConstDependency.Template() |
| ); |
| |
| normalModuleFactory.hooks.parser |
| .for("javascript/auto") |
| .tap("CompatibilityPlugin", (parser, parserOptions) => { |
| if ( |
| parserOptions.browserify !== undefined && |
| !parserOptions.browserify |
| ) |
| return; |
| |
| parser.hooks.call |
| .for("require") |
| .tap("CompatibilityPlugin", expr => { |
| // support for browserify style require delegator: "require(o, !0)" |
| if (expr.arguments.length !== 2) return; |
| const second = parser.evaluateExpression(expr.arguments[1]); |
| if (!second.isBoolean()) return; |
| if (second.asBool() !== true) return; |
| const dep = new ConstDependency("require", expr.callee.range); |
| dep.loc = expr.loc; |
| if (parser.state.current.dependencies.length > 1) { |
| const last = |
| parser.state.current.dependencies[ |
| parser.state.current.dependencies.length - 1 |
| ]; |
| if ( |
| last.critical && |
| last.options && |
| last.options.request === "." && |
| last.userRequest === "." && |
| last.options.recursive |
| ) |
| parser.state.current.dependencies.pop(); |
| } |
| parser.state.current.addDependency(dep); |
| return true; |
| }); |
| }); |
| } |
| ); |
| } |
| } |
| module.exports = CompatibilityPlugin; |