| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const Template = require("./Template"); |
| const ConstDependency = require("./dependencies/ConstDependency"); |
| const ParserHelpers = require("./ParserHelpers"); |
| const NullFactory = require("./NullFactory"); |
| |
| const REPLACEMENTS = { |
| // eslint-disable-next-line camelcase |
| __webpack_hash__: "__webpack_require__.h", |
| // eslint-disable-next-line camelcase |
| __webpack_chunkname__: "__webpack_require__.cn" |
| }; |
| const REPLACEMENT_TYPES = { |
| // eslint-disable-next-line camelcase |
| __webpack_hash__: "string", |
| // eslint-disable-next-line camelcase |
| __webpack_chunkname__: "string" |
| }; |
| |
| class ExtendedAPIPlugin { |
| apply(compiler) { |
| compiler.hooks.compilation.tap( |
| "ExtendedAPIPlugin", |
| (compilation, { normalModuleFactory }) => { |
| compilation.dependencyFactories.set(ConstDependency, new NullFactory()); |
| compilation.dependencyTemplates.set( |
| ConstDependency, |
| new ConstDependency.Template() |
| ); |
| |
| const mainTemplate = compilation.mainTemplate; |
| mainTemplate.hooks.requireExtensions.tap( |
| "ExtendedAPIPlugin", |
| (source, chunk, hash) => { |
| const buf = [source]; |
| buf.push(""); |
| buf.push("// __webpack_hash__"); |
| buf.push(`${mainTemplate.requireFn}.h = ${JSON.stringify(hash)};`); |
| buf.push(""); |
| buf.push("// __webpack_chunkname__"); |
| buf.push( |
| `${mainTemplate.requireFn}.cn = ${JSON.stringify(chunk.name)};` |
| ); |
| return Template.asString(buf); |
| } |
| ); |
| mainTemplate.hooks.globalHash.tap("ExtendedAPIPlugin", () => true); |
| |
| const handler = (parser, parserOptions) => { |
| Object.keys(REPLACEMENTS).forEach(key => { |
| parser.hooks.expression |
| .for(key) |
| .tap( |
| "ExtendedAPIPlugin", |
| ParserHelpers.toConstantDependencyWithWebpackRequire( |
| parser, |
| REPLACEMENTS[key] |
| ) |
| ); |
| parser.hooks.evaluateTypeof |
| .for(key) |
| .tap( |
| "ExtendedAPIPlugin", |
| ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]) |
| ); |
| }); |
| }; |
| |
| normalModuleFactory.hooks.parser |
| .for("javascript/auto") |
| .tap("ExtendedAPIPlugin", handler); |
| normalModuleFactory.hooks.parser |
| .for("javascript/dynamic") |
| .tap("ExtendedAPIPlugin", handler); |
| normalModuleFactory.hooks.parser |
| .for("javascript/esm") |
| .tap("ExtendedAPIPlugin", handler); |
| } |
| ); |
| } |
| } |
| |
| module.exports = ExtendedAPIPlugin; |