@depup/webpack 5.110.1-depup.0 → 5.111.1-depup.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 (304) hide show
  1. package/README.md +7 -8
  2. package/changes.json +7 -11
  3. package/lib/APIPlugin.js +26 -11
  4. package/lib/AutomaticPrefetchPlugin.js +1 -1
  5. package/lib/Cache.js +8 -3
  6. package/lib/CacheFacade.js +1 -1
  7. package/lib/ChunkGraph.js +20 -18
  8. package/lib/CircularModulesPlugin.js +157 -55
  9. package/lib/CleanPlugin.js +2 -2
  10. package/lib/CompatibilityPlugin.js +3 -4
  11. package/lib/Compilation.js +337 -338
  12. package/lib/Compiler.js +213 -51
  13. package/lib/ConcatenationScope.js +25 -35
  14. package/lib/ConstPlugin.js +16 -132
  15. package/lib/CopyPlugin.js +1054 -0
  16. package/lib/DefinePlugin.js +24 -8
  17. package/lib/DependencyTemplate.js +2 -1
  18. package/lib/DotenvPlugin.js +64 -40
  19. package/lib/ErrorHelpers.js +113 -0
  20. package/lib/ExportsInfo.js +30 -16
  21. package/lib/ExternalModule.js +47 -22
  22. package/lib/FileSystemInfo.js +17 -14
  23. package/lib/FlagDependencyExportsPlugin.js +53 -34
  24. package/lib/FlagDependencyUsagePlugin.js +17 -15
  25. package/lib/Generator.js +24 -2
  26. package/lib/HotModuleReplacementPlugin.js +55 -7
  27. package/lib/IgnorePlugin.js +1 -1
  28. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  29. package/lib/LoaderOptionsPlugin.js +1 -1
  30. package/lib/MainTemplate.js +5 -1
  31. package/lib/Module.js +19 -10
  32. package/lib/ModuleGraph.js +6 -9
  33. package/lib/MultiCompiler.js +7 -17
  34. package/lib/MultiWatching.js +1 -1
  35. package/lib/NormalModule.js +148 -70
  36. package/lib/NormalModuleFactory.js +1 -1
  37. package/lib/RuntimeGlobals.js +21 -7
  38. package/lib/RuntimeModule.js +28 -12
  39. package/lib/RuntimePlugin.js +33 -3
  40. package/lib/RuntimeTemplate.js +1147 -847
  41. package/lib/SourceMapDevToolPlugin.js +54 -104
  42. package/lib/TemplatedPathPlugin.js +16 -59
  43. package/lib/Watching.js +9 -0
  44. package/lib/WebpackOptionsApply.js +84 -91
  45. package/lib/asset/AssetBytesGenerator.js +7 -1
  46. package/lib/asset/AssetGenerator.js +50 -24
  47. package/lib/asset/AssetModule.js +3 -0
  48. package/lib/asset/AssetSourceGenerator.js +7 -1
  49. package/lib/asset/WebManifestParser.js +7 -5
  50. package/lib/async-modules/AsyncModuleHelpers.js +10 -4
  51. package/lib/buildChunkGraph.js +11 -15
  52. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  53. package/lib/cache/IdleFileCachePlugin.js +2 -2
  54. package/lib/cache/MemoryCachePlugin.js +4 -4
  55. package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
  56. package/lib/cache/PackFileCacheStrategy.js +17 -19
  57. package/lib/cache/getLazyHashedEtag.js +3 -5
  58. package/lib/config/browserslistTargetHandler.js +17 -4
  59. package/lib/config/defaults.js +162 -142
  60. package/lib/config/getClaimedAssetTypes.js +10 -11
  61. package/lib/config/normalization.js +100 -20
  62. package/lib/config/target.js +13 -4
  63. package/lib/container/ContainerReferencePlugin.js +6 -0
  64. package/lib/container/RemoteRuntimeModule.js +9 -0
  65. package/lib/container/declaredRemotes.js +39 -0
  66. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  67. package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
  68. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
  69. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  70. package/lib/css/CssGenerator.js +27 -11
  71. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  72. package/lib/css/CssLoadingRuntimeModule.js +92 -15
  73. package/lib/css/CssModule.js +1 -1
  74. package/lib/css/CssModulesPlugin.js +3 -10
  75. package/lib/css/CssParser.js +162 -31
  76. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  77. package/lib/css/cssMinify.js +43 -32
  78. package/lib/css/data.js +3526 -871
  79. package/lib/css/syntax.js +6455 -1237
  80. package/lib/debug/ProfilingPlugin.js +7 -4
  81. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  82. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  83. package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
  84. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  85. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
  86. package/lib/dependencies/CommonJsPlugin.js +19 -3
  87. package/lib/dependencies/CommonJsRequireDependency.js +32 -9
  88. package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
  89. package/lib/dependencies/ContextDependency.js +1 -1
  90. package/lib/dependencies/ContextDependencyHelpers.js +3 -9
  91. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +20 -7
  92. package/lib/dependencies/ContextElementDependency.js +1 -1
  93. package/lib/dependencies/CssIcssExportDependency.js +13 -9
  94. package/lib/dependencies/CssIcssImportDependency.js +3 -6
  95. package/lib/dependencies/CssUrlDependency.js +3 -5
  96. package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
  97. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
  98. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +10 -4
  99. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +12 -7
  100. package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
  101. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +217 -34
  102. package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
  103. package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
  104. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  105. package/lib/dependencies/HarmonyImportDependency.js +99 -41
  106. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +198 -25
  107. package/lib/dependencies/HarmonyImportSideEffectDependency.js +117 -4
  108. package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
  109. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  110. package/lib/dependencies/HtmlEntryDependency.js +136 -104
  111. package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
  112. package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
  113. package/lib/dependencies/ImportContextDependency.js +43 -3
  114. package/lib/dependencies/ImportDependency.js +8 -29
  115. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  116. package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
  117. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  118. package/lib/dependencies/ImportMetaPlugin.js +67 -25
  119. package/lib/dependencies/ImportParserPlugin.js +25 -15
  120. package/lib/dependencies/LoaderPlugin.js +26 -1
  121. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  122. package/lib/dependencies/RequireHeaderDependency.js +20 -21
  123. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  124. package/lib/dependencies/URLContextDependency.js +1 -1
  125. package/lib/dependencies/URLDependency.js +6 -5
  126. package/lib/dependencies/WorkerAndWorkletPlugin.js +16 -21
  127. package/lib/dependencies/WorkerDependency.js +12 -18
  128. package/lib/dependencies/WorkletDependency.js +12 -20
  129. package/lib/dependencies/importOptionsCheck.js +47 -0
  130. package/lib/dll/DelegatedModule.js +18 -1
  131. package/lib/dll/DllReferencePlugin.js +11 -8
  132. package/lib/dll/LibManifestPlugin.js +1 -1
  133. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  134. package/lib/errors/DotenvFileError.js +29 -0
  135. package/lib/errors/DuplicateModulesWarning.js +12 -7
  136. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  137. package/lib/errors/ExternalStarReexportError.js +44 -0
  138. package/lib/errors/HookWebpackError.js +3 -2
  139. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  140. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  141. package/lib/errors/ModuleParseError.js +2 -1
  142. package/lib/errors/UnusedAssetsWarning.js +36 -0
  143. package/lib/errors/UnusedFederationWarning.js +35 -0
  144. package/lib/errors/UnusedModulesWarning.js +38 -0
  145. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  146. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  147. package/lib/esm/ModuleChunkLoadingPlugin.js +21 -5
  148. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +91 -53
  149. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  150. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  151. package/lib/hmr/LazyCompilationPlugin.js +3 -5
  152. package/lib/html/HtmlGenerator.js +72 -87
  153. package/lib/html/HtmlModulesPlugin.js +479 -215
  154. package/lib/html/HtmlParser.js +110 -147
  155. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  156. package/lib/html/data.js +142 -7
  157. package/lib/html/htmlMinify.js +92 -122
  158. package/lib/html/syntax.js +2031 -1556
  159. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  160. package/lib/index.js +49 -3
  161. package/lib/javascript/ChunkFormatHelpers.js +4 -3
  162. package/lib/javascript/JavascriptGenerator.js +8 -1
  163. package/lib/javascript/JavascriptModule.js +1 -0
  164. package/lib/javascript/JavascriptModulesPlugin.js +76 -80
  165. package/lib/javascript/JavascriptParser.js +1970 -900
  166. package/lib/javascript/StartupHelpers.js +27 -3
  167. package/lib/javascript/data.js +172 -0
  168. package/lib/javascript/grammar.js +5546 -0
  169. package/lib/javascript/parser.js +1500 -0
  170. package/lib/javascript/regexp.js +1762 -0
  171. package/lib/javascript/regexpData.js +51 -0
  172. package/lib/javascript/syntax.js +9061 -5262
  173. package/lib/json/JsonGenerator.js +7 -1
  174. package/lib/library/ModuleLibraryPlugin.js +171 -132
  175. package/lib/loaders/LoaderRunner.js +170 -14
  176. package/lib/node/NodeWatchFileSystem.js +3 -9
  177. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  178. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +8 -15
  179. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  180. package/lib/optimize/AggressiveMergingPlugin.js +3 -5
  181. package/lib/optimize/ConcatenatedModule.js +222 -125
  182. package/lib/optimize/ConstExportsPlugin.js +50 -34
  183. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
  184. package/lib/optimize/InlineExports.js +20 -2
  185. package/lib/optimize/InnerGraphPlugin.js +7 -13
  186. package/lib/optimize/LimitChunkCountPlugin.js +5 -8
  187. package/lib/optimize/MangleExportsPlugin.js +13 -4
  188. package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
  189. package/lib/optimize/RealContentHashPlugin.js +179 -44
  190. package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
  191. package/lib/optimize/SplitChunksPlugin.js +2 -4
  192. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  193. package/lib/performance/BroadContextsPlugin.js +1 -1
  194. package/lib/performance/CacheEffectivenessPlugin.js +7 -7
  195. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  196. package/lib/performance/EvalUsagePlugin.js +5 -2
  197. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  198. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  199. package/lib/performance/SizeLimitsPlugin.js +2 -4
  200. package/lib/performance/TopLevelThisPlugin.js +5 -4
  201. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  202. package/lib/performance/UnusedFederationPlugin.js +147 -0
  203. package/lib/performance/UnusedModulesPlugin.js +141 -0
  204. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  205. package/lib/performance/isOnlyReexported.js +65 -0
  206. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  207. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
  208. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  209. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  210. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  211. package/lib/prefetch/ResourceHintPlugin.js +29 -35
  212. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  213. package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
  214. package/lib/rules/RuleSetCompiler.js +211 -4
  215. package/lib/runtime/AsyncModuleRuntimeModule.js +103 -67
  216. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  217. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  218. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  219. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  220. package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
  221. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  222. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  223. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  224. package/lib/runtime/GlobalRuntimeModule.js +11 -4
  225. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  226. package/lib/runtime/HelperRuntimeModule.js +10 -0
  227. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +313 -222
  228. package/lib/runtime/NonceRuntimeModule.js +9 -0
  229. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  230. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  231. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  232. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  233. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  234. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  235. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  236. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  237. package/lib/schemes/DataUriPlugin.js +3 -6
  238. package/lib/schemes/HttpUriPlugin.js +22 -5
  239. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  240. package/lib/serialization/BinaryMiddleware.js +9 -9
  241. package/lib/serialization/FileMiddleware.js +31 -18
  242. package/lib/serialization/ObjectMiddleware.js +168 -139
  243. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  244. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  245. package/lib/sharing/ShareRuntimeModule.js +9 -0
  246. package/lib/sharing/declaredShared.js +47 -0
  247. package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
  248. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  249. package/lib/typescript/TypeScriptPlugin.js +10 -13
  250. package/lib/url/URLParserPlugin.js +6 -8
  251. package/lib/util/ArrayQueue.js +3 -3
  252. package/lib/util/LocConverter.js +4 -7
  253. package/lib/util/SourceProcessor.js +115 -99
  254. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  255. package/lib/util/async.js +292 -0
  256. package/lib/util/buildDiagnostics.js +69 -0
  257. package/lib/util/chainedImports.js +3 -4
  258. package/lib/util/concatenate.js +4 -4
  259. package/lib/util/conventions.js +5 -1
  260. package/lib/util/createHooksRegistry.js +1 -2
  261. package/lib/util/createMappings.js +25 -3
  262. package/lib/util/dataURL.js +2 -3
  263. package/lib/util/deterministicGrouping.js +8 -13
  264. package/lib/util/findGraphRoots.js +6 -13
  265. package/lib/util/fs.js +27 -1
  266. package/lib/util/globUtils.js +1 -1
  267. package/lib/util/handlerKeys.js +40 -0
  268. package/lib/util/hash/wasm-hash.js +3 -4
  269. package/lib/util/identifier.js +20 -0
  270. package/lib/util/internalSerializables.js +7 -1
  271. package/lib/util/registerExternalSerializer.js +6 -45
  272. package/lib/util/removeBOM.js +82 -1
  273. package/lib/util/semver.js +5 -3
  274. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +14 -3
  275. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +14 -3
  276. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
  277. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
  278. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +7 -12
  279. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
  280. package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
  281. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
  282. package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
  283. package/lib/web/FetchCompileAsyncWasmPlugin.js +10 -6
  284. package/lib/web/FetchCompileWasmPlugin.js +4 -2
  285. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  286. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  287. package/package.json +55 -46
  288. package/schemas/WebpackOptions.check.js +1 -1
  289. package/schemas/WebpackOptions.json +388 -76
  290. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  291. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  292. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  293. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  294. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  295. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  296. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  297. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  298. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  299. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  300. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  301. package/types.d.ts +1795 -608
  302. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  303. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  304. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -13,15 +13,18 @@ const makeSerializable = require("../util/makeSerializable");
