webpack 5.111.1 → 5.112.1

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 (793) hide show
  1. package/README.md +1 -1
  2. package/bin/webpack.js +13 -7
  3. package/lib/Chunk.js +3 -966
  4. package/lib/Compilation.js +373 -163
  5. package/lib/Compiler.js +31 -44
  6. package/lib/Dependency.js +3 -551
  7. package/lib/DependencyTemplate.js +3 -70
  8. package/lib/EntryPlugin.js +3 -68
  9. package/lib/Entrypoint.js +3 -121
  10. package/lib/ExternalsPlugin.js +3 -92
  11. package/lib/FileSystemInfo.js +3 -4629
  12. package/lib/InitFragment.js +3 -204
  13. package/lib/LibraryTemplatePlugin.js +3 -46
  14. package/lib/ModuleFilenameHelpers.js +3 -400
  15. package/lib/ModuleNotFoundError.js +2 -2
  16. package/lib/MultiCompiler.js +37 -8
  17. package/lib/NormalModule.js +3 -2242
  18. package/lib/NullFactory.js +3 -22
  19. package/lib/ProgressPlugin.js +3 -908
  20. package/lib/RawModule.js +3 -197
  21. package/lib/RequestShortener.js +3 -37
  22. package/lib/SingleEntryPlugin.js +1 -1
  23. package/lib/WebpackError.js +2 -2
  24. package/lib/asset/AssetBytesGenerator.js +21 -13
  25. package/lib/asset/AssetBytesParser.js +12 -10
  26. package/lib/asset/AssetGenerator.js +71 -69
  27. package/lib/asset/AssetModule.js +13 -2
  28. package/lib/asset/AssetModulesPlugin.js +10 -12
  29. package/lib/asset/AssetParser.js +10 -10
  30. package/lib/asset/AssetSourceGenerator.js +23 -15
  31. package/lib/asset/AssetSourceParser.js +12 -10
  32. package/lib/asset/RawDataUrlModule.js +17 -10
  33. package/lib/asset/WebManifestGenerator.js +17 -12
  34. package/lib/asset/WebManifestParser.js +8 -8
  35. package/lib/async-modules/AsyncModuleHelpers.js +12 -5
  36. package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
  37. package/lib/async-modules/InferAsyncModulesPlugin.js +9 -3
  38. package/lib/async-modules/isGeneratorLowered.js +3 -3
  39. package/lib/bun/BunTargetPlugin.js +1 -1
  40. package/lib/cache/AddBuildDependenciesPlugin.js +2 -19
  41. package/lib/{Cache.js → cache/Cache.js} +1 -1
  42. package/lib/{CacheFacade.js → cache/CacheFacade.js} +6 -6
  43. package/lib/cache/IdleFileCachePlugin.js +2 -2
  44. package/lib/cache/MemoryCachePlugin.js +2 -2
  45. package/lib/cache/MemoryWithGcCachePlugin.js +2 -2
  46. package/lib/cache/PackFileCacheStrategy.js +13 -19
  47. package/lib/cache/ResolverCachePlugin.js +65 -11
  48. package/lib/cache/mergeEtags.js +1 -1
  49. package/lib/{OptionsApply.js → config/OptionsApply.js} +3 -3
  50. package/lib/{PlatformPlugin.js → config/PlatformPlugin.js} +2 -2
  51. package/lib/{WebpackOptionsApply.js → config/WebpackOptionsApply.js} +209 -212
  52. package/lib/{WebpackOptionsDefaulter.js → config/WebpackOptionsDefaulter.js} +3 -3
  53. package/lib/config/browserslistTargetHandler.js +1 -1
  54. package/lib/{cli.js → config/cli.js} +14 -164
  55. package/lib/config/defaults.js +166 -59
  56. package/lib/config/getClaimedAssetTypes.js +22 -14
  57. package/lib/config/normalization.js +18 -7
  58. package/lib/config/target.js +11 -1
  59. package/lib/container/ContainerEntryDependency.js +1 -1
  60. package/lib/container/ContainerEntryModule.js +13 -11
  61. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  62. package/lib/container/ContainerExposedDependency.js +1 -1
  63. package/lib/container/ContainerPlugin.js +178 -5
  64. package/lib/container/ContainerReferencePlugin.js +75 -14
  65. package/lib/container/FallbackDependency.js +1 -1
  66. package/lib/container/FallbackItemDependency.js +1 -1
  67. package/lib/container/FallbackModule.js +12 -10
  68. package/lib/container/FallbackModuleFactory.js +2 -2
  69. package/lib/container/HoistContainerReferencesPlugin.js +10 -11
  70. package/lib/container/ModuleFederationPlugin.js +306 -7
  71. package/lib/container/RemoteModule.js +14 -10
  72. package/lib/container/RemoteRuntimeModule.js +5 -5
  73. package/lib/container/RemoteToExternalDependency.js +1 -1
  74. package/lib/container/moduleFederationHooks.js +1 -1
  75. package/lib/context/ContextModule.js +37 -26
  76. package/lib/context/ContextModuleFactory.js +14 -11
  77. package/lib/context/ContextReplacementPlugin.js +6 -12
  78. package/lib/css/CssGenerator.js +78 -68
  79. package/lib/css/CssInjectStyleRuntimeModule.js +36 -30
  80. package/lib/css/CssLoadingRuntimeModule.js +77 -44
  81. package/lib/css/CssModule.js +37 -29
  82. package/lib/css/CssModulesPlugin.js +129 -45
  83. package/lib/css/CssParser.js +714 -322
  84. package/lib/css/CssServerStylesRuntimeModule.js +3 -3
  85. package/lib/{util → css}/conventions.js +1 -1
  86. package/lib/css/cssMinify.js +110 -37
  87. package/lib/css/data.js +6990 -5125
  88. package/lib/css/syntax-parser.js +20734 -0
  89. package/lib/css/syntax-printer.js +6092 -0
  90. package/lib/css/syntax.js +37 -18686
  91. package/lib/debug/ProfilingPlugin.js +106 -51
  92. package/lib/{DefinePlugin.js → define/DefinePlugin.js} +416 -55
  93. package/lib/{DotenvPlugin.js → define/DotenvPlugin.js} +19 -15
  94. package/lib/{EnvironmentPlugin.js → define/EnvironmentPlugin.js} +6 -4
  95. package/lib/deno/DenoTargetPlugin.js +1 -1
  96. package/lib/dependencies/ConstDependency.js +3 -120
  97. package/lib/dependencies/ContextElementDependency.js +5 -172
  98. package/lib/dependencies/NullDependency.js +3 -37
  99. package/lib/dependencies/{AMDDefineDependency.js → amd/AMDDefineDependency.js} +12 -11
  100. package/lib/dependencies/{AMDDefineDependencyParserPlugin.js → amd/AMDDefineDependencyParserPlugin.js} +10 -11
  101. package/lib/dependencies/{AMDPlugin.js → amd/AMDPlugin.js} +11 -11
  102. package/lib/dependencies/{AMDRequireArrayDependency.js → amd/AMDRequireArrayDependency.js} +15 -13
  103. package/lib/dependencies/{AMDRequireContextDependency.js → amd/AMDRequireContextDependency.js} +11 -10
  104. package/lib/dependencies/{AMDRequireDependenciesBlock.js → amd/AMDRequireDependenciesBlock.js} +7 -6
  105. package/lib/dependencies/{AMDRequireDependenciesBlockParserPlugin.js → amd/AMDRequireDependenciesBlockParserPlugin.js} +14 -11
  106. package/lib/dependencies/{AMDRequireDependency.js → amd/AMDRequireDependency.js} +13 -12
  107. package/lib/dependencies/{AMDRequireItemDependency.js → amd/AMDRequireItemDependency.js} +8 -7
  108. package/lib/dependencies/{AMDRuntimeModules.js → amd/AMDRuntimeModules.js} +3 -3
  109. package/lib/dependencies/{LocalModule.js → amd/LocalModule.js} +8 -4
  110. package/lib/dependencies/{LocalModuleDependency.js → amd/LocalModuleDependency.js} +17 -10
  111. package/lib/dependencies/{LocalModulesHelpers.js → amd/LocalModulesHelpers.js} +1 -1
  112. package/lib/dependencies/{RequireJsStuffPlugin.js → amd/RequireJsStuffPlugin.js} +9 -9
  113. package/lib/dependencies/{UnsupportedDependency.js → amd/UnsupportedDependency.js} +11 -10
  114. package/lib/dependencies/{CommonJsDependencyHelpers.js → commonjs/CommonJsDependencyHelpers.js} +8 -9
  115. package/lib/dependencies/{CommonJsExportRequireDependency.js → commonjs/CommonJsExportRequireDependency.js} +166 -36
  116. package/lib/dependencies/{CommonJsExportsDependency.js → commonjs/CommonJsExportsDependency.js} +15 -14
  117. package/lib/dependencies/{CommonJsExportsParserPlugin.js → commonjs/CommonJsExportsParserPlugin.js} +154 -92
  118. package/lib/dependencies/{CommonJsFullRequireDependency.js → commonjs/CommonJsFullRequireDependency.js} +32 -24
  119. package/lib/dependencies/{CommonJsImportsParserPlugin.js → commonjs/CommonJsImportsParserPlugin.js} +36 -33
  120. package/lib/dependencies/{CommonJsObjectExportDependency.js → commonjs/CommonJsObjectExportDependency.js} +17 -16
  121. package/lib/dependencies/{CommonJsPlugin.js → commonjs/CommonJsPlugin.js} +48 -39
  122. package/lib/dependencies/{CommonJsRequireContextDependency.js → commonjs/CommonJsRequireContextDependency.js} +15 -14
  123. package/lib/dependencies/{CommonJsRequireDependency.js → commonjs/CommonJsRequireDependency.js} +33 -25
  124. package/lib/dependencies/{CommonJsSelfReferenceDependency.js → commonjs/CommonJsSelfReferenceDependency.js} +17 -16
  125. package/lib/dependencies/{ModuleDecoratorDependency.js → commonjs/ModuleDecoratorDependency.js} +16 -15
  126. package/lib/dependencies/{RequireEnsureDependenciesBlock.js → commonjs/RequireEnsureDependenciesBlock.js} +8 -7
  127. package/lib/dependencies/{RequireEnsureDependenciesBlockParserPlugin.js → commonjs/RequireEnsureDependenciesBlockParserPlugin.js} +9 -6
  128. package/lib/dependencies/{RequireEnsureDependency.js → commonjs/RequireEnsureDependency.js} +13 -12
  129. package/lib/dependencies/{RequireEnsureItemDependency.js → commonjs/RequireEnsureItemDependency.js} +7 -6
  130. package/lib/dependencies/{RequireEnsurePlugin.js → commonjs/RequireEnsurePlugin.js} +8 -8
  131. package/lib/dependencies/{RequireHeaderDependency.js → commonjs/RequireHeaderDependency.js} +14 -13
  132. package/lib/dependencies/{RequireIncludeDependency.js → commonjs/RequireIncludeDependency.js} +13 -12
  133. package/lib/dependencies/{RequireIncludeDependencyParserPlugin.js → commonjs/RequireIncludeDependencyParserPlugin.js} +3 -27
  134. package/lib/dependencies/{RequireIncludePlugin.js → commonjs/RequireIncludePlugin.js} +4 -4
  135. package/lib/dependencies/{RequireResolveContextDependency.js → commonjs/RequireResolveContextDependency.js} +11 -10
  136. package/lib/dependencies/{RequireResolveDependency.js → commonjs/RequireResolveDependency.js} +12 -11
  137. package/lib/dependencies/{RequireResolveHeaderDependency.js → commonjs/RequireResolveHeaderDependency.js} +13 -12
  138. package/lib/dependencies/commonjs/TopLevelThisParserPlugin.js +59 -0
  139. package/lib/dependencies/{ContextDependency.js → context/ContextDependency.js} +15 -14
  140. package/lib/dependencies/{ContextDependencyHelpers.js → context/ContextDependencyHelpers.js} +31 -9
  141. package/lib/dependencies/{ContextDependencyTemplateAsId.js → context/ContextDependencyTemplateAsId.js} +3 -3
  142. package/lib/dependencies/{ContextDependencyTemplateAsRequireCall.js → context/ContextDependencyTemplateAsRequireCall.js} +3 -3
  143. package/lib/dependencies/context/ContextElementDependency.js +198 -0
  144. package/lib/dependencies/{ImportMetaContextDependency.js → context/ImportMetaContextDependency.js} +7 -6
  145. package/lib/dependencies/{ImportMetaContextDependencyParserPlugin.js → context/ImportMetaContextDependencyParserPlugin.js} +10 -11
  146. package/lib/dependencies/{ImportMetaContextPlugin.js → context/ImportMetaContextPlugin.js} +5 -5
  147. package/lib/dependencies/{ImportMetaGlobDependency.js → context/ImportMetaGlobDependency.js} +7 -6
  148. package/lib/dependencies/{ImportMetaGlobDependencyParserPlugin.js → context/ImportMetaGlobDependencyParserPlugin.js} +7 -10
  149. package/lib/dependencies/{ImportMetaGlobHelpers.js → context/ImportMetaGlobHelpers.js} +17 -19
  150. package/lib/dependencies/{RequireContextDependency.js → context/RequireContextDependency.js} +7 -6
  151. package/lib/dependencies/{RequireContextDependencyParserPlugin.js → context/RequireContextDependencyParserPlugin.js} +2 -2
  152. package/lib/dependencies/{RequireContextPlugin.js → context/RequireContextPlugin.js} +5 -5
  153. package/lib/dependencies/{CachedConstDependency.js → core/CachedConstDependency.js} +21 -17
  154. package/lib/dependencies/core/ConstDependency.js +131 -0
  155. package/lib/dependencies/{ImportPhase.js → core/ImportPhase.js} +5 -4
  156. package/lib/dependencies/{ModuleDependency.js → core/ModuleDependency.js} +10 -7
  157. package/lib/dependencies/{ModuleDependencyTemplateAsId.js → core/ModuleDependencyTemplateAsId.js} +3 -3
  158. package/lib/dependencies/{ModuleDependencyTemplateAsRequireId.js → core/ModuleDependencyTemplateAsRequireId.js} +2 -2
  159. package/lib/dependencies/{ModuleInitFragmentDependency.js → core/ModuleInitFragmentDependency.js} +10 -9
  160. package/lib/dependencies/core/NullDependency.js +44 -0
  161. package/lib/dependencies/{RuntimeRequirementsDependency.js → core/RuntimeRequirementsDependency.js} +10 -9
  162. package/lib/dependencies/{StaticExportsDependency.js → core/StaticExportsDependency.js} +15 -8
  163. package/lib/dependencies/{CssIcssExportDependency.js → css/CssIcssExportDependency.js} +375 -99
  164. package/lib/dependencies/{CssIcssImportDependency.js → css/CssIcssImportDependency.js} +24 -19
  165. package/lib/dependencies/{CssIcssSymbolDependency.js → css/CssIcssSymbolDependency.js} +13 -12
  166. package/lib/dependencies/{CssImportDependency.js → css/CssImportDependency.js} +15 -11
  167. package/lib/dependencies/{CssUrlDependency.js → css/CssUrlDependency.js} +25 -22
  168. package/lib/dependencies/{CreateRequireParserPlugin.js → esm/CreateRequireParserPlugin.js} +9 -9
  169. package/lib/dependencies/{HarmonyAcceptDependency.js → esm/ESMAcceptDependency.js} +41 -38
  170. package/lib/dependencies/esm/ESMAcceptImportDependency.js +39 -0
  171. package/lib/dependencies/{HarmonyCompatibilityDependency.js → esm/ESMCompatibilityDependency.js} +29 -21
  172. package/lib/dependencies/{HarmonyDetectionParserPlugin.js → esm/ESMDetectionParserPlugin.js} +20 -20
  173. package/lib/dependencies/{HarmonyEvaluatedImportSpecifierDependency.js → esm/ESMEvaluatedImportSpecifierDependency.js} +33 -30
  174. package/lib/dependencies/{HarmonyExportDependencyParserPlugin.js → esm/ESMExportDependencyParserPlugin.js} +60 -89
  175. package/lib/dependencies/{HarmonyExportExpressionDependency.js → esm/ESMExportExpressionDependency.js} +80 -45
  176. package/lib/dependencies/{HarmonyExportHeaderDependency.js → esm/ESMExportHeaderDependency.js} +17 -15
  177. package/lib/dependencies/esm/ESMExportImportedSideEffectDependency.js +37 -0
  178. package/lib/dependencies/{HarmonyExportImportedSpecifierDependency.js → esm/ESMExportImportedSpecifierDependency.js} +146 -133
  179. package/lib/dependencies/{HarmonyExportInitFragment.js → esm/ESMExportInitFragment.js} +48 -30
  180. package/lib/dependencies/{HarmonyExportSpecifierDependency.js → esm/ESMExportSpecifierDependency.js} +78 -37
  181. package/lib/dependencies/{HarmonyExports.js → esm/ESMExports.js} +4 -12
  182. package/lib/dependencies/{HarmonyImportBareSideEffectDependency.js → esm/ESMImportBareSideEffectDependency.js} +21 -13
  183. package/lib/dependencies/{HarmonyImportDependency.js → esm/ESMImportDependency.js} +86 -68
  184. package/lib/dependencies/{HarmonyImportDependencyParserPlugin.js → esm/ESMImportDependencyParserPlugin.js} +104 -100
  185. package/lib/dependencies/{HarmonyImportGuard.js → esm/ESMImportGuard.js} +36 -51
  186. package/lib/dependencies/{HarmonyImportSideEffectDependency.js → esm/ESMImportSideEffectDependency.js} +83 -39
  187. package/lib/dependencies/{HarmonyImportSpecifierDependency.js → esm/ESMImportSpecifierDependency.js} +98 -60
  188. package/lib/dependencies/esm/ESMLiveExportDependency.js +311 -0
  189. package/lib/dependencies/esm/ESMLiveExportParserPlugin.js +862 -0
  190. package/lib/dependencies/esm/ESMModulesPlugin.js +205 -0
  191. package/lib/dependencies/{HarmonyTopLevelThisParserPlugin.js → esm/ESMTopLevelThisParserPlugin.js} +7 -7
  192. package/lib/dependencies/{TopLevelAwaitDependency.js → esm/TopLevelAwaitDependency.js} +12 -18
  193. package/lib/dependencies/{DynamicExports.js → helpers/DynamicExports.js} +5 -7
  194. package/lib/{util → dependencies/helpers}/chainedImports.js +5 -5
  195. package/lib/dependencies/{processExportInfo.js → helpers/processExportInfo.js} +4 -4
  196. package/lib/{util → dependencies/helpers}/traverseDestructuringAssignmentProperties.js +1 -1
  197. package/lib/dependencies/{ImportMetaHotAcceptDependency.js → hmr/ImportMetaHotAcceptDependency.js} +8 -7
  198. package/lib/dependencies/{ImportMetaHotDeclineDependency.js → hmr/ImportMetaHotDeclineDependency.js} +8 -7
  199. package/lib/dependencies/{ModuleHotAcceptDependency.js → hmr/ModuleHotAcceptDependency.js} +8 -7
  200. package/lib/dependencies/{ModuleHotDeclineDependency.js → hmr/ModuleHotDeclineDependency.js} +8 -7
  201. package/lib/dependencies/{HtmlEntryDependency.js → html/HtmlEntryDependency.js} +52 -151
  202. package/lib/dependencies/{HtmlInlineHtmlDependency.js → html/HtmlInlineHtmlDependency.js} +13 -15
  203. package/lib/dependencies/{HtmlInlineScriptDependency.js → html/HtmlInlineScriptDependency.js} +69 -23
  204. package/lib/dependencies/{HtmlInlineStyleDependency.js → html/HtmlInlineStyleDependency.js} +50 -18
  205. package/lib/dependencies/{HtmlSourceDependency.js → html/HtmlSourceDependency.js} +23 -16
  206. package/lib/dependencies/{ImportContextDependency.js → import/ImportContextDependency.js} +24 -10
  207. package/lib/dependencies/{ImportDependency.js → import/ImportDependency.js} +26 -18
  208. package/lib/dependencies/{ImportEagerDependency.js → import/ImportEagerDependency.js} +18 -10
  209. package/lib/dependencies/{ImportParserPlugin.js → import/ImportParserPlugin.js} +22 -25
  210. package/lib/dependencies/{ImportPlugin.js → import/ImportPlugin.js} +4 -4
  211. package/lib/dependencies/{ImportWeakDependency.js → import/ImportWeakDependency.js} +18 -10
  212. package/lib/dependencies/{importOptionsCheck.js → import/importOptionsCheck.js} +2 -2
  213. package/lib/dependencies/{BuildTimeConstDependency.js → import-meta/BuildTimeConstDependency.js} +12 -11
  214. package/lib/dependencies/{ImportMetaMainDependency.js → import-meta/ImportMetaMainDependency.js} +12 -11
  215. package/lib/dependencies/{ImportMetaPlugin.js → import-meta/ImportMetaPlugin.js} +122 -103
  216. package/lib/dependencies/{SystemPlugin.js → system/SystemPlugin.js} +11 -38
  217. package/lib/dependencies/{SystemRuntimeModule.js → system/SystemRuntimeModule.js} +3 -3
  218. package/lib/dependencies/{ImportMetaResolveDependency.js → url/ImportMetaResolveDependency.js} +9 -8
  219. package/lib/dependencies/{URLContextDependency.js → url/URLContextDependency.js} +11 -10
  220. package/lib/dependencies/{URLDependency.js → url/URLDependency.js} +28 -20
  221. package/lib/{url → dependencies/url}/URLParserPlugin.js +17 -19
  222. package/lib/dependencies/{URLPlugin.js → url/URLPlugin.js} +6 -7
  223. package/lib/dependencies/{WebAssemblyExportImportedDependency.js → wasm/WebAssemblyExportImportedDependency.js} +18 -11
  224. package/lib/dependencies/{WebAssemblyImportDependency.js → wasm/WebAssemblyImportDependency.js} +19 -12
  225. package/lib/dependencies/{CreateScriptUrlDependency.js → worker/CreateScriptUrlDependency.js} +12 -11
  226. package/lib/dependencies/{WorkerAndWorkletPlugin.js → worker/WorkerAndWorkletPlugin.js} +82 -53
  227. package/lib/dependencies/{WorkerDependency.js → worker/WorkerDependency.js} +22 -15
  228. package/lib/dependencies/{WorkletDependency.js → worker/WorkletDependency.js} +19 -18
  229. package/lib/{EvalDevToolModulePlugin.js → devtool/EvalDevToolModulePlugin.js} +20 -6
  230. package/lib/{EvalSourceMapDevToolPlugin.js → devtool/EvalSourceMapDevToolPlugin.js} +32 -24
  231. package/lib/devtool/ModuleFilenameHelpers.js +413 -0
  232. package/lib/{SourceMapDevToolModuleOptionsPlugin.js → devtool/SourceMapDevToolModuleOptionsPlugin.js} +10 -3
  233. package/lib/{SourceMapDevToolPlugin.js → devtool/SourceMapDevToolPlugin.js} +155 -27
  234. package/lib/{util → devtool}/generateDebugId.js +1 -1
  235. package/lib/{IgnoreWarningsPlugin.js → diagnostics/IgnoreWarningsPlugin.js} +2 -2
  236. package/lib/{NoEmitOnErrorsPlugin.js → diagnostics/NoEmitOnErrorsPlugin.js} +1 -1
  237. package/lib/diagnostics/WarnCaseSensitiveModulesPlugin.js +64 -0
  238. package/lib/{WarnDeprecatedOptionPlugin.js → diagnostics/WarnDeprecatedOptionPlugin.js} +2 -22
  239. package/lib/diagnostics/WarnNoModeSetPlugin.js +27 -0
  240. package/lib/dll/DelegatedModule.js +23 -21
  241. package/lib/dll/DelegatedModuleFactoryPlugin.js +2 -2
  242. package/lib/dll/DelegatedPlugin.js +1 -1
  243. package/lib/{dependencies → dll}/DelegatedSourceDependency.js +5 -4
  244. package/lib/{dependencies → dll}/DllEntryDependency.js +6 -5
  245. package/lib/dll/DllEntryPlugin.js +3 -3
  246. package/lib/dll/DllModule.js +14 -10
  247. package/lib/dll/DllModuleFactory.js +3 -3
  248. package/lib/dll/DllPlugin.js +18 -6
  249. package/lib/dll/DllReferencePlugin.js +103 -30
  250. package/lib/dll/LibManifestPlugin.js +9 -7
  251. package/lib/electron/ElectronTargetPlugin.js +2 -2
  252. package/lib/{DynamicEntryPlugin.js → entry/DynamicEntryPlugin.js} +3 -3
  253. package/lib/{dependencies → entry}/EntryDependency.js +11 -2
  254. package/lib/{EntryOptionPlugin.js → entry/EntryOptionPlugin.js} +6 -6
  255. package/lib/entry/EntryPlugin.js +75 -0
  256. package/lib/errors/AbstractMethodError.js +1 -1
  257. package/lib/{performance → errors}/AssetsOverSizeLimitWarning.js +2 -2
  258. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  259. package/lib/errors/BuildCycleError.js +1 -1
  260. package/lib/{WarnCaseSensitiveModulesPlugin.js → errors/CaseSensitiveModulesWarning.js} +4 -56
  261. package/lib/errors/ChunkRenderError.js +1 -1
  262. package/lib/errors/CodeGenerationError.js +1 -1
  263. package/lib/errors/CommentCompilationWarning.js +1 -1
  264. package/lib/errors/ConflictingEntryExportsWarning.js +38 -0
  265. package/lib/{dependencies → errors}/CriticalDependencyWarning.js +4 -3
  266. package/lib/errors/DeprecatedOptionWarning.js +30 -0
  267. package/lib/errors/DllManifestError.js +26 -0
  268. package/lib/{performance → errors}/DuplicatePackagesWarning.js +6 -6
  269. package/lib/{dependencies/HarmonyLinkingError.js → errors/ESMLinkingError.js} +4 -4
  270. package/lib/{performance → errors}/EntrypointsOverSizeLimitWarning.js +2 -2
  271. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  272. package/lib/{ErrorHelpers.js → errors/ErrorHelpers.js} +9 -6
  273. package/lib/errors/ExternalStarReexportError.js +2 -2
  274. package/lib/{library → errors}/FalseIIFEUmdWarning.js +1 -1
  275. package/lib/errors/HookWebpackError.js +6 -5
  276. package/lib/errors/IgnoreErrorModuleFactory.js +3 -3
  277. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  278. package/lib/errors/JSONParseError.js +4 -4
  279. package/lib/{optimize → errors}/MinMaxSizeWarning.js +1 -1
  280. package/lib/errors/ModuleBuildError.js +1 -1
  281. package/lib/errors/ModuleDependencyError.js +2 -2
  282. package/lib/errors/ModuleDependencyWarning.js +2 -2
  283. package/lib/errors/ModuleError.js +1 -1
  284. package/lib/errors/ModuleHashingError.js +1 -1
  285. package/lib/errors/ModuleNotFoundError.js +3 -3
  286. package/lib/errors/ModuleParseError.js +1 -1
  287. package/lib/errors/ModuleRestoreError.js +1 -1
  288. package/lib/errors/ModuleStoreError.js +1 -1
  289. package/lib/errors/ModuleWarning.js +1 -1
  290. package/lib/{performance → errors}/NoAsyncChunksWarning.js +1 -1
  291. package/lib/{WarnNoModeSetPlugin.js → errors/NoModeWarning.js} +2 -19
  292. package/lib/errors/NodeStuffInWebError.js +7 -2
  293. package/lib/errors/PathVariableError.js +31 -0
  294. package/lib/errors/RequireIncludeDeprecationWarning.js +40 -0
  295. package/lib/{performance → errors}/RuntimeInLargeChunkWarning.js +1 -1
  296. package/lib/errors/RuntimeModuleGenerationError.js +51 -0
  297. package/lib/errors/SSRManifestAutoPublicPathWarning.js +24 -0
  298. package/lib/errors/SystemImportDeprecationWarning.js +43 -0
  299. package/lib/errors/UnmergeableEntryExportsError.js +34 -0
  300. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  301. package/lib/{wasm-sync → errors}/UnsupportedWebAssemblyFeatureError.js +1 -1
  302. package/lib/{wasm-sync → errors}/WebAssemblyInInitialChunkError.js +7 -5
  303. package/lib/errors/WebpackError.js +13 -3
  304. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -2
  305. package/lib/esm/ModuleChunkFormatPlugin.js +55 -20
  306. package/lib/esm/ModuleChunkLoadingPlugin.js +3 -3
  307. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +8 -8
  308. package/lib/{ExternalModule.js → externals/ExternalModule.js} +90 -63
  309. package/lib/{ExternalModuleFactoryPlugin.js → externals/ExternalModuleFactoryPlugin.js} +42 -41
  310. package/lib/externals/ExternalsPlugin.js +99 -0
  311. package/lib/fs/FileSystemInfo.js +4642 -0
  312. package/lib/{util → fs}/fs.js +22 -9
  313. package/lib/{AsyncDependenciesBlock.js → graph/AsyncDependenciesBlock.js} +27 -4
  314. package/lib/graph/Chunk.js +985 -0
  315. package/lib/{ChunkGraph.js → graph/ChunkGraph.js} +192 -80
  316. package/lib/{ChunkGroup.js → graph/ChunkGroup.js} +11 -3
  317. package/lib/{DependenciesBlock.js → graph/DependenciesBlock.js} +16 -4
  318. package/lib/graph/Dependency.js +634 -0
  319. package/lib/graph/Entrypoint.js +136 -0
  320. package/lib/{ExportsInfo.js → graph/ExportsInfo.js} +131 -83
  321. package/lib/{HotUpdateChunk.js → graph/HotUpdateChunk.js} +8 -0
  322. package/lib/{ModuleGraph.js → graph/ModuleGraph.js} +44 -33
  323. package/lib/{ModuleGraphConnection.js → graph/ModuleGraphConnection.js} +2 -2
  324. package/lib/{buildChunkGraph.js → graph/buildChunkGraph.js} +169 -76
  325. package/lib/{util → graph}/findGraphRoots.js +15 -9
  326. package/lib/graph/isDependencyKind.js +23 -0
  327. package/lib/hmr/HotModuleReplacement.runtime.js +12 -11
  328. package/lib/{HotModuleReplacementPlugin.js → hmr/HotModuleReplacementPlugin.js} +51 -57
  329. package/lib/hmr/HotModuleReplacementRuntimeModule.js +3 -3
  330. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +25 -26
  331. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +2 -2
  332. package/lib/hmr/LazyCompilationPlugin.js +32 -28
  333. package/lib/html/HtmlGenerator.js +132 -60
  334. package/lib/html/HtmlModule.js +16 -2
  335. package/lib/html/HtmlModulesPlugin.js +184 -87
  336. package/lib/html/HtmlParser.js +511 -160
  337. package/lib/html/builtinEmbeddedRenderer.js +70 -25
  338. package/lib/html/data.js +44 -22
  339. package/lib/html/htmlMinify.js +114 -41
  340. package/lib/html/syntax-parser.js +15795 -0
  341. package/lib/html/syntax-printer.js +1033 -0
  342. package/lib/html/syntax.js +37 -13952
  343. package/lib/html/xmlMinify.js +70 -0
  344. package/lib/ids/ChunkModuleIdRangePlugin.js +2 -2
  345. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  346. package/lib/ids/HashedModuleIdsPlugin.js +32 -5
  347. package/lib/ids/IdHelpers.js +4 -4
  348. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  349. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -5
  350. package/lib/ids/OccurrenceModuleIdsPlugin.js +6 -5
  351. package/lib/{RecordIdsPlugin.js → ids/RecordIdsPlugin.js} +5 -5
  352. package/lib/ids/SyncModuleIdsPlugin.js +3 -3
  353. package/lib/{util → ids}/numberHash.js +1 -1
  354. package/lib/index.js +312 -105
  355. package/lib/{APIPlugin.js → javascript/APIPlugin.js} +31 -37
  356. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  357. package/lib/javascript/BasicEvaluatedExpression.js +9 -9
  358. package/lib/javascript/ChunkHelpers.js +64 -4
  359. package/lib/javascript/CommonJsChunkFormatPlugin.js +5 -13
  360. package/lib/{CompatibilityPlugin.js → javascript/CompatibilityPlugin.js} +7 -7
  361. package/lib/{ConstPlugin.js → javascript/ConstPlugin.js} +75 -8
  362. package/lib/{ExportsInfoApiPlugin.js → javascript/ExportsInfoApiPlugin.js} +5 -5
  363. package/lib/{dependencies → javascript}/ExportsInfoDependency.js +10 -9
  364. package/lib/javascript/JavascriptGenerator.js +32 -27
  365. package/lib/{JavascriptMetaInfoPlugin.js → javascript/JavascriptMetaInfoPlugin.js} +8 -20
  366. package/lib/javascript/JavascriptModule.js +14 -3
  367. package/lib/javascript/JavascriptModulesPlugin.js +441 -214
  368. package/lib/javascript/JavascriptParser.js +318 -144
  369. package/lib/javascript/JavascriptParserHelpers.js +1 -1
  370. package/lib/javascript/MergedEntryExports.js +196 -0
  371. package/lib/javascript/ScopeAnalyzer.js +3924 -13
  372. package/lib/javascript/StartupHelpers.js +6 -6
  373. package/lib/{UseStrictPlugin.js → javascript/UseStrictPlugin.js} +13 -19
  374. package/lib/{dependencies → javascript}/WebpackIsIncludedDependency.js +10 -9
  375. package/lib/{WebpackIsIncludedPlugin.js → javascript/WebpackIsIncludedPlugin.js} +8 -8
  376. package/lib/javascript/data.js +533 -122
  377. package/lib/javascript/jsMinify.js +272 -0
  378. package/lib/javascript/regexp.js +67 -32
  379. package/lib/javascript/syntax-parser.js +19169 -0
  380. package/lib/javascript/syntax-printer-data.js +1099 -0
  381. package/lib/javascript/syntax-printer.js +53878 -0
  382. package/lib/javascript/syntax.js +20 -11274
  383. package/lib/json/JsonData.js +1 -1
  384. package/lib/{dependencies → json}/JsonExportsDependency.js +8 -7
  385. package/lib/json/JsonGenerator.js +24 -16
  386. package/lib/json/JsonModule.js +13 -2
  387. package/lib/json/JsonModulesPlugin.js +1 -1
  388. package/lib/json/JsonParser.js +11 -10
  389. package/lib/json/jsonMinify.js +69 -0
  390. package/lib/library/AbstractLibraryPlugin.js +28 -15
  391. package/lib/library/AmdLibraryPlugin.js +4 -4
  392. package/lib/library/AssignLibraryPlugin.js +28 -12
  393. package/lib/library/EnableLibraryPlugin.js +1 -1
  394. package/lib/library/ExportPropertyLibraryPlugin.js +4 -4
  395. package/lib/library/JsonpLibraryPlugin.js +2 -2
  396. package/lib/library/LibraryTemplatePlugin.js +53 -0
  397. package/lib/library/ModuleLibraryPlugin.js +557 -187
  398. package/lib/library/SystemLibraryPlugin.js +6 -8
  399. package/lib/library/UmdLibraryPlugin.js +3 -4
  400. package/lib/{dependencies → loaders}/LoaderDependency.js +3 -3
  401. package/lib/{dependencies → loaders}/LoaderImportDependency.js +9 -3
  402. package/lib/{LoaderOptionsPlugin.js → loaders/LoaderOptionsPlugin.js} +30 -12
  403. package/lib/{dependencies → loaders}/LoaderPlugin.js +2 -2
  404. package/lib/loaders/LoaderRunner.js +94 -46
  405. package/lib/{LoaderTargetPlugin.js → loaders/LoaderTargetPlugin.js} +2 -2
  406. package/lib/loaders/loadLoader.js +16 -10
  407. package/lib/logging/Logger.js +7 -9
  408. package/lib/logging/ProgressPlugin.js +957 -0
  409. package/lib/{CodeGenerationResults.js → module/CodeGenerationResults.js} +7 -7
  410. package/lib/{Generator.js → module/Generator.js} +33 -23
  411. package/lib/{Module.js → module/Module.js} +121 -53
  412. package/lib/{ModuleFactory.js → module/ModuleFactory.js} +3 -3
  413. package/lib/module/NormalModule.js +2350 -0
  414. package/lib/{NormalModuleFactory.js → module/NormalModuleFactory.js} +64 -71
  415. package/lib/module/NullFactory.js +29 -0
  416. package/lib/{Parser.js → module/Parser.js} +12 -5
  417. package/lib/module/RawModule.js +208 -0
  418. package/lib/{SelfModuleFactory.js → module/SelfModuleFactory.js} +1 -1
  419. package/lib/{util → module}/extractSourceMap.js +71 -20
  420. package/lib/{util → module}/findCaseMismatch.js +4 -4
  421. package/lib/node/CommonJsChunkLoadingPlugin.js +3 -3
  422. package/lib/{dependencies → node}/ExternalModuleDependency.js +8 -7
  423. package/lib/{dependencies → node}/ExternalModuleInitFragment.js +7 -6
  424. package/lib/{dependencies → node}/ExternalModuleInitFragmentDependency.js +14 -9
  425. package/lib/node/NodeEnvironmentPlugin.js +11 -1
  426. package/lib/{NodeStuffPlugin.js → node/NodeStuffPlugin.js} +17 -17
  427. package/lib/node/NodeTargetPlugin.js +1 -1
  428. package/lib/node/NodeWatchFileSystem.js +58 -6
  429. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +7 -7
  430. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -19
  431. package/lib/node/ReadFileCompileWasmPlugin.js +9 -11
  432. package/lib/node/RequireChunkLoadingRuntimeModule.js +7 -7
  433. package/lib/node/nodeConsole.js +6 -7
  434. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  435. package/lib/optimize/AggressiveSplittingPlugin.js +12 -8
  436. package/lib/{CircularModulesPlugin.js → optimize/CircularModulesPlugin.js} +14 -14
  437. package/lib/optimize/ConcatenatedModule.js +231 -220
  438. package/lib/{ConcatenationScope.js → optimize/ConcatenationScope.js} +39 -6
  439. package/lib/optimize/ConstExportsPlugin.js +7 -7
  440. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  441. package/lib/{FlagAllModulesAsUsedPlugin.js → optimize/FlagAllModulesAsUsedPlugin.js} +3 -3
  442. package/lib/{FlagDependencyExportsPlugin.js → optimize/FlagDependencyExportsPlugin.js} +23 -28
  443. package/lib/{FlagDependencyUsagePlugin.js → optimize/FlagDependencyUsagePlugin.js} +44 -19
  444. package/lib/{FlagEntryExportAsUsedPlugin.js → optimize/FlagEntryExportAsUsedPlugin.js} +2 -2
  445. package/lib/optimize/FlagIncludedChunksPlugin.js +2 -2
  446. package/lib/optimize/InlineExports.js +12 -7
  447. package/lib/optimize/InnerGraph.js +5 -13
  448. package/lib/optimize/InnerGraphPlugin.js +10 -10
  449. package/lib/optimize/LazyBarrels.js +620 -0
  450. package/lib/{util → optimize}/LazyBucketSortedSet.js +2 -2
  451. package/lib/optimize/LimitChunkCountPlugin.js +16 -7
  452. package/lib/optimize/MangleExportsPlugin.js +5 -5
  453. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -6
  454. package/lib/optimize/MinChunkSizePlugin.js +9 -6
  455. package/lib/optimize/ModuleConcatenationPlugin.js +28 -22
  456. package/lib/{dependencies → optimize}/PureExpressionDependency.js +11 -10
  457. package/lib/optimize/RealContentHashPlugin.js +18 -13
  458. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  459. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  460. package/lib/optimize/SideEffectsFlagPlugin.js +24 -38
  461. package/lib/optimize/SplitChunksPlugin.js +719 -174
  462. package/lib/{util → optimize}/TupleQueue.js +9 -9
  463. package/lib/optimize/chunkSetIntersections.js +437 -0
  464. package/lib/{util → optimize}/deterministicGrouping.js +17 -17
  465. package/lib/{BannerPlugin.js → output/BannerPlugin.js} +82 -14
  466. package/lib/{CleanPlugin.js → output/CleanPlugin.js} +69 -25
  467. package/lib/{CopyPlugin.js → output/CopyPlugin.js} +144 -70
  468. package/lib/{ManifestPlugin.js → output/ManifestPlugin.js} +91 -17
  469. package/lib/output/SSRManifestPlugin.js +349 -0
  470. package/lib/performance/AnalyzableBailoutsPlugin.js +1 -1
  471. package/lib/performance/AsyncChunkWaterfallsPlugin.js +1 -1
  472. package/lib/performance/BroadContextsPlugin.js +4 -4
  473. package/lib/performance/CacheEffectivenessPlugin.js +2 -3
  474. package/lib/performance/ConflictingResourceHintsPlugin.js +1 -1
  475. package/lib/performance/DuplicateModulesPlugin.js +3 -4
  476. package/lib/performance/DuplicatePackagesPlugin.js +3 -3
  477. package/lib/performance/DynamicExportsPlugin.js +2 -2
  478. package/lib/performance/EvalUsagePlugin.js +4 -6
  479. package/lib/performance/HotspotsPlugin.js +39 -14
  480. package/lib/performance/LargeModulesPlugin.js +2 -3
  481. package/lib/performance/LegacyJavascriptPlugin.js +1 -2
  482. package/lib/performance/MissingSideEffectsPlugin.js +2 -3
  483. package/lib/performance/MissingSourceMapsPlugin.js +5 -6
  484. package/lib/performance/PureAnnotationsPlugin.js +19 -13
  485. package/lib/performance/RedundantDynamicImportsPlugin.js +6 -8
  486. package/lib/performance/ScopeHoistingBailoutsPlugin.js +2 -2
  487. package/lib/performance/SizeLimitsPlugin.js +11 -12
  488. package/lib/performance/TopLevelThisPlugin.js +22 -13
  489. package/lib/performance/UnsplitVendorsPlugin.js +1 -2
  490. package/lib/performance/UnusedAliasesPlugin.js +6 -7
  491. package/lib/performance/UnusedAssetsPlugin.js +5 -5
  492. package/lib/performance/UnusedDefinesPlugin.js +2 -2
  493. package/lib/performance/UnusedExternalsPlugin.js +3 -4
  494. package/lib/performance/UnusedFederationPlugin.js +2 -4
  495. package/lib/performance/UnusedModulesPlugin.js +5 -4
  496. package/lib/performance/getModuleSize.js +1 -1
  497. package/lib/performance/hasOnlyUnusedExports.js +4 -4
  498. package/lib/performance/isOnlyReexported.js +7 -6
  499. package/lib/{AutomaticPrefetchPlugin.js → prefetch/AutomaticPrefetchPlugin.js} +4 -5
  500. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +2 -2
  501. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +1 -1
  502. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +4 -4
  503. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +4 -4
  504. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +4 -4
  505. package/lib/{dependencies → prefetch}/PrefetchDependency.js +1 -1
  506. package/lib/{PrefetchPlugin.js → prefetch/PrefetchPlugin.js} +2 -2
  507. package/lib/prefetch/ResourceHintPlugin.js +66 -45
  508. package/lib/prefetch/ResourceHintRuntimeModule.js +3 -3
  509. package/lib/prefetch/StartupAssetHintRuntimeModule.js +3 -3
  510. package/lib/prefetch/parseResourceHintOptions.js +4 -3
  511. package/lib/{ProvidePlugin.js → provide/ProvidePlugin.js} +7 -7
  512. package/lib/{dependencies → provide}/ProvidedDependency.js +50 -17
  513. package/lib/{IgnorePlugin.js → resolve/IgnorePlugin.js} +30 -13
  514. package/lib/{NormalModuleReplacementPlugin.js → resolve/NormalModuleReplacementPlugin.js} +4 -4
  515. package/lib/{ResolverFactory.js → resolve/ResolverFactory.js} +18 -5
  516. package/lib/resolve/getResolveOptionsKey.js +59 -0
  517. package/lib/rules/BasicEffectRulePlugin.js +1 -1
  518. package/lib/rules/RuleSetCompiler.js +42 -51
  519. package/lib/rules/UseEffectRulePlugin.js +1 -3
  520. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +2 -2
  521. package/lib/runtime/AsyncModuleRuntimeModule.js +14 -5
  522. package/lib/runtime/AutoPublicPathRuntimeModule.js +5 -5
  523. package/lib/runtime/BaseUriRuntimeModule.js +3 -3
  524. package/lib/runtime/ChunkNameRuntimeModule.js +2 -2
  525. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -2
  526. package/lib/runtime/CompatRuntimeModule.js +4 -4
  527. package/lib/runtime/ConcatenationWrapRuntimeModule.js +2 -2
  528. package/lib/runtime/ConstructRequireRuntimeModule.js +2 -2
  529. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
  530. package/lib/runtime/CreateScriptRuntimeModule.js +2 -2
  531. package/lib/runtime/CreateScriptUrlRuntimeModule.js +2 -2
  532. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -6
  533. package/lib/runtime/EnsureChunkRuntimeModule.js +4 -4
  534. package/lib/runtime/GetChunkFilenameRuntimeModule.js +7 -11
  535. package/lib/runtime/GetFullHashRuntimeModule.js +2 -2
  536. package/lib/runtime/GetMainFilenameRuntimeModule.js +4 -4
  537. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +3 -3
  538. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +3 -3
  539. package/lib/runtime/GlobalRuntimeModule.js +3 -3
  540. package/lib/runtime/HasOwnPropertyRuntimeModule.js +3 -3
  541. package/lib/runtime/HelperRuntimeModule.js +16 -1
  542. package/lib/runtime/LoadScriptRuntimeModule.js +3 -3
  543. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +80 -17
  544. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -2
  545. package/lib/runtime/NonceRuntimeModule.js +2 -2
  546. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  547. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  548. package/lib/runtime/RelativeUrlRuntimeModule.js +2 -2
  549. package/lib/{RuntimeGlobals.js → runtime/RuntimeGlobals.js} +24 -1
  550. package/lib/runtime/RuntimeIdRuntimeModule.js +4 -4
  551. package/lib/{RuntimeModule.js → runtime/RuntimeModule.js} +36 -21
  552. package/lib/{RuntimePlugin.js → runtime/RuntimePlugin.js} +50 -50
  553. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +2 -2
  554. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +2 -2
  555. package/lib/runtime/StartupChunkDependenciesPlugin.js +2 -2
  556. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +5 -5
  557. package/lib/runtime/StartupEntrypointRuntimeModule.js +3 -3
  558. package/lib/runtime/SystemContextRuntimeModule.js +2 -2
  559. package/lib/runtime/ToBinaryRuntimeModule.js +3 -3
  560. package/lib/runtime/WorkerRuntimeModule.js +1 -1
  561. package/lib/runtime/baseUri.js +1 -1
  562. package/lib/schemes/DataUriPlugin.js +1 -1
  563. package/lib/schemes/HttpUriPlugin.js +68 -13
  564. package/lib/schemes/VirtualUrlPlugin.js +52 -16
  565. package/lib/serialization/AggregateErrorSerializer.js +4 -4
  566. package/lib/serialization/BinaryMiddleware.js +4 -1
  567. package/lib/serialization/ErrorObjectSerializer.js +2 -5
  568. package/lib/serialization/FileMiddleware.js +3 -3
  569. package/lib/serialization/ObjectMiddleware.js +62 -29
  570. package/lib/serialization/PlainObjectSerializer.js +3 -7
  571. package/lib/serialization/Serializer.js +21 -11
  572. package/lib/serialization/SerializerMiddleware.js +10 -8
  573. package/lib/serialization/SingleItemMiddleware.js +4 -2
  574. package/lib/sharing/ConsumeSharedFallbackDependency.js +9 -1
  575. package/lib/sharing/ConsumeSharedModule.js +18 -14
  576. package/lib/sharing/ConsumeSharedPlugin.js +148 -42
  577. package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -8
  578. package/lib/sharing/ProvideForSharedDependency.js +9 -1
  579. package/lib/sharing/ProvideSharedDependency.js +1 -1
  580. package/lib/sharing/ProvideSharedModule.js +11 -9
  581. package/lib/sharing/ProvideSharedModuleFactory.js +2 -2
  582. package/lib/sharing/ProvideSharedPlugin.js +111 -20
  583. package/lib/sharing/SharePlugin.js +102 -9
  584. package/lib/sharing/ShareRuntimeModule.js +6 -6
  585. package/lib/sharing/resolveMatchedConfigs.js +1 -1
  586. package/lib/{util → sharing}/semver.js +14 -16
  587. package/lib/sharing/utils.js +59 -2
  588. package/lib/stats/DefaultStatsFactoryPlugin.js +57 -54
  589. package/lib/stats/DefaultStatsPresetPlugin.js +3 -7
  590. package/lib/stats/DefaultStatsPrinterPlugin.js +15 -14
  591. package/lib/{MultiStats.js → stats/MultiStats.js} +4 -4
  592. package/lib/{Stats.js → stats/Stats.js} +4 -4
  593. package/lib/stats/StatsFactory.js +208 -37
  594. package/lib/stats/StatsPrinter.js +126 -13
  595. package/lib/{ChunkTemplate.js → template/ChunkTemplate.js} +7 -7
  596. package/lib/{ConditionalInitFragment.js → template/ConditionalInitFragment.js} +3 -3
  597. package/lib/template/DependencyTemplate.js +77 -0
  598. package/lib/{DependencyTemplates.js → template/DependencyTemplates.js} +9 -4
  599. package/lib/template/InitFragment.js +223 -0
  600. package/lib/{MainTemplate.js → template/MainTemplate.js} +11 -11
  601. package/lib/{ModuleInfoHeaderPlugin.js → template/ModuleInfoHeaderPlugin.js} +30 -8
  602. package/lib/{ModuleTemplate.js → template/ModuleTemplate.js} +6 -6
  603. package/lib/{RuntimeTemplate.js → template/RuntimeTemplate.js} +158 -95
  604. package/lib/{Template.js → template/Template.js} +14 -12
  605. package/lib/{TemplatedPathPlugin.js → template/TemplatedPathPlugin.js} +19 -23
  606. package/lib/typescript/TypeScriptPlugin.js +3 -3
  607. package/lib/util/RequestShortener.js +44 -0
  608. package/lib/util/SortableSet.js +87 -22
  609. package/lib/util/SourceProcessor.js +439 -51
  610. package/lib/util/TupleSet.js +27 -27
  611. package/lib/util/WeakTupleMap.js +20 -16
  612. package/lib/util/buildDiagnostics.js +2 -2
  613. package/lib/util/cleverMerge.js +61 -33
  614. package/lib/util/comparators.js +19 -15
  615. package/lib/util/concatenate.js +28 -147
  616. package/lib/util/createMappings.js +111 -0
  617. package/lib/util/dataURL.js +96 -15
  618. package/lib/util/deprecation.js +5 -4
  619. package/lib/util/extractComments.js +118 -0
  620. package/lib/util/formatLocation.js +1 -1
  621. package/lib/util/globUtils.js +198 -20
  622. package/lib/util/haltVisitors.js +51 -0
  623. package/lib/util/handlerKeys.js +2 -2
  624. package/lib/util/identifier.js +117 -1
  625. package/lib/util/implicitTypeLoaderFallback.js +6 -4
  626. package/lib/util/internalSerializables.js +296 -102
  627. package/lib/util/magicComment.js +12 -7
  628. package/lib/util/makeSerializable.js +28 -7
  629. package/lib/util/memoize.js +1 -1
  630. package/lib/util/parseJson.js +2 -2
  631. package/lib/util/preloadModuleType.js +5 -2
  632. package/lib/util/registerExternalSerializer.js +2 -2
  633. package/lib/util/removeBOM.js +1 -1
  634. package/lib/util/runtime.js +1 -1
  635. package/lib/util/serialization.js +35 -28
  636. package/lib/util/source.js +2 -2
  637. package/lib/util/terminalColors.js +161 -0
  638. package/lib/{wasm-async → wasm}/AsyncWasmCompileRuntimeModule.js +5 -5
  639. package/lib/{wasm-async → wasm}/AsyncWasmLoadingRuntimeModule.js +5 -5
  640. package/lib/{wasm-async → wasm}/AsyncWasmModule.js +19 -5
  641. package/lib/{wasm-async → wasm}/AsyncWebAssemblyGenerator.js +17 -9
  642. package/lib/{wasm-async → wasm}/AsyncWebAssemblyJavascriptGenerator.js +24 -15
  643. package/lib/{wasm-async → wasm}/AsyncWebAssemblyModulesPlugin.js +26 -10
  644. package/lib/{wasm-async → wasm}/AsyncWebAssemblyParser.js +14 -12
  645. package/lib/wasm/EnableWasmLoadingPlugin.js +1 -1
  646. package/lib/{wasm-async → wasm}/UniversalCompileAsyncWasmPlugin.js +11 -13
  647. package/lib/wasm/wasmModuleFilename.js +2 -2
  648. package/lib/wasm-sync/SyncWasmModule.js +18 -3
  649. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +8 -8
  650. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -3
  651. package/lib/wasm-sync/WebAssemblyGenerator.js +22 -16
  652. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +28 -21
  653. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +9 -7
  654. package/lib/wasm-sync/WebAssemblyParser.js +15 -17
  655. package/lib/wasm-sync/WebAssemblyUtils.js +6 -5
  656. package/lib/{MultiWatching.js → watch/MultiWatching.js} +3 -3
  657. package/lib/{WatchIgnorePlugin.js → watch/WatchIgnorePlugin.js} +43 -9
  658. package/lib/{Watching.js → watch/Watching.js} +8 -8
  659. package/lib/web/FetchCompileAsyncWasmPlugin.js +12 -18
  660. package/lib/web/FetchCompileWasmPlugin.js +8 -10
  661. package/lib/web/JsonpChunkLoadingPlugin.js +3 -3
  662. package/lib/web/JsonpChunkLoadingRuntimeModule.js +6 -6
  663. package/lib/web/JsonpTemplatePlugin.js +1 -1
  664. package/lib/webpack.js +27 -17
  665. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -3
  666. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
  667. package/package.json +57 -36
  668. package/schemas/WebpackOptions.check.js +4 -3
  669. package/schemas/WebpackOptions.d.json.ts +2 -0
  670. package/schemas/WebpackOptions.json +295 -75
  671. package/schemas/plugins/BannerPlugin.check.js +4 -3
  672. package/schemas/plugins/BannerPlugin.json +29 -2
  673. package/schemas/plugins/HtmlGeneratorOptions.check.js +4 -3
  674. package/schemas/plugins/HtmlParserOptions.check.js +4 -3
  675. package/schemas/plugins/IgnorePlugin.check.js +4 -3
  676. package/schemas/plugins/IgnorePlugin.d.json.ts +2 -0
  677. package/schemas/plugins/IgnorePlugin.json +1 -1
  678. package/schemas/plugins/LoaderOptionsPlugin.check.js +4 -3
  679. package/schemas/plugins/ManifestPlugin.check.js +4 -3
  680. package/schemas/plugins/ManifestPlugin.json +3 -3
  681. package/schemas/plugins/ProgressPlugin.check.js +4 -3
  682. package/schemas/plugins/ProgressPlugin.json +2 -7
  683. package/schemas/plugins/SSRManifestPlugin.check.js +7 -0
  684. package/schemas/plugins/SSRManifestPlugin.json +20 -0
  685. package/schemas/plugins/SourceMapDevToolPlugin.check.js +4 -3
  686. package/schemas/plugins/SourceMapDevToolPlugin.json +44 -12
  687. package/schemas/plugins/WatchIgnorePlugin.check.js +4 -3
  688. package/schemas/plugins/WatchIgnorePlugin.json +12 -3
  689. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +4 -3
  690. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +4 -3
  691. package/schemas/plugins/asset/AssetParserOptions.check.js +4 -3
  692. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +4 -3
  693. package/schemas/plugins/container/ContainerPlugin.check.js +4 -3
  694. package/schemas/plugins/container/ContainerPlugin.json +8 -0
  695. package/schemas/plugins/container/ContainerReferencePlugin.check.js +4 -3
  696. package/schemas/plugins/container/ExternalsType.check.js +4 -3
  697. package/schemas/plugins/container/ModuleFederationPlugin.check.js +4 -3
  698. package/schemas/plugins/container/ModuleFederationPlugin.json +40 -0
  699. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +4 -3
  700. package/schemas/plugins/css/CssGeneratorOptions.check.js +4 -3
  701. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +4 -3
  702. package/schemas/plugins/css/CssModuleParserOptions.check.js +4 -3
  703. package/schemas/plugins/css/CssParserOptions.check.js +4 -3
  704. package/schemas/plugins/debug/ProfilingPlugin.check.js +4 -3
  705. package/schemas/plugins/define/DotenvPluginOptions.check.js +7 -0
  706. package/schemas/plugins/define/DotenvPluginOptions.json +3 -0
  707. package/schemas/plugins/dll/DllPlugin.check.js +4 -3
  708. package/schemas/plugins/dll/DllReferencePlugin.check.js +4 -3
  709. package/schemas/plugins/dll/DllReferencePlugin.json +3 -18
  710. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +4 -3
  711. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +4 -3
  712. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +4 -3
  713. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +4 -3
  714. package/schemas/plugins/json/JsonModulesPluginParser.check.js +4 -3
  715. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +4 -3
  716. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +4 -3
  717. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +4 -3
  718. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +4 -3
  719. package/schemas/plugins/output/CleanOptions.check.js +7 -0
  720. package/schemas/plugins/output/CleanOptions.json +3 -0
  721. package/schemas/plugins/schemes/HttpUriPlugin.check.js +4 -3
  722. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +4 -3
  723. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +4 -3
  724. package/schemas/plugins/sharing/ConsumeSharedPlugin.json +32 -0
  725. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +4 -3
  726. package/schemas/plugins/sharing/ProvideSharedPlugin.json +32 -0
  727. package/schemas/plugins/sharing/SharePlugin.check.js +4 -3
  728. package/schemas/plugins/sharing/SharePlugin.json +32 -0
  729. package/types.d.ts +20780 -14174
  730. package/lib/LazyBarrel.js +0 -388
  731. package/lib/dependencies/HarmonyAcceptImportDependency.js +0 -39
  732. package/lib/dependencies/HarmonyModulesPlugin.js +0 -192
  733. package/lib/javascript/ChunkFormatHelpers.js +0 -72
  734. package/lib/javascript/grammar.js +0 -5546
  735. package/lib/javascript/parser.js +0 -1500
  736. package/lib/javascript/regexpData.js +0 -51
  737. package/lib/performance/getSourceModules.js +0 -22
  738. package/lib/util/Semaphore.js +0 -65
  739. package/lib/util/objectToMap.js +0 -15
  740. package/schemas/WebpackOptions.check.d.ts +0 -7
  741. package/schemas/_container.json +0 -155
  742. package/schemas/_sharing.json +0 -118
  743. package/schemas/plugins/BannerPlugin.check.d.ts +0 -7
  744. package/schemas/plugins/HtmlGeneratorOptions.check.d.ts +0 -7
  745. package/schemas/plugins/HtmlParserOptions.check.d.ts +0 -7
  746. package/schemas/plugins/IgnorePlugin.check.d.ts +0 -7
  747. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +0 -7
  748. package/schemas/plugins/ManifestPlugin.check.d.ts +0 -7
  749. package/schemas/plugins/ProgressPlugin.check.d.ts +0 -7
  750. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +0 -7
  751. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +0 -7
  752. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +0 -7
  753. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +0 -7
  754. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +0 -7
  755. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +0 -7
  756. package/schemas/plugins/container/ContainerPlugin.check.d.ts +0 -7
  757. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +0 -7
  758. package/schemas/plugins/container/ExternalsType.check.d.ts +0 -7
  759. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +0 -7
  760. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +0 -7
  761. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +0 -7
  762. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +0 -7
  763. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +0 -7
  764. package/schemas/plugins/css/CssParserOptions.check.d.ts +0 -7
  765. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +0 -7
  766. package/schemas/plugins/dll/DllPlugin.check.d.ts +0 -7
  767. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +0 -7
  768. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +0 -7
  769. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +0 -7
  770. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +0 -7
  771. package/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts +0 -7
  772. package/schemas/plugins/json/JsonModulesPluginParser.check.d.ts +0 -7
  773. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +0 -7
  774. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +0 -7
  775. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +0 -7
  776. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +0 -7
  777. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +0 -7
  778. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +0 -7
  779. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +0 -7
  780. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +0 -7
  781. package/schemas/plugins/sharing/SharePlugin.check.d.ts +0 -7
  782. /package/lib/{validateSchema.js → config/validateSchema.js} +0 -0
  783. /package/lib/{util → css}/topologicalSort.js +0 -0
  784. /package/lib/dependencies/{getFunctionExpression.js → helpers/getFunctionExpression.js} +0 -0
  785. /package/lib/{util → externals}/extractUrlAndGlobal.js +0 -0
  786. /package/lib/{util → fs}/StackedCacheMap.js +0 -0
  787. /package/lib/{util → javascript}/StackedMap.js +0 -0
  788. /package/lib/{ModuleProfile.js → module/ModuleProfile.js} +0 -0
  789. /package/lib/{ModuleSourceTypeConstants.js → module/ModuleSourceTypeConstants.js} +0 -0
  790. /package/lib/{ModuleTypeConstants.js → module/ModuleTypeConstants.js} +0 -0
  791. /package/lib/{OptimizationStages.js → optimize/OptimizationStages.js} +0 -0
  792. /package/lib/{util → optimize}/Queue.js +0 -0
  793. /package/lib/{util → stats}/smartGrouping.js +0 -0
