HarmonyModulesPlugin.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. const TopLevelAwaitDependency = require("./TopLevelAwaitDependency");
  26. /**
  27. * @import {
  28. * JavascriptParserOptions
  29. * } from "../../declarations/WebpackOptions"
  30. */
  31. /** @import Compiler from "../Compiler" */
  32. /** @import Parser from "../javascript/JavascriptParser" */
  33. /**
  34. * Defines the harmony modules plugin options type used by this module.
  35. * @typedef {object} HarmonyModulesPluginOptions
  36. * @property {boolean=} deferImport
  37. */
  38. const PLUGIN_NAME = "HarmonyModulesPlugin";
  39. class HarmonyModulesPlugin {
  40. /**
  41. * Creates an instance of HarmonyModulesPlugin.
  42. * @param {HarmonyModulesPluginOptions} options options
  43. */
  44. constructor(options) {
  45. /** @type {HarmonyModulesPluginOptions} */
  46. this.options = options;
  47. }
  48. /**
  49. * Applies the plugin by registering its hooks on the compiler.
  50. * @param {Compiler} compiler the compiler instance
  51. * @returns {void}
  52. */
  53. apply(compiler) {
  54. compiler.hooks.compilation.tap(
  55. PLUGIN_NAME,
  56. (compilation, { normalModuleFactory }) => {
  57. compilation.dependencyTemplates.set(
  58. HarmonyCompatibilityDependency,
  59. new HarmonyCompatibilityDependency.Template()
  60. );
  61. compilation.dependencyTemplates.set(
  62. TopLevelAwaitDependency,
  63. new TopLevelAwaitDependency.Template()
  64. );
  65. compilation.dependencyFactories.set(
  66. HarmonyImportSideEffectDependency,
  67. normalModuleFactory
  68. );
  69. compilation.dependencyTemplates.set(
  70. HarmonyImportSideEffectDependency,
  71. new HarmonyImportSideEffectDependency.Template()
  72. );
  73. compilation.dependencyFactories.set(
  74. HarmonyImportSpecifierDependency,
  75. normalModuleFactory
  76. );
  77. compilation.dependencyTemplates.set(
  78. HarmonyImportSpecifierDependency,
  79. new HarmonyImportSpecifierDependency.Template()
  80. );
  81. compilation.dependencyFactories.set(
  82. HarmonyEvaluatedImportSpecifierDependency,
  83. normalModuleFactory
  84. );
  85. compilation.dependencyTemplates.set(
  86. HarmonyEvaluatedImportSpecifierDependency,
  87. new HarmonyEvaluatedImportSpecifierDependency.Template()
  88. );
  89. compilation.dependencyTemplates.set(
  90. HarmonyExportHeaderDependency,
  91. new HarmonyExportHeaderDependency.Template()
  92. );
  93. compilation.dependencyTemplates.set(
  94. HarmonyExportExpressionDependency,
  95. new HarmonyExportExpressionDependency.Template()
  96. );
  97. compilation.dependencyTemplates.set(
  98. HarmonyExportSpecifierDependency,
  99. new HarmonyExportSpecifierDependency.Template()
  100. );
  101. compilation.dependencyFactories.set(
  102. HarmonyExportImportedSpecifierDependency,
  103. normalModuleFactory
  104. );
  105. compilation.dependencyTemplates.set(
  106. HarmonyExportImportedSpecifierDependency,
  107. new HarmonyExportImportedSpecifierDependency.Template()
  108. );
  109. compilation.dependencyTemplates.set(
  110. HarmonyAcceptDependency,
  111. new HarmonyAcceptDependency.Template()
  112. );
  113. compilation.dependencyFactories.set(
  114. HarmonyAcceptImportDependency,
  115. normalModuleFactory
  116. );
  117. compilation.dependencyTemplates.set(
  118. HarmonyAcceptImportDependency,
  119. new HarmonyAcceptImportDependency.Template()
  120. );
  121. /**
  122. * Handles the hook callback for this code path.
  123. * @param {Parser} parser parser parser
  124. * @param {JavascriptParserOptions} parserOptions parserOptions
  125. * @returns {void}
  126. */
  127. const handler = (parser, parserOptions) => {
  128. // TODO webpack 6: rename harmony to esm or module
  129. if (parserOptions.harmony !== undefined && !parserOptions.harmony) {
  130. return;
  131. }
  132. new HarmonyDetectionParserPlugin().apply(parser);
  133. new HarmonyImportDependencyParserPlugin(parserOptions).apply(parser);
  134. new HarmonyExportDependencyParserPlugin(parserOptions).apply(parser);
  135. new HarmonyTopLevelThisParserPlugin().apply(parser);
  136. if (parserOptions.createRequire) {
  137. new CreateRequireParserPlugin(parserOptions).apply(parser);
  138. }
  139. };
  140. normalModuleFactory.hooks.parser
  141. .for(JAVASCRIPT_MODULE_TYPE_AUTO)
  142. .tap(PLUGIN_NAME, handler);
  143. normalModuleFactory.hooks.parser
  144. .for(JAVASCRIPT_MODULE_TYPE_ESM)
  145. .tap(PLUGIN_NAME, handler);
  146. }
  147. );
  148. }
  149. }
  150. module.exports = HarmonyModulesPlugin;