13
13
  const memoize = require("../util/memoize");
14
14
  const NullDependency = require("./NullDependency");
15
15
 
16
- // Required here rather than at the top: the plugin reaches back into the dependencies.
17
- const getJavascriptModulesPlugin = memoize(() =>
18
- require("../javascript/JavascriptModulesPlugin")
16
+ // Required here rather than at the top: the deferred-namespace runtime imports
17
+ // dependencies from here.
18
+ const getDeferredCycleHelpers = memoize(() =>
19
+ require("../runtime/MakeDeferredNamespaceObjectRuntime")
19
20
  );
20
21
 
21
22
  /** @import { ReplaceSource } from "webpack-sources" */
22
23
  /** @import Dependency from "../Dependency" */
23
24
  /** @import { DependencyTemplateContext } from "../DependencyTemplate" */
24
- /** @import { BuildMeta } from "../Module" */
25
+ /** @import Module, { BuildMeta } from "../Module" */
26
+ /** @import ModuleGraph from "../ModuleGraph" */
27
+ /** @import ChunkGraph, { ModuleId } from "../ChunkGraph" */
25
28
  /**
26
29
  * @import {
27
30
  * JavascriptModuleBuildInfo
@@ -39,6 +42,39 @@ makeSerializable(
39
42
  "webpack/lib/dependencies/HarmonyCompatibilityDependency"
40
43
  );
41
44
 
45
+ /**
46
+ * Key shared by the async modules of one strongly-connected component. The spec
47
+ * records one `[[EvaluationError]]` per component, so a member that already
48
+ * fulfilled still has to report the root's error afterwards.
49
+ * @param {ModuleGraph} moduleGraph the module graph
50
+ * @param {ChunkGraph} chunkGraph the chunk graph
51
+ * @param {Module} module the async module
52
+ * @returns {ModuleId | null} the group key, or null when it is not in an async cycle
53
+ */
54
+ const getAsyncCycleGroupId = (moduleGraph, chunkGraph, module) => {
55
+ const { getDeferredCycleModules } = getDeferredCycleHelpers();
56
+ const peers = getDeferredCycleModules(moduleGraph, module);
57
+ if (peers === null) return null;
58
+ // The component's smallest async member id names the group, so every member
59
+ // emits the same key and none has to carry the whole peer list.
60
+ let groupId = null;
61
+ let asyncPeerCount = 0;
62
+ for (const peer of peers) {
63
+ if (!moduleGraph.isAsync(peer)) continue;
64
+ asyncPeerCount++;
65
+ const id = chunkGraph.getModuleId(peer);
66
+ if (id !== null && (groupId === null || `${id}` < `${groupId}`)) {
67
+ groupId = id;
68
+ }
69
+ }
70
+ if (asyncPeerCount === 0) return null;
71
+ const ownId = chunkGraph.getModuleId(module);
72
+ if (ownId !== null && (groupId === null || `${ownId}` < `${groupId}`)) {
73
+ groupId = ownId;
74
+ }
75
+ return groupId;
76
+ };
77
+
42
78
  HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate extends (
43
79
  NullDependency.Template
44
80
  ) {
@@ -56,10 +92,12 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
56
92
  module,
57
93
  runtimeTemplate,
58
94
  moduleGraph,
95
+ chunkGraph,
59
96
  initFragments,
60
97
  runtimeRequirements,
61
98
  runtime,
62
- concatenationScope
99
+ concatenationScope,
100
+ getData
63
101
  }
64
102
  ) {
65
103
  // a wrapped module has a real exports object that still needs `__esModule`
@@ -73,20 +111,13 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
73
111
  exportsArgument: module.exportsArgument,
74
112
  runtimeRequirements
75
113
  });
