@depup/webpack 5.109.2-depup.0 → 5.110.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 (640) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +26 -17
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +117 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +50 -13
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +101 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +32 -47
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +141 -85
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +332 -169
  89. package/lib/RuntimeTemplate.js +2792 -352
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +261 -79
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +36 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +57 -24
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +168 -88
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5324 -0
  160. package/lib/css/syntax.js +9579 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +27 -19
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +2 -2
  230. package/lib/dependencies/ImportDependency.js +24 -20
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +49 -35
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  290. package/lib/dependencies/WorkerDependency.js +28 -22
  291. package/lib/dependencies/WorkletDependency.js +15 -14
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/processExportInfo.js +5 -5
  294. package/lib/dll/DelegatedModule.js +34 -22
  295. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  296. package/lib/dll/DelegatedPlugin.js +2 -2
  297. package/lib/dll/DllEntryPlugin.js +2 -2
  298. package/lib/dll/DllModule.js +22 -15
  299. package/lib/dll/DllModuleFactory.js +7 -3
  300. package/lib/dll/DllPlugin.js +7 -5
  301. package/lib/dll/DllReferencePlugin.js +10 -7
  302. package/lib/dll/LibManifestPlugin.js +5 -5
  303. package/lib/electron/ElectronTargetPlugin.js +53 -49
  304. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  305. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  306. package/lib/errors/BroadContextsWarning.js +43 -0
  307. package/lib/errors/BuildCycleError.js +1 -1
  308. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  309. package/lib/errors/ChunkRenderError.js +1 -1
  310. package/lib/errors/CircularDependenciesWarning.js +38 -0
  311. package/lib/errors/CodeGenerationError.js +1 -1
  312. package/lib/errors/CommentCompilationWarning.js +1 -1
  313. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  314. package/lib/errors/DuplicateModulesWarning.js +45 -0
  315. package/lib/errors/DynamicExportsWarning.js +30 -0
  316. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  317. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  318. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  319. package/lib/errors/EvalUsageWarning.js +28 -0
  320. package/lib/errors/HookWebpackError.js +5 -5
  321. package/lib/errors/HotspotsWarning.js +57 -0
  322. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  323. package/lib/errors/InlinedAssetsWarning.js +36 -0
  324. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  325. package/lib/errors/LargeModulesWarning.js +45 -0
  326. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  327. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  328. package/lib/errors/MixedExportsWarning.js +41 -0
  329. package/lib/errors/ModuleDependencyError.js +13 -16
  330. package/lib/errors/ModuleDependencyWarning.js +5 -15
  331. package/lib/errors/ModuleHashingError.js +1 -1
  332. package/lib/errors/ModuleNotFoundError.js +2 -2
  333. package/lib/errors/ModuleParseError.js +1 -2
  334. package/lib/errors/ModuleRestoreError.js +1 -1
  335. package/lib/errors/ModuleStoreError.js +1 -1
  336. package/lib/errors/NodeStuffInWebError.js +1 -1
  337. package/lib/errors/OsDependentRuleWarning.js +31 -0
  338. package/lib/errors/PureAnnotationsWarning.js +36 -0
  339. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  340. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  341. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  342. package/lib/errors/TinyChunksWarning.js +40 -0
  343. package/lib/errors/TopLevelThisWarning.js +34 -0
  344. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  345. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  346. package/lib/errors/UnusedAliasesWarning.js +29 -0
  347. package/lib/errors/UnusedDefinesWarning.js +29 -0
  348. package/lib/errors/UnusedExternalsWarning.js +29 -0
  349. package/lib/errors/UnusedReexportsWarning.js +42 -0
  350. package/lib/errors/UnusedRuleWarning.js +29 -0
  351. package/lib/errors/WebpackError.js +9 -5
  352. package/lib/errors/deriveStackFromNestedError.js +90 -0
  353. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  354. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  355. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  356. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
  357. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  358. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  359. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  360. package/lib/hmr/lazyCompilationBackend.js +9 -6
  361. package/lib/hmr/parserHooks.js +56 -0
  362. package/lib/html/HtmlGenerator.js +277 -77
  363. package/lib/html/HtmlModule.js +7 -3
  364. package/lib/html/HtmlModulesPlugin.js +282 -162
  365. package/lib/html/HtmlParser.js +31 -86
  366. package/lib/html/data.js +1928 -0
  367. package/lib/html/htmlMinify.js +288 -0
  368. package/lib/html/syntax.js +5557 -1155
  369. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  370. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  371. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  372. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  373. package/lib/ids/IdHelpers.js +7 -8
  374. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  375. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  376. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  377. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  378. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  379. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  380. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  381. package/lib/index.js +10 -0
  382. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  383. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  384. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  385. package/lib/javascript/ChunkHelpers.js +1 -1
  386. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  387. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  388. package/lib/javascript/JavascriptGenerator.js +65 -165
  389. package/lib/javascript/JavascriptModule.js +9 -3
  390. package/lib/javascript/JavascriptModulesPlugin.js +98 -113
  391. package/lib/javascript/JavascriptParser.js +242 -99
  392. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  393. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  394. package/lib/javascript/StartupHelpers.js +55 -9
  395. package/lib/javascript/syntax.js +2678 -232
  396. package/lib/json/JsonData.js +8 -4
  397. package/lib/json/JsonGenerator.js +38 -16
  398. package/lib/json/JsonModule.js +7 -3
  399. package/lib/json/JsonModulesPlugin.js +1 -1
  400. package/lib/json/JsonParser.js +5 -6
  401. package/lib/library/AbstractLibraryPlugin.js +20 -14
  402. package/lib/library/AmdLibraryPlugin.js +11 -7
  403. package/lib/library/AssignLibraryPlugin.js +19 -13
  404. package/lib/library/EnableLibraryPlugin.js +2 -2
  405. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  406. package/lib/library/JsonpLibraryPlugin.js +11 -7
  407. package/lib/library/ModuleLibraryPlugin.js +256 -64
  408. package/lib/library/SystemLibraryPlugin.js +12 -8
  409. package/lib/library/UmdLibraryPlugin.js +62 -25
  410. package/lib/loaders/LoaderRunner.js +14 -1
  411. package/lib/loaders/loadLoader.js +8 -4
  412. package/lib/logging/createConsoleLogger.js +7 -4
  413. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  414. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  415. package/lib/node/NodeSourcePlugin.js +1 -1
  416. package/lib/node/NodeTargetPlugin.js +4 -3
  417. package/lib/node/NodeTemplatePlugin.js +1 -1
  418. package/lib/node/NodeWatchFileSystem.js +70 -9
  419. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  420. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  421. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  422. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/nodeConsole.js +7 -3
  424. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  425. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  426. package/lib/optimize/ConcatenatedModule.js +985 -470
  427. package/lib/optimize/ConstExportsPlugin.js +11 -7
  428. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  429. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  430. package/lib/optimize/InlineExports.js +9 -5
  431. package/lib/optimize/InnerGraph.js +28 -12
  432. package/lib/optimize/InnerGraphPlugin.js +23 -18
  433. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  434. package/lib/optimize/MangleExportsPlugin.js +7 -8
  435. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  436. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  437. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  438. package/lib/optimize/RealContentHashPlugin.js +10 -6
  439. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  440. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  441. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  442. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  443. package/lib/optimize/SplitChunksPlugin.js +86 -24
  444. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  445. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  446. package/lib/performance/BroadContextsPlugin.js +142 -0
  447. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  448. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  449. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  450. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  451. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  452. package/lib/performance/DynamicExportsPlugin.js +120 -0
  453. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  454. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  455. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  456. package/lib/performance/EvalUsagePlugin.js +115 -0
  457. package/lib/performance/HotspotsPlugin.js +296 -0
  458. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  459. package/lib/performance/LargeModulesPlugin.js +126 -0
  460. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  461. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  462. package/lib/performance/MixedExportsPlugin.js +136 -0
  463. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  464. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  465. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  466. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  467. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  468. package/lib/performance/SizeLimitsPlugin.js +139 -7
  469. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  470. package/lib/performance/TinyChunksPlugin.js +128 -0
  471. package/lib/performance/TopLevelThisPlugin.js +208 -0
  472. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  473. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  474. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  475. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  476. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  477. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  478. package/lib/performance/getModuleSize.js +22 -0
  479. package/lib/performance/getSourceModules.js +22 -0
  480. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  481. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  482. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  483. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  484. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  487. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  488. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  489. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  490. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  491. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  492. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  493. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  494. package/lib/rules/RuleSetCompiler.js +146 -12
  495. package/lib/rules/UseEffectRulePlugin.js +18 -11
  496. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  497. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  498. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  499. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  500. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  501. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  502. package/lib/runtime/CompatRuntimeModule.js +5 -3
  503. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  504. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  505. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  506. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  507. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  508. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  509. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  510. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  511. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  512. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  513. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  514. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  515. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  516. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  517. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  518. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  519. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  520. package/lib/runtime/NonceRuntimeModule.js +10 -0
  521. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  522. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  523. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  524. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  525. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  526. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  527. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  528. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  529. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  530. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  531. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  532. package/lib/runtime/baseUri.js +63 -0
  533. package/lib/schemes/DataUriPlugin.js +1 -1
  534. package/lib/schemes/FileUriPlugin.js +1 -1
  535. package/lib/schemes/HttpUriPlugin.js +24 -15
  536. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  537. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  538. package/lib/serialization/BinaryMiddleware.js +4 -4
  539. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  540. package/lib/serialization/FileMiddleware.js +7 -7
  541. package/lib/serialization/ObjectMiddleware.js +139 -114
  542. package/lib/serialization/PlainObjectSerializer.js +19 -16
  543. package/lib/sharing/ConsumeSharedModule.js +30 -21
  544. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  545. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  546. package/lib/sharing/ProvideSharedModule.js +25 -16
  547. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  548. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  549. package/lib/sharing/SharePlugin.js +17 -5
  550. package/lib/sharing/ShareRuntimeModule.js +4 -4
  551. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  552. package/lib/sharing/utils.js +1 -3
  553. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  554. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  555. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  556. package/lib/stats/StatsFactory.js +25 -26
  557. package/lib/stats/StatsPrinter.js +16 -12
  558. package/lib/typescript/TypeScriptPlugin.js +12 -14
  559. package/lib/url/URLParserPlugin.js +26 -13
  560. package/lib/util/AsyncQueue.js +4 -3
  561. package/lib/util/Hash.js +5 -1
  562. package/lib/util/LazySet.js +35 -22
  563. package/lib/util/LocConverter.js +36 -13
  564. package/lib/util/SourceProcessor.js +1050 -24
  565. package/lib/util/StringXor.js +1 -1
  566. package/lib/util/chainedImports.js +9 -5
  567. package/lib/util/cleverMerge.js +1 -1
  568. package/lib/util/comparators.js +45 -14
  569. package/lib/util/concatenate.js +203 -77
  570. package/lib/util/conventions.js +5 -1
  571. package/lib/util/createHash.js +2 -2
  572. package/lib/util/createHooksRegistry.js +8 -10
  573. package/lib/util/dataURL.js +225 -1
  574. package/lib/util/extractSourceMap.js +4 -3
  575. package/lib/util/findCaseMismatch.js +139 -0
  576. package/lib/util/formatLocation.js +1 -2
  577. package/lib/util/fs.js +22 -5
  578. package/lib/util/globUtils.js +298 -24
  579. package/lib/util/hash/BatchedHash.js +5 -1
  580. package/lib/util/hash/BulkUpdateHash.js +5 -1
  581. package/lib/util/hash/DebugHash.js +5 -1
  582. package/lib/util/hash/hash-digest.js +6 -2
  583. package/lib/util/identifier.js +4 -0
  584. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  585. package/lib/util/internalSerializables.js +6 -0
  586. package/lib/util/lazyModule.js +56 -0
  587. package/lib/util/makeSerializable.js +7 -3
  588. package/lib/util/matchAlias.js +25 -0
  589. package/lib/util/mimeTypes.js +11 -5
  590. package/lib/util/nonNumericOnlyHash.js +4 -3
  591. package/lib/util/parseJson.js +5 -3
  592. package/lib/util/preloadModuleType.js +32 -0
  593. package/lib/util/registerExternalSerializer.js +7 -5
  594. package/lib/util/runtime.js +2 -2
  595. package/lib/util/semver.js +1 -1
  596. package/lib/util/serialization.js +28 -28
  597. package/lib/util/source.js +2 -2
  598. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  599. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  600. package/lib/wasm/wasmModuleFilename.js +54 -0
  601. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  602. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  603. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  604. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  605. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  606. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  607. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  608. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  609. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  610. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  611. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  612. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  613. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  614. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  615. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  616. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  617. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  618. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  619. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  620. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  621. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  622. package/lib/web/JsonpTemplatePlugin.js +2 -2
  623. package/lib/webpack.js +22 -11
  624. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  625. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  626. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  627. package/module.d.ts +1 -0
  628. package/package.json +32 -25
  629. package/schemas/WebpackOptions.check.js +1 -1
  630. package/schemas/WebpackOptions.json +670 -36
  631. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  634. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  635. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  636. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  639. package/types.d.ts +3144 -454
  640. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -5,7 +5,6 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const glob2regexp = require("watchpack").util.globToRegExp;