@@ -5,8 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const Chunk = require("../Chunk");
9
- const { STAGE_ADVANCED } = require("../OptimizationStages");
8
+ const MinMaxSizeWarning = require("../errors/MinMaxSizeWarning");
10
9
  const WebpackError = require("../errors/WebpackError");
11
10
  const { requestToId } = require("../ids/IdHelpers");
12
11
  const { isSubset } = require("../util/SetHelpers");
@@ -16,10 +15,15 @@ const {
16
15
  compareModulesByIdentifier
17
16
  } = require("../util/comparators");
18
17
  const createHash = require("../util/createHash");
19
- const deterministicGrouping = require("../util/deterministicGrouping");
20
18
  const { makePathsRelative } = require("../util/identifier");
21
19
  const memoize = require("../util/memoize");
22
- const MinMaxSizeWarning = require("./MinMaxSizeWarning");
20
+ const { STAGE_ADVANCED } = require("./OptimizationStages");
21
+ const { discoverIntersections } = require("./chunkSetIntersections");
22
+ const deterministicGrouping = require("./deterministicGrouping");
23
+
24
+ const getMatchModuleGlobCondition = memoize(
25
+ () => require("../util/globUtils").matchModuleGlobCondition
26
+ );
23
27
 
24
28
  /**
25
29
  * @import {
@@ -33,16 +37,16 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
33
37
  * OutputNormalizedWithDefaults as OutputOptions
34
38
  * } from "../config/defaults"
35
39
  */
