webpack 5.102.1 → 5.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +121 -134
  2. package/hot/dev-server.js +18 -3
  3. package/hot/emitter-event-target.js +7 -0
  4. package/hot/lazy-compilation-node.js +45 -29
  5. package/hot/lazy-compilation-universal.js +18 -0
  6. package/hot/lazy-compilation-web.js +15 -5
  7. package/hot/load-http.js +7 -0
  8. package/hot/only-dev-server.js +19 -4
  9. package/lib/APIPlugin.js +6 -0
  10. package/lib/Chunk.js +1 -1
  11. package/lib/ChunkGraph.js +9 -7
  12. package/lib/ChunkGroup.js +8 -5
  13. package/lib/CleanPlugin.js +6 -3
  14. package/lib/CodeGenerationResults.js +2 -1
  15. package/lib/CompatibilityPlugin.js +28 -2
  16. package/lib/Compilation.js +58 -21
  17. package/lib/Compiler.js +3 -3
  18. package/lib/ConcatenationScope.js +0 -15
  19. package/lib/ContextModule.js +6 -3
  20. package/lib/ContextModuleFactory.js +6 -4
  21. package/lib/CssModule.js +6 -1
  22. package/lib/DefinePlugin.js +45 -14
  23. package/lib/DelegatedModule.js +7 -4
  24. package/lib/Dependency.js +8 -1
  25. package/lib/DependencyTemplate.js +1 -0
  26. package/lib/DllModule.js +6 -3
  27. package/lib/DotenvPlugin.js +462 -0
  28. package/lib/EnvironmentPlugin.js +19 -16
  29. package/lib/EvalSourceMapDevToolPlugin.js +16 -0
  30. package/lib/ExportsInfo.js +6 -2
  31. package/lib/ExternalModule.js +28 -35
  32. package/lib/ExternalModuleFactoryPlugin.js +11 -9
  33. package/lib/ExternalsPlugin.js +2 -1
  34. package/lib/FileSystemInfo.js +1 -1
  35. package/lib/Generator.js +10 -7
  36. package/lib/HookWebpackError.js +33 -4
  37. package/lib/HotModuleReplacementPlugin.js +22 -0
  38. package/lib/ManifestPlugin.js +235 -0
  39. package/lib/Module.js +27 -15
  40. package/lib/ModuleBuildError.js +1 -1
  41. package/lib/ModuleError.js +1 -1
  42. package/lib/ModuleFilenameHelpers.js +1 -1
  43. package/lib/ModuleGraph.js +29 -13
  44. package/lib/ModuleGraphConnection.js +2 -2
  45. package/lib/ModuleSourceTypeConstants.js +189 -0
  46. package/lib/ModuleTypeConstants.js +1 -4
  47. package/lib/ModuleWarning.js +1 -1
  48. package/lib/MultiCompiler.js +1 -1
  49. package/lib/NodeStuffPlugin.js +424 -116
  50. package/lib/NormalModule.js +23 -20
  51. package/lib/NormalModuleFactory.js +7 -10
  52. package/lib/Parser.js +1 -1
  53. package/lib/RawModule.js +7 -4
  54. package/lib/RuntimeGlobals.js +22 -4
  55. package/lib/RuntimeModule.js +1 -1
  56. package/lib/RuntimePlugin.js +27 -6
  57. package/lib/RuntimeTemplate.js +120 -57
  58. package/lib/SourceMapDevToolPlugin.js +26 -1
  59. package/lib/Template.js +17 -6
  60. package/lib/TemplatedPathPlugin.js +5 -6
  61. package/lib/WebpackError.js +0 -1
  62. package/lib/WebpackOptionsApply.js +67 -15
  63. package/lib/asset/AssetBytesGenerator.js +16 -12
  64. package/lib/asset/AssetGenerator.js +31 -26
  65. package/lib/asset/AssetSourceGenerator.js +16 -12
  66. package/lib/asset/RawDataUrlModule.js +6 -3
  67. package/lib/buildChunkGraph.js +4 -2
  68. package/lib/cache/PackFileCacheStrategy.js +6 -5
  69. package/lib/cli.js +2 -43
  70. package/lib/config/browserslistTargetHandler.js +24 -0
  71. package/lib/config/defaults.js +226 -61
  72. package/lib/config/normalization.js +4 -3
  73. package/lib/config/target.js +11 -0
  74. package/lib/container/ContainerEntryModule.js +6 -3
  75. package/lib/container/FallbackModule.js +6 -3
  76. package/lib/container/RemoteModule.js +1 -3
  77. package/lib/css/CssGenerator.js +304 -76
  78. package/lib/css/CssLoadingRuntimeModule.js +14 -4
  79. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
  80. package/lib/css/CssModulesPlugin.js +72 -67
  81. package/lib/css/CssParser.js +1726 -732
  82. package/lib/css/walkCssTokens.js +128 -11
  83. package/lib/dependencies/CachedConstDependency.js +24 -10
  84. package/lib/dependencies/CommonJsImportsParserPlugin.js +0 -9
  85. package/lib/dependencies/CommonJsPlugin.js +12 -0
  86. package/lib/dependencies/CommonJsRequireContextDependency.js +1 -1
  87. package/lib/dependencies/ContextDependencyHelpers.js +2 -2
  88. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +3 -1
  89. package/lib/dependencies/CssIcssExportDependency.js +389 -12
  90. package/lib/dependencies/CssIcssImportDependency.js +114 -51
  91. package/lib/dependencies/CssIcssSymbolDependency.js +31 -33
  92. package/lib/dependencies/CssImportDependency.js +17 -6
  93. package/lib/dependencies/CssUrlDependency.js +3 -2
  94. package/lib/dependencies/DynamicExports.js +7 -7
  95. package/lib/dependencies/ExternalModuleDependency.js +7 -4
  96. package/lib/dependencies/ExternalModuleInitFragment.js +3 -2
  97. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +96 -0
  98. package/lib/dependencies/HarmonyAcceptDependency.js +6 -1
  99. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -1
  100. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +12 -1
  101. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +35 -23
  102. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +13 -9
  103. package/lib/dependencies/HarmonyExports.js +4 -4
  104. package/lib/dependencies/HarmonyImportDependency.js +28 -27
  105. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +28 -69
  106. package/lib/dependencies/HarmonyImportSideEffectDependency.js +4 -3
  107. package/lib/dependencies/HarmonyImportSpecifierDependency.js +10 -8
  108. package/lib/dependencies/ImportDependency.js +8 -2
  109. package/lib/dependencies/ImportEagerDependency.js +6 -3
  110. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  111. package/lib/dependencies/ImportMetaPlugin.js +154 -9
  112. package/lib/dependencies/ImportParserPlugin.js +21 -23
  113. package/lib/dependencies/ImportPhase.js +121 -0
  114. package/lib/dependencies/ImportWeakDependency.js +6 -3
  115. package/lib/dependencies/LocalModulesHelpers.js +3 -3
  116. package/lib/dependencies/ModuleDependency.js +5 -1
  117. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  118. package/lib/dependencies/WorkerPlugin.js +2 -2
  119. package/lib/dependencies/getFunctionExpression.js +1 -1
  120. package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -8
  121. package/lib/esm/ModuleChunkFormatPlugin.js +5 -4
  122. package/lib/hmr/HotModuleReplacement.runtime.js +2 -1
  123. package/lib/hmr/LazyCompilationPlugin.js +5 -3
  124. package/lib/ids/IdHelpers.js +20 -8
  125. package/lib/index.js +6 -0
  126. package/lib/javascript/ChunkHelpers.js +16 -5
  127. package/lib/javascript/JavascriptGenerator.js +105 -104
  128. package/lib/javascript/JavascriptModulesPlugin.js +80 -37
  129. package/lib/javascript/JavascriptParser.js +161 -44
  130. package/lib/json/JsonGenerator.js +5 -4
  131. package/lib/json/JsonParser.js +9 -2
  132. package/lib/library/AbstractLibraryPlugin.js +1 -1
  133. package/lib/library/AmdLibraryPlugin.js +4 -1
  134. package/lib/library/ExportPropertyLibraryPlugin.js +4 -1
  135. package/lib/library/ModuleLibraryPlugin.js +41 -23
  136. package/lib/library/SystemLibraryPlugin.js +8 -1
  137. package/lib/library/UmdLibraryPlugin.js +2 -2
  138. package/lib/logging/Logger.js +5 -4
  139. package/lib/logging/createConsoleLogger.js +2 -2
  140. package/lib/node/NodeTargetPlugin.js +9 -1
  141. package/lib/node/ReadFileCompileWasmPlugin.js +0 -2
  142. package/lib/optimize/ConcatenatedModule.js +208 -167
  143. package/lib/optimize/ModuleConcatenationPlugin.js +5 -4
  144. package/lib/optimize/SideEffectsFlagPlugin.js +3 -2
  145. package/lib/optimize/SplitChunksPlugin.js +60 -46
  146. package/lib/rules/RuleSetCompiler.js +1 -1
  147. package/lib/runtime/AsyncModuleRuntimeModule.js +28 -18
  148. package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
  149. package/lib/runtime/GetChunkFilenameRuntimeModule.js +3 -2
  150. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +89 -55
  151. package/lib/schemes/HttpUriPlugin.js +78 -7
  152. package/lib/serialization/AggregateErrorSerializer.js +1 -2
  153. package/lib/serialization/ObjectMiddleware.js +0 -2
  154. package/lib/serialization/SingleItemMiddleware.js +1 -1
  155. package/lib/sharing/ConsumeSharedModule.js +1 -1
  156. package/lib/sharing/ConsumeSharedPlugin.js +5 -3
  157. package/lib/sharing/ProvideSharedModule.js +1 -1
  158. package/lib/sharing/resolveMatchedConfigs.js +15 -9
  159. package/lib/sharing/utils.js +1 -1
  160. package/lib/stats/DefaultStatsFactoryPlugin.js +8 -5
  161. package/lib/stats/DefaultStatsPresetPlugin.js +1 -1
  162. package/lib/stats/DefaultStatsPrinterPlugin.js +1 -1
  163. package/lib/util/StringXor.js +1 -1
  164. package/lib/util/URLAbsoluteSpecifier.js +2 -2
  165. package/lib/util/binarySearchBounds.js +2 -2
  166. package/lib/util/comparators.js +54 -76
  167. package/lib/util/compileBooleanMatcher.js +78 -6
  168. package/lib/util/createHash.js +20 -199
  169. package/lib/util/deprecation.js +1 -1
  170. package/lib/util/deterministicGrouping.js +6 -3
  171. package/lib/util/fs.js +75 -75
  172. package/lib/util/hash/BatchedHash.js +10 -9
  173. package/lib/util/hash/BulkUpdateHash.js +138 -0
  174. package/lib/util/hash/DebugHash.js +75 -0
  175. package/lib/util/hash/hash-digest.js +216 -0
  176. package/lib/util/identifier.js +82 -17
  177. package/lib/util/internalSerializables.js +2 -6
  178. package/lib/util/runtime.js +3 -3
  179. package/lib/util/source.js +2 -2
  180. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -4
  181. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +3 -2
  182. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +11 -7
  183. package/lib/wasm-sync/WebAssemblyGenerator.js +9 -6
  184. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +11 -6
  185. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +6 -2
  186. package/lib/web/FetchCompileWasmPlugin.js +0 -2
  187. package/lib/webpack.js +85 -82
  188. package/module.d.ts +5 -0
  189. package/package.json +34 -28
  190. package/schemas/WebpackOptions.check.js +1 -1
  191. package/schemas/WebpackOptions.json +160 -101
  192. package/schemas/plugins/{css/CssAutoParserOptions.check.d.ts → ManifestPlugin.check.d.ts} +1 -1
  193. package/schemas/plugins/ManifestPlugin.check.js +6 -0
  194. package/schemas/plugins/ManifestPlugin.json +98 -0
  195. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  196. package/schemas/plugins/SourceMapDevToolPlugin.json +16 -3
  197. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  198. package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
  199. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  200. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  201. package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
  202. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -1
  203. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  204. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  205. package/schemas/plugins/json/JsonModulesPluginParser.check.js +1 -1
  206. package/types.d.ts +771 -436
  207. package/lib/ModuleSourceTypesConstants.js +0 -123
  208. package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
  209. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +0 -112
  210. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +0 -7
  211. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +0 -6
  212. package/schemas/plugins/css/CssAutoGeneratorOptions.json +0 -3
  213. package/schemas/plugins/css/CssAutoParserOptions.check.js +0 -6
  214. package/schemas/plugins/css/CssAutoParserOptions.json +0 -3
  215. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +0 -7
  216. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +0 -6
  217. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +0 -3
  218. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +0 -7
  219. package/schemas/plugins/css/CssGlobalParserOptions.check.js +0 -6
  220. package/schemas/plugins/css/CssGlobalParserOptions.json +0 -3