9
8
  const {
10
9
  JAVASCRIPT_MODULE_TYPE_AUTO,
11
10
  JAVASCRIPT_MODULE_TYPE_DYNAMIC,
@@ -17,26 +16,41 @@ const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency
17
16
  const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
18
17
  const { ImportPhaseUtils } = require("../dependencies/ImportPhase");
19
18
  const formatLocation = require("../util/formatLocation");
19
+ const { dirname, join, readJson, relative } = require("../util/fs");
20
+ const { getGlobToRegExpSource } = require("../util/globUtils");
21
+ const {
22
+ NODE_MODULES_REGEXP,
23
+ WINDOWS_PATH_SEPARATOR_REGEXP,
24
+ relativePathToRequest
25
+ } = require("../util/identifier");
20
26
  const { CompilerHintNotationRegExp } = require("../util/magicComment");
21
27
 
22
- /** @typedef {import("estree").MaybeNamedClassDeclaration} MaybeNamedClassDeclaration */
23
- /** @typedef {import("estree").MaybeNamedFunctionDeclaration} MaybeNamedFunctionDeclaration */
24
- /** @typedef {import("estree").ModuleDeclaration} ModuleDeclaration */
25
- /** @typedef {import("estree").Statement} Statement */
26
- /** @typedef {import("estree").CallExpression} CallExpression */
27
- /** @typedef {import("../Compiler")} Compiler */
28
- /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
29
- /** @typedef {import("../Module")} Module */
30
- /** @typedef {import("../ModuleGraph")} ModuleGraph */
31
- /** @typedef {import("../Module").BuildInfo} BuildInfo */
32
- /** @typedef {import("../Module").BuildMeta} BuildMeta */
33
- /** @typedef {import("../javascript/JavascriptModule").JavascriptModuleBuildInfo} JavascriptModuleBuildInfo */
34
- /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
35
- /** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
36
- /** @typedef {import("../ExportsInfo").TargetItemWithConnection} TargetItemWithConnection */
37
- /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
38
- /** @typedef {import("../javascript/JavascriptParser").Range} Range */
39
- /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
28
+ /**
29
+ * @import {
30
+ * MaybeNamedClassDeclaration,
31
+ * MaybeNamedFunctionDeclaration,
32
+ * ModuleDeclaration,
33
+ * Statement,
34
+ * CallExpression
35
+ * } from "estree"
36
+ */
37
+ /** @import Compiler from "../Compiler" */
38
+ /** @import Module, { BuildMeta } from "../Module" */
39
+ /**
40
+ * @import {
41
+ * JavascriptModuleBuildInfo
42
+ * } from "../javascript/JavascriptModule"
43
+ */
44
+ /** @import ModuleGraphConnection from "../ModuleGraphConnection" */
45
+ /** @import { ExportInfo, TargetItemWithConnection } from "../ExportsInfo" */
46
+ /** @import JavascriptParser, { Range } from "../javascript/JavascriptParser" */
47
+ /** @import { InputFileSystem } from "../util/fs" */
48
+ /** @import { CreateData, ResolveData } from "../NormalModuleFactory" */
49
+ /**
50
+ * @import {
51
+ * JavascriptParserOptions
52
+ * } from "../../declarations/WebpackOptions"
53
+ */
40
54
 
41
55
  /**
42
56
  * Defines the export in module type used by this module.
@@ -46,10 +60,35 @@ const { CompilerHintNotationRegExp } = require("../util/magicComment");
46
60
  * @property {boolean} checked if the export is conditional
47
61
  */
48
62
 
63
+ /** @typedef {NonNullable<CreateData["resourceResolveData"]>} ResourceResolveData */
64
+
49
65
  /** @typedef {string | boolean | string[] | undefined} SideEffectsFlagValue */
50
66
 
51
67
  /** @typedef {Map<string, RegExp>} CacheItem */
52
68
 
69
+ /**
70
+ * @typedef {object} ResolvedSideEffectsFlag
71
+ * @property {SideEffectsFlagValue} sideEffects package.json sideEffects value
72
+ * @property {string} relativePath path relative to the owning package root
73
+ */
74
+
75
+ /**
76
+ * @typedef {object} OwningSideEffectsFlag
77
+ * @property {SideEffectsFlagValue} sideEffects package.json sideEffects value
78
+ * @property {string} packageRoot directory of the declaring package.json
79
+ */
80
+
81
+ /**
82
+ * A finished ancestor walk, kept per descriptionFileRoot. The package.json
83
+ * paths it consulted are replayed as dependencies for every module reusing it.
84
+ * @typedef {object} OwningSideEffectsFlagWalk
85
+ * @property {OwningSideEffectsFlag | null} owning declaring package, `null` when the walk found none
86
+ * @property {string[]} read package.json files the walk read
87
+ * @property {string[]} missing package.json files the walk did not find
88
+ */
89
+
90
+ /** @typedef {Map<string, OwningSideEffectsFlagWalk>} OwningSideEffectsFlagCache */
91
+
53
92
  /**
54
93
  * Whether a resolved re-export target is reached through an `import defer` edge.
55
94
  * Such edges must not be collapsed by the side-effect-free barrel optimization:
@@ -67,6 +106,21 @@ const isDeferredTargetConnection = (connection) =>
67
106
  /** @type {WeakMap<Compiler, CacheItem>} */
68
107
  const globToRegexpCache = new WeakMap();
69
108
 
109
+ /** @type {WeakMap<Compiler, OwningSideEffectsFlagCache>} */
110
+ const owningSideEffectsFlagCache = new WeakMap();
111
+
112
+ /** @type {WeakMap<Partial<CreateData>, ResolvedSideEffectsFlag>} */
113
+ const resolvedSideEffectsFlags = new WeakMap();
114
+
115
+ /**
116
+ * Whether a failed ancestor package.json read means nothing is there, as
117
+ * opposed to something being there that cannot be used.
118
+ * @param {NodeJS.ErrnoException | SyntaxError | Error} err error from readJson
119
+ * @returns {boolean} true when no file was found at that path
120
+ */
121
+ const isMissingPackageJsonError = (err) =>
122
+ "code" in err && err.code === "ENOENT";
123
+
70
124
  /**
71
125
  * Returns a regular expression.
72
126
  * @param {string} glob the pattern
@@ -79,7 +133,7 @@ const globToRegexp = (glob, cache) => {
79
133
  if (!glob.includes("/")) {
80
134
  glob = `**/${glob}`;
81
135
  }
82
- const regexpSource = glob2regexp(glob);
136
+ const regexpSource = getGlobToRegExpSource()(glob);
83
137
  const regexp = new RegExp(`^(\\./)?${regexpSource}$`);
84
138
  cache.set(glob, regexp);
85
139
  return regexp;
@@ -110,6 +164,144 @@ const notSideEffectsTag = Symbol("NoSideEffects");
110
164
  /** @type {(target: { module: Module }) => boolean} */
111
165
  const RETURNS_FALSE = () => false;
112
166
 
167
+ /**
168
+ * Resolve sideEffects from the package that declares it, inheriting past a nested
169
+ * package.json that declares none. Globs are rebased on the declaring package root,
170
+ * and each package.json the walk consults becomes a dependency of the resolve.
171
+ * @param {InputFileSystem} fs file system
172
+ * @param {ResolveData} resolveData resolve data
173
+ * @param {string} descriptionFileRoot root directory of the nearest description file
174
+ * @param {OwningSideEffectsFlagCache} owningCache walk cache keyed by descriptionFileRoot
175
+ * @param {(result?: ResolvedSideEffectsFlag) => void} callback callback
176
+ * @returns {void}
177
+ */
178
+ const resolveSideEffectsFlag = (
179
+ fs,
180
+ resolveData,
181
+ descriptionFileRoot,
182
+ owningCache,
183
+ callback
184
+ ) => {
185
+ const resolveInfo = /** @type {ResourceResolveData} */ (
186
+ resolveData.createData.resourceResolveData
187
+ );
188
+ const descriptionFileData =
189
+ /** @type {NonNullable<ResourceResolveData["descriptionFileData"]>} */ (
190
+ resolveInfo.descriptionFileData
191
+ );
192
+ const relativePath = /** @type {string} */ (resolveInfo.relativePath);
193
+ if (descriptionFileData.sideEffects !== undefined) {
194
+ return callback({
195
+ sideEffects: /** @type {SideEffectsFlagValue} */ (
196
+ descriptionFileData.sideEffects
197
+ ),
198
+ relativePath
199
+ });
200
+ }
201
+ // Named package with no sideEffects: do not inherit from outside.
202
+ if (descriptionFileData.name !== undefined) {
203
+ return callback();
204
+ }
205
+ // Only inherit for a file living under node_modules; app-local nests keep shadowing.
206
+ // Read the resolved path so a symlinked package flags all of its files alike.
207
+ if (
208
+ typeof resolveInfo.path !== "string" ||
209
+ !NODE_MODULES_REGEXP.test(resolveInfo.path)
210
+ ) {
211
+ return callback();
212
+ }
213
+
214
+ // stays in descriptionFileRoot's space, which is the space packageRoot is found in
215
+ const resourcePath = join(fs, descriptionFileRoot, relativePath);
216
+
217
+ /**
218
+ * @param {OwningSideEffectsFlagWalk} walk finished walk
219
+ * @returns {void}
220
+ */
221
+ const finishFromWalk = (walk) => {
222
+ for (const file of walk.read) resolveData.fileDependencies.add(file);
223
+ for (const file of walk.missing) resolveData.missingDependencies.add(file);
224
+ const owning = walk.owning;
225
+ if (owning === null) return callback();
226
+ const ancestorRelative = relative(
227
+ fs,
228
+ owning.packageRoot,
229
+ resourcePath
230
+ ).replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/");
231
+ return callback({
232
+ sideEffects: owning.sideEffects,
233
+ relativePath: relativePathToRequest(ancestorRelative)
234
+ });
235
+ };
236
+
237
+ const cached = owningCache.get(descriptionFileRoot);
238
+ if (cached !== undefined) {
239
+ return finishFromWalk(cached);
240
+ }
241
+
242
+ /** @type {string[]} */
243
+ const read = [];
244
+ /** @type {string[]} */
245
+ const missing = [];
246
+
247
+ /**
248
+ * @param {OwningSideEffectsFlag | null} owning declaring package or null
249
+ * @returns {void}
250
+ */
251
+ const done = (owning) => {
252
+ /** @type {OwningSideEffectsFlagWalk} */
253
+ const walk = { owning, read, missing };
254
+ owningCache.set(descriptionFileRoot, walk);
255
+ return finishFromWalk(walk);
256
+ };
257
+
258
+ let dir = dirname(fs, descriptionFileRoot);
259
+
260
+ const next = () => {
261
+ const parent = dirname(fs, dir);
262
+ if (!parent || parent === dir) return done(null);
263
+ const baseName = relative(fs, parent, dir).replace(
264
+ WINDOWS_PATH_SEPARATOR_REGEXP,
265
+ "/"
266
+ );
267
+ // Do not inherit an application's sideEffects across an install boundary.
268
+ if (baseName === "node_modules") return done(null);
269
+
270
+ const packageJsonPath = join(fs, dir, "package.json");
271
+
272
+ readJson(fs, packageJsonPath, (err, data) => {
273
+ if (err) {
274
+ if (!isMissingPackageJsonError(err)) {
275
+ // it is there but unreadable, so what it declares is unknown:
276
+ // decline rather than let an outer flag speak for it
277
+ read.push(packageJsonPath);
278
+ return done(null);
279
+ }
280
+ missing.push(packageJsonPath);
281
+ dir = parent;
282
+ return next();
283
+ }
284
+ read.push(packageJsonPath);
285
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
286
+ dir = parent;
287
+ return next();
288
+ }
289
+ if (data.sideEffects !== undefined) {
290
+ return done({
291
+ sideEffects: /** @type {SideEffectsFlagValue} */ (data.sideEffects),
292
+ packageRoot: dir
293
+ });
294
+ }
295
+ // An unnamed manifest deeper in the package keeps the walk going; a named one
296
+ // is a package of its own, and its silence is its answer.
297
+ if (data.name !== undefined) return done(null);
298
+ dir = parent;
299
+ next();
300
+ });
301
+ };
302
+ next();
303
+ };
304
+
113
305
  /**
114
306
  * Detects if the module is "pure single-star passthrough": one whose entire export
115
307
  * surface is exactly one `export * from "x"` (no named/local/default-bearing
@@ -159,31 +351,62 @@ class SideEffectsFlagPlugin {
159
351
  cache = new Map();
160
352
  globToRegexpCache.set(compiler.root, cache);
161
353
  }
354
+ let owningCache = owningSideEffectsFlagCache.get(compiler.root);
355
+ if (owningCache === undefined) {
356
+ owningCache = new Map();
357
+ owningSideEffectsFlagCache.set(compiler.root, owningCache);
358
+ }
162
359
  compiler.hooks.compilation.tap(
163
360
  PLUGIN_NAME,
164
361
  (compilation, { normalModuleFactory }) => {
165
362
  const moduleGraph = compilation.moduleGraph;
166
- normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
167
- const resolveData = data.resourceResolveData;
168
- if (
169
- resolveData &&
170
- resolveData.descriptionFileData &&
171
- resolveData.relativePath
172
- ) {
173
- const sideEffects = resolveData.descriptionFileData.sideEffects;
174
- if (sideEffects !== undefined) {
175
- if (module.factoryMeta === undefined) {
176
- module.factoryMeta = {};
363
+ normalModuleFactory.hooks.afterResolve.tapAsync(
364
+ PLUGIN_NAME,
365
+ (resolveData, callback) => {
366
+ const inputFileSystem = compiler.inputFileSystem;
367
+ if (!inputFileSystem) return callback();
368
+ const { createData } = resolveData;
369
+ const resolveInfo = createData.resourceResolveData;
370
+ if (
371
+ !resolveInfo ||
372
+ !resolveInfo.descriptionFileData ||
373
+ !resolveInfo.relativePath
374
+ ) {
375
+ return callback();
376
+ }
377
+ const descriptionFileRoot =
378
+ resolveInfo.descriptionFileRoot ||
379
+ (resolveInfo.descriptionFilePath
380
+ ? dirname(inputFileSystem, resolveInfo.descriptionFilePath)
381
+ : undefined);
382
+ if (descriptionFileRoot === undefined) return callback();
383
+ resolveSideEffectsFlag(
384
+ inputFileSystem,
385
+ resolveData,
386
+ descriptionFileRoot,
387
+ owningCache,
388
+ (resolved) => {
389
+ if (resolved !== undefined) {
390
+ resolvedSideEffectsFlags.set(createData, resolved);
391
+ }
392
+ callback();
177
393
  }
178
- const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
179
- resolveData.relativePath,
180
- /** @type {SideEffectsFlagValue} */ (sideEffects),
181
- /** @type {CacheItem} */ (cache)
182
- );
183
- module.factoryMeta.sideEffectFree = !hasSideEffects;
394
+ );
395
+ }
396
+ );
397
+ normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
398
+ const resolved = resolvedSideEffectsFlags.get(data);
399
+ if (resolved !== undefined) {
400
+ if (module.factoryMeta === undefined) {
401
+ module.factoryMeta = {};
184
402
  }
403
+ const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
404
+ resolved.relativePath,
405
+ resolved.sideEffects,
406
+ /** @type {CacheItem} */ (cache)
407
+ );
408
+ module.factoryMeta.sideEffectFree = !hasSideEffects;
185
409
  }
186
-
187
410
  return module;
188
411
  });
189
412
  normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
@@ -529,7 +752,7 @@ class SideEffectsFlagPlugin {
529
752
  // Re-export resolution is idempotent within a pass, so cache it
530
753
  // per export info: a shared barrel imported by many modules
531
754
  // resolves each name once instead of once per consumer.
532
- /** @type {Map<ExportInfo, TargetItemWithConnection | null>} */
755
+ /** @type {Map<InstanceType<ExportInfo>, TargetItemWithConnection | null>} */
533
756
  const reexportTargetCache = new Map();
534
757
 
535
758
  // Dependencies don't change within the pass, so the passthrough
@@ -21,21 +21,28 @@ const { makePathsRelative } = require("../util/identifier");
21
21
  const memoize = require("../util/memoize");
22
22
  const MinMaxSizeWarning = require("./MinMaxSizeWarning");
23
23
 
24
- /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksCacheGroup} OptimizationSplitChunksCacheGroup */
25
- /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksOptions} OptimizationSplitChunksOptions */
26
- /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksSizes} OptimizationSplitChunksSizes */
27
- /** @typedef {import("../config/defaults").OutputNormalizedWithDefaults} OutputOptions */
28
- /** @typedef {import("../Chunk").ChunkName} ChunkName */
29
- /** @typedef {import("../ChunkGraph")} ChunkGraph */
30
- /** @typedef {import("../ChunkGroup")} ChunkGroup */
31
- /** @typedef {import("../Compiler")} Compiler */
32
- /** @typedef {import("../Module")} Module */
33
- /** @typedef {import("../Module").SourceType} SourceType */
34
- /** @typedef {import("../ModuleGraph")} ModuleGraph */
35
- /** @typedef {import("../Chunk").ChunkFilenameTemplate} ChunkFilenameTemplate */
24
+ /**
25
+ * @import {
26
+ * OptimizationSplitChunksCacheGroup,
27
+ * OptimizationSplitChunksOptions,
28
+ * OptimizationSplitChunksSizes
29
+ * } from "../../declarations/WebpackOptions"
30
+ */
31
+ /**
32
+ * @import {
33
+ * OutputNormalizedWithDefaults as OutputOptions
34
+ * } from "../config/defaults"
35
+ */
36
+ /** @import { ChunkName, ChunkFilenameTemplate } from "../Chunk" */
37
+ /** @import ChunkGraph from "../ChunkGraph" */
38
+ /** @import ChunkGroup from "../ChunkGroup" */
39
+ /** @import Compilation from "../Compilation" */
40
+ /** @import Compiler from "../Compiler" */
41
+ /** @import Module, { SourceType } from "../Module" */
42
+ /** @import ModuleGraph from "../ModuleGraph" */
36
43
  /** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
37
44
  /** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
38
- /** @typedef {import("../util/deterministicGrouping").Sizes} Sizes */
45
+ /** @import { Sizes } from "../util/deterministicGrouping" */
39
46
 
40
47
  /**
41
48
  * Defines the chunk filter fn callback.
@@ -212,6 +219,27 @@ const hashFilename = (name, outputOptions) => {
212
219
  return digest.slice(0, 8);
213
220
  };
214
221
 
222
+ /**
223
+ * A split `maxInitialRequests`/`maxAsyncRequests` refused, recorded for
224
+ * `performance.splitChunksCapped`.
225
+ * @typedef {object} CappedSplit
226
+ * @property {string} cacheGroup the cache group whose split was refused
227
+ * @property {Chunk} chunk the chunk it would have been taken out of
228
+ * @property {"maxAsyncRequests" | "maxInitialRequests"} limit the option that refused it
229
+ * @property {number} maxRequests the value that option had
230
+ * @property {number} modules how many modules the split would have moved
231
+ */
232
+
233
+ /** @type {WeakMap<Compilation, CappedSplit[]>} */
234
+ const CAPPED_SPLITS = new WeakMap();
235
+
236
+ /**
237
+ * Reads back the splits a request cap refused during this compilation.
238
+ * @param {Compilation} compilation the compilation
239
+ * @returns {CappedSplit[] | undefined} the refused splits, or `undefined` when nothing recorded them
240
+ */
241
+ const getCappedSplits = (compilation) => CAPPED_SPLITS.get(compilation);
242
+
215
243
  /**
216
244
  * Returns the number of requests.
217
245
  * @param {Chunk} chunk the chunk
@@ -690,7 +718,7 @@ const createCacheGroupSource = (options, key, defaultSizeTypes) => {
690
718
 
691
719
  const PLUGIN_NAME = "SplitChunksPlugin";
692
720
 
693
- module.exports = class SplitChunksPlugin {
721
+ class SplitChunksPlugin {
694
722
  /**
695
723
  * Creates an instance of SplitChunksPlugin.
696
724
  * @param {OptimizationSplitChunksOptions=} options plugin options
@@ -897,6 +925,19 @@ module.exports = class SplitChunksPlugin {
897
925
  (chunks) => {
898
926
  if (alreadyOptimized) return;
899
927
  alreadyOptimized = true;
928
+ const { performance } = compilation.options;
929
+ // Mirrors both of `SplitChunksCappedPlugin`'s gates: a build that
930
+ // would not report records nothing and allocates nothing.
931
+ /** @type {CappedSplit[] | undefined} */
932
+ let cappedSplits;
933
+ if (
934
+ performance !== false &&
935
+ performance.splitChunksCapped === true &&
936
+ Boolean(performance.hints)
937
+ ) {
938
+ cappedSplits = [];
939
+ CAPPED_SPLITS.set(compilation, cappedSplits);
940
+ }
900
941
  logger.time("prepare");
901
942
  const chunkGraph = compilation.chunkGraph;
902
943
  const moduleGraph = compilation.moduleGraph;
@@ -1644,19 +1685,36 @@ module.exports = class SplitChunksPlugin {
1644
1685
  Number.isFinite(item.cacheGroup.maxAsyncRequests))
1645
1686
  ) {
1646
1687
  for (const chunk of usedChunks) {
1647
- // respect max requests
1648
- const maxRequests = chunk.isOnlyInitial()
1649
- ? item.cacheGroup.maxInitialRequests
1650
- : chunk.canBeInitial()
1651
- ? Math.min(
1652
- item.cacheGroup.maxInitialRequests,
1653
- item.cacheGroup.maxAsyncRequests
1654
- )
1655
- : item.cacheGroup.maxAsyncRequests;
1688
+ // respect max requests: a chunk that is both initial and
1689
+ // async answers to the stricter of the two caps
1690
+ const isOnlyInitial = chunk.isOnlyInitial();
1691
+ const byAsyncRequests =
1692
+ !isOnlyInitial &&
1693
+ (!chunk.canBeInitial() ||
1694
+ item.cacheGroup.maxAsyncRequests <
1695
+ item.cacheGroup.maxInitialRequests);
1696
+ const maxRequests = byAsyncRequests
1697
+ ? item.cacheGroup.maxAsyncRequests
1698
+ : item.cacheGroup.maxInitialRequests;
1656
1699
  if (
1657
1700
  Number.isFinite(maxRequests) &&
1658
1701
  getRequests(chunk) >= maxRequests
1659
1702
  ) {
1703
+ if (cappedSplits !== undefined) {
1704
+ cappedSplits.push({
1705
+ cacheGroup: item.cacheGroup.key,
1706
+ chunk,
1707
+ // which cap it was cannot be read back off the value:
1708
+ // the two are equal by default in production
1709
+ limit: byAsyncRequests
1710
+ ? "maxAsyncRequests"
1711
+ : "maxInitialRequests",
1712
+ maxRequests:
1713
+ /** @type {number} */
1714
+ (maxRequests),
1715
+ modules: item.modules.size
1716
+ });
1717
+ }
1660
1718
  usedChunks.delete(chunk);
1661
1719
  }
1662
1720
  }
@@ -1983,4 +2041,8 @@ module.exports = class SplitChunksPlugin {
1983
2041
  );
1984
2042
  });
1985
2043
  }
1986
- };
2044
+ }
2045
+
2046
+ SplitChunksPlugin.getCappedSplits = getCappedSplits;
2047
+
2048
+ module.exports = SplitChunksPlugin;
@@ -8,7 +8,7 @@
8
8
  const WebpackError = require("../errors/WebpackError");
9
9
  const formatSize = require("../util/formatSize");
10
10
 
11
- /** @typedef {import("./SizeLimitsPlugin").AssetDetails} AssetDetails */
11
+ /** @import { AssetDetails } from "./SizeLimitsPlugin" */
12
12
 
13
13
  class AssetsOverSizeLimitWarning extends WebpackError {
14
14
  /**
@@ -18,7 +18,15 @@ class AssetsOverSizeLimitWarning extends WebpackError {
18
18
  */
19
19
  constructor(assetsOverSizeLimit, assetLimit) {
20
20
  const assetLists = assetsOverSizeLimit
21
- .map((asset) => `\n ${asset.name} (${formatSize(asset.size)})`)
21
+ .map((asset) => {
22
+ const largest = asset.modules
23
+ ? `\n Largest modules: ${asset.modules
24
+ .map((module) => `${module.name} (${formatSize(module.size)})`)
25
+ .join(", ")}`
26
+ : "";
27
+
28
+ return `\n ${asset.name} (${formatSize(asset.size)})${largest}`;
29
+ })
22
30
  .join("");
23
31
 
24
32
  super(`asset size limit: The following asset(s) exceed the recommended size limit (${formatSize(
@@ -0,0 +1,136 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const AsyncChunkWaterfallWarning = require("../errors/AsyncChunkWaterfallWarning");
9
+
10
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
11
+ /** @import ChunkGroup from "../ChunkGroup" */
12
+ /** @import Compiler from "../Compiler" */
13
+ /** @import { WaterfallDetails } from "../errors/AsyncChunkWaterfallWarning" */
14
+
15
+ const PLUGIN_NAME = "AsyncChunkWaterfallsPlugin";
16
+
17
+ // Enough to name the offenders without printing the whole chunk graph.
18
+ const MAX_REPORTED_WATERFALLS = 5;
19
+
20
+ // Two levels is the shape `import()` is for — a route that loads its own data.
21
+ // Three is where the round trips start outweighing what splitting saved.
22
+ const MIN_REPORTED_DEPTH = 3;
23
+
24
+ class AsyncChunkWaterfallsPlugin {
25
+ /**
26
+ * Creates an instance of AsyncChunkWaterfallsPlugin.
27
+ * @param {PerformanceOptions} options the plugin options
28
+ */
29
+ constructor(options) {
30
+ /** @type {PerformanceOptions["hints"]} */
31
+ this.hints = options.hints;
32
+ }
33
+
34
+ /**
35
+ * Applies the plugin by registering its hooks on the compiler.
36
+ * @param {Compiler} compiler the compiler instance
37
+ * @returns {void}
38
+ */
39
+ apply(compiler) {
40
+ const hints = this.hints;
41
+
42
+ if (!hints) return;
43
+
44
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
45
+ // `afterSeal` is past the hash, which folds every message into it — a
46
+ // hint reported earlier would change the build's identity.
47
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
48
+ const { chunkGraph } = compilation;
49
+
50
+ /**
51
+ * The name to print for a group; ids exist by `afterSeal`.
52
+ * @param {ChunkGroup} group the group
53
+ * @returns {string} what to call it
54
+ */
55
+ const nameOf = (group) => {
56
+ if (group.name) return group.name;
57
+
58
+ const [chunk] = group.chunks;
59
+
60
+ return chunk && chunk.id !== null ? `${chunk.id}` : "(unnamed)";
61
+ };
62
+
63
+ // Breadth-first from the initial groups, so the depth recorded for a
64
+ // group is the fewest requests a client makes to reach it.
65
+ /** @type {Map<ChunkGroup, ChunkGroup[]>} */
66
+ const pathTo = new Map();
67
+ /** @type {ChunkGroup[]} */
68
+ const queue = [];
69
+
70
+ for (const group of compilation.chunkGroups) {
71
+ if (!group.isInitial()) continue;
72
+
73
+ pathTo.set(group, []);
74
+ queue.push(group);
75
+ }
76
+
77
+ /** @type {WaterfallDetails[]} */
78
+ const waterfalls = [];
79
+ let deepest = 0;
80
+
81
+ for (let i = 0; i < queue.length; i++) {
82
+ const group = queue[i];
83
+ const path = /** @type {ChunkGroup[]} */ (pathTo.get(group));
84
+
85
+ for (const child of group.getChildren()) {
86
+ if (pathTo.has(child)) continue;
87
+
88
+ const childPath = [...path, child];
89
+
90
+ pathTo.set(child, childPath);
91
+ queue.push(child);
92
+
93
+ if (childPath.length < MIN_REPORTED_DEPTH) continue;
94
+
95
+ // Only the end of a chain is reported: every prefix of it is a
96
+ // waterfall too, and naming them all says the same thing N times.
97
+ if (child.getNumberOfChildren() > 0) continue;
98
+
99
+ let size = 0;
100
+
101
+ for (const step of childPath) {
102
+ for (const chunk of step.chunks) {
103
+ size += chunkGraph.getChunkSize(chunk);
104
+ }
105
+ }
106
+
107
+ deepest = Math.max(deepest, childPath.length);
108
+ waterfalls.push({ chain: childPath.map(nameOf), size });
109
+ }
110
+ }
111
+
112
+ if (waterfalls.length === 0) return;
113
+
114
+ // Deepest first, then largest: the worst round-trip cost leads.
115
+ waterfalls.sort(
116
+ (a, b) => b.chain.length - a.chain.length || b.size - a.size
117
+ );
118
+
119
+ const warning = new AsyncChunkWaterfallWarning(
120
+ waterfalls.slice(0, MAX_REPORTED_WATERFALLS),
121
+ deepest
122
+ );
123
+
124
+ if (hints === "error") {
125
+ compilation.errors.push(warning);
126
+ } else if (hints === "stats") {
127
+ compilation.hints.push(warning);
128
+ } else {
129
+ compilation.warnings.push(warning);
130
+ }
131
+ });
132
+ });
133
+ }
134
+ }
135
+
136
+ module.exports = AsyncChunkWaterfallsPlugin;