HarmonyModulesPlugin.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
  11. const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
  12. const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
  13. const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
  14. const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
  15. const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
  16. const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
  17. const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
  18. const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
  19. const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
  20. const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
  21. const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
  22. const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
  23. const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
  24. /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
  25. /** @typedef {import("../Compiler")} Compiler */
  26. /** @typedef {import("../javascript/JavascriptParser")} Parser */
  27. /**
  28. * @typedef HarmonyModulesPluginOptions
  29. * @property {boolean=} topLevelAwait
  30. * @property {boolean=} deferImport
  31. */
  32. const PLUGIN_NAME = "HarmonyModulesPlugin";
  33. class HarmonyModulesPlugin {
  34. /**
  35. * @param {HarmonyModulesPluginOptions} options options
  36. */
  37. constructor(options) {
  38. this.options = options;
  39. }
  40. /**
  41. * Apply the plugin
  42. * @param {Compiler} compiler the compiler instance
  43. * @returns {void}
  44. */
  45. apply(compiler) {
  46. compiler.hooks.compilation.tap(
  47. PLUGIN_NAME,
  48. (compilation, { normalModuleFactory }) => {
  49. compilation.dependencyTemplates.set(
  50. HarmonyCompatibilityDependency,
  51. new HarmonyCompatibilityDependency.Template()
  52. );
  53. compilation.dependencyFactories.set(
  54. HarmonyImportSideEffectDependency,
  55. normalModuleFactory
  56. );
  57. compilation.dependencyTemplates.set(
  58. HarmonyImportSideEffectDependency,
  59. new HarmonyImportSideEffectDependency.Template()
  60. );
  61. compilation.dependencyFactories.set(
  62. HarmonyImportSpecifierDependency,
  63. normalModuleFactory
  64. );
  65. compilation.dependencyTemplates.set(
  66. HarmonyImportSpecifierDependency,
  67. new HarmonyImportSpecifierDependency.Template()
  68. );
  69. compilation.dependencyFactories.set(
  70. HarmonyEvaluatedImportSpecifierDependency,
  71. normalModuleFactory
  72. );
  73. compilation.dependencyTemplates.set(
  74. HarmonyEvaluatedImportSpecifierDependency,
  75. new HarmonyEvaluatedImportSpecifierDependency.Template()
  76. );
  77. compilation.dependencyTemplates.set(
  78. HarmonyExportHeaderDependency,
  79. new HarmonyExportHeaderDependency.Template()
  80. );
  81. compilation.dependencyTemplates.set(
  82. HarmonyExportExpressionDependency,
  83. new HarmonyExportExpressionDependency.Template()
  84. );
  85. compilation.dependencyTemplates.set(
  86. HarmonyExportSpecifierDependency,
  87. new HarmonyExportSpecifierDependency.Template()
  88. );
  89. compilation.dependencyFactories.set(
  90. HarmonyExportImportedSpecifierDependency,
  91. normalModuleFactory
  92. );
  93. compilation.dependencyTemplates.set(
  94. HarmonyExportImportedSpecifierDependency,
  95. new HarmonyExportImportedSpecifierDependency.Template()
  96. );
  97. compilation.dependencyTemplates.set(
  98. HarmonyAcceptDependency,
  99. new HarmonyAcceptDependency.Template()
  100. );
  101. compilation.dependencyFactories.set(
  102. HarmonyAcceptImportDependency,
  103. normalModuleFactory
  104. );
  105. compilation.dependencyTemplates.set(
  106. HarmonyAcceptImportDependency,
  107. new HarmonyAcceptImportDependency.Template()
  108. );
  109. /**
  110. * @param {Parser} parser parser parser
  111. * @param {JavascriptParserOptions} parserOptions parserOptions
  112. * @returns {void}
  113. */
  114. const handler = (parser, parserOptions) => {
  115. // TODO webpack 6: rename harmony to esm or module
  116. if (parserOptions.harmony !== undefined && !parserOptions.harmony) {
  117. return;
  118. }
  119. new HarmonyDetectionParserPlugin(this.options).apply(parser);
  120. new HarmonyImportDependencyParserPlugin(
  121. parserOptions,
  122. this.options.deferImport
  123. ).apply(parser);
  124. new HarmonyExportDependencyParserPlugin(
  125. parserOptions,
  126. this.options.deferImport
  127. ).apply(parser);
  128. new HarmonyTopLevelThisParserPlugin().apply(parser);
  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;