NormalModuleReplacementPlugin.js 2.1 KB

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