36
- /** @import { ChunkName, ChunkFilenameTemplate } from "../Chunk" */
37
- /** @import ChunkGraph from "../ChunkGraph" */
38
- /** @import ChunkGroup from "../ChunkGroup" */
40
+ /** @import Chunk, { ChunkName, ChunkFilenameTemplate } from "../graph/Chunk" */
41
+ /** @import ChunkGraph from "../graph/ChunkGraph" */
42
+ /** @import ChunkGroup from "../graph/ChunkGroup" */
39
43
  /** @import Compilation from "../Compilation" */
40
44
  /** @import Compiler from "../Compiler" */
41
- /** @import Module, { SourceType } from "../Module" */
42
- /** @import ModuleGraph from "../ModuleGraph" */
43
- /** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
44
- /** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
45
- /** @import { Sizes } from "../util/deterministicGrouping" */
45
+ /** @import Module, { SourceType } from "../module/Module" */
46
+ /** @import ModuleGraph from "../graph/ModuleGraph" */
47
+ /** @typedef {import("./deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
48
+ /** @typedef {import("./deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
49
+ /** @import { Sizes } from "./deterministicGrouping" */
46
50
 
47
51
  /**
48
52
  * Defines the chunk filter fn callback.
@@ -114,6 +118,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
114
118
  * @property {boolean} reuseExistingChunk
115
119
  * @property {boolean} usedExports
116
120
  * @property {boolean} _validateSize
121
+ * @property {boolean} _validateSizeReduction
117
122
  * @property {boolean} _validateRemainingSize
118
123
  * @property {SplitChunksSizes} _minSizeForMaxSize
119
124
  * @property {boolean} _conditionalEnforce
@@ -158,6 +163,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
158
163
  /**
159
164
  * Defines the split chunks options type used by this module.
160
165
  * @typedef {object} SplitChunksOptions
166
+ * @property {number | undefined} dedupDepth
161
167
  * @property {ChunkFilterFn} chunksFilter
162
168
  * @property {DefaultSizeTypes} defaultSizeTypes
163
169
  * @property {SplitChunksSizes} minSize
@@ -178,6 +184,22 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
178
184
  * @property {FallbackCacheGroup} fallbackCacheGroup
179
185
  */
