webpack 5.108.3 → 5.109.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 (191) hide show
  1. package/lib/APIPlugin.js +48 -29
  2. package/lib/CacheFacade.js +8 -0
  3. package/lib/ChunkGroup.js +1 -0
  4. package/lib/CompatibilityPlugin.js +31 -29
  5. package/lib/Compilation.js +50 -8
  6. package/lib/ConstPlugin.js +11 -11
  7. package/lib/ContextModule.js +239 -6
  8. package/lib/ContextModuleFactory.js +139 -14
  9. package/lib/DefinePlugin.js +396 -101
  10. package/lib/Entrypoint.js +1 -1
  11. package/lib/ExportsInfoApiPlugin.js +2 -2
  12. package/lib/ExternalModule.js +107 -5
  13. package/lib/ExternalModuleFactoryPlugin.js +20 -1
  14. package/lib/FileSystemInfo.js +130 -74
  15. package/lib/FlagDependencyExportsPlugin.js +55 -8
  16. package/lib/HotModuleReplacementPlugin.js +18 -15
  17. package/lib/LazyBarrel.js +30 -3
  18. package/lib/Module.js +3 -0
  19. package/lib/ModuleFilenameHelpers.js +2 -2
  20. package/lib/ModuleTypeConstants.js +8 -1
  21. package/lib/MultiCompiler.js +13 -2
  22. package/lib/MultiWatching.js +1 -0
  23. package/lib/NodeStuffPlugin.js +51 -33
  24. package/lib/NormalModule.js +169 -405
  25. package/lib/NormalModuleFactory.js +76 -2
  26. package/lib/ProgressPlugin.js +211 -119
  27. package/lib/ProvidePlugin.js +2 -2
  28. package/lib/RuntimeGlobals.js +47 -0
  29. package/lib/RuntimePlugin.js +33 -0
  30. package/lib/RuntimeTemplate.js +304 -16
  31. package/lib/UseStrictPlugin.js +1 -1
  32. package/lib/WebpackIsIncludedPlugin.js +1 -1
  33. package/lib/WebpackOptionsApply.js +24 -19
  34. package/lib/asset/AssetGenerator.js +110 -28
  35. package/lib/asset/AssetModulesPlugin.js +92 -2
  36. package/lib/asset/WebManifestGenerator.js +164 -0
  37. package/lib/asset/WebManifestParser.js +130 -0
  38. package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
  39. package/lib/async-modules/isGeneratorLowered.js +26 -0
  40. package/lib/cache/PackFileCacheStrategy.js +9 -3
  41. package/lib/config/browserslistTargetHandler.js +40 -0
  42. package/lib/config/defaults.js +222 -32
  43. package/lib/config/normalization.js +26 -0
  44. package/lib/config/target.js +9 -1
  45. package/lib/css/CssGenerator.js +73 -73
  46. package/lib/css/CssLoadingRuntimeModule.js +5 -1
  47. package/lib/css/CssModulesPlugin.js +92 -53
  48. package/lib/css/CssParser.js +843 -302
  49. package/lib/css/syntax.js +1219 -483
  50. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
  51. package/lib/dependencies/AMDPlugin.js +2 -2
  52. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
  53. package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
  54. package/lib/dependencies/CommonJsExportsDependency.js +47 -2
  55. package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
  56. package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
  57. package/lib/dependencies/CommonJsPlugin.js +2 -2
  58. package/lib/dependencies/CommonJsRequireDependency.js +26 -1
  59. package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
  60. package/lib/dependencies/ContextDependencyHelpers.js +3 -3
  61. package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
  62. package/lib/dependencies/CssIcssExportDependency.js +190 -87
  63. package/lib/dependencies/CssUrlDependency.js +35 -4
  64. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
  65. package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
  66. package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
  67. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
  68. package/lib/dependencies/HarmonyImportDependency.js +12 -1
  69. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +34 -107
  70. package/lib/dependencies/HarmonyImportGuard.js +192 -20
  71. package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
  72. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
  73. package/lib/dependencies/HtmlEntryDependency.js +797 -172
  74. package/lib/dependencies/HtmlSourceDependency.js +26 -0
  75. package/lib/dependencies/ImportDependency.js +43 -1
  76. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
  77. package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
  78. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  79. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  80. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  81. package/lib/dependencies/ImportMetaPlugin.js +532 -180
  82. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  83. package/lib/dependencies/ImportParserPlugin.js +87 -26
  84. package/lib/dependencies/ImportPhase.js +10 -8
  85. package/lib/dependencies/LoaderPlugin.js +5 -1
  86. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  87. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
  88. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
  89. package/lib/dependencies/SystemPlugin.js +2 -4
  90. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  91. package/lib/dependencies/URLDependency.js +141 -21
  92. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
  93. package/lib/dependencies/WorkerDependency.js +86 -18
  94. package/lib/dependencies/WorkletDependency.js +278 -0
  95. package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
  96. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
  97. package/lib/errors/LoaderLoadingError.js +20 -0
  98. package/lib/errors/ModuleParseError.js +39 -22
  99. package/lib/errors/NodeStuffInWebError.js +1 -1
  100. package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
  101. package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
  102. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
  103. package/lib/hmr/lazyCompilationBackend.js +32 -8
  104. package/lib/html/HtmlGenerator.js +940 -91
  105. package/lib/html/HtmlModule.js +3 -2
  106. package/lib/html/HtmlModulesPlugin.js +625 -170
  107. package/lib/html/HtmlParser.js +812 -340
  108. package/lib/html/favicon.svg +1 -0
  109. package/lib/html/syntax.js +2116 -834
  110. package/lib/ids/IdHelpers.js +1 -1
  111. package/lib/index.js +6 -0
  112. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  113. package/lib/javascript/BasicEvaluatedExpression.js +366 -48
  114. package/lib/javascript/JavascriptGenerator.js +197 -49
  115. package/lib/javascript/JavascriptModulesPlugin.js +178 -24
  116. package/lib/javascript/JavascriptParser.js +711 -355
  117. package/lib/javascript/JavascriptParserHelpers.js +3 -6
  118. package/lib/javascript/syntax.js +4380 -0
  119. package/lib/library/ModuleLibraryPlugin.js +38 -1
  120. package/lib/loaders/LoaderRunner.js +714 -0
  121. package/lib/loaders/loadLoader.js +100 -0
  122. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +19 -0
  123. package/lib/node/ReadFileCompileWasmPlugin.js +14 -0
  124. package/lib/optimize/ConcatenatedModule.js +120 -16
  125. package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
  126. package/lib/optimize/InnerGraphPlugin.js +50 -30
  127. package/lib/optimize/ModuleConcatenationPlugin.js +69 -3
  128. package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
  129. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
  130. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
  131. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  132. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  133. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  134. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  135. package/lib/rules/RuleSetCompiler.js +114 -0
  136. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  137. package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
  138. package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
  139. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  140. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  141. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
  142. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
  143. package/lib/schemes/HttpUriPlugin.js +40 -1
  144. package/lib/schemes/VirtualUrlPlugin.js +1 -2
  145. package/lib/serialization/FileMiddleware.js +29 -3
  146. package/lib/stats/DefaultStatsFactoryPlugin.js +32 -3
  147. package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
  148. package/lib/stats/DefaultStatsPrinterPlugin.js +12 -2
  149. package/lib/stats/StatsFactory.js +15 -8
  150. package/lib/url/URLParserPlugin.js +98 -19
  151. package/lib/util/AsyncQueue.js +122 -72
  152. package/lib/util/LocConverter.js +9 -8
  153. package/lib/util/SetHelpers.js +1 -1
  154. package/lib/util/SourceProcessor.js +41 -28
  155. package/lib/util/StackedMap.js +122 -48
  156. package/lib/util/binarySearchBounds.js +2 -2
  157. package/lib/util/concatenate.js +40 -14
  158. package/lib/util/createHooksRegistry.js +13 -5
  159. package/lib/util/dataURL.js +2 -2
  160. package/lib/util/deterministicGrouping.js +7 -5
  161. package/lib/util/formatSize.js +6 -2
  162. package/lib/util/globUtils.js +710 -0
  163. package/lib/util/identifier.js +23 -6
  164. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  165. package/lib/util/internalSerializables.js +88 -71
  166. package/lib/util/magicComment.js +121 -25
  167. package/lib/util/numberHash.js +2 -2
  168. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
  169. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
  170. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
  171. package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
  172. package/lib/web/FetchCompileWasmPlugin.js +14 -0
  173. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
  174. package/lib/webpack.js +65 -0
  175. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
  176. package/module.d.ts +21 -0
  177. package/package.json +14 -13
  178. package/schemas/WebpackOptions.check.js +1 -1
  179. package/schemas/WebpackOptions.json +759 -36
  180. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  181. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  182. package/schemas/plugins/ProgressPlugin.json +17 -1
  183. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  184. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  185. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  186. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  187. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  188. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  189. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  190. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  191. package/types.d.ts +1300 -325