76
- // A library exporting the same bindings natively never reads the marker back
77
- // off the exports object, so it takes the call over and emits it where wrapped.
78
- const hooks = getJavascriptModulesPlugin().getCompilationHooks(
79
- runtimeTemplate.compilation
80
- );
81
- const takenOver =
82
- hooks.onDemandExportsGeneration.isUsed() &&
83
- hooks.onDemandExportsGeneration.call(
84
- module,
85
- runtime,
86
- content,
87
- false
88
- ) === true;
89
- if (!takenOver) {
114
+
115
+ const meta = moduleGraph.getMetaIfExisting(module);
116
+ if (!concatenationScope && meta && meta.onDemandExports && getData) {
117
+ const data = getData();
118
+ const before = data.get("exportsSource");
119
+ data.set("exportsSource", before ? `${before}${content}` : content);
120
+ } else {
90
121
  initFragments.push(
91
122
  new InitFragment(
92
123
  content,
@@ -99,9 +130,23 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
99
130
  }
100
131
  if (moduleGraph.isAsync(module)) {
101
132
  runtimeRequirements.add(RuntimeGlobals.module);
102
- const hasAwait = /** @type {BuildMeta} */ (module.buildMeta).async
103
- ? ", 1"
104
- : "";
133
+ // Only `strictModuleErrorHandling` keeps a recorded error for later
134
+ // requires, so the component's peers are worth naming only then.
135
+ const cycleGroupId = runtimeTemplate.outputOptions
136
+ .strictModuleErrorHandling
137
+ ? getAsyncCycleGroupId(moduleGraph, chunkGraph, module)
138
+ : null;
139
+ // The group is keyed by module id, so the runtime needs `module.id`.
140
+ if (cycleGroupId !== null) {
141
+ runtimeRequirements.add(RuntimeGlobals.moduleId);
142
+ }
143
+ const isAsyncBody = /** @type {BuildMeta} */ (module.buildMeta).async;
144
+ const hasAwait =
145
+ cycleGroupId === null
146
+ ? isAsyncBody
147
+ ? ", 1"
148
+ : ""
149
+ : `, ${isAsyncBody ? 1 : 0}, ${JSON.stringify(cycleGroupId)}`;
105
150
  // A module-scope `await using` is disposed when its scope ends, so the body
106
151
  // needs a block that closes before the module reports completion —
107
152
  // otherwise dependents run before disposal is awaited.
@@ -109,10 +109,9 @@ module.exports = class HarmonyDetectionParserPlugin {
109
109
  }
110
110
  });
111
111
 
112
- // Using `import.meta` only parses as a module, so it marks the module ESM.
113
- // Non-bailing; staged before the bailing DefinePlugin and ImportMetaPlugin
114
- // replacement taps so it observes every access; unknown members go
115
- // through `unhandledExpressionMemberChain`.
112
+ // `import.meta` parses only as a module, so it marks this one ESM. Staged
113
+ // before the bailing DefinePlugin and ImportMetaPlugin taps, so it observes
114
+ // every access without ending the chain.
116
115
  const onImportMeta = () => {
117
116
  enableHarmony(false);
118
117
  };
@@ -150,10 +150,16 @@ HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImpor
150
150
  break;
151
151
  }
152
152
  case "namespace": {
153
- value =
154
- ids[0] === "__esModule"
155
- ? ids.length === 1 || undefined
156
- : exportsInfo.isExportProvided(ids);
153
+ // Empty ids are an `export * as ns` hop skipped as side-effect free,
154
+ // leaving the target's own namespace, which always exists.
155
+ if (ids.length === 0) {
156
+ value = true;
157
+ } else {
158
+ value =
159
+ ids[0] === "__esModule"
160
+ ? ids.length === 1 || undefined
161
+ : exportsInfo.isExportProvided(ids);
162
+ }
157
163
  break;
158
164
  }
159
165
  case "dynamic": {
@@ -112,10 +112,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
112
112
  return true;
113
113
  });