@@ -7,6 +7,7 @@
7
7
 
8
8
  const makeSerializable = require("../util/makeSerializable");
9
9
  const HarmonyImportDependency = require("./HarmonyImportDependency");
10
+ const { ImportPhase } = require("./ImportPhase");
10
11
  const NullDependency = require("./NullDependency");
11
12
 
12
13
  class HarmonyAcceptImportDependency extends HarmonyImportDependency {
@@ -14,7 +15,7 @@ class HarmonyAcceptImportDependency extends HarmonyImportDependency {
14
15
  * @param {string} request the request string
15
16
  */
16
17
  constructor(request) {
17
- super(request, Number.NaN);
18
+ super(request, Infinity, ImportPhase.Evaluation);
18
19
  this.weak = true;
19
20
  }
20
21
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  const makeSerializable = require("../util/makeSerializable");
9
9
  const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
10
+ const { ImportPhase } = require("./ImportPhase");
10
11
 
11
12
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
12
13
  /** @typedef {import("../Dependency")} Dependency */
@@ -37,7 +38,17 @@ class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDe
37
38
  * @param {string} operator operator
38
39
  */
39
40
  constructor(request, sourceOrder, ids, name, range, attributes, operator) {
40
- super(request, sourceOrder, ids, name, range, false, attributes, []);
41
+ super(
42
+ request,
43
+ sourceOrder,
44
+ ids,
45
+ name,
46
+ range,
47
+ false,
48
+ ImportPhase.Evaluation,
49
+ attributes,
50
+ []
51
+ );
41
52
  this.operator = operator;
42
53
  }
43
54
 
@@ -5,6 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const CompatibilityPlugin = require("../CompatibilityPlugin");
8
9
  const WebpackError = require("../WebpackError");
9
10
  const { getImportAttributes } = require("../javascript/JavascriptParser");
10
11
  const InnerGraph = require("../optimize/InnerGraph");
@@ -15,10 +16,10 @@ const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImporte
15
16
  const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
16
17
  const { ExportPresenceModes } = require("./HarmonyImportDependency");
17
18
  const {
18
- getImportMode,
19
19
  harmonySpecifierTag
20
20
  } = require("./HarmonyImportDependencyParserPlugin");
21
21
  const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
22
+ const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
22
23
 
23
24
  /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
24
25
  /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
@@ -26,6 +27,7 @@ const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDepe
26
27
  /** @typedef {import("../javascript/JavascriptParser").FunctionDeclaration} FunctionDeclaration */
27
28
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
28
29
  /** @typedef {import("./HarmonyImportDependencyParserPlugin").HarmonySettings} HarmonySettings */
30
+ /** @typedef {import("../CompatibilityPlugin").CompatibilitySettings} CompatibilitySettings */
29
31
 
30
32
  const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency;
31
33
 
@@ -36,6 +38,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
36
38
  * @param {import("../../declarations/WebpackOptions").JavascriptParserOptions} options options
37
39
  */
38
40
  constructor(options) {
41
+ this.options = options;
39
42
  this.exportPresenceMode =
40
43
  options.reexportExportsPresence !== undefined
41
44
  ? ExportPresenceModes.fromUserOption(options.reexportExportsPresence)
@@ -44,7 +47,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
44
47
  : options.strictExportPresence
45
48
  ? ExportPresenceModes.ERROR
46
49
  : ExportPresenceModes.AUTO;
47
- this.deferImport = options.deferImport;
48
50
  }
49
51
 
50
52
  /**
@@ -53,6 +55,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
53
55
  */
54
56
  apply(parser) {
55
57
  const { exportPresenceMode } = this;
58
+ const getImportPhase = createGetImportPhase(this.options.deferImport);
59
+
56
60
  parser.hooks.export.tap(PLUGIN_NAME, (statement) => {
57
61
  const dep = new HarmonyExportHeaderDependency(
58
62
  /** @type {Range | false} */ (
@@ -77,22 +81,20 @@ module.exports = class HarmonyExportDependencyParserPlugin {
77
81
  clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
78
82
  clearDep.loc.index = -1;
79
83
  parser.state.module.addPresentationalDependency(clearDep);
80
- let defer = false;
81
- if (this.deferImport) {
82
- ({ defer } = getImportMode(parser, statement));
83
- if (defer) {
84
- const error = new WebpackError(
85
- "Deferred re-export (`export defer * as namespace from '...'`) is not a part of the Import Defer proposal.\nUse the following code instead:\n import defer * as namespace from '...';\n export { namespace };"
86
- );
87
- error.loc = statement.loc || undefined;
88
- parser.state.current.addError(error);
89
- }
84
+
85
+ const phase = getImportPhase(parser, statement);
86
+ if (phase && ImportPhaseUtils.isDefer(phase)) {
87
+ const error = new WebpackError(
88
+ "Deferred re-export (`export defer * as namespace from '...'`) is not a part of the Import Defer proposal.\nUse the following code instead:\n import defer * as namespace from '...';\n export { namespace };"
89
+ );
90
+ error.loc = statement.loc || undefined;
91
+ parser.state.current.addError(error);
90
92
  }
91
93
  const sideEffectDep = new HarmonyImportSideEffectDependency(
92
94
  /** @type {string} */ (source),
93
95
  parser.state.lastHarmonyImportOrder,
94
- getImportAttributes(statement),
95
- defer
96
+ phase,
97
+ getImportAttributes(statement)
96
98
  );
97
99
  sideEffectDep.loc = Object.create(
98
100
  /** @type {DependencyLocation} */ (statement.loc)
@@ -121,7 +123,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
121
123
  })
122
124
  .join(""),
123
125
  node.type.endsWith("Declaration") &&
124
- /** @type {FunctionDeclaration | ClassDeclaration} */ (node).id
126
+ /** @type {FunctionDeclaration | ClassDeclaration} */ (node).id
125
127
  ? /** @type {FunctionDeclaration | ClassDeclaration} */
126
128
  (node).id.name
127
129
  : isFunctionDeclaration
@@ -157,6 +159,18 @@ module.exports = class HarmonyExportDependencyParserPlugin {
157
159
  parser.hooks.exportSpecifier.tap(
158
160
  PLUGIN_NAME,
159
161
  (statement, id, name, idx) => {
162
+ // CompatibilityPlugin may change exports name
163
+ // not handle re-export or import then export situation as current CompatibilityPlugin only
164
+ // rename symbol in declaration module, not change exported symbol
165
+ const variable = parser.getTagData(
166
+ id,
167
+ CompatibilityPlugin.nestedWebpackIdentifierTag
168
+ );
169
+ if (variable && /** @type {CompatibilitySettings} */ (variable).name) {
170
+ // CompatibilityPlugin changes exports to a new name, should updates exports name
171
+ id = /** @type {CompatibilitySettings} */ (variable).name;
172
+ }
173
+
160
174
  const settings =
161
175
  /** @type {HarmonySettings} */
162
176
  (parser.getTagData(id, harmonySpecifierTag));
@@ -174,8 +188,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
174
188
  null,
175
189
  exportPresenceMode,
176
190
  null,
177
- settings.attributes,
178
- settings.defer
191
+ settings.phase,
192
+ settings.attributes
179
193
  )
180
194
  : new HarmonyExportSpecifierDependency(id, name);
181
195
  dep.loc = Object.create(
@@ -207,13 +221,11 @@ module.exports = class HarmonyExportDependencyParserPlugin {
207
221
  parser.state.harmonyStarExports || new HarmonyStarExportsList();
208
222
  }
209
223
  const attributes = getImportAttributes(statement);
210
- const defer = this.deferImport
211
- ? getImportMode(parser, statement).defer
212
- : false;
213
224
  const dep = new HarmonyExportImportedSpecifierDependency(
214
225
  /** @type {string} */
215
226
  (source),
216
- parser.state.lastHarmonyImportOrder,
227
+ /** @type {number} */
228
+ (parser.state.lastHarmonyImportOrder),
217
229
  id ? [id] : [],
218
230
  name,
219
231
  harmonyNamedExports,
@@ -221,8 +233,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
221
233
  harmonyStarExports && harmonyStarExports.slice(),
222
234
  exportPresenceMode,
223
235
  harmonyStarExports,
224
- attributes,
225
- defer
236
+ getImportPhase(parser, statement),
237
+ attributes
226
238
  );
227
239
  if (harmonyStarExports) {
228
240
  harmonyStarExports.push(dep);
@@ -27,6 +27,7 @@ const {
27
27
  } = require("../util/runtime");
28
28
  const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
29
29
  const HarmonyImportDependency = require("./HarmonyImportDependency");
30
+ const { ImportPhaseUtils } = require("./ImportPhase");
30
31
  const processExportInfo = require("./processExportInfo");
31
32
 
32
33
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
@@ -57,8 +58,9 @@ const processExportInfo = require("./processExportInfo");
57
58
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
58
59
  /** @typedef {import("./HarmonyImportDependency").Ids} Ids */
59
60
  /** @typedef {import("./HarmonyImportDependency").ExportPresenceMode} ExportPresenceMode */
61
+ /** @typedef {import("../dependencies/ImportPhase").ImportPhaseType} ImportPhaseType */
60
62
 
61
- /** @typedef {"missing"|"unused"|"empty-star"|"reexport-dynamic-default"|"reexport-named-default"|"reexport-namespace-object"|"reexport-fake-namespace-object"|"reexport-undefined"|"normal-reexport"|"dynamic-reexport"} ExportModeType */
63
+ /** @typedef {"missing" | "unused" | "empty-star" | "reexport-dynamic-default" | "reexport-named-default" | "reexport-namespace-object" | "reexport-fake-namespace-object" | "reexport-undefined" | "normal-reexport" | "dynamic-reexport"} ExportModeType */
62
64
 
63
65
  const { ExportPresenceModes } = HarmonyImportDependency;
64
66
 
@@ -376,8 +378,8 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
376
378
  * @param {ReadonlyArray<HarmonyExportImportedSpecifierDependency> | null} otherStarExports other star exports in the module before this import
377
379
  * @param {ExportPresenceMode} exportPresenceMode mode of checking export names
378
380
  * @param {HarmonyStarExportsList | null} allStarExports all star exports in the module
381
+ * @param {ImportPhaseType} phase import phase
379
382
  * @param {ImportAttributes=} attributes import attributes
380
- * @param {boolean=} defer is defer phase
381
383
  */
382
384
  constructor(
383
385
  request,
@@ -388,10 +390,10 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
388
390
  otherStarExports,
389
391
  exportPresenceMode,
390
392
  allStarExports,
391
- attributes,
392
- defer
393
+ phase,
394
+ attributes
393
395
  ) {
394
- super(request, sourceOrder, attributes, defer);
396
+ super(request, sourceOrder, phase, attributes);
395
397
 
396
398
  this.ids = ids;
397
399
  this.name = name;
@@ -1050,12 +1052,14 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
1050
1052
  ) {
1051
1053
  const importedModule = /** @type {Module} */ (moduleGraph.getModule(dep));
1052
1054
  const importVar = dep.getImportVar(moduleGraph);
1055
+ const isDeferred =
1056
+ ImportPhaseUtils.isDefer(dep.phase) &&
1057
+ !(/** @type {BuildMeta} */ (importedModule.buildMeta).async);
1053
1058
 
1054
1059
  if (
1055
1060
  (mode.type === "reexport-namespace-object" ||
1056
1061
  mode.type === "reexport-fake-namespace-object") &&
1057
- dep.defer &&
1058
- !moduleGraph.isAsync(importedModule)
1062
+ isDeferred
1059
1063
  ) {
1060
1064
  initFragments.push(
1061
1065
  ...this.getReexportDeferredNamespaceObjectFragments(
@@ -1200,7 +1204,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
1200
1204
  moduleGraph.isAsync(importedModule)
1201
1205
  ? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
1202
1206
  : InitFragment.STAGE_HARMONY_IMPORTS,
1203
- dep.sourceOrder,
1207
+ /** @type {number} */ (dep.sourceOrder),
1204
1208
  key,
1205
1209
  runtimeCondition
1206
1210
  )
@@ -1261,7 +1265,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
1261
1265
  moduleGraph.isAsync(importedModule)
1262
1266
  ? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
1263
1267
  : InitFragment.STAGE_HARMONY_IMPORTS,
1264
- dep.sourceOrder
1268
+ /** @type {number} */ (dep.sourceOrder)
1265
1269
  )
1266
1270
  );
1267
1271
  break;
@@ -9,13 +9,13 @@ const RuntimeGlobals = require("../RuntimeGlobals");
9
9
 
10
10
  /** @typedef {import("../Module").BuildInfo} BuildInfo */
11
11
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
12
- /** @typedef {import("../Parser").ParserState} ParserState */
12
+ /** @typedef {import("../javascript/JavascriptParser").JavascriptParserState} JavascriptParserState */
13
13
 
14
- /** @type {WeakMap<ParserState, boolean>} */
14
+ /** @type {WeakMap<JavascriptParserState, boolean>} */
15
15
  const parserStateExportsState = new WeakMap();
16
16
 
17
17
  /**
18
- * @param {ParserState} parserState parser state
18
+ * @param {JavascriptParserState} parserState parser state
19
19
  * @param {boolean} isStrictHarmony strict harmony mode should be enabled
20
20
  * @returns {void}
21
21
  */
@@ -37,7 +37,7 @@ module.exports.enable = (parserState, isStrictHarmony) => {
37
37
  };
38
38
 
39
39
  /**
40
- * @param {ParserState} parserState parser state
40
+ * @param {JavascriptParserState} parserState parser state
41
41
  * @returns {boolean} true, when enabled
42
42
  */
43
43
  module.exports.isEnabled = (parserState) => {
@@ -12,6 +12,7 @@ const InitFragment = require("../InitFragment");
12
12
  const Template = require("../Template");
13
13
  const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
14
14
  const { filterRuntime, mergeRuntime } = require("../util/runtime");
15
+ const { ImportPhase, ImportPhaseUtils } = require("./ImportPhase");
15
16
  const ModuleDependency = require("./ModuleDependency");
16
17
 
17
18
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
@@ -23,6 +24,7 @@ const ModuleDependency = require("./ModuleDependency");
23
24
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
24
25
  /** @typedef {import("../WebpackError")} WebpackError */
25
26
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
27
+ /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
26
28
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
27
29
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
28
30
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
@@ -60,14 +62,18 @@ class HarmonyImportDependency extends ModuleDependency {
60
62
  /**
61
63
  * @param {string} request request string
62
64
  * @param {number} sourceOrder source order
65
+ * @param {ImportPhaseType=} phase import phase
63
66
  * @param {ImportAttributes=} attributes import attributes
64
- * @param {boolean=} defer import attributes
65
67
  */
66
- constructor(request, sourceOrder, attributes, defer) {
67
- super(request);
68
- this.sourceOrder = sourceOrder;
68
+ constructor(
69
+ request,
70
+ sourceOrder,
71
+ phase = ImportPhase.Evaluation,
72
+ attributes = undefined
73
+ ) {
74
+ super(request, sourceOrder);
75
+ this.phase = phase;
69
76
  this.attributes = attributes;
70
- this.defer = defer;
71
77
  }
72
78
 
73
79
  get category() {
@@ -79,7 +85,7 @@ class HarmonyImportDependency extends ModuleDependency {
79
85
  */
80
86
  getResourceIdentifier() {
81
87
  let str = super.getResourceIdentifier();
82
- if (this.defer) {
88
+ if (ImportPhaseUtils.isDefer(this.phase)) {
83
89
  str += "|defer";
84
90
  }
85
91
  if (this.attributes) {
@@ -104,10 +110,14 @@ class HarmonyImportDependency extends ModuleDependency {
104
110
  */
105
111
  getImportVar(moduleGraph) {
106
112
  const module = /** @type {Module} */ (moduleGraph.getParentModule(this));
113
+ const importedModule = /** @type {Module} */ (moduleGraph.getModule(this));
107
114
  const meta = moduleGraph.getMeta(module);
108
- const defer = this.defer;
109
115
 
110
- const metaKey = defer ? "deferredImportVarMap" : "importVarMap";
116
+ const isDeferred =
117
+ ImportPhaseUtils.isDefer(this.phase) &&
118
+ !(/** @type {BuildMeta} */ (importedModule.buildMeta).async);
119
+
120
+ const metaKey = isDeferred ? "deferredImportVarMap" : "importVarMap";
111
121
  let importVarMap = meta[metaKey];
112
122
  if (!importVarMap) {
113
123
  meta[metaKey] = importVarMap =
@@ -115,19 +125,12 @@ class HarmonyImportDependency extends ModuleDependency {
115
125
  (new Map());
116
126
  }
117
127
 
118
- let importVar = importVarMap.get(
119
- /** @type {Module} */
120
- (moduleGraph.getModule(this))
121
- );
128
+ let importVar = importVarMap.get(importedModule);
122
129
  if (importVar) return importVar;
123
130
  importVar = `${Template.toIdentifier(
124
131
  `${this.userRequest}`
125
- )}__WEBPACK_${this.defer ? "DEFERRED_" : ""}IMPORTED_MODULE_${importVarMap.size}__`;
126
- importVarMap.set(
127
- /** @type {Module} */
128
- (moduleGraph.getModule(this)),
129
- importVar
130
- );
132
+ )}__WEBPACK_${isDeferred ? "DEFERRED_" : ""}IMPORTED_MODULE_${importVarMap.size}__`;
133
+ importVarMap.set(importedModule, importVar);
131
134
  return importVar;
132
135
  }
133
136
 
@@ -167,7 +170,7 @@ class HarmonyImportDependency extends ModuleDependency {
167
170
  request: this.request,
168
171
  originModule: module,
169
172
  runtimeRequirements,
170
- defer: this.defer
173
+ dependency: this
171
174
  });
172
175
  }
173
176
 
@@ -289,9 +292,8 @@ class HarmonyImportDependency extends ModuleDependency {
289
292
  */
290
293
  serialize(context) {
291
294
  const { write } = context;
292
- write(this.sourceOrder);
293
295
  write(this.attributes);
294
- write(this.defer);
296
+ write(this.phase);
295
297
  super.serialize(context);
296
298
  }
297
299
 
@@ -300,9 +302,8 @@ class HarmonyImportDependency extends ModuleDependency {
300
302
  */
301
303
  deserialize(context) {
302
304
  const { read } = context;
303
- this.sourceOrder = read();
304
305
  this.attributes = read();
305
- this.defer = read();
306
+ this.phase = read();
306
307
  super.deserialize(context);
307
308
  }
308
309
  }
@@ -344,7 +345,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
344
345
  const moduleKey = referencedModule
345
346
  ? referencedModule.identifier()
346
347
  : dep.request;
347
- const key = `${dep.defer ? "deferred " : ""}harmony import ${moduleKey}`;
348
+ const key = `${ImportPhaseUtils.isDefer(dep.phase) ? "deferred " : ""}harmony import ${moduleKey}`;
348
349
 
349
350
  const runtimeCondition = dep.weak
350
351
  ? false
@@ -382,7 +383,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
382
383
  new ConditionalInitFragment(
383
384
  importStatement[0],
384
385
  InitFragment.STAGE_HARMONY_IMPORTS,
385
- dep.sourceOrder,
386
+ /** @type {number} */ (dep.sourceOrder),
386
387
  key,
387
388
  runtimeCondition
388
389
  )
@@ -395,7 +396,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
395
396
  new ConditionalInitFragment(
396
397
  importStatement[1],
397
398
  InitFragment.STAGE_ASYNC_HARMONY_IMPORTS,
398
- dep.sourceOrder,
399
+ /** @type {number} */ (dep.sourceOrder),
399
400
  `${key} compat`,
400
401
  runtimeCondition
401
402
  )
@@ -405,7 +406,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
405
406
  new ConditionalInitFragment(
406
407
  importStatement[0] + importStatement[1],
407
408
  InitFragment.STAGE_HARMONY_IMPORTS,
408
- dep.sourceOrder,
409
+ /** @type {number} */ (dep.sourceOrder),
409
410
  key,
410
411
  runtimeCondition
411
412
  )
@@ -5,7 +5,6 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const CommentCompilationWarning = require("../CommentCompilationWarning");
9
8
  const HotModuleReplacementPlugin = require("../HotModuleReplacementPlugin");
10
9
  const WebpackError = require("../WebpackError");
11
10
  const {
@@ -21,6 +20,7 @@ const HarmonyExports = require("./HarmonyExports");
21
20
  const { ExportPresenceModes } = require("./HarmonyImportDependency");
22
21
  const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
23
22
  const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
23
+ const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
24
24
 
25
25
  /** @typedef {import("estree").Expression} Expression */
26
26
  /** @typedef {import("estree").Identifier} Identifier */
@@ -36,6 +36,7 @@ const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDepend
36
36
  /** @typedef {import("../javascript/JavascriptParser").Members} Members */
37
37
  /** @typedef {import("../javascript/JavascriptParser").MembersOptionals} MembersOptionals */
38
38
  /** @typedef {import("./HarmonyImportDependency").Ids} Ids */
39
+ /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
39
40
 
40
41
  const harmonySpecifierTag = Symbol("harmony import");
41
42
 
@@ -47,7 +48,7 @@ const harmonySpecifierTag = Symbol("harmony import");
47
48
  * @property {string} name
48
49
  * @property {boolean} await
49
50
  * @property {ImportAttributes=} attributes
50
- * @property {boolean | undefined} defer
51
+ * @property {ImportPhaseType} phase
51
52
  */
52
53
 
53
54
  const PLUGIN_NAME = "HarmonyImportDependencyParserPlugin";
@@ -57,6 +58,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
57
58
  * @param {JavascriptParserOptions} options options
58
59
  */
59
60
  constructor(options) {
61
+ this.options = options;
60
62
  this.exportPresenceMode =
61
63
  options.importExportsPresence !== undefined
62
64
  ? ExportPresenceModes.fromUserOption(options.importExportsPresence)
@@ -66,7 +68,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
66
68
  ? ExportPresenceModes.ERROR
67
69
  : ExportPresenceModes.AUTO;
68
70
  this.strictThisContextOnImports = options.strictThisContextOnImports;
69
- this.deferImport = options.deferImport;
70
71
  }
71
72
 
72
73
  /**
@@ -76,6 +77,8 @@ module.exports = class HarmonyImportDependencyParserPlugin {
76
77
  apply(parser) {
77
78
  const { exportPresenceMode } = this;
78
79
 
80
+ const getImportPhase = createGetImportPhase(this.options.deferImport);
81
+
79
82
  /**
80
83
  * @param {Members} members members
81
84
  * @param {MembersOptionals} membersOptionals members Optionals
@@ -119,26 +122,24 @@ module.exports = class HarmonyImportDependencyParserPlugin {
119
122
  parser.state.module.addPresentationalDependency(clearDep);
120
123
  parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
121
124
  const attributes = getImportAttributes(statement);
122
- let defer = false;
123
- if (this.deferImport) {
124
- ({ defer } = getImportMode(parser, statement));
125
- if (
126
- defer &&
127
- (statement.specifiers.length !== 1 ||
128
- statement.specifiers[0].type !== "ImportNamespaceSpecifier")
129
- ) {
130
- const error = new WebpackError(
131
- "Deferred import can only be used with `import * as namespace from '...'` syntax."
132
- );
133
- error.loc = statement.loc || undefined;
134
- parser.state.current.addError(error);
135
- }
125
+ const phase = getImportPhase(parser, statement);
126
+ if (
127
+ ImportPhaseUtils.isDefer(phase) &&
128
+ (statement.specifiers.length !== 1 ||
129
+ statement.specifiers[0].type !== "ImportNamespaceSpecifier")
130
+ ) {
131
+ const error = new WebpackError(
132
+ "Deferred import can only be used with `import * as namespace from '...'` syntax."
133
+ );
134
+ error.loc = statement.loc || undefined;
135
+ parser.state.current.addError(error);
136
136
  }
137
+
137
138
  const sideEffectDep = new HarmonyImportSideEffectDependency(
138
139
  /** @type {string} */ (source),
139
140
  parser.state.lastHarmonyImportOrder,
140
- attributes,
141
- defer
141
+ phase,
142
+ attributes
142
143
  );
143
144
  sideEffectDep.loc = /** @type {DependencyLocation} */ (statement.loc);
144
145
  parser.state.module.addDependency(sideEffectDep);
@@ -148,9 +149,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
148
149
  PLUGIN_NAME,
149
150
  (statement, source, id, name) => {
150
151
  const ids = id === null ? [] : [id];
151
- const defer = this.deferImport
152
- ? getImportMode(parser, statement).defer
153
- : false;
152
+ const phase = getImportPhase(parser, statement);
154
153
  parser.tagVariable(
155
154
  name,
156
155
  harmonySpecifierTag,
@@ -160,7 +159,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
160
159
  ids,
161
160
  sourceOrder: parser.state.lastHarmonyImportOrder,
162
161
  attributes: getImportAttributes(statement),
163
- defer
162
+ phase
164
163
  })
165
164
  );
166
165
  return true;
@@ -237,9 +236,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
237
236
  /** @type {Range} */
238
237
  (expr.range),
239
238
  exportPresenceMode,
239
+ settings.phase,
240
240
  settings.attributes,
241
- [],
242
- settings.defer
241
+ []
243
242
  );
244
243
  dep.referencedPropertiesInDestructuring =
245
244
  parser.destructuringAssignmentPropertiesFor(expr);
@@ -287,9 +286,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
287
286
  /** @type {Range} */
288
287
  (expr.range),
289
288
  exportPresenceMode,
289
+ settings.phase,
290
290
  settings.attributes,
291
- ranges,
292
- settings.defer
291
+ ranges
293
292
  );
294
293
  dep.referencedPropertiesInDestructuring =
295
294
  parser.destructuringAssignmentPropertiesFor(expr);
@@ -337,9 +336,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
337
336
  settings.name,
338
337
  /** @type {Range} */ (expr.range),
339
338
  exportPresenceMode,
339
+ settings.phase,
340
340
  settings.attributes,
341
- ranges,
342
- settings.defer
341
+ ranges
343
342
  );
344
343
  dep.directImport = members.length === 0;
345
344
  dep.call = true;
@@ -406,44 +405,4 @@ module.exports = class HarmonyImportDependencyParserPlugin {
406
405
  }
407
406
  };
408
407
 
409
- /**
410
- * @param {JavascriptParser} parser parser
411
- * @param {ExportNamedDeclaration | ExportAllDeclaration | ImportDeclaration} node node
412
- * @returns {{ defer: boolean }} import attributes
413
- */
414
- function getImportMode(parser, node) {
415
- const result = { defer: "phase" in node && node.phase === "defer" };
416
- if (!node.range) {
417
- return result;
418
- }
419
- const { options, errors } = parser.parseCommentOptions(node.range);
420
- if (errors) {
421
- for (const e of errors) {
422
- const { comment } = e;
423
- if (!comment.loc) continue;
424
- parser.state.module.addWarning(
425
- new CommentCompilationWarning(
426
- `Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
427
- comment.loc
428
- )
429
- );
430
- }
431
- }
432
- if (!options) return result;
433
- if (options.webpackDefer) {
434
- if (typeof options.webpackDefer === "boolean") {
435
- result.defer = options.webpackDefer;
436
- } else if (node.loc) {
437
- parser.state.module.addWarning(
438
- new CommentCompilationWarning(
439
- "webpackDefer magic comment expected a boolean value.",
440
- node.loc
441
- )
442
- );
443
- }
444
- }
445
- return result;
446
- }
447
-
448
- module.exports.getImportMode = getImportMode;
449
408
  module.exports.harmonySpecifierTag = harmonySpecifierTag;
@@ -16,16 +16,17 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
16
16
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
17
17
  /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
18
18
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
19
+ /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
19
20
 
20
21
  class HarmonyImportSideEffectDependency extends HarmonyImportDependency {
21
22
  /**
22
23
  * @param {string} request the request string
23
24
  * @param {number} sourceOrder source order
25
+ * @param {ImportPhaseType} phase import phase
24
26
  * @param {ImportAttributes=} attributes import attributes
25
- * @param {boolean=} defer is defer phase
26
27
  */
27
- constructor(request, sourceOrder, attributes, defer) {
28
- super(request, sourceOrder, attributes, defer);
28
+ constructor(request, sourceOrder, phase, attributes) {
29
+ super(request, sourceOrder, phase, attributes);
29
30
  }
30
31
 
31
32
  get type() {