@@ -10,10 +10,16 @@ const EnvironmentNotSupportAsyncWarning = require("../errors/EnvironmentNotSuppo
10
10
  const DynamicExports = require("./DynamicExports");
11
11
  const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
12
12
  const HarmonyExports = require("./HarmonyExports");
13
- const { IMPORT_META_NAMES } = require("./ImportMetaPlugin");
13
+ const {
14
+ IMPORT_META_NAMES,
15
+ IMPORT_META_STAGE_ESM_DETECTION
16
+ } = require("./ImportMetaPlugin");
17
+ const TopLevelAwaitDependency = require("./TopLevelAwaitDependency");
14
18
 
19
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
15
20
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
16
21
  /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
22
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
17
23
 
18
24
  const PLUGIN_NAME = "HarmonyDetectionParserPlugin";
19
25
 
@@ -68,34 +74,58 @@ module.exports = class HarmonyDetectionParserPlugin {
68
74
  }
69
75
  });
70
76
 
71
- parser.hooks.topLevelAwait.tap(PLUGIN_NAME, () => {
77
+ parser.hooks.topLevelAwait.tap(PLUGIN_NAME, (node) => {
72
78
  const module = parser.state.module;
73
79
  enableHarmony(false);
74
80
  /** @type {BuildMeta} */
75
81
  (module.buildMeta).async = true;
76
- EnvironmentNotSupportAsyncWarning.check(
77
- module,
78
- parser.state.compilation.runtimeTemplate,
79
- "topLevelAwait"
80
- );
82
+ const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
83
+ if (node.type === "AwaitExpression") {
84
+ // Record for a possible `await` -> `(yield …)` rewrite when the module
85
+ // is lowered to a generator (target without `async`/`await`).
86
+ module.addPresentationalDependency(
87
+ new TopLevelAwaitDependency(
88
+ /** @type {Range} */ (node.range),
89
+ /** @type {Range} */ (node.argument.range)
90
+ )
91
+ );
92
+ } else {
93
+ // `for await…of` can't be expressed as a generator; never lower it.
94
+ buildInfo.usesTopLevelAwaitForOf = true;
95
+ }
96
+ const { runtimeTemplate } = parser.state.compilation;
97
+ if (
98
+ !runtimeTemplate.supportsAsyncFunction() &&
99
+ (!runtimeTemplate.supportsGenerator() ||
100
+ buildInfo.usesTopLevelAwaitForOf)
101
+ ) {
102
+ module.addWarning(
103
+ new EnvironmentNotSupportAsyncWarning(module, "topLevelAwait")
104
+ );
105
+ }
81
106
  });
82
107
 
83
108
  // Using `import.meta` only parses as a module, so it marks the module ESM.
84
- // Non-bailing and run before ImportMetaPlugin so its handling still runs;
85
- // unknown members go through `unhandledExpressionMemberChain`.
109
+ // Non-bailing; staged before the bailing DefinePlugin and ImportMetaPlugin
110
+ // replacement taps so it observes every access; unknown members go
111
+ // through `unhandledExpressionMemberChain`.
86
112
  const onImportMeta = () => {
87
113
  enableHarmony(false);
88
114
  };
115
+ const earlyTapOptions = {
116
+ name: PLUGIN_NAME,
117
+ stage: IMPORT_META_STAGE_ESM_DETECTION
118
+ };
89
119
  for (const name of IMPORT_META_NAMES) {
90
- parser.hooks.expression.for(name).tap(PLUGIN_NAME, onImportMeta);
91
- parser.hooks.typeof.for(name).tap(PLUGIN_NAME, onImportMeta);
120
+ parser.hooks.expression.for(name).tap(earlyTapOptions, onImportMeta);
121
+ parser.hooks.typeof.for(name).tap(earlyTapOptions, onImportMeta);
92
122
  }
93
123
  parser.hooks.expressionMemberChain
94
124
  .for("import.meta")
95
- .tap(PLUGIN_NAME, onImportMeta);
125
+ .tap(earlyTapOptions, onImportMeta);
96
126
  parser.hooks.unhandledExpressionMemberChain
97
127
  .for("import.meta")
98
- .tap(PLUGIN_NAME, onImportMeta);
128
+ .tap(earlyTapOptions, onImportMeta);
99
129
 
100
130
  /**
101
131
  * Returns true if in harmony.
@@ -70,10 +70,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
70
70
  ),
71
71
  /** @type {Range} */ (statement.range)
72
72
  );
73
- dep.setLocWithIndex(
74
- /** @type {DependencyLocation} */ (statement.loc),
75
- -1
76
- );
73
+ dep.setLocWithIndex(parser.getLocation(statement), -1);
77
74
  parser.state.module.addPresentationalDependency(dep);
78
75
  return true;
79
76
  });