180
186
 
187
+ /**
188
+ * A cache group as intersection discovery reads it: what it takes, and how much
189
+ * the modules it would take have to weigh.
190
+ * @typedef {object} IntersectionCacheGroup
191
+ * @property {OptimizationSplitChunksCacheGroup["test"]} test the modules it accepts
192
+ * @property {SplitChunksSizes} minSize the size each of their types must reach
193
+ */
194
+
195
+ /**
196
+ * What the cache groups taking intersections allow discovery to assume.
197
+ * @typedef {object} IntersectionSettings
198
+ * @property {number} minSize size an intersection's modules must reach, `0` when unbounded
199
+ * @property {number} minMembers fewest chunks an intersection is worth discovering with
200
+ * @property {IntersectionCacheGroup[] | undefined} groups the cache groups taking them, when every one of them is known
201
+ */
202
+
181
203
  /** @typedef {Set<Chunk>} ChunkSet */
182
204
 
183
205
  /**
@@ -340,8 +362,14 @@ const ASYNC_CHUNK_FILTER = (chunk) => !chunk.canBeInitial();
340
362
  */
341
363
  const ALL_CHUNK_FILTER = (_chunk) => true;
342
364
 
343
- /** Placeholder until a chunk set group is filled and its signatures are written. */
344
- const EMPTY_SIGNATURES = new Uint32Array(0);
365
+ // What one compilation may spend looking for the intersections of its chunk
366
+ // sets: a word of every pair of them it reaches, and the intersections it keeps,
367
+ // bounding the worst case of chunk sets that each span most chunks.
368
+
369
+ // TODO raise or drop both once threads carry the search, as rspack needs no
370
+ // ceiling with rayon behind it
371
+ const MAX_INTERSECTION_WORK = 50000000;
372
+ const MAX_INTERSECTIONS = 10000;
345
373
 
