HarmonyModulesPlugin.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
  7. const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
  8. const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
  9. const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
  10. const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
  11. const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
  12. const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
  13. const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
  14. const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
  15. const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
  16. const {
  17. JAVASCRIPT_MODULE_TYPE_AUTO,
  18. JAVASCRIPT_MODULE_TYPE_ESM
  19. } = require("../ModuleTypeConstants");
  20. const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
  21. const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
  22. const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
  23. const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
  24. /** @typedef {import("../Compiler")} Compiler */
  25. const PLUGIN_NAME = "HarmonyModulesPlugin";
  26. class HarmonyModulesPlugin {
  27. constructor(options) {
  28. this.options = options;
  29. }
  30. /**
  31. * Apply the plugin
  32. * @param {Compiler} compiler the compiler instance
  33. * @returns {void}
  34. */
  35. apply(compiler) {
  36. compiler.hooks.compilation.tap(
  37. PLUGIN_NAME,
  38. (compilation, { normalModuleFactory }) => {
  39. compilation.dependencyTemplates.set(
  40. HarmonyCompatibilityDependency,
  41. new HarmonyCompatibilityDependency.Template()
  42. );
  43. compilation.dependencyFactories.set(
  44. HarmonyImportSideEffectDependency,
  45. normalModuleFactory
  46. );
  47. compilation.dependencyTemplates.set(
  48. HarmonyImportSideEffectDependency,
  49. new HarmonyImportSideEffectDependency.Template()
  50. );
  51. compilation.dependencyFactories.set(
  52. HarmonyImportSpecifierDependency,
  53. normalModuleFactory
  54. );
  55. compilation.dependencyTemplates.set(
  56. HarmonyImportSpecifierDependency,
  57. new HarmonyImportSpecifierDependency.Template()
  58. );
  59. compilation.dependencyFactories.set(
  60. HarmonyEvaluatedImportSpecifierDependency,
  61. normalModuleFactory
  62. );
  63. compilation.dependencyTemplates.set(
  64. HarmonyEvaluatedImportSpecifierDependency,
  65. new HarmonyEvaluatedImportSpecifierDependency.Template()
  66. );
  67. compilation.dependencyTemplates.set(
  68. HarmonyExportHeaderDependency,
  69. new HarmonyExportHeaderDependency.Template()
  70. );
  71. compilation.dependencyTemplates.set(
  72. HarmonyExportExpressionDependency,
  73. new HarmonyExportExpressionDependency.Template()
  74. );
  75. compilation.dependencyTemplates.set(
  76. HarmonyExportSpecifierDependency,
  77. new HarmonyExportSpecifierDependency.Template()
  78. );
  79. compilation.dependencyFactories.set(
  80. HarmonyExportImportedSpecifierDependency,
  81. normalModuleFactory
  82. );
  83. compilation.dependencyTemplates.set(
  84. HarmonyExportImportedSpecifierDependency,
  85. new HarmonyExportImportedSpecifierDependency.Template()
  86. );
  87. compilation.dependencyTemplates.set(
  88. HarmonyAcceptDependency,
  89. new HarmonyAcceptDependency.Template()
  90. );
  91. compilation.dependencyFactories.set(
  92. HarmonyAcceptImportDependency,
  93. normalModuleFactory
  94. );
  95. compilation.dependencyTemplates.set(
  96. HarmonyAcceptImportDependency,
  97. new HarmonyAcceptImportDependency.Template()
  98. );
  99. const handler = (parser, parserOptions) => {
  100. // TODO webpack 6: rename harmony to esm or module
  101. if (parserOptions.harmony !== undefined && !parserOptions.harmony)
  102. return;
  103. new HarmonyDetectionParserPlugin(this.options).apply(parser);
  104. new HarmonyImportDependencyParserPlugin(parserOptions).apply(parser);
  105. new HarmonyExportDependencyParserPlugin(parserOptions).apply(parser);
  106. new HarmonyTopLevelThisParserPlugin().apply(parser);
  107. };
  108. normalModuleFactory.hooks.parser
  109. .for(JAVASCRIPT_MODULE_TYPE_AUTO)
  110. .tap(PLUGIN_NAME, handler);
  111. normalModuleFactory.hooks.parser
  112. .for(JAVASCRIPT_MODULE_TYPE_ESM)
  113. .tap(PLUGIN_NAME, handler);
  114. }
  115. );
  116. }
  117. }
  118. module.exports = HarmonyModulesPlugin;