@@ -84,10 +81,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
84
81
  "",
85
82
  /** @type {Range} */ (statement.range)
86
83
  );
87
- clearDep.setLocWithIndex(
88
- /** @type {DependencyLocation} */ (statement.loc),
89
- -1
90
- );
84
+ clearDep.setLocWithIndex(parser.getLocation(statement), -1);
91
85
  parser.state.module.addPresentationalDependency(clearDep);
92
86
 
93
87
  const phase = getImportPhase(parser, statement);
@@ -95,7 +89,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
95
89
  const error = new WebpackError(
96
90
  "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 };"
97
91
  );
98
- error.loc = statement.loc || undefined;
92
+ error.loc = parser.getLocation(statement) || undefined;
99
93
  parser.state.current.addError(error);
100
94
  }
101
95
  const sideEffectDep = new HarmonyImportSideEffectDependency(
@@ -104,10 +98,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
104
98
  phase,
105
99
  getImportAttributes(statement)
106
100
  );
107
- sideEffectDep.setLocWithIndex(
108
- /** @type {DependencyLocation} */ (statement.loc),
109
- -1
110
- );
101
+ sideEffectDep.setLocWithIndex(parser.getLocation(statement), -1);
111
102
  // lazy barrel: defer at parse time when the importing module is side-effect-free
