UNPKG

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