NormalModuleReplacementPlugin.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const { dirname, isAbsolute, join } = require("./util/fs");
  7. /** @import Compiler from "./Compiler" */
  8. /** @import { ResolveData } from "./NormalModuleFactory" */
  9. /** @import { InputFileSystem } from "./util/fs" */
  10. /** @typedef {(resolveData: ResolveData) => void} ModuleReplacer */
  11. const PLUGIN_NAME = "NormalModuleReplacementPlugin";
  12. class NormalModuleReplacementPlugin {
  13. /**
  14. * Create an instance of the plugin
  15. * @param {RegExp} resourceRegExp the resource matcher
  16. * @param {string | ModuleReplacer} newResource the resource replacement
  17. */
  18. constructor(resourceRegExp, newResource) {
  19. /** @type {RegExp} */
  20. this.resourceRegExp = resourceRegExp;
  21. /** @type {string | ModuleReplacer} */
  22. this.newResource = newResource;
  23. }
  24. /**
  25. * Applies the plugin by registering its hooks on the compiler.
  26. * @param {Compiler} compiler the compiler instance
  27. * @returns {void}
  28. */
  29. apply(compiler) {
  30. const resourceRegExp = this.resourceRegExp;
  31. const newResource = this.newResource;
  32. compiler.hooks.normalModuleFactory.tap(PLUGIN_NAME, (nmf) => {
  33. nmf.hooks.beforeResolve.tap(PLUGIN_NAME, (result) => {
  34. if (resourceRegExp.test(result.request)) {
  35. if (typeof newResource === "function") {
  36. newResource(result);
  37. } else {
  38. result.request = newResource;
  39. }
  40. }
  41. });
  42. nmf.hooks.afterResolve.tap(PLUGIN_NAME, (result) => {
  43. const createData = result.createData;
  44. if (resourceRegExp.test(/** @type {string} */ (createData.resource))) {
  45. if (typeof newResource === "function") {
  46. newResource(result);
  47. } else {
  48. const fs =
  49. /** @type {InputFileSystem} */
  50. (compiler.inputFileSystem);
  51. if (isAbsolute(newResource)) {
  52. createData.resource = newResource;
  53. } else {
  54. createData.resource = join(
  55. fs,
  56. dirname(fs, /** @type {string} */ (createData.resource)),
  57. newResource
  58. );
  59. }
  60. }
  61. }
  62. });
  63. });
  64. }
  65. }
  66. module.exports = NormalModuleReplacementPlugin;