112
103
  const moduleFactoryMeta = parser.state.module.factoryMeta;
113
104
  if (moduleFactoryMeta !== undefined && moduleFactoryMeta.sideEffectFree) {
@@ -168,10 +159,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
168
159
  node.type === "ClassDeclaration" ||
169
160
  node.type === "ClassExpression") &&
170
161
  !node.id));
171
- dep.setLocWithIndex(
172
- /** @type {DependencyLocation} */ (statement.loc),
173
- -1
174
- );
162
+ dep.setLocWithIndex(parser.getLocation(statement), -1);
175
163
  parser.state.current.addDependency(dep);
176
164
  getInnerGraphUtils(parser.state.compilation).addVariableUsage(
177
165
  parser,
@@ -241,7 +229,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
241
229
  dep.setLazy(true);
242
230
  }
243
231
  dep.setLocWithIndex(
244
- /** @type {DependencyLocation} */ (statement.loc),
232
+ parser.getLocation(statement),
245
233
  /** @type {number} */ (idx)
246
234
  );
247
235
  const isAsiSafe = !parser.isAsiPosition(
@@ -296,7 +284,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
296
284
  dep.setLazy(true);
297
285
  }
298
286
  dep.setLocWithIndex(
299
- /** @type {DependencyLocation} */ (statement.loc),
287
+ parser.getLocation(statement),
300
288
  /** @type {number} */ (idx)
301
289
  );
