DelegatedModuleFactoryPlugin.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const DelegatedModule = require("./DelegatedModule");
  7. /** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions} DllReferencePluginOptions */
  8. /** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptionsContent} DllReferencePluginOptionsContent */
  9. /** @typedef {import("./DelegatedModule").DelegatedModuleSourceRequest} DelegatedModuleSourceRequest */
  10. /** @typedef {import("./DelegatedModule").DelegatedModuleType} DelegatedModuleType */
  11. /** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
  12. /** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
  13. /**
  14. * @typedef {object} Options
  15. * @property {DelegatedModuleSourceRequest} source source
  16. * @property {NonNullable<DllReferencePluginOptions["context"]>} context absolute context path to which lib ident is relative to
  17. * @property {DllReferencePluginOptionsContent} content content
  18. * @property {DllReferencePluginOptions["type"]} type type
  19. * @property {DllReferencePluginOptions["extensions"]} extensions extensions
  20. * @property {DllReferencePluginOptions["scope"]} scope scope
  21. * @property {AssociatedObjectForCache=} associatedObjectForCache object for caching
  22. */
  23. const PLUGIN_NAME = "DelegatedModuleFactoryPlugin";
  24. class DelegatedModuleFactoryPlugin {
  25. /**
  26. * @param {Options} options options
  27. */
  28. constructor(options) {
  29. this.options = options;
  30. options.type = options.type || "require";
  31. options.extensions = options.extensions || ["", ".js", ".json", ".wasm"];
  32. }
  33. /**
  34. * @param {NormalModuleFactory} normalModuleFactory the normal module factory
  35. * @returns {void}
  36. */
  37. apply(normalModuleFactory) {
  38. const scope = this.options.scope;
  39. if (scope) {
  40. normalModuleFactory.hooks.factorize.tapAsync(
  41. PLUGIN_NAME,
  42. (data, callback) => {
  43. const [dependency] = data.dependencies;
  44. const { request } = dependency;
  45. if (request && request.startsWith(`${scope}/`)) {
  46. const innerRequest = `.${request.slice(scope.length)}`;
  47. let resolved;
  48. if (innerRequest in this.options.content) {
  49. resolved = this.options.content[innerRequest];
  50. return callback(
  51. null,
  52. new DelegatedModule(
  53. this.options.source,
  54. resolved,
  55. /** @type {DelegatedModuleType} */
  56. (this.options.type),
  57. innerRequest,
  58. request
  59. )
  60. );
  61. }
  62. const extensions =
  63. /** @type {string[]} */
  64. (this.options.extensions);
  65. for (let i = 0; i < extensions.length; i++) {
  66. const extension = extensions[i];
  67. const requestPlusExt = innerRequest + extension;
  68. if (requestPlusExt in this.options.content) {
  69. resolved = this.options.content[requestPlusExt];
  70. return callback(
  71. null,
  72. new DelegatedModule(
  73. this.options.source,
  74. resolved,
  75. /** @type {DelegatedModuleType} */
  76. (this.options.type),
  77. requestPlusExt,
  78. request + extension
  79. )
  80. );
  81. }
  82. }
  83. }
  84. return callback();
  85. }
  86. );
  87. } else {
  88. normalModuleFactory.hooks.module.tap(PLUGIN_NAME, module => {
  89. const request = module.libIdent(this.options);
  90. if (request && request in this.options.content) {
  91. const resolved = this.options.content[request];
  92. return new DelegatedModule(
  93. this.options.source,
  94. resolved,
  95. /** @type {DelegatedModuleType} */
  96. (this.options.type),
  97. request,
  98. module
  99. );
  100. }
  101. return module;
  102. });
  103. }
  104. }
  105. }
  106. module.exports = DelegatedModuleFactoryPlugin;