@depup/webpack 5.111.1-depup.2 → 5.112.0-depup.0

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