302
290
  const isAsiSafe = !parser.isAsiPosition(
@@ -10,6 +10,7 @@ const Dependency = require("../Dependency");
10
10
  const InitFragment = require("../InitFragment");
11
11
  const Template = require("../Template");
12
12
  const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
13
+ const isGeneratorLowered = require("../async-modules/isGeneratorLowered");
13
14
  const { filterRuntime, mergeRuntime } = require("../util/runtime");
14
15
  const HarmonyLinkingError = require("./HarmonyLinkingError");
15
16
  const { ImportPhase, ImportPhaseUtils } = require("./ImportPhase");
@@ -475,8 +476,18 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
475
476
  )
476
477
  );
477
478
  const importVar = dep.getImportVar(templateContext.moduleGraph);
479
+ // When the consuming module is emitted as a generator (target without
480
+ // `async`/`await`), the dependency `await` must become `yield`.
481
+ const generatorLowered = isGeneratorLowered(
482
+ /** @type {Module} */ (module),
483
+ moduleGraph,
484
+ templateContext.runtimeTemplate
485
+ );
478
486
  templateContext.initFragments.push(
479
- new AwaitDependenciesInitFragment(new Map([[importVar, importVar]]))
487
+ new AwaitDependenciesInitFragment(
488
+ new Map([[importVar, importVar]]),
489
+ generatorLowered
490
+ )
480
491
  );
481
492
  templateContext.initFragments.push(
482
493
  new ConditionalInitFragment(
@@ -12,7 +12,6 @@ const {
12
12
  getImportAttributes
13
13
  } = require("../javascript/JavascriptParser");
14
14
  const { getInnerGraphUtils } = require("../optimize/InnerGraph");
15
- const memoize = require("../util/memoize");
16
15
  const ConstDependency = require("./ConstDependency");
17
16
  const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
18
17
  const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
@@ -22,6 +21,10 @@ const {
22
21
  ExportPresenceModes,
23
22
  getNonOptionalPart
24
23
  } = require("./HarmonyImportDependency");
24
+ const {
25
+ attachDependencyGuards,
26
+ isPresentByGuards
27
+ } = require("./HarmonyImportGuard");
25
28
  const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
26
29
  const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
27
30
  const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
@@ -46,10 +49,6 @@ const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
46
49
  /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
47
50
  /** @typedef {import("./HarmonyImportGuard").GuardFrame} GuardFrame */
48
51
 
49
- /** @typedef {Map<string, Set<string>>} Guards Map of import root to guarded member keys */
50
-
51
- const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));
52
-
53
52
  const harmonySpecifierTag = Symbol("harmony import");
54
53
 
55
54
  // Shared placeholder: plain specifier references have no member ranges, so they
@@ -137,6 +136,12 @@ const findImportSpecifier = (parser, node) => {
137
136
  parser,
138
137
  /** @type {Expression} */ (node.object)
139
138
  );
139
+ case "BinaryExpression":
140
+ // `"x" in ns` presence guard
141
+ return (
142
+ node.operator === "in" &&
143
+ findImportSpecifier(parser, /** @type {Expression} */ (node.right))
144
+ );
140
145
  default:
141
146
  return false;
142
147
  }
@@ -175,21 +180,18 @@ module.exports = class HarmonyImportDependencyParserPlugin {
175
180
  );
176
181
  if (!harmonySettings) return this.exportPresenceMode;
177
182
 
183
+ if (this.exportPresenceMode === ExportPresenceModes.NONE) {
184
+ return this.exportPresenceMode;
185
+ }
186
+
178
187
  const stack = /** @type {GuardFrame[] | undefined} */ (
179
188
  parser.state.guardStack
180
189
  );
