/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { dirname, isAbsolute, join } = require("./util/fs"); /** @import Compiler from "./Compiler" */ /** @import { ResolveData } from "./NormalModuleFactory" */ /** @import { InputFileSystem } from "./util/fs" */ /** @typedef {(resolveData: ResolveData) => void} ModuleReplacer */ const PLUGIN_NAME = "NormalModuleReplacementPlugin"; class NormalModuleReplacementPlugin { /** * Create an instance of the plugin * @param {RegExp} resourceRegExp the resource matcher * @param {string | ModuleReplacer} newResource the resource replacement */ constructor(resourceRegExp, newResource) { /** @type {RegExp} */ this.resourceRegExp = resourceRegExp; /** @type {string | ModuleReplacer} */ this.newResource = newResource; } /** * Applies the plugin by registering its hooks on the compiler. * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { const resourceRegExp = this.resourceRegExp; const newResource = this.newResource; compiler.hooks.normalModuleFactory.tap(PLUGIN_NAME, (nmf) => { nmf.hooks.beforeResolve.tap(PLUGIN_NAME, (result) => { if (resourceRegExp.test(result.request)) { if (typeof newResource === "function") { newResource(result); } else { result.request = newResource; } } }); nmf.hooks.afterResolve.tap(PLUGIN_NAME, (result) => { const createData = result.createData; if (resourceRegExp.test(/** @type {string} */ (createData.resource))) { if (typeof newResource === "function") { newResource(result); } else { const fs = /** @type {InputFileSystem} */ (compiler.inputFileSystem); if (isAbsolute(newResource)) { createData.resource = newResource; } else { createData.resource = join( fs, dirname(fs, /** @type {string} */ (createData.resource)), newResource ); } } } }); }); } } module.exports = NormalModuleReplacementPlugin;