346
374
  /**
347
375
  * Returns normalized representation.
@@ -381,7 +409,7 @@ const mergeSizes = (...sizes) => {
381
409
  * @returns {boolean} true, if there are sizes > 0
382
410
  */
383
411
  const hasNonZeroSizes = (sizes) => {
384
- for (const key of /** @type {SourceType[]} */ (Object.keys(sizes))) {
412
+ for (const key of Object.keys(sizes)) {
385
413
  if (sizes[key] > 0) return true;
386
414
  }
387
415
  return false;
@@ -417,7 +445,7 @@ const combineSizes = (a, b, combine) => {
417
445
  * @returns {boolean} true if there are sizes and all existing sizes are at least `minSize`
418
446
  */
419
447
  const checkMinSize = (sizes, minSize) => {
420
- for (const key of /** @type {SourceType[]} */ (Object.keys(minSize))) {
448
+ for (const key of Object.keys(minSize)) {
421
449
  const size = sizes[key];
422
450
  if (size === undefined || size === 0) continue;
423
451
  if (size < minSize[key]) return false;
@@ -433,9 +461,7 @@ const checkMinSize = (sizes, minSize) => {
433
461
  * @returns {boolean} true if there are sizes and all existing sizes are at least `minSizeReduction`
434
462
  */
435
463
  const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
436
- for (const key of /** @type {SourceType[]} */ (
437
- Object.keys(minSizeReduction)
438
- )) {
464
+ for (const key of Object.keys(minSizeReduction)) {
439
465
  const size = sizes[key];
440
466
  if (size === undefined || size === 0) continue;
441
467
  if (size * chunkCount < minSizeReduction[key]) return false;
@@ -452,7 +478,7 @@ const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
452
478
  const getViolatingMinSizes = (sizes, minSize) => {
453
479
  /** @type {SourceTypes | undefined} */
454
480
  let list;
455
- for (const key of /** @type {SourceType[]} */ (Object.keys(minSize))) {
481
+ for (const key of Object.keys(minSize)) {
456
482
  const size = sizes[key];
457
483
  if (size === undefined || size === 0) continue;
458
484
  if (size < minSize[key]) {
@@ -470,7 +496,7 @@ const getViolatingMinSizes = (sizes, minSize) => {
470
496
  */
471
497
  const totalSize = (sizes) => {
472
498
  let size = 0;
473
- for (const key of /** @type {SourceType[]} */ (Object.keys(sizes))) {
499
+ for (const key of Object.keys(sizes)) {
474
500
  size += sizes[key];
475
501
  }
476
502
  return size;
@@ -486,7 +512,7 @@ const normalizeName = (name) => {
486
512
  return () => name;
487
513
  }
488
514
  if (typeof name === "function") {
489
- return /** @type {GetNameFn} */ (name);
515
+ return name;
490
516
  }
491
517
  };
492
518
 
@@ -513,19 +539,41 @@ const normalizeChunksFilter = (chunks) => {
513
539
  }
514
540
  };
515
541
 
542
+ /**
543
+ * A cache group source a module can only match or not, and what decides it.
544
+ * @typedef {object} StaticCacheGroupSource
545
+ * @property {CacheGroupSource} source the normalized source
546
+ * @property {OptimizationSplitChunksCacheGroup["test"]} test the modules it accepts
547
+ */
548
+
549
+ /**
550
+ * The normalized cache groups, and what is known about them without a module.
551
+ * @typedef {object} NormalizedCacheGroups
552
+ * @property {GetCacheGroups} getCacheGroups a function to get the cache groups
553
+ * @property {StaticCacheGroupSource[]} staticSources the sources a module can only match or not
554
+ * @property {boolean} hasDynamicSources true when a callback builds sources per module
555
+ */
556
+
516
557
  /**
517
558
  * Normalizes cache groups.
518
559
  * @param {undefined | GetCacheGroups | Record<string, false | string | RegExp | RawGetCacheGroups | OptimizationSplitChunksCacheGroup>} cacheGroups the cache group options
519
560
  * @param {DefaultSizeTypes} defaultSizeTypes the default size types
520
- * @returns {GetCacheGroups} a function to get the cache groups
561
+ * @returns {NormalizedCacheGroups} the normalized cache groups
521
562
  */
522
563
  const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
523
564
  if (typeof cacheGroups === "function") {
524
- return cacheGroups;
565
+ return {
566
+ getCacheGroups: cacheGroups,
567
+ staticSources: [],
568
+ hasDynamicSources: true
569
+ };
525
570
  }
526
571
  if (typeof cacheGroups === "object" && cacheGroups !== null) {
527
572
  /** @type {((module: Module, context: CacheGroupsContext, results: CacheGroupSource[]) => void)[]} */
528
573
  const handlers = [];
574
+ /** @type {StaticCacheGroupSource[]} */
575
+ const staticSources = [];
576
+ let hasDynamicSources = false;
529
577
  for (const key of Object.keys(cacheGroups)) {
530
578
  const option = cacheGroups[key];
531
579
  if (option === false) {
@@ -533,6 +581,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
533
581
  }
534
582
  if (typeof option === "string" || option instanceof RegExp) {
535
583
  const source = createCacheGroupSource({}, key, defaultSizeTypes);
584
+ staticSources.push({ source, test: option });
536
585
  handlers.push((module, context, results) => {
537
586
  if (checkTest(option, module, context)) {
538
587
  results.push(source);
@@ -541,6 +590,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
541
590
  } else if (typeof option === "function") {
542
591
  /** @type {WeakMap<OptimizationSplitChunksCacheGroup, CacheGroupSource>} */
543
592
  const cache = new WeakMap();
593
+ hasDynamicSources = true;
544
594
  handlers.push((module, context, results) => {
545
595
  const result = option(module);
546
596
  if (result) {
@@ -563,6 +613,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
563
613
  });
564
614
  } else {
565
615
  const source = createCacheGroupSource(option, key, defaultSizeTypes);
616
+ staticSources.push({ source, test: option.test });
566
617
  handlers.push((module, context, results) => {
567
618
  if (
568
619
  checkTest(option.test, module, context) &&
@@ -588,9 +639,13 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
588
639
  }
589
640
  return results;
590
641
  };
591
- return fn;
642
+ return { getCacheGroups: fn, staticSources, hasDynamicSources };
592
643
  }
593
- return () => null;
644
+ return {
645
+ getCacheGroups: () => null,
646
+ staticSources: [],
647
+ hasDynamicSources: false
648
+ };
594
649
  };
595
650
 
596
651
  /** @typedef {(module: Module, context: CacheGroupsContext) => boolean} CheckTestFn */
@@ -616,9 +671,36 @@ const checkTest = (test, module, context) => {
616
671
  const name = module.nameForCondition();
617
672
  return name ? test.test(name) : false;
618
673
  }
674
+ if (typeof test === "object") {
675
+ return getMatchModuleGlobCondition()(test, module);
676
+ }
619
677
  return false;
620
678
  };
621
679
 
680
+ /**
681
+ * Whether a module matches a test that decides it without running user code.
682
+ * A callback or a test naming no modules is treated as matching, so a module it
683
+ * might take is never taken for one it cannot.
684
+ * @param {OptimizationSplitChunksCacheGroup["test"]} test test option
685
+ * @param {Module} module the module
686
+ * @returns {boolean} true, if the module may be selected
687
+ */
688
+ const matchesStaticTest = (test, module) => {
689
+ if (typeof test === "string") {
690
+ const name = module.nameForCondition();
691
+ return name ? name.startsWith(test) : false;
692
+ }
693
+ if (test instanceof RegExp) {
694
+ const name = module.nameForCondition();
695
+ return name ? test.test(name) : false;
696
+ }
697
+ if (typeof test === "object") {
698
+ return getMatchModuleGlobCondition()(test, module);
699
+ }
700
+ if (typeof test === "boolean") return test;
701
+ return true;
702
+ };
703
+
622
704
  /** @typedef {(type: string) => boolean} CheckModuleTypeFn */
623
705
 
624
706
  /**
@@ -724,6 +806,16 @@ class SplitChunksPlugin {
724
806
  * @param {OptimizationSplitChunksOptions=} options plugin options
725
807
  */
726
808
  constructor(options = {}) {
809
+ if (
810
+ options.dedupDepth !== undefined &&
811
+ (!Number.isInteger(options.dedupDepth) ||
812
+ options.dedupDepth < 0 ||
813
+ options.dedupDepth > 0xffffffff)
814
+ ) {
815
+ throw new WebpackError(
816
+ '"optimization.splitChunks.dedupDepth" must be an integer between 0 and 4294967295.'
817
+ );
818
+ }
727
819
  const defaultSizeTypes = options.defaultSizeTypes || [
728
820
  "javascript",
729
821
  "unknown"
@@ -735,9 +827,12 @@ class SplitChunksPlugin {
735
827
  defaultSizeTypes
736
828
  );
737
829
  const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
830
+ const { getCacheGroups, staticSources, hasDynamicSources } =
831
+ normalizeCacheGroups(options.cacheGroups, defaultSizeTypes);
738
832
 
739
833
  /** @type {SplitChunksOptions} */
740
834
  this.options = {
835
+ dedupDepth: options.dedupDepth,
741
836
  chunksFilter:
742
837
  /** @type {ChunkFilterFn} */
743
838
  (normalizeChunksFilter(options.chunks || "all")),
@@ -765,10 +860,7 @@ class SplitChunksPlugin {
765
860
  maxInitialRequests: options.maxInitialRequests || 1,
766
861
  hidePathInfo: options.hidePathInfo || false,
767
862
  filename: options.filename || undefined,
768
- getCacheGroups: normalizeCacheGroups(
769
- options.cacheGroups,
770
- defaultSizeTypes
771
- ),
863
+ getCacheGroups,
772
864
  getName: options.name
773
865
  ? /** @type {GetNameFn} */ (normalizeName(options.name))
774
866
  : defaultGetName,
@@ -807,6 +899,64 @@ class SplitChunksPlugin {
807
899
 
808
900
  /** @type {WeakMap<CacheGroupSource, CacheGroup>} */
809
901
  this._cacheGroupCache = new WeakMap();
902
+ /** @type {StaticCacheGroupSource[]} */
903
+ this._staticCacheGroupSources = staticSources;
904
+ this._hasDynamicCacheGroups = hasDynamicSources;
905
+ }
906
+
907
+ /**
908
+ * Settings for the intersections a chunk set discovers, or `undefined` when no
909
+ * cache group would take one.
910
+ * @param {boolean} usedExports true for the sets grouped by used exports
911
+ * @param {number} dedupDepth rounds of discovery this compilation allows
912
+ * @returns {IntersectionSettings | undefined} the settings, when discovery applies
913
+ */
914
+ _getIntersectionSettings(usedExports, dedupDepth) {
915
+ if (dedupDepth === 0) return undefined;
916
+ // A callback builds its cache groups per module, so neither what they take
917
+ // nor what they ask of it is known here: discover for the widest of them,
918
+ // and bound nothing.
919
+ if (this._hasDynamicCacheGroups) {
920
+ return { minSize: 0, minMembers: 1, groups: undefined };
921
+ }
922
+ /** @type {IntersectionCacheGroup[]} */
923
+ const groups = [];
924
+ let minMembers = Number.POSITIVE_INFINITY;
925
+ /** @type {number | undefined} */
926
+ let minSize;
927
+ for (const { source, test } of this._staticCacheGroupSources) {
928
+ const cacheGroup = this._getCacheGroup(source);
929
+ if (
930
+ cacheGroup.usedExports !== usedExports ||
931
+ cacheGroup.getName !== defaultGetName ||
932
+ (!cacheGroup._validateSize && !cacheGroup._validateSizeReduction)
933
+ ) {
934
+ continue;
935
+ }
936
+ groups.push({ test, minSize: cacheGroup.minSize });
937
+ minMembers = Math.min(minMembers, Math.max(1, cacheGroup.minChunks));
938
+ if (minSize === 0) continue;
939
+ // A chunk filter can map two intersections onto the same selected
940
+ // chunks, where only the modules of both together reach `minSize`, so
941
+ // a bound holds only for groups taking the chunks as they are.
942
+
943
+ // TODO intersect what a filter selects, where every group shares one,
944
+ // so a filtered build is bounded as well
945
+ if (
946
+ cacheGroup.chunksFilter !== ALL_CHUNK_FILTER ||
947
+ !cacheGroup._validateSize
948
+ ) {
949
+ minSize = 0;
950
+ continue;
951
+ }
952
+ for (const size of Object.values(cacheGroup.minSize)) {
953
+ if (size > 0 && (minSize === undefined || size < minSize)) {
954
+ minSize = size;
955
+ }
956
+ }
957
+ }
958
+ if (groups.length === 0) return undefined;
959
+ return { minSize: minSize || 0, minMembers, groups };
810
960
  }
811
961
 
812
962
  /**
@@ -890,6 +1040,7 @@ class SplitChunksPlugin {
890
1040
  : cacheGroupSource.key,
891
1041
  reuseExistingChunk: cacheGroupSource.reuseExistingChunk || false,
892
1042
  _validateSize: hasNonZeroSizes(minSize),
1043
+ _validateSizeReduction: hasNonZeroSizes(minSizeReduction),
893
1044
  _validateRemainingSize: hasNonZeroSizes(minRemainingSize),
894
1045
  _minSizeForMaxSize: mergeSizes(
895
1046
  cacheGroupSource.minSize,
@@ -941,24 +1092,50 @@ class SplitChunksPlugin {
941
1092
  logger.time("prepare");
942
1093
  const chunkGraph = compilation.chunkGraph;
943
1094
  const moduleGraph = compilation.moduleGraph;
1095
+ // Rounds of discovery: what the option says, or what the defaults
1096
+ // of the next major imply, as a plugin constructed by hand reads
1097
+ // no defaults of its own
1098
+ const dedupDepth =
1099
+ this.options.dedupDepth === undefined
1100
+ ? compiler.options.experiments.futureDefaults
1101
+ ? 1
1102
+ : 0
1103
+ : this.options.dedupDepth;
1104
+ const intersectionSettings = this._getIntersectionSettings(
1105
+ false,
1106
+ dedupDepth
1107
+ );
1108
+ const exportsIntersectionSettings = this._getIntersectionSettings(
1109
+ true,
1110
+ dedupDepth
1111
+ );
1112
+ // Chunks in the index intersection discovery works in, built only
1113
+ // when a cache group would take an intersection
1114
+ /** @type {Chunk[] | undefined} */
1115
+ const intersectionChunks =
1116
+ intersectionSettings === undefined &&
1117
+ exportsIntersectionSettings === undefined
1118
+ ? undefined
1119
+ : [];
1120
+ // The index of each of those chunks
1121
+ /** @type {Map<Chunk, number>} */
1122
+ const intersectionChunkIndices = new Map();
944
1123
  // Give each selected chunk an index (to create strings from chunks)
945
1124
  /** @type {Map<Chunk, bigint>} */
946
1125
  const chunkIndexMap = new Map();
947
- // Dense per-chunk index, folded into the 64 bit membership
948
- // signatures that reject non-subsets in getCombinations
949
- /** @type {Map<Chunk, number>} */
950
- const chunkSignatureBitMap = new Map();
951
1126
  const ZERO = BigInt("0");
952
1127
  const ONE = BigInt("1");
953
1128
  const START = ONE << BigInt("31");
954
1129
  let index = START;
955
- let denseIndex = 0;
956
1130
  for (const chunk of chunks) {
957
1131
  chunkIndexMap.set(
958
1132
  chunk,
959
1133
  index | BigInt((Math.random() * 0x7fffffff) | 0)
960
1134
  );
961
- chunkSignatureBitMap.set(chunk, denseIndex++ & 63);
1135
+ if (intersectionChunks !== undefined) {
1136
+ intersectionChunkIndices.set(chunk, intersectionChunks.length);
1137
+ intersectionChunks.push(chunk);
1138
+ }
962
1139
  index <<= ONE;
963
1140
  }
964
1141
  /**
@@ -992,11 +1169,60 @@ class SplitChunksPlugin {
992
1169
  return /** @type {bigint} */ (chunkIndexMap.get(key)).toString(16);
993
1170
  };
994
1171
 
1172
+ /**
1173
+ * Most a module can weigh towards an intersection of these cache groups, `0`
1174
+ * when none of them takes it and `Infinity` when a size of it is unknown or
1175
+ * bounded by nothing.
1176
+ * @param {Module} module the module
1177
+ * @param {IntersectionCacheGroup[]} groups the cache groups taking the intersections
1178
+ * @returns {number} the bound
1179
+ */
1180
+ const getModuleSizeBound = (module, groups) => {
1181
+ // A native test is exact, so a module no group accepts weighs nothing. A
1182
+ // callback stays a possible match rather than being called a second time.
1183
+ if (!groups.some(({ test }) => matchesStaticTest(test, module))) {
1184
+ return 0;
1185
+ }
1186
+ let bound = 0;
1187
+ let types = 0;
1188
+ for (const type of module.getSourceTypes()) {
1189
+ types++;
1190
+ for (const { minSize } of groups) {
1191
+ // Without a threshold on this type, arbitrarily few bytes of it survive
1192
+ // minSize, so nothing about this module bounds anything
1193
+ if (!(minSize[type] > 0)) return Number.POSITIVE_INFINITY;
1194
+ }
1195
+ const size = module.size(type);
1196
+ if (!(size >= 0) || size === Number.POSITIVE_INFINITY) {
1197
+ return Number.POSITIVE_INFINITY;
1198
+ }
1199
+ bound += size;
1200
+ }
1201
+ return types === 0 ? Number.POSITIVE_INFINITY : bound;
1202
+ };
1203
+
1204
+ /** Whether discovery of these sets prunes by size. */
1205
+ const boundsChunkSetSizes =
1206
+ intersectionSettings !== undefined &&
1207
+ intersectionSettings.minSize > 0;
1208
+ const boundsExportsChunkSetSizes =
1209
+ exportsIntersectionSettings !== undefined &&
1210
+ exportsIntersectionSettings.minSize > 0;
1211
+
995
1212
  const getChunkSetsInGraph = memoize(() => {
996
1213
  /** @type {Map<bigint, ChunkSet>} */
997
1214
  const chunkSetsInGraph = new Map();
998
1215
  /** @type {ChunkSet} */
999
1216
  const singleChunkSets = new Set();
1217
+ // Only what a chunk set's own modules weigh, and only where a bound on it
1218
+ // can reject an intersection
1219
+ /** @type {Map<bigint | Chunk, number> | undefined} */
1220
+ const sizeByKey = boundsChunkSetSizes ? new Map() : undefined;
1221
+ const groups = boundsChunkSetSizes
1222
+ ? /** @type {IntersectionCacheGroup[]} */ (
1223
+ intersectionSettings.groups
1224
+ )
1225
+ : undefined;
1000
1226
  for (const module of compilation.modules) {
1001
1227
  const chunks = chunkGraph.getModuleChunksIterable(module);
1002
1228
  const chunksKey = getKey(chunks);
@@ -1007,8 +1233,18 @@ class SplitChunksPlugin {
1007
1233
  } else {
1008
1234
  singleChunkSets.add(chunksKey);
1009
1235
  }
1236
+ if (sizeByKey !== undefined) {
1237
+ sizeByKey.set(
1238
+ chunksKey,
1239
+ (sizeByKey.get(chunksKey) || 0) +
1240
+ getModuleSizeBound(
1241
+ module,
1242
+ /** @type {IntersectionCacheGroup[]} */ (groups)
1243
+ )
1244
+ );
1245
+ }
1010
1246
  }
1011
- return { chunkSetsInGraph, singleChunkSets };
1247
+ return { chunkSetsInGraph, singleChunkSets, sizeByKey };
1012
1248
  });
1013
1249
 
1014
1250
  /**
@@ -1032,127 +1268,353 @@ class SplitChunksPlugin {
1032
1268
  return groupedByUsedExports.values();
1033
1269
  };
1034
1270
 
1035
- /** @type {Map<Module, Iterable<Chunk[]>>} */
1271
+ /** @type {Map<Module, Chunk[][]>} */
1036
1272
  const groupedByExportsMap = new Map();
1037
1273
 
1038
- /** @typedef {Map<bigint | Chunk, ChunkSet>} ChunkSetsInGraph */
1274
+ /** @typedef {Map<bigint, ChunkSet>} ChunkSetsInGraph */
1039
1275
 
1040
1276
  const getExportsChunkSetsInGraph = memoize(() => {
1041
1277
  /** @type {ChunkSetsInGraph} */
1042
1278
  const chunkSetsInGraph = new Map();
1043
1279
  /** @type {ChunkSet} */
1044
1280
  const singleChunkSets = new Set();
1281
+ // A module counts towards every group it appears in, which can only
1282
+ // overstate a group, never hide an intersection worth splitting
1283
+ /** @type {Map<bigint | Chunk, number> | undefined} */
1284
+ const sizeByKey = boundsExportsChunkSetSizes
1285
+ ? new Map()
1286
+ : undefined;
1287
+ const groups = boundsExportsChunkSetSizes
1288
+ ? /** @type {IntersectionCacheGroup[]} */ (
1289
+ exportsIntersectionSettings.groups
1290
+ )
1291
+ : undefined;
1045
1292
  for (const module of compilation.modules) {
1046
1293
  const groupedChunks = [...groupChunksByExports(module)];
1047
1294
  groupedByExportsMap.set(module, groupedChunks);
1048
1295
  for (const chunks of groupedChunks) {
1296
+ const chunksKey = getKey(chunks);
1049
1297
  if (chunks.length === 1) {
1050
1298
  singleChunkSets.add(chunks[0]);
1051
1299
  } else {
1052
- const chunksKey = getKey(chunks);
1053
- if (!chunkSetsInGraph.has(chunksKey)) {
1054
- chunkSetsInGraph.set(chunksKey, new Set(chunks));
1300
+ // More than one chunk, so the key is the bigint of their ids
1301
+ const setKey = /** @type {bigint} */ (chunksKey);
1302
+ if (!chunkSetsInGraph.has(setKey)) {
1303
+ chunkSetsInGraph.set(setKey, new Set(chunks));
1055
1304
  }
1056
1305
  }
1306
+ if (sizeByKey !== undefined) {
1307
+ sizeByKey.set(
1308
+ chunksKey,
1309
+ (sizeByKey.get(chunksKey) || 0) +
1310
+ getModuleSizeBound(
1311
+ module,
1312
+ /** @type {IntersectionCacheGroup[]} */ (groups)
1313
+ )
1314
+ );
1315
+ }
1057
1316
  }
1058
1317
  }
1059
- return { chunkSetsInGraph, singleChunkSets };
1318
+ return { chunkSetsInGraph, singleChunkSets, sizeByKey };
1060
1319
  });
1061
1320
 
1062
1321
  /**
1063
- * Chunk sets of equal size, with a 64 bit membership signature
1064
- * per set stored as two words at `2 * i` in `signatures`.
1065
- * @typedef {object} ChunkSetGroup
1066
- * @property {ChunkSet[]} sets the chunk sets
1067
- * @property {Uint32Array} signatures two signature words per set
1322
+ * The chunk sets a combination can be taken from, in the order they are
1323
+ * combined in, indexed by the chunk fewest of them hold.
1324
+ * @typedef {object} ChunkSetIndex
1325
+ * @property {ChunkSet[]} sets the chunk sets, smaller counts first
1326
+ * @property {Map<Chunk, number[]>} setsByRarestChunk what to try for a chunk
1327
+ * @property {Map<Chunk, number>} singleOrder order of the single chunk sets
1068
1328
  */
1069
1329
 
1070
- /** @typedef {Map<CountOfChunk, ChunkSetGroup>} ChunkSetsByCount */
1071
-
1072
- // holds the signature of the set currently being combined; transient
1073
- const signatureScratch = new Uint32Array(2);
1074
-
1075
1330
  /**
1076
- * Folds a chunk set into a 64 bit membership signature.
1077
- * @param {ChunkSet} chunksSet set of chunks
1078
- * @param {Uint32Array} out target array
1079
- * @param {number} offset index of the first of the two words
1080
- * @returns {void}
1331
+ * Indexes chunk sets for the subsets of a set to be found without walking all
1332
+ * of them: a subset holds the chunk fewest sets hold of it, so only the sets
1333
+ * indexed under a chunk of the superset can be one.
1334
+ * @param {IterableIterator<ChunkSet>} chunkSets set of sets of chunks
1335
+ * @param {ChunkSet} singleChunkSets the chunks holding modules of their own
1336
+ * @returns {ChunkSetIndex} the sets, and where to look for a subset
1081
1337
  */
1082
- const writeSignature = (chunksSet, out, offset) => {
1083
- out[offset] = 0;
1084
- out[offset + 1] = 0;
1085
- for (const chunk of chunksSet) {
1086
- const bit = /** @type {number} */ (
1087
- chunkSignatureBitMap.get(chunk)
1088
- );
1089
- out[offset + (bit >> 5)] |= 1 << (bit & 31);
1338
+ const indexChunkSets = (chunkSets, singleChunkSets) => {
1339
+ // Grouped by count, as only a smaller set can be a proper subset, and
1340
+ // combined in that order
1341
+ /** @type {Map<CountOfChunk, ChunkSet[]>} */
1342
+ const setsByCount = new Map();
1343
+ /** @type {Map<Chunk, number>} */
1344
+ const holders = new Map();
1345
+ for (const chunksSet of chunkSets) {
1346
+ const group = setsByCount.get(chunksSet.size);
1347
+ if (group === undefined) {
1348
+ setsByCount.set(chunksSet.size, [chunksSet]);
1349
+ } else {
1350
+ group.push(chunksSet);
1351
+ }
1352
+ for (const chunk of chunksSet) {
1353
+ holders.set(chunk, (holders.get(chunk) || 0) + 1);
1354
+ }
1355
+ }
1356
+ /** @type {ChunkSet[]} */
1357
+ const sets = [];
1358
+ for (const group of setsByCount.values()) {
1359
+ for (const chunksSet of group) sets.push(chunksSet);
1090
1360
  }
1361
+ /** @type {Map<Chunk, number[]>} */
1362
+ const setsByRarestChunk = new Map();
1363
+ for (let i = 0; i < sets.length; i++) {
1364
+ /** @type {Chunk | undefined} */
1365
+ let rarest;
1366
+ let fewest = 0;
1367
+ for (const chunk of sets[i]) {
1368
+ const count = /** @type {number} */ (holders.get(chunk));
1369
+ if (rarest === undefined || count < fewest) {
1370
+ rarest = chunk;
1371
+ fewest = count;
1372
+ }
1373
+ }
1374
+ if (rarest === undefined) continue;
1375
+ const indices = setsByRarestChunk.get(rarest);
1376
+ if (indices === undefined) setsByRarestChunk.set(rarest, [i]);
1377
+ else indices.push(i);
1378
+ }
1379
+ /** @type {Map<Chunk, number>} */
1380
+ const singleOrder = new Map();
1381
+ for (const chunk of singleChunkSets) {
1382
+ singleOrder.set(chunk, singleOrder.size);
1383
+ }
1384
+ return { sets, setsByRarestChunk, singleOrder };
1091
1385
  };
1386
+ const getChunkSetIndex = memoize(() => {
1387
+ const { chunkSetsInGraph, singleChunkSets } = getChunkSetsInGraph();
1388
+ return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
1389
+ });
1390
+ const getExportsChunkSetIndex = memoize(() => {
1391
+ const { chunkSetsInGraph, singleChunkSets } =
1392
+ getExportsChunkSetsInGraph();
1393
+ return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
1394
+ });
1092
1395
 
1093
- // group these set of chunks by count
1094
- // to allow to check less sets via isSubset
1095
- // (only smaller sets can be subset)
1096
1396
  /**
1097
- * Group chunk sets by count.
1098
- * @param {IterableIterator<ChunkSet>} chunkSets set of sets of chunks
1099
- * @returns {ChunkSetsByCount} map of sets of chunks by count
1397
+ * Discovers the intersections of the chunk sets that are not chunk sets
1398
+ * themselves, and groups them by the sets holding all of their chunks.
1399
+ * @param {ChunkSetsInGraph} chunkSets the chunk sets in the graph
1400
+ * @param {ChunkSet} singleChunkSets the chunks holding modules of their own
1401
+ * @param {Map<bigint | Chunk, number> | undefined} sizeByKey size of the modules behind each chunk set
1402
+ * @param {IntersectionSettings} settings what the cache groups taking them allow
1403
+ * @returns {Map<bigint | Chunk, ChunkSet[]>} intersections by the key of each set holding them
1100
1404
  */
1101
- const groupChunkSetsByCount = (chunkSets) => {
1102
- /** @type {ChunkSetsByCount} */
1103
- const chunkSetsByCount = new Map();
1104
- for (const chunksSet of chunkSets) {
1105
- const count = chunksSet.size;
1106
- let group = chunkSetsByCount.get(count);
1107
- if (group === undefined) {
1108
- group = { sets: [], signatures: EMPTY_SIGNATURES };
1109
- chunkSetsByCount.set(count, group);
1405
+ const discoverChunkSetIntersections = (
1406
+ chunkSets,
1407
+ singleChunkSets,
1408
+ sizeByKey,
1409
+ settings
1410
+ ) => {
1411
+ /** @type {Map<bigint | Chunk, ChunkSet[]>} */
1412
+ const result = new Map();
1413
+ if (chunkSets.size < 2) return result;
1414
+ // Widest sets first, so a limit keeps the intersections reaching the most
1415
+ // chunks, and by key after that, so no module order reaches the result
1416
+ /** @type {(bigint | Chunk)[]} */
1417
+ const keys = [...chunkSets.keys()].sort((a, b) => {
1418
+ const countDiff =
1419
+ /** @type {ChunkSet} */ (chunkSets.get(b)).size -
1420
+ /** @type {ChunkSet} */ (chunkSets.get(a)).size;
1421
+ if (countDiff !== 0) return countDiff;
1422
+ return a < b ? -1 : 1;
1423
+ });
1424
+ // A chunk of its own is keyed by the chunk, so what holds both is wider
1425
+ // than what the graph's chunk sets are keyed by
1426
+ let memberCount = 0;
1427
+ for (const set of chunkSets.values()) memberCount += set.size;
1428
+ // A one chunk intersection holds only what a chunk of its own already holds,
1429
+ // so those sets are inputs for what they weigh and the sets holding them
1430
+ const multiSetCount = keys.length;
1431
+ if (settings.minMembers < 2) {
1432
+ for (const chunk of singleChunkSets) keys.push(chunk);
1433
+ memberCount += keys.length - multiSetCount;
1434
+ }
1435
+ const setCount = keys.length;
1436
+ const offsets = new Int32Array(setCount + 1);
1437
+ const members = new Int32Array(memberCount);
1438
+ const sizes =
1439
+ sizeByKey === undefined ? undefined : new Float64Array(setCount);
1440
+ let cursor = 0;
1441
+ for (let i = 0; i < setCount; i++) {
1442
+ const key = keys[i];
1443
+ if (sizes !== undefined) {
1444
+ sizes[i] =
1445
+ /** @type {Map<bigint | Chunk, number>} */ (sizeByKey).get(
1446
+ key
1447
+ ) || 0;
1110
1448
  }
1111
- group.sets.push(chunksSet);
1449
+ offsets[i] = cursor;
1450
+ if (i < multiSetCount) {
1451
+ for (const chunk of /** @type {ChunkSet} */ (
1452
+ chunkSets.get(/** @type {bigint} */ (key))
1453
+ )) {
1454
+ members[cursor++] = /** @type {number} */ (
1455
+ intersectionChunkIndices.get(chunk)
1456
+ );
1457
+ }
1458
+ } else {
1459
+ members[cursor++] = /** @type {number} */ (
1460
+ intersectionChunkIndices.get(/** @type {Chunk} */ (key))
1461
+ );
1462
+ }
1463
+ offsets[i + 1] = cursor;
1112
1464
  }
1113
- for (const group of chunkSetsByCount.values()) {
1114
- const { sets } = group;
1115
- const signatures = new Uint32Array(sets.length * 2);
1116
- for (let i = 0; i < sets.length; i++) {
1117
- writeSignature(sets[i], signatures, i * 2);
1465
+ const { intersections, capped } = discoverIntersections({
1466
+ setCount,
1467
+ memberCount: intersectionChunkIndices.size,
1468
+ offsets,
1469
+ members,
1470
+ depth: dedupDepth,
1471
+ minMembers: settings.minMembers,
1472
+ sizes,
1473
+ minSize: settings.minSize,
1474
+ maxIntersections: MAX_INTERSECTIONS,
1475
+ maxWork: MAX_INTERSECTION_WORK
1476
+ });
1477
+ if (capped) {
1478
+ logger.warn(
1479
+ `Stopped looking for chunk sets to share modules through at ${MAX_INTERSECTIONS} of them, or at the work of intersecting ${MAX_INTERSECTION_WORK} words. Some modules chunks share stay where they are. Lower "optimization.splitChunks.dedupDepth" to spend less on the search.`
1480
+ );
1481
+ }
1482
+ const chunkList = /** @type {Chunk[]} */ (intersectionChunks);
1483
+ for (const { members: chunkIndices, support } of intersections) {
1484
+ /** @type {ChunkSet} */
1485
+ const intersection = new Set();
1486
+ for (const index of chunkIndices) {
1487
+ intersection.add(chunkList[index]);
1488
+ }
1489
+ for (const set of support) {
1490
+ // The one intersection a single chunk could hold is that chunk, which
1491
+ // is a combination of its modules already
1492
+ if (set >= multiSetCount) continue;
1493
+ const key = keys[set];
1494
+ const held = result.get(key);
1495
+ if (held === undefined) result.set(key, [intersection]);
1496
+ else held.push(intersection);
1118
1497
  }
1119
- group.signatures = signatures;
1120
1498
  }
1121
- return chunkSetsByCount;
1499
+ return result;
1122
1500
  };
1123
- const getChunkSetsByCount = memoize(() =>
1124
- groupChunkSetsByCount(
1125
- getChunkSetsInGraph().chunkSetsInGraph.values()
1126
- )
1127
- );
1128
- const getExportsChunkSetsByCount = memoize(() =>
1129
- groupChunkSetsByCount(
1130
- getExportsChunkSetsInGraph().chunkSetsInGraph.values()
1131
- )
1132
- );
1501
+
1502
+ // How many combinations of each chunk set are chunk sets in the graph, for the
1503
+ // cache groups that take no intersections. Missing means all of them.
1504
+ /** @type {Map<Combinations, number>} */
1505
+ const originalCombinationCounts = new Map();
1506
+ /** @type {Map<Combinations, number>} */
1507
+ const originalExportsCombinationCounts = new Map();
1508
+
1509
+ // TODO rebuild the candidates per cache group priority, from the
1510
+ // module chunk edges the priorities before it left, as rspack does
1511
+ const getIntersectionsByChunkSetKey = memoize(() => {
1512
+ const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
1513
+ getChunkSetsInGraph();
1514
+ return discoverChunkSetIntersections(
1515
+ chunkSetsInGraph,
1516
+ singleChunkSets,
1517
+ sizeByKey,
1518
+ /** @type {IntersectionSettings} */ (intersectionSettings)
1519
+ );
1520
+ });
1521
+ const getExportsIntersectionsByChunkSetKey = memoize(() => {
1522
+ const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
1523
+ getExportsChunkSetsInGraph();
1524
+ return discoverChunkSetIntersections(
1525
+ chunkSetsInGraph,
1526
+ singleChunkSets,
1527
+ sizeByKey,
1528
+ /** @type {IntersectionSettings} */ (exportsIntersectionSettings)
1529
+ );
1530
+ });
1133
1531
 
1134
1532
  /** @typedef {(ChunkSet | Chunk)[]} Combinations */
1135
1533
 
1534
+ /**
1535
+ * Where a chunk set's own combinations end, for a cache group that
1536
+ * takes no intersection.
1537
+ * @param {Combinations} combinations the combinations
1538
+ * @param {boolean} withIntersections whether the group takes the intersections too
1539
+ * @param {Map<Combinations, number>} originalCounts how many of them are chunk sets themselves
1540
+ * @returns {number} where to stop
1541
+ */
1542
+ const originalCombinationCount = (
1543
+ combinations,
1544
+ withIntersections,
1545
+ originalCounts
1546
+ ) => {
1547
+ if (withIntersections || originalCounts.size === 0) {
1548
+ return combinations.length;
1549
+ }
1550
+ const originals = originalCounts.get(combinations);
1551
+ return originals === undefined ? combinations.length : originals;
1552
+ };
1553
+
1554
+ /**
1555
+ * Appends the intersections a chunk set holds to its combinations.
1556
+ * @param {bigint | Chunk} key key of the chunk set
1557
+ * @param {Combinations} combinations its combinations
1558
+ * @param {() => Map<bigint | Chunk, ChunkSet[]>} getIntersectionsByKey takes the intersections held by each chunk set
1559
+ * @param {Map<Combinations, number>} originalCounts takes how many of them are chunk sets themselves
1560
+ * @returns {void}
1561
+ */
1562
+ const appendIntersections = (
1563
+ key,
1564
+ combinations,
1565
+ getIntersectionsByKey,
1566
+ originalCounts
1567
+ ) => {
1568
+ // The chunk sets stay in front, so a cache group taking no
1569
+ // intersection reads only up to their count
1570
+ originalCounts.set(combinations, combinations.length);
1571
+ const intersections = getIntersectionsByKey().get(key);
1572
+ if (intersections === undefined) return;
1573
+ for (const intersection of intersections) {
1574
+ combinations.push(intersection);
1575
+ }
1576
+ };
1577
+
1136
1578
  // Create a list of possible combinations
1137
1579
  /**
1138
1580
  * Creates a get combinations.
1139
1581
  * @param {ChunkSetsInGraph} chunkSets chunk sets
1140
- * @param {ChunkSet} singleChunkSets single chunks sets
1141
- * @param {ChunkSetsByCount} chunkSetsByCount chunk sets by count
1142
- * @returns {(key: bigint | Chunk) => Combinations} combinations
1582
+ * @param {ChunkSetIndex} index the chunk sets a combination is taken from
1583
+ * @param {(() => Map<bigint | Chunk, ChunkSet[]>) | undefined} getIntersectionsByKey takes the intersections held by each chunk set, on the first cache group asking for them
1584
+ * @param {Map<Combinations, number>} originalCounts takes how many of a chunk set's combinations are chunk sets themselves
1585
+ * @returns {(key: bigint | Chunk, withIntersections: boolean) => Combinations} combinations
1143
1586
  */
1144
1587
  const createGetCombinations = (
1145
1588
  chunkSets,
1146
- singleChunkSets,
1147
- chunkSetsByCount
1589
+ index,
1590
+ getIntersectionsByKey,
1591
+ originalCounts
1148
1592
  ) => {
1593
+ const { sets, setsByRarestChunk, singleOrder } = index;
1149
1594
  /** @type {Map<bigint | Chunk, Combinations>} */
1150
1595
  const combinationsCache = new Map();
1151
1596
 
1152
- return (key) => {
1597
+ return (key, withIntersections) => {
1153
1598
  const cacheEntry = combinationsCache.get(key);
1154
- if (cacheEntry !== undefined) return cacheEntry;
1155
- if (key instanceof Chunk) {
1599
+ if (cacheEntry !== undefined) {
1600
+ // Nothing is discovered until a cache group that takes the
1601
+ // intersections reaches a chunk set of more than one chunk
1602
+ if (
1603
+ withIntersections &&
1604
+ getIntersectionsByKey !== undefined &&
1605
+ cacheEntry[0] instanceof Set &&
1606
+ !originalCounts.has(cacheEntry)
1607
+ ) {
1608
+ appendIntersections(
1609
+ key,
1610
+ cacheEntry,
1611
+ getIntersectionsByKey,
1612
+ originalCounts
1613
+ );
1614
+ }
1615
+ return cacheEntry;
1616
+ }
1617
+ if (typeof key !== "bigint") {
1156
1618
  const result = [key];
1157
1619
  combinationsCache.set(key, result);
1158
1620
  return result;
@@ -1162,72 +1624,90 @@ class SplitChunksPlugin {
1162
1624
  (chunkSets.get(key));
1163
1625
  /** @type {Combinations} */
1164
1626
  const array = [chunksSet];
1165
- writeSignature(chunksSet, signatureScratch, 0);
1166
- const selfLow = signatureScratch[0];
1167
- const selfHigh = signatureScratch[1];
1168
- for (const [count, group] of chunkSetsByCount) {
1169
- // "equal" is not needed because they would have been merge in the first step
1170
- if (count < chunksSet.size) {
1171
- const { sets, signatures } = group;
1172
- for (let i = 0; i < sets.length; i++) {
1173
- // a subset cannot hold a signature bit the superset lacks,
1174
- // so this rejects nearly every candidate without touching the Set
1175
- const offset = i * 2;
1176
- if (
1177
- (signatures[offset] & ~selfLow) !== 0 ||
1178
- (signatures[offset + 1] & ~selfHigh) !== 0
1179
- ) {
1180
- continue;
1181
- }
1182
- const set = sets[i];
1183
- if (isSubset(chunksSet, set)) {
1184
- array.push(set);
1185
- }
1627
+ // A subset holds the chunk fewest sets hold of it, so only the sets
1628
+ // indexed under a chunk of this one can be one
1629
+ /** @type {number[]} */
1630
+ const subsets = [];
1631
+ for (const chunk of chunksSet) {
1632
+ const indices = setsByRarestChunk.get(chunk);
1633
+ if (indices === undefined) continue;
1634
+ for (const candidate of indices) {
1635
+ const set = sets[candidate];
1636
+ // "equal" is not needed because they would have been merge in the first step
1637
+ if (set.size < chunksSet.size && isSubset(chunksSet, set)) {
1638
+ subsets.push(candidate);
1186
1639
  }
1187
1640
  }
1188
1641
  }
1189
- for (const chunk of singleChunkSets) {
1190
- if (chunksSet.has(chunk)) {
1191
- array.push(chunk);
1192
- }
1642
+ // Combined in the order they were indexed in, smaller counts first
1643
+ if (subsets.length > 1) subsets.sort((a, b) => a - b);
1644
+ for (const candidate of subsets) array.push(sets[candidate]);
1645
+ /** @type {Chunk[]} */
1646
+ const singles = [];
1647
+ for (const chunk of chunksSet) {
1648
+ if (singleOrder.has(chunk)) singles.push(chunk);
1649
+ }
1650
+ if (singles.length > 1) {
1651
+ singles.sort(
1652
+ (a, b) =>
1653
+ /** @type {number} */ (singleOrder.get(a)) -
1654
+ /** @type {number} */ (singleOrder.get(b))
1655
+ );
1193
1656
  }
1657
+ for (const chunk of singles) array.push(chunk);
1194
1658
  combinationsCache.set(key, array);
1659
+ if (withIntersections && getIntersectionsByKey !== undefined) {
1660
+ appendIntersections(
1661
+ key,
1662
+ array,
1663
+ getIntersectionsByKey,
1664
+ originalCounts
1665
+ );
1666
+ }
1195
1667
  return array;
1196
1668
  };
1197
1669
  };
1198
1670
 
1199
1671
  const getCombinationsFactory = memoize(() => {
1200
- const { chunkSetsInGraph, singleChunkSets } = getChunkSetsInGraph();
1672
+ const { chunkSetsInGraph } = getChunkSetsInGraph();
1201
1673
  return createGetCombinations(
1202
1674
  chunkSetsInGraph,
1203
- singleChunkSets,
1204
- getChunkSetsByCount()
1675
+ getChunkSetIndex(),
1676
+ intersectionSettings === undefined
1677
+ ? undefined
1678
+ : getIntersectionsByChunkSetKey,
1679
+ originalCombinationCounts
1205
1680
  );
1206
1681
  });
1207
1682
 
1208
1683
  /**
1209
1684
  * Returns combinations by key.
1210
1685
  * @param {bigint | Chunk} key key
1686
+ * @param {boolean} withIntersections whether to take the intersections of the chunk sets too
1211
1687
  * @returns {Combinations} combinations by key
1212
1688
  */
1213
- const getCombinations = (key) => getCombinationsFactory()(key);
1689
+ const getCombinations = (key, withIntersections) =>
1690
+ getCombinationsFactory()(key, withIntersections);
1214
1691
 
1215
1692
  const getExportsCombinationsFactory = memoize(() => {
1216
- const { chunkSetsInGraph, singleChunkSets } =
1217
- getExportsChunkSetsInGraph();
1693
+ const { chunkSetsInGraph } = getExportsChunkSetsInGraph();
1218
1694
  return createGetCombinations(
1219
1695
  chunkSetsInGraph,
1220
- singleChunkSets,
1221
- getExportsChunkSetsByCount()
1696
+ getExportsChunkSetIndex(),
1697
+ exportsIntersectionSettings === undefined
1698
+ ? undefined
1699
+ : getExportsIntersectionsByChunkSetKey,
1700
+ originalExportsCombinationCounts
1222
1701
  );
1223
1702
  });
1224
1703
  /**
1225
1704
  * Gets exports combinations.
1226
1705
  * @param {bigint | Chunk} key key
1706
+ * @param {boolean} withIntersections whether to take the intersections of the chunk sets too
1227
1707
  * @returns {Combinations} exports combinations by key
1228
1708
  */
1229
- const getExportsCombinations = (key) =>
1230
- getExportsCombinationsFactory()(key);
1709
+ const getExportsCombinations = (key, withIntersections) =>
1710
+ getExportsCombinationsFactory()(key, withIntersections);
1231
1711
 
1232
1712
  /**
1233
1713
  * Defines the selected chunks result type used by this module.
@@ -1260,7 +1740,7 @@ class SplitChunksPlugin {
1260
1740
  if (entry2 === undefined) {
1261
1741
  /** @type {Chunk[]} */
1262
1742
  const selectedChunks = [];
1263
- if (chunks instanceof Chunk) {
1743
+ if (!(chunks instanceof Set)) {
1264
1744
  if (chunkFilter(chunks)) selectedChunks.push(chunks);
1265
1745
  } else {
1266
1746
  for (const chunk of chunks) {
@@ -1438,32 +1918,77 @@ class SplitChunksPlugin {
1438
1918
  /**
1439
1919
  * Returns combinations of the chunks the module is in.
1440
1920
  * @param {Module} module the module
1921
+ * @param {boolean} withIntersections whether to take the intersections of the chunk sets too
1441
1922
  * @returns {Combinations} chunk combinations
1442
1923
  */
1443
- const computeCombinations = (module) =>
1444
- getCombinations(getKey(chunkGraph.getModuleChunksIterable(module)));
1924
+ const computeCombinations = (module, withIntersections) =>
1925
+ getCombinations(
1926
+ getKey(chunkGraph.getModuleChunksIterable(module)),
1927
+ withIntersections
1928
+ );
1445
1929
 
1446
1930
  /**
1447
- * Returns combinations of the module's chunks grouped by used exports.
1931
+ * Returns combinations of the module's chunks grouped by used exports. A
1932
+ * module whose chunks all use the same exports takes the combinations of that
1933
+ * one group as they are, without a copy to merge into.
1448
1934
  * @param {Module} module the module
1449
- * @returns {Set<ChunkSet | Chunk>} chunk combinations
1935
+ * @param {boolean} withIntersections whether to take the intersections of the chunk sets too
1936
+ * @returns {Combinations} chunk combinations
1450
1937
  */
1451
- const computeCombinationsByUsedExports = (module) => {
1938
+ const computeCombinationsByUsedExports = (
1939
+ module,
1940
+ withIntersections
1941
+ ) => {
1452
1942
  // fill the groupedByExportsMap
1453
1943
  getExportsChunkSetsInGraph();
1454
- /** @type {Set<ChunkSet | Chunk>} */
1455
- const set = new Set();
1456
1944
  const groupedByUsedExports =
1457
- /** @type {Iterable<Chunk[]>} */
1945
+ /** @type {Chunk[][]} */
1458
1946
  (groupedByExportsMap.get(module));
1947
+ if (groupedByUsedExports.length === 1) {
1948
+ return getExportsCombinations(
1949
+ getKey(groupedByUsedExports[0]),
1950
+ withIntersections
1951
+ );
1952
+ }
1953
+ /** @type {Combinations} */
1954
+ const array = [];
1955
+ /** @type {Set<ChunkSet | Chunk>} */
1956
+ const seen = new Set();
1459
1957
  for (const chunks of groupedByUsedExports) {
1460
- for (const comb of getExportsCombinations(getKey(chunks))) {
1461
- set.add(comb);
1958
+ const combinations = getExportsCombinations(
1959
+ getKey(chunks),
1960
+ withIntersections
1961
+ );
1962
+ const end = originalCombinationCount(
1963
+ combinations,
1964
+ withIntersections,
1965
+ originalExportsCombinationCounts
1966
+ );
1967
+ for (let i = 0; i < end; i++) {
1968
+ const combination = combinations[i];
1969
+ const known = seen.size;
1970
+ seen.add(combination);
1971
+ if (seen.size !== known) array.push(combination);
1462
1972
  }
1463
1973
  }
1464
- return set;
1974
+ return array;
1465
1975
  };
1466
1976
 
1977
+ /**
1978
+ * Whether a cache group puts the intersections of the chunk sets to use. Only
1979
+ * one naming its chunk after the modules it takes, and holding out for a size,
1980
+ * can group modules that no chunk set holds together.
1981
+ * @param {CacheGroup} cacheGroup the cache group
1982
+ * @returns {boolean} true when it takes them
1983
+ */
1984
+ const takesIntersections = (cacheGroup) =>
1985
+ intersectionChunks !== undefined &&
1986
+ (cacheGroup.usedExports
1987
+ ? exportsIntersectionSettings
1988
+ : intersectionSettings) !== undefined &&
1989
+ cacheGroup.getName === defaultGetName &&
1990
+ (cacheGroup._validateSize || cacheGroup._validateSizeReduction);
1991
+
1467
1992
  logger.timeEnd("prepare");
1468
1993
 
1469
1994
  logger.time("modules");
@@ -1479,39 +2004,63 @@ class SplitChunksPlugin {
1479
2004
  // Computed at most once per module, on first use by a cache group
1480
2005
  /** @type {Combinations | undefined} */
1481
2006
  let combsCache;
1482
- /** @type {Set<ChunkSet | Chunk> | undefined} */
2007
+ let combsCacheHasIntersections = false;
2008
+ /** @type {(Combinations | undefined)[] | undefined} */
1483
2009
  let combsByUsedExportsCache;
1484
2010
 
1485
2011
  let cacheGroupIndex = 0;
1486
2012
  for (const cacheGroupSource of cacheGroups) {
1487
2013
  const cacheGroup = this._getCacheGroup(cacheGroupSource);
1488
-
2014
+ const withIntersections = takesIntersections(cacheGroup);
2015
+ /** @type {Combinations} */
1489
2016
  let combs;
2017
+ let end;
1490
2018
  if (cacheGroup.usedExports) {
1491
2019
  if (combsByUsedExportsCache === undefined) {
1492
- combsByUsedExportsCache =
1493
- computeCombinationsByUsedExports(module);
2020
+ combsByUsedExportsCache = [];
2021
+ }
2022
+ const index = withIntersections ? 1 : 0;
2023
+ let cached = combsByUsedExportsCache[index];
2024
+ if (cached === undefined) {
2025
+ cached = computeCombinationsByUsedExports(
2026
+ module,
2027
+ withIntersections
2028
+ );
2029
+ combsByUsedExportsCache[index] = cached;
1494
2030
  }
1495
- combs = combsByUsedExportsCache;
2031
+ combs = cached;
2032
+ // The intersections trail the chunk sets, so a cache group that takes
2033
+ // none of them stops where they begin
2034
+ end = originalCombinationCount(
2035
+ combs,
2036
+ withIntersections,
2037
+ originalExportsCombinationCounts
2038
+ );
1496
2039
  } else {
1497
- if (combsCache === undefined) {
1498
- combsCache = computeCombinations(module);
2040
+ if (
2041
+ combsCache === undefined ||
2042
+ (withIntersections && !combsCacheHasIntersections)
2043
+ ) {
2044
+ combsCache = computeCombinations(module, withIntersections);
2045
+ combsCacheHasIntersections = withIntersections;
1499
2046
  }
1500
2047
  combs = combsCache;
2048
+ end = originalCombinationCount(
2049
+ combs,
2050
+ withIntersections,
2051
+ originalCombinationCounts
2052
+ );
1501
2053
  }
1502
2054
  // For all combination of chunk selection
1503
- for (const chunkCombination of combs) {
2055
+ for (let i = 0; i < end; i++) {
2056
+ const chunkCombination = combs[i];
1504
2057
  // Break if minimum number of chunks is not reached
1505
2058
  const count =
1506
- chunkCombination instanceof Chunk ? 1 : chunkCombination.size;
2059
+ chunkCombination instanceof Set ? chunkCombination.size : 1;
1507
2060
  if (count < cacheGroup.minChunks) continue;
1508
2061
  // Select chunks by configuration
1509
2062
  const { chunks: selectedChunks, key: selectedChunksKey } =
1510
- getSelectedChunks(
1511
- chunkCombination,
1512
- /** @type {ChunkFilterFn} */
1513
- (cacheGroup.chunksFilter)
1514
- );
2063
+ getSelectedChunks(chunkCombination, cacheGroup.chunksFilter);
1515
2064
 
1516
2065
  addModuleToChunksInfoMap(
1517
2066
  cacheGroup,
@@ -1707,9 +2256,7 @@ class SplitChunksPlugin {
1707
2256
  limit: byAsyncRequests
1708
2257
  ? "maxAsyncRequests"
1709
2258
  : "maxInitialRequests",
1710
- maxRequests:
1711
- /** @type {number} */
1712
- (maxRequests),
2259
+ maxRequests,
1713
2260
  modules: item.modules.size
1714
2261
  });
1715
2262
  }
@@ -1938,9 +2485,7 @@ class SplitChunksPlugin {
1938
2485
  if (Object.keys(maxSize).length === 0) {
1939
2486
  continue;
1940
2487
  }
1941
- for (const key of /** @type {SourceType[]} */ (
1942
- Object.keys(maxSize)
1943
- )) {
2488
+ for (const key of Object.keys(maxSize)) {
1944
2489
  const maxSizeValue = maxSize[key];
1945
2490
  const minSizeValue = minSize[key];
1946
2491
  if (