181
- if (stack !== undefined) {
182
- const name = harmonySettings.name;
183
- const member = ids[0];
184
- for (let i = stack.length - 1; i >= 0; i--) {
185
- const presence = stack[i].presence;
186
- if (presence !== undefined) {
187
- const members = presence.get(name);
188
- if (members !== undefined && members.has(member)) {
189
- return ExportPresenceModes.NONE;
190
- }
191
- }
192
- }
190
+ if (
191
+ stack !== undefined &&
192
+ isPresentByGuards(parser, stack, harmonySettings.name, ids[0])
193
+ ) {
194
+ return ExportPresenceModes.NONE;
193
195
  }
194
196
 
195
197
  return this.exportPresenceMode;
@@ -235,7 +237,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
235
237
  : "",
236
238
  /** @type {Range} */ (statement.range)
237
239
  );
238
- clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
240
+ clearDep.loc = parser.getLocation(statement);
239
241
  parser.state.module.addPresentationalDependency(clearDep);
240
242
  parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
241
243
  const attributes = getImportAttributes(statement);
@@ -248,7 +250,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
248
250
  const error = new WebpackError(
249
251
  "Deferred import can only be used with `import * as namespace from '...'` syntax."
250
252
  );
251
- error.loc = statement.loc || undefined;
253
+ error.loc = parser.getLocation(statement) || undefined;
252
254
  parser.state.current.addError(error);
253
255
  }
254
256
 
@@ -258,7 +260,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
258
260
  phase,
259
261
  attributes
260
262
  );
261
- sideEffectDep.loc = /** @type {DependencyLocation} */ (statement.loc);
263
+ sideEffectDep.loc = parser.getLocation(statement);
262
264
  parser.state.module.addDependency(sideEffectDep);
263
265
  return true;
264
266
  });
@@ -305,7 +307,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
305
307
  dep.asiSafe = !parser.isAsiPosition(
306
308
  /** @type {Range} */ (expression.range)[0]
307
309
  );
308
- dep.loc = /** @type {DependencyLocation} */ (expression.loc);
310
+ dep.loc = parser.getLocation(expression);
309
311
  parser.state.module.addDependency(dep);
310
312
  getInnerGraphUtils(parser.state.compilation).onUsage(
311
313
  parser.state,
@@ -351,10 +353,10 @@ module.exports = class HarmonyImportDependencyParserPlugin {
351
353
  dep.asiSafe = !parser.isAsiPosition(
352
354
  /** @type {Range} */ (expr.range)[0]
353
355
  );
354
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
356
+ dep.loc = parser.getLocation(expr);
355
357
  dep.call = parser.scope.inTaggedTemplateTag;
356
358
  parser.state.module.addDependency(dep);
357
- getHarmonyImportGuard().attachDependencyGuards(parser, dep);
359
+ attachDependencyGuards(parser, dep);
358
360
  getInnerGraphUtils(parser.state.compilation).onUsage(
359
361
  parser.state,
360
362
  (e) => (dep.usedByExports = e)
@@ -404,9 +406,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
404
406
  /** @type {Range} */
405
407
  (expr.range)[0]
406
408
  );
407
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
409
+ dep.loc = parser.getLocation(expr);
408
410
  parser.state.module.addDependency(dep);
409
- getHarmonyImportGuard().attachDependencyGuards(parser, dep);
411
+ attachDependencyGuards(parser, dep);
410
412
  getInnerGraphUtils(parser.state.compilation).onUsage(
411
413
  parser.state,
412
414
  (e) => (dep.usedByExports = e)
@@ -461,9 +463,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
461
463
  dep.namespaceObjectAsContext =
462
464
  members.length > 0 &&
463
465
  /** @type {boolean} */ (this.strictThisContextOnImports);
464
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
466
+ dep.loc = parser.getLocation(expr);
465
467
  parser.state.module.addDependency(dep);
466
- getHarmonyImportGuard().attachDependencyGuards(parser, dep);
468
+ attachDependencyGuards(parser, dep);
467
469
  if (args) parser.walkExpressions(args);
468
470
  getInnerGraphUtils(parser.state.compilation).onUsage(
469
471
  parser.state,
@@ -502,7 +504,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
502
504
  }
503
505
  const dependencies = requests.map((request) => {
504
506
  const dep = new HarmonyAcceptImportDependency(request);
505
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
507
+ dep.loc = parser.getLocation(expr);
506
508
  parser.state.module.addDependency(dep);
507
509
  return dep;
508
510
  });
@@ -513,7 +515,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
513
515
  dependencies,
514
516
  true
515
517
  );
516
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
518
+ dep.loc = parser.getLocation(expr);
517
519
  parser.state.module.addDependency(dep);
518
520
  }
519
521
  });