114
114
  // `export default <namespace binding>` is the same export as
115
- // `export { ns as default }`, so it is claimed here and rewritten into the
116
- // same re-export. Stage -10 runs before the inner-graph tap, which would
117
- // otherwise wrap the identifier in a pure-expression guard whose insertions
118
- // outlive the statement this removes.
115
+ // `export { ns as default }`, so it becomes the same re-export. Stage -10
116
+ // beats the inner-graph tap, whose guard would outlive the removed statement.
119
117
  parser.hooks.statement.tap(
120
118
  { name: PLUGIN_NAME, stage: -10 },
121
119
  (statement) => {
@@ -130,6 +128,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
130
128
  /** @type {HarmonySettings | undefined} */
131
129
  (parser.getTagData(name, harmonySpecifierTag));
132
130
  if (!settings || settings.ids.length !== 0) return;
131
+ settings.used = true;
133
132
  if (ImportPhaseUtils.isDefer(settings.phase)) return;
134
133
  const harmonyNamedExports = (parser.state.harmonyNamedExports =
135
134
  parser.state.harmonyNamedExports || new Set());
@@ -217,14 +216,19 @@ module.exports = class HarmonyExportDependencyParserPlugin {
217
216
  : undefined,
218
217
  constValue
219
218
  );
219
+ const isAnonymousClass =
220
+ (node.type === "ClassDeclaration" || node.type === "ClassExpression") &&
221
+ !node.id;
220
222
  dep.isAnonymousDefault =
221
223
  this.options.anonymousDefaultExportName !== false &&
222
224
  (node.type === "ArrowFunctionExpression" ||
225
+ isAnonymousClass ||
223
226
  ((node.type === "FunctionDeclaration" ||
224
- node.type === "FunctionExpression" ||
225
- node.type === "ClassDeclaration" ||
226
- node.type === "ClassExpression") &&
227
+ node.type === "FunctionExpression") &&
227
228
  !node.id));
229
+ // A class observes its own name from a static initializer, which runs
230
+ // before the name could be patched afterwards, so it is named in place.
231
+ dep.isAnonymousDefaultClass = dep.isAnonymousDefault && isAnonymousClass;
228
232
  dep.setLocWithIndex(parser.getLocation(statement), -1);
229
233
  parser.state.current.addDependency(dep);
230
234
  getInnerGraphUtils(parser.state.compilation).addVariableUsage(
@@ -255,6 +259,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
255
259
  const settings =
256
260
  /** @type {HarmonySettings} */
257
261
  (parser.getTagData(id, harmonySpecifierTag));
262
+ if (settings) settings.used = true;
258
263
  const harmonyNamedExports = (parser.state.harmonyNamedExports =
259
264
  parser.state.harmonyNamedExports || new Set());
260
265
  harmonyNamedExports.add(name);
@@ -12,8 +12,11 @@ const RuntimeGlobals = require("../RuntimeGlobals");
12
12
  const { InlinedUsedName } = require("../optimize/InlineExports");
13
13
  const makeSerializable = require("../util/makeSerializable");
14
14
  const { propertyAccess } = require("../util/property");
15
- const ExportBindingInitFragment = require("./ExportBindingInitFragment");
15
+
16
16
  const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
17
+
18
+ const { ExportBindingType } = HarmonyExportInitFragment;
19
+
17
20
  const NullDependency = require("./NullDependency");
18
21
 
19
22
  const DEFAULT_EXPORT_NAME = "default";
@@ -26,8 +29,8 @@ const DEFAULT_EXPORT_NAME = "default";
26
29
  /** @import { InlinedValue } from "../optimize/InlineExports" */
27
30
  /** @import { Range } from "../javascript/JavascriptParser" */
28
31
  /** @typedef {string | { id?: string | undefined, range: Range, prefix: string, suffix: string }} DeclarationId */
29
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[Range, Range, string, DeclarationId | undefined, boolean]>} ObjectDeserializerContext */
30
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[Range, Range, string, DeclarationId | undefined, boolean]>} ObjectSerializerContext */
32
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[Range, Range, string, DeclarationId | undefined, boolean, boolean]>} ObjectDeserializerContext */
33
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[Range, Range, string, DeclarationId | undefined, boolean, boolean]>} ObjectSerializerContext */
31
34
  /** @import { ExportMap } from "./HarmonyExportInitFragment" */
