NormalModuleReplacementPlugin.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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 {function(import("./NormalModuleFactory").ResolveData): void} ModuleReplacer */
  9. class NormalModuleReplacementPlugin {
  10. /**
  11. * Create an instance of the plugin
  12. * @param {RegExp} resourceRegExp the resource matcher
  13. * @param {string|ModuleReplacer} newResource the resource replacement
  14. */
  15. constructor(resourceRegExp, newResource) {
  16. this.resourceRegExp = resourceRegExp;
  17. this.newResource = newResource;
  18. }
  19. /**
  20. * Apply the plugin
  21. * @param {Compiler} compiler the compiler instance
  22. * @returns {void}
  23. */
  24. apply(compiler) {
  25. const resourceRegExp = this.resourceRegExp;
  26. const newResource = this.newResource;
  27. compiler.hooks.normalModuleFactory.tap(
  28. "NormalModuleReplacementPlugin",
  29. nmf => {
  30. nmf.hooks.beforeResolve.tap("NormalModuleReplacementPlugin", result => {
  31. if (resourceRegExp.test(result.request)) {
  32. if (typeof newResource === "function") {
  33. newResource(result);
  34. } else {
  35. result.request = newResource;
  36. }
  37. }
  38. });
  39. nmf.hooks.afterResolve.tap("NormalModuleReplacementPlugin", result => {
  40. const createData = result.createData;
  41. if (
  42. resourceRegExp.test(/** @type {string} */ (createData.resource))
  43. ) {
  44. if (typeof newResource === "function") {
  45. newResource(result);
  46. } else {
  47. const fs = compiler.inputFileSystem;
  48. if (
  49. newResource.startsWith("/") ||
  50. (newResource.length > 1 && newResource[1] === ":")
  51. ) {
  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. }
  67. module.exports = NormalModuleReplacementPlugin;