@@ -524,7 +526,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
524
526
  }
525
527
  const dependencies = requests.map((request) => {
526
528
  const dep = new HarmonyAcceptImportDependency(request);
527
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
529
+ dep.loc = parser.getLocation(expr);
528
530
  parser.state.module.addDependency(dep);
529
531
  return dep;
530
532
  });
@@ -535,7 +537,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
535
537
  dependencies,
536
538
  false
537
539
  );
538
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
540
+ dep.loc = parser.getLocation(expr);
539
541
  parser.state.module.addDependency(dep);
540
542
  }
541
543
  });
@@ -543,90 +545,15 @@ module.exports = class HarmonyImportDependencyParserPlugin {
543
545
  parser.hooks.collectGuards.tap(PLUGIN_NAME, (expression) => {
544
546
  if (parser.scope.isAsmJs) return;
545
547
 
546
- // Presence guards: `"x" in ns` checks that suppress export-presence errors
547
- // (consequent only).
548
- /** @type {Guards | undefined} */
549
- let presence;
550
- if (this.exportPresenceMode !== ExportPresenceModes.NONE) {
551
- /** @type {Guards} */
552
- const guards = new Map();
553
-
554
- /**
555
- * Processes the provided expression.
556
- * @param {Expression} expression expression
557
- * @param {boolean} needTruthy need to be truthy
558
- */
559
- const collect = (expression, needTruthy) => {
560
- if (
561
- expression.type === "UnaryExpression" &&
562
- expression.operator === "!"
563
- ) {
564
- collect(expression.argument, !needTruthy);
565
- return;
566
- } else if (expression.type === "LogicalExpression" && needTruthy) {
567
- if (expression.operator === "&&") {
568
- collect(expression.left, true);
569
- collect(expression.right, true);
570
- } else if (expression.operator === "||") {
571
- const leftEvaluation = parser.evaluateExpression(expression.left);
572
- const leftBool = leftEvaluation.asBool();
573
- if (leftBool === false) {
574
- collect(expression.right, true);
575
- }
576
- } else if (expression.operator === "??") {
577
- const leftEvaluation = parser.evaluateExpression(expression.left);
578
- const leftNullish = leftEvaluation.asNullish();
579
- if (leftNullish === true) {
580
- collect(expression.right, true);
581
- }
582
- }
583
- return;
584
- }
585
- if (!needTruthy) return;
586
-
587
- // Direct `"x" in ns` guards
588
- if (
589
- expression.type === "BinaryExpression" &&
590
- expression.operator === "in"
591
- ) {
592
- if (expression.right.type !== "Identifier") {
593
- return;
594
- }
595
- const info = getInOperatorHarmonyImportInfo(
596
- parser,
597
- expression.left,
598
- expression.right
599
- );
600
- if (!info) return;
601
-
602
- const { settings, leftPart, members } = info;
603
- // Only direct namespace guards
604
- if (members.length > 0) return;
605
- const guarded = guards.get(settings.name);
606
- if (guarded) {
607
- guarded.add(leftPart);
608
- return;
609
- }
610
-
611
- guards.set(settings.name, new Set([leftPart]));
612
- }
613
- };
614
-
615
- collect(expression, true);
616
-
617
- if (guards.size > 0) presence = guards;
618
- }
619
-
620
548
  const hasSpecifier = findImportSpecifier(parser, expression);
621
549
  const depStart = hasSpecifier
622
550
  ? /** @type {Module} */ (parser.state.module).dependencies.length
623
551
  : undefined;
624
552
 
625
- if (presence === undefined && depStart === undefined) return;
553
+ if (depStart === undefined) return;
626
554
 
627
555
  /** @type {GuardFrame} */
628
556
  const consequent = {
629
- presence,
630
557
  test: expression,
631
558
  depStart,
632
559
  condition: true