32
35
  /**
33
36
  * @import {
@@ -54,6 +57,8 @@ class HarmonyExportExpressionDependency extends NullDependency {
54
57
  this.constValue = constValue;
55
58
  /** @type {boolean} */
56
59
  this.isAnonymousDefault = false;
60
+ /** @type {boolean} */
61
+ this.isAnonymousDefaultClass = false;
57
62
  }
58
63
 
59
64
  get type() {
@@ -126,6 +131,7 @@ class HarmonyExportExpressionDependency extends NullDependency {
126
131
  .write(this.prefix)
127
132
  .write(this.declarationId)
128
133
  .write(this.isAnonymousDefault)
134
+ .write(this.isAnonymousDefaultClass)
129
135
  .write(this.constValue);
130
136
  super.serialize(context);
131
137
  }
@@ -145,8 +151,10 @@ class HarmonyExportExpressionDependency extends NullDependency {
145
151
  const c4 = c3.rest;
146
152
  this.isAnonymousDefault = c4.read();
147
153
  const c5 = c4.rest;
148
- this.constValue = c5.read();
149
- super.deserialize(c5.rest);
154
+ this.isAnonymousDefaultClass = c5.read();
155
+ const c6 = c5.rest;
156
+ this.constValue = c6.read();
157
+ super.deserialize(c6.rest);
150
158
  }
151
159
  }
