HarmonyModulesPlugin.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const {
  7. JAVASCRIPT_MODULE_TYPE_AUTO,
  8. JAVASCRIPT_MODULE_TYPE_ESM
  9. } = require("../ModuleTypeConstants");
  10. const CreateRequireParserPlugin = require("./CreateRequireParserPlugin");
  11. const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
  12. const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
  13. const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
  14. const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
  15. const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
  16. const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
  17. const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
  18. const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
  19. const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
  20. const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
  21. const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
  22. const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
  23. const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
  24. const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
  25. /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
  26. /** @typedef {import("../Compiler")} Compiler */
  27. /** @typedef {import("../javascript/JavascriptParser")} Parser */
  28. /**
  29. * Defines the harmony modules plugin options type used by this module.
  30. * @typedef {object} HarmonyModulesPluginOptions
  31. * @property {boolean=} deferImport
  32. */
  33. const PLUGIN_NAME = "HarmonyModulesPlugin";
  34. class HarmonyModulesPlugin {
  35. /**
  36. * Creates an instance of HarmonyModulesPlugin.
  37. * @param {HarmonyModulesPluginOptions} options options
  38. */
  39. constructor(options) {
  40. this.options = options;
  41. }
  42. /**
  43. * Applies the plugin by registering its hooks on the compiler.
  44. * @param {Compiler} compiler the compiler instance
  45. * @returns {void}
  46. */
  47. apply(compiler) {
  48. compiler.hooks.compilation.tap(
  49. PLUGIN_NAME,
  50. (compilation, { normalModuleFactory }) => {
  51. compilation.dependencyTemplates.set(
  52. HarmonyCompatibilityDependency,
  53. new HarmonyCompatibilityDependency.Template()
  54. );
  55. compilation.dependencyFactories.set(
  56. HarmonyImportSideEffectDependency,
  57. normalModuleFactory
  58. );
  59. compilation.dependencyTemplates.set(
  60. HarmonyImportSideEffectDependency,
  61. new HarmonyImportSideEffectDependency.Template()
  62. );
  63. compilation.dependencyFactories.set(
  64. HarmonyImportSpecifierDependency,
  65. normalModuleFactory
  66. );
  67. compilation.dependencyTemplates.set(
  68. HarmonyImportSpecifierDependency,
  69. new HarmonyImportSpecifierDependency.Template()
  70. );
  71. compilation.dependencyFactories.set(
  72. HarmonyEvaluatedImportSpecifierDependency,
  73. normalModuleFactory
  74. );
  75. compilation.dependencyTemplates.set(
  76. HarmonyEvaluatedImportSpecifierDependency,
  77. new HarmonyEvaluatedImportSpecifierDependency.Template()
  78. );
  79. compilation.dependencyTemplates.set(
  80. HarmonyExportHeaderDependency,
  81. new HarmonyExportHeaderDependency.Template()
  82. );
  83. compilation.dependencyTemplates.set(
  84. HarmonyExportExpressionDependency,
  85. new HarmonyExportExpressionDependency.Template()
  86. );
  87. compilation.dependencyTemplates.set(
  88. HarmonyExportSpecifierDependency,
  89. new HarmonyExportSpecifierDependency.Template()
  90. );
  91. compilation.dependencyFactories.set(
  92. HarmonyExportImportedSpecifierDependency,
  93. normalModuleFactory
  94. );
  95. compilation.dependencyTemplates.set(
  96. HarmonyExportImportedSpecifierDependency,
  97. new HarmonyExportImportedSpecifierDependency.Template()
  98. );
  99. compilation.dependencyTemplates.set(
  100. HarmonyAcceptDependency,
  101. new HarmonyAcceptDependency.Template()
  102. );
  103. compilation.dependencyFactories.set(
  104. HarmonyAcceptImportDependency,
  105. normalModuleFactory
  106. );
  107. compilation.dependencyTemplates.set(
  108. HarmonyAcceptImportDependency,
  109. new HarmonyAcceptImportDependency.Template()
  110. );
  111. /**
  112. * Handles the hook callback for this code path.
  113. * @param {Parser} parser parser parser
  114. * @param {JavascriptParserOptions} parserOptions parserOptions
  115. * @returns {void}
  116. */
  117. const handler = (parser, parserOptions) => {
  118. // TODO webpack 6: rename harmony to esm or module
  119. if (parserOptions.harmony !== undefined && !parserOptions.harmony) {
  120. return;
  121. }
  122. new HarmonyDetectionParserPlugin().apply(parser);
  123. new HarmonyImportDependencyParserPlugin(parserOptions).apply(parser);
  124. new HarmonyExportDependencyParserPlugin(parserOptions).apply(parser);
  125. new HarmonyTopLevelThisParserPlugin().apply(parser);
  126. if (parserOptions.createRequire) {
  127. new CreateRequireParserPlugin(parserOptions).apply(parser);
  128. }
  129. };
  130. normalModuleFactory.hooks.parser
  131. .for(JAVASCRIPT_MODULE_TYPE_AUTO)
  132. .tap(PLUGIN_NAME, handler);
  133. normalModuleFactory.hooks.parser
  134. .for(JAVASCRIPT_MODULE_TYPE_ESM)
  135. .tap(PLUGIN_NAME, handler);
  136. }
  137. );
  138. }
  139. }
  140. module.exports = HarmonyModulesPlugin;