DelegatedModuleFactoryPlugin.js 3.8 KB

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