152
160
 
@@ -208,7 +216,10 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
208
216
  } else if (used) {
209
217
  /** @type {ExportMap} */
210
218
  const map = new Map();
211
- map.set(used, `/* export default binding */ ${name}`);
219
+ map.set(used, {
220
+ value: `/* export default binding */ ${name}`,
221
+ type: ExportBindingType.Getter
222
+ });
212
223
  initFragments.push(new HarmonyExportInitFragment(exportsName, map));
213
224
  }
214
225
 
@@ -253,31 +264,19 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
253
264
  defaultIsUsed = true;
254
265
  runtimeRequirements.add(RuntimeGlobals.exports);
255
266
  // `export default <expr>` binds an immutable const declaration
256
- const canUseValueBinding =
267
+ const valueFormat =
257
268
  /** @type {import("../Module").BuildInfo} */ (module.buildInfo)
258
269
  .isCircular === false;
259
- if (canUseValueBinding) {
260
- initFragments.push(
261
- new ExportBindingInitFragment(
262
- exportsName,
263
- [
264
- {
265
- name: used,
266
- value: `/* export default binding */ ${name}`,
267
- bindingType: "value"
268
- }
269
- ],
270
- true
271
- )
272
- );
273
- } else {
274
- /** @type {ExportMap} */
275
- const map = new Map();
276
- map.set(used, name);
277
- initFragments.push(
278
- new HarmonyExportInitFragment(exportsName, map)
279
- );
280
- }
270
+
271
+ /** @type {ExportMap} */
272
+ const map = new Map();
273
+ map.set(used, {
274
+ value: name,
275
+ type: valueFormat
276
+ ? ExportBindingType.Value
277
+ : ExportBindingType.Getter
278
+ });
279
+ initFragments.push(new HarmonyExportInitFragment(exportsName, map));
281
280
  } else {
282
281
  content = `/* unused harmony default export */ var ${name} = `;
283
282
  }
@@ -294,10 +293,9 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
294
293
  } else if (used) {
295
294
  defaultIsUsed = true;
296
295
  runtimeRequirements.add(RuntimeGlobals.exports);
297
- // This is a little bit incorrect as TDZ is not correct, but we can't use const.
298
- // No local `__WEBPACK_DEFAULT_EXPORT__` binding is created in this path,
299
- // so the anonymous-default `.name` fix-up below must reference the actual
300
- // assignment target instead. See issue #20793.
296
+ // The TDZ is not reproduced here, `const` being unavailable. No local
297
+ // binding is created either, so the anonymous-default `.name` fix-up
298
+ // below names the assignment target instead. See issue #20793.
301
299
  name = `${exportsName}${propertyAccess(
302
300
  typeof used === "string" ? [used] : used
303
301
  )}`;
@@ -308,6 +306,22 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
308
306
  }
309
307
 
310
308
  if (dep.range) {
309
+ // `export default class {}` names the class "default", and a static
310
+ // initializer reads that name before any later fix-up could run, so
311
+ // the class is created as a property of that name instead.
312
+ if (dep.isAnonymousDefaultClass) {
313
+ source.replace(
314
+ dep.rangeStatement[0],
315
+ dep.range[0] - 1,
316
+ `${content}{ ${DEFAULT_EXPORT_NAME}: (${dep.prefix}`
317
+ );
318
+ source.replace(
319
+ dep.range[1],
320
+ dep.rangeStatement[1] - 0.5,
321
+ `) }.${DEFAULT_EXPORT_NAME};`
322
+ );
323
+ return;
324
+ }
311
325
  source.replace(
312
326
  dep.rangeStatement[0],
313
327
  dep.range[0] - 1,