HarmonyModulesPlugin.js 4.0 KB

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