webpack 5.97.1 → 5.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/README.md +368 -434
  2. package/bin/webpack.js +15 -9
  3. package/hot/dev-server.js +18 -3
  4. package/hot/emitter-event-target.js +7 -0
  5. package/hot/lazy-compilation-node.js +45 -29
  6. package/hot/lazy-compilation-universal.js +18 -0
  7. package/hot/lazy-compilation-web.js +15 -5
  8. package/hot/load-http.js +7 -0
  9. package/hot/log.js +15 -15
  10. package/hot/only-dev-server.js +19 -4
  11. package/hot/poll.js +1 -0
  12. package/lib/APIPlugin.js +48 -50
  13. package/lib/AbstractMethodError.js +1 -0
  14. package/lib/AsyncDependenciesBlock.js +4 -5
  15. package/lib/AutomaticPrefetchPlugin.js +22 -22
  16. package/lib/BannerPlugin.js +35 -40
  17. package/lib/Cache.js +12 -9
  18. package/lib/CacheFacade.js +13 -13
  19. package/lib/CaseSensitiveModulesWarning.js +6 -6
  20. package/lib/Chunk.js +68 -47
  21. package/lib/ChunkGraph.js +174 -95
  22. package/lib/ChunkGroup.js +32 -24
  23. package/lib/ChunkTemplate.js +8 -8
  24. package/lib/CleanPlugin.js +90 -42
  25. package/lib/CodeGenerationResults.js +12 -9
  26. package/lib/CompatibilityPlugin.js +70 -21
  27. package/lib/Compilation.js +827 -550
  28. package/lib/Compiler.js +137 -109
  29. package/lib/ConcatenationScope.js +45 -8
  30. package/lib/ConditionalInitFragment.js +1 -1
  31. package/lib/ConstPlugin.js +89 -59
  32. package/lib/ContextExclusionPlugin.js +5 -4
  33. package/lib/ContextModule.js +66 -51
  34. package/lib/ContextModuleFactory.js +51 -30
  35. package/lib/ContextReplacementPlugin.js +89 -34
  36. package/lib/CssModule.js +8 -4
  37. package/lib/DefinePlugin.js +209 -57
  38. package/lib/DelegatedModule.js +34 -23
  39. package/lib/DelegatedModuleFactoryPlugin.js +27 -24
  40. package/lib/DelegatedPlugin.js +4 -2
  41. package/lib/DependenciesBlock.js +0 -2
  42. package/lib/Dependency.js +37 -19
  43. package/lib/DependencyTemplate.js +2 -0
  44. package/lib/DependencyTemplates.js +5 -6
  45. package/lib/DllEntryPlugin.js +8 -4
  46. package/lib/DllModule.js +11 -12
  47. package/lib/DllModuleFactory.js +2 -2
  48. package/lib/DllPlugin.js +9 -6
  49. package/lib/DllReferencePlugin.js +60 -65
  50. package/lib/DotenvPlugin.js +462 -0
  51. package/lib/DynamicEntryPlugin.js +8 -8
  52. package/lib/EntryOptionPlugin.js +8 -6
  53. package/lib/EntryPlugin.js +5 -3
  54. package/lib/Entrypoint.js +19 -0
  55. package/lib/EnvironmentNotSupportAsyncWarning.js +0 -3
  56. package/lib/EnvironmentPlugin.js +26 -19
  57. package/lib/ErrorHelpers.js +6 -6
  58. package/lib/EvalDevToolModulePlugin.js +17 -14
  59. package/lib/EvalSourceMapDevToolPlugin.js +156 -142
  60. package/lib/ExportsInfo.js +180 -115
  61. package/lib/ExportsInfoApiPlugin.js +2 -2
  62. package/lib/ExternalModule.js +256 -102
  63. package/lib/ExternalModuleFactoryPlugin.js +66 -29
  64. package/lib/ExternalsPlugin.js +57 -2
  65. package/lib/FileSystemInfo.js +313 -247
  66. package/lib/FlagAllModulesAsUsedPlugin.js +2 -2
  67. package/lib/FlagDependencyExportsPlugin.js +29 -19
  68. package/lib/FlagDependencyUsagePlugin.js +9 -10
  69. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  70. package/lib/Generator.js +43 -10
  71. package/lib/GraphHelpers.js +11 -3
  72. package/lib/HookWebpackError.js +35 -7
  73. package/lib/HotModuleReplacementPlugin.js +149 -108
  74. package/lib/HotUpdateChunk.js +0 -3
  75. package/lib/IgnoreErrorModuleFactory.js +2 -2
  76. package/lib/IgnorePlugin.js +16 -13
  77. package/lib/IgnoreWarningsPlugin.js +6 -4
  78. package/lib/InitFragment.js +41 -23
  79. package/lib/InvalidDependenciesModuleWarning.js +2 -3
  80. package/lib/JavascriptMetaInfoPlugin.js +2 -4
  81. package/lib/LibManifestPlugin.js +12 -13
  82. package/lib/LoaderOptionsPlugin.js +12 -14
  83. package/lib/LoaderTargetPlugin.js +5 -3
  84. package/lib/MainTemplate.js +18 -29
  85. package/lib/ManifestPlugin.js +235 -0
  86. package/lib/Module.js +138 -60
  87. package/lib/ModuleBuildError.js +4 -2
  88. package/lib/ModuleDependencyError.js +4 -3
  89. package/lib/ModuleDependencyWarning.js +4 -3
  90. package/lib/ModuleError.js +1 -1
  91. package/lib/ModuleFactory.js +10 -3
  92. package/lib/ModuleFilenameHelpers.js +63 -60
  93. package/lib/ModuleGraph.js +195 -70
  94. package/lib/ModuleGraphConnection.js +14 -20
  95. package/lib/ModuleInfoHeaderPlugin.js +15 -16
  96. package/lib/ModuleNotFoundError.js +1 -1
  97. package/lib/ModuleParseError.js +8 -4
  98. package/lib/ModuleSourceTypeConstants.js +189 -0
  99. package/lib/ModuleTemplate.js +7 -8
  100. package/lib/ModuleTypeConstants.js +37 -15
  101. package/lib/ModuleWarning.js +1 -1
  102. package/lib/MultiCompiler.js +64 -49
  103. package/lib/MultiStats.js +19 -14
  104. package/lib/MultiWatching.js +7 -11
  105. package/lib/NoEmitOnErrorsPlugin.js +5 -3
  106. package/lib/NodeStuffPlugin.js +438 -126
  107. package/lib/NormalModule.js +322 -201
  108. package/lib/NormalModuleFactory.js +230 -117
  109. package/lib/NormalModuleReplacementPlugin.js +37 -39
  110. package/lib/NullFactory.js +3 -2
  111. package/lib/OptimizationStages.js +1 -1
  112. package/lib/OptionsApply.js +1 -1
  113. package/lib/Parser.js +5 -3
  114. package/lib/PlatformPlugin.js +3 -1
  115. package/lib/PrefetchPlugin.js +6 -4
  116. package/lib/ProgressPlugin.js +48 -49
  117. package/lib/ProvidePlugin.js +7 -5
  118. package/lib/RawModule.js +26 -12
  119. package/lib/RecordIdsPlugin.js +88 -110
  120. package/lib/RequestShortener.js +3 -1
  121. package/lib/ResolverFactory.js +15 -14
  122. package/lib/RuntimeGlobals.js +216 -153
  123. package/lib/RuntimeModule.js +7 -6
  124. package/lib/RuntimePlugin.js +115 -62
  125. package/lib/RuntimeTemplate.js +248 -76
  126. package/lib/SelfModuleFactory.js +2 -2
  127. package/lib/SizeFormatHelpers.js +2 -2
  128. package/lib/SourceMapDevToolModuleOptionsPlugin.js +17 -27
  129. package/lib/SourceMapDevToolPlugin.js +72 -59
  130. package/lib/Stats.js +2 -3
  131. package/lib/Template.js +31 -24
  132. package/lib/TemplatedPathPlugin.js +24 -21
  133. package/lib/UseStrictPlugin.js +1 -1
  134. package/lib/WarnCaseSensitiveModulesPlugin.js +36 -37
  135. package/lib/WarnDeprecatedOptionPlugin.js +7 -8
  136. package/lib/WarnNoModeSetPlugin.js +3 -1
  137. package/lib/WatchIgnorePlugin.js +11 -9
  138. package/lib/Watching.js +27 -29
  139. package/lib/WebpackError.js +10 -3
  140. package/lib/WebpackIsIncludedPlugin.js +4 -5
  141. package/lib/WebpackOptionsApply.js +263 -135
  142. package/lib/asset/AssetBytesGenerator.js +171 -0
  143. package/lib/asset/AssetBytesParser.js +37 -0
  144. package/lib/asset/AssetGenerator.js +285 -223
  145. package/lib/asset/AssetModulesPlugin.js +103 -41
  146. package/lib/asset/AssetParser.js +7 -3
  147. package/lib/asset/AssetSourceGenerator.js +41 -17
  148. package/lib/asset/RawDataUrlModule.js +17 -9
  149. package/lib/async-modules/AsyncModuleHelpers.js +52 -0
  150. package/lib/async-modules/AwaitDependenciesInitFragment.js +39 -24
  151. package/lib/async-modules/InferAsyncModulesPlugin.js +25 -26
  152. package/lib/buildChunkGraph.js +36 -17
  153. package/lib/cache/AddBuildDependenciesPlugin.js +5 -6
  154. package/lib/cache/IdleFileCachePlugin.js +22 -20
  155. package/lib/cache/MemoryCachePlugin.js +3 -3
  156. package/lib/cache/MemoryWithGcCachePlugin.js +17 -11
  157. package/lib/cache/PackFileCacheStrategy.js +198 -170
  158. package/lib/cache/ResolverCachePlugin.js +58 -48
  159. package/lib/cache/getLazyHashedEtag.js +5 -4
  160. package/lib/cli.js +197 -39
  161. package/lib/config/browserslistTargetHandler.js +110 -85
  162. package/lib/config/defaults.js +514 -113
  163. package/lib/config/normalization.js +91 -64
  164. package/lib/config/target.js +30 -18
  165. package/lib/container/ContainerEntryDependency.js +0 -1
  166. package/lib/container/ContainerEntryModule.js +16 -15
  167. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  168. package/lib/container/ContainerPlugin.js +5 -6
  169. package/lib/container/ContainerReferencePlugin.js +27 -30
  170. package/lib/container/FallbackDependency.js +2 -1
  171. package/lib/container/FallbackModule.js +19 -14
  172. package/lib/container/FallbackModuleFactory.js +2 -2
  173. package/lib/container/HoistContainerReferencesPlugin.js +7 -7
  174. package/lib/container/ModuleFederationPlugin.js +4 -4
  175. package/lib/container/RemoteModule.js +14 -14
  176. package/lib/container/RemoteRuntimeModule.js +2 -2
  177. package/lib/container/options.js +9 -9
  178. package/lib/css/CssGenerator.js +366 -74
  179. package/lib/css/CssLoadingRuntimeModule.js +26 -16
  180. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
  181. package/lib/css/CssModulesPlugin.js +191 -142
  182. package/lib/css/CssParser.js +1756 -740
  183. package/lib/css/walkCssTokens.js +180 -67
  184. package/lib/debug/ProfilingPlugin.js +135 -51
  185. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +29 -28
  186. package/lib/dependencies/AMDPlugin.js +18 -11
  187. package/lib/dependencies/AMDRequireArrayDependency.js +5 -4
  188. package/lib/dependencies/AMDRequireContextDependency.js +2 -1
  189. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +35 -26
  190. package/lib/dependencies/AMDRuntimeModules.js +3 -1
  191. package/lib/dependencies/CachedConstDependency.js +24 -18
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +31 -24
  193. package/lib/dependencies/CommonJsExportsDependency.js +2 -1
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +50 -36
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +7 -13
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +146 -127
  197. package/lib/dependencies/CommonJsPlugin.js +29 -18
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +4 -3
  199. package/lib/dependencies/CommonJsSelfReferenceDependency.js +4 -4
  200. package/lib/dependencies/ConstDependency.js +2 -2
  201. package/lib/dependencies/ContextDependency.js +10 -5
  202. package/lib/dependencies/ContextDependencyHelpers.js +21 -13
  203. package/lib/dependencies/ContextDependencyTemplateAsId.js +10 -9
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +13 -10
  205. package/lib/dependencies/ContextElementDependency.js +23 -12
  206. package/lib/dependencies/CssIcssExportDependency.js +402 -22
  207. package/lib/dependencies/CssIcssImportDependency.js +116 -51
  208. package/lib/dependencies/CssIcssSymbolDependency.js +33 -35
  209. package/lib/dependencies/CssImportDependency.js +17 -14
  210. package/lib/dependencies/CssUrlDependency.js +8 -13
  211. package/lib/dependencies/DynamicExports.js +19 -19
  212. package/lib/dependencies/ExportsInfoDependency.js +13 -10
  213. package/lib/dependencies/ExternalModuleDependency.js +7 -7
  214. package/lib/dependencies/ExternalModuleInitFragment.js +3 -2
  215. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +96 -0
  216. package/lib/dependencies/HarmonyAcceptDependency.js +96 -5
  217. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -5
  218. package/lib/dependencies/HarmonyCompatibilityDependency.js +0 -1
  219. package/lib/dependencies/HarmonyDetectionParserPlugin.js +10 -30
  220. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +19 -8
  221. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +136 -99
  222. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +152 -61
  224. package/lib/dependencies/HarmonyExportInitFragment.js +2 -2
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +2 -2
  226. package/lib/dependencies/HarmonyExports.js +5 -5
  227. package/lib/dependencies/HarmonyImportDependency.js +92 -45
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +201 -163
  229. package/lib/dependencies/HarmonyImportSideEffectDependency.js +5 -6
  230. package/lib/dependencies/HarmonyImportSpecifierDependency.js +69 -42
  231. package/lib/dependencies/HarmonyModulesPlugin.js +16 -11
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -15
  233. package/lib/dependencies/ImportContextDependency.js +15 -1
  234. package/lib/dependencies/ImportDependency.js +25 -7
  235. package/lib/dependencies/ImportEagerDependency.js +7 -5
  236. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +23 -13
  237. package/lib/dependencies/ImportMetaContextPlugin.js +2 -2
  238. package/lib/dependencies/ImportMetaPlugin.js +172 -20
  239. package/lib/dependencies/ImportParserPlugin.js +327 -49
  240. package/lib/dependencies/ImportPhase.js +121 -0
  241. package/lib/dependencies/ImportPlugin.js +3 -1
  242. package/lib/dependencies/ImportWeakDependency.js +7 -5
  243. package/lib/dependencies/JsonExportsDependency.js +54 -28
  244. package/lib/dependencies/LoaderDependency.js +0 -3
  245. package/lib/dependencies/LoaderImportDependency.js +0 -3
  246. package/lib/dependencies/LoaderPlugin.js +24 -25
  247. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  248. package/lib/dependencies/ModuleDecoratorDependency.js +2 -4
  249. package/lib/dependencies/ModuleDependency.js +14 -13
  250. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  251. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  252. package/lib/dependencies/NullDependency.js +2 -0
  253. package/lib/dependencies/ProvidedDependency.js +8 -10
  254. package/lib/dependencies/PureExpressionDependency.js +1 -2
  255. package/lib/dependencies/RequireContextDependency.js +2 -1
  256. package/lib/dependencies/RequireContextDependencyParserPlugin.js +47 -44
  257. package/lib/dependencies/RequireContextPlugin.js +5 -2
  258. package/lib/dependencies/RequireEnsureDependenciesBlock.js +3 -3
  259. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +101 -99
  260. package/lib/dependencies/RequireEnsurePlugin.js +6 -6
  261. package/lib/dependencies/RequireIncludeDependency.js +2 -2
  262. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +33 -34
  263. package/lib/dependencies/RequireIncludePlugin.js +1 -0
  264. package/lib/dependencies/RequireResolveContextDependency.js +1 -1
  265. package/lib/dependencies/RequireResolveDependency.js +3 -3
  266. package/lib/dependencies/RuntimeRequirementsDependency.js +3 -4
  267. package/lib/dependencies/StaticExportsDependency.js +3 -5
  268. package/lib/dependencies/SystemPlugin.js +4 -4
  269. package/lib/dependencies/URLContextDependency.js +65 -0
  270. package/lib/dependencies/URLDependency.js +3 -8
  271. package/lib/dependencies/URLPlugin.js +18 -159
  272. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -3
  273. package/lib/dependencies/WebAssemblyImportDependency.js +2 -2
  274. package/lib/dependencies/WebpackIsIncludedDependency.js +2 -3
  275. package/lib/dependencies/WorkerDependency.js +8 -6
  276. package/lib/dependencies/WorkerPlugin.js +131 -67
  277. package/lib/dependencies/getFunctionExpression.js +2 -2
  278. package/lib/dependencies/processExportInfo.js +4 -4
  279. package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -1
  280. package/lib/esm/ModuleChunkFormatPlugin.js +232 -179
  281. package/lib/esm/ModuleChunkLoadingPlugin.js +112 -57
  282. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +102 -28
  283. package/lib/formatLocation.js +2 -2
  284. package/lib/hmr/HotModuleReplacement.runtime.js +41 -29
  285. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  286. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +43 -33
  287. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +37 -0
  288. package/lib/hmr/LazyCompilationPlugin.js +67 -54
  289. package/lib/hmr/lazyCompilationBackend.js +23 -18
  290. package/lib/ids/ChunkModuleIdRangePlugin.js +14 -11
  291. package/lib/ids/DeterministicChunkIdsPlugin.js +32 -37
  292. package/lib/ids/DeterministicModuleIdsPlugin.js +52 -52
  293. package/lib/ids/HashedModuleIdsPlugin.js +15 -13
  294. package/lib/ids/IdHelpers.js +66 -49
  295. package/lib/ids/NamedChunkIdsPlugin.js +14 -17
  296. package/lib/ids/NamedModuleIdsPlugin.js +12 -14
  297. package/lib/ids/NaturalChunkIdsPlugin.js +6 -4
  298. package/lib/ids/NaturalModuleIdsPlugin.js +4 -3
  299. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -5
  300. package/lib/ids/OccurrenceModuleIdsPlugin.js +8 -7
  301. package/lib/ids/SyncModuleIdsPlugin.js +18 -13
  302. package/lib/index.js +54 -14
  303. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +116 -119
  304. package/lib/javascript/BasicEvaluatedExpression.js +26 -18
  305. package/lib/javascript/ChunkFormatHelpers.js +70 -0
  306. package/lib/javascript/ChunkHelpers.js +17 -5
  307. package/lib/javascript/CommonJsChunkFormatPlugin.js +114 -141
  308. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -4
  309. package/lib/javascript/JavascriptGenerator.js +122 -100
  310. package/lib/javascript/JavascriptModulesPlugin.js +332 -152
  311. package/lib/javascript/JavascriptParser.js +1488 -1052
  312. package/lib/javascript/JavascriptParserHelpers.js +48 -47
  313. package/lib/javascript/StartupHelpers.js +23 -22
  314. package/lib/json/JsonData.js +4 -4
  315. package/lib/json/JsonGenerator.js +66 -32
  316. package/lib/json/JsonModulesPlugin.js +16 -6
  317. package/lib/json/JsonParser.js +23 -8
  318. package/lib/library/AbstractLibraryPlugin.js +45 -10
  319. package/lib/library/AmdLibraryPlugin.js +7 -5
  320. package/lib/library/AssignLibraryPlugin.js +71 -17
  321. package/lib/library/EnableLibraryPlugin.js +51 -25
  322. package/lib/library/ExportPropertyLibraryPlugin.js +12 -18
  323. package/lib/library/JsonpLibraryPlugin.js +5 -2
  324. package/lib/library/ModuleLibraryPlugin.js +230 -18
  325. package/lib/library/SystemLibraryPlugin.js +29 -11
  326. package/lib/library/UmdLibraryPlugin.js +35 -32
  327. package/lib/logging/Logger.js +18 -15
  328. package/lib/logging/createConsoleLogger.js +27 -27
  329. package/lib/logging/runtime.js +11 -11
  330. package/lib/logging/truncateArgs.js +5 -5
  331. package/lib/node/CommonJsChunkLoadingPlugin.js +72 -75
  332. package/lib/node/NodeEnvironmentPlugin.js +9 -3
  333. package/lib/node/NodeTargetPlugin.js +9 -1
  334. package/lib/node/NodeTemplatePlugin.js +2 -2
  335. package/lib/node/NodeWatchFileSystem.js +4 -4
  336. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -38
  337. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +10 -11
  338. package/lib/node/ReadFileCompileWasmPlugin.js +11 -14
  339. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -30
  340. package/lib/node/nodeConsole.js +12 -7
  341. package/lib/optimize/AggressiveMergingPlugin.js +46 -47
  342. package/lib/optimize/AggressiveSplittingPlugin.js +233 -238
  343. package/lib/optimize/ConcatenatedModule.js +620 -251
  344. package/lib/optimize/EnsureChunkConditionsPlugin.js +58 -58
  345. package/lib/optimize/FlagIncludedChunksPlugin.js +93 -96
  346. package/lib/optimize/InnerGraph.js +139 -124
  347. package/lib/optimize/InnerGraphPlugin.js +29 -24
  348. package/lib/optimize/LimitChunkCountPlugin.js +32 -8
  349. package/lib/optimize/MangleExportsPlugin.js +22 -22
  350. package/lib/optimize/MergeDuplicateChunksPlugin.js +80 -81
  351. package/lib/optimize/MinChunkSizePlugin.js +12 -7
  352. package/lib/optimize/ModuleConcatenationPlugin.js +92 -71
  353. package/lib/optimize/RealContentHashPlugin.js +58 -44
  354. package/lib/optimize/RemoveEmptyChunksPlugin.js +8 -5
  355. package/lib/optimize/RemoveParentModulesPlugin.js +7 -4
  356. package/lib/optimize/RuntimeChunkPlugin.js +22 -25
  357. package/lib/optimize/SideEffectsFlagPlugin.js +44 -26
  358. package/lib/optimize/SplitChunksPlugin.js +209 -158
  359. package/lib/performance/AssetsOverSizeLimitWarning.js +1 -1
  360. package/lib/performance/EntrypointsOverSizeLimitWarning.js +2 -2
  361. package/lib/performance/SizeLimitsPlugin.js +8 -5
  362. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +5 -7
  363. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +61 -64
  364. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +3 -4
  365. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  366. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  367. package/lib/rules/BasicEffectRulePlugin.js +14 -5
  368. package/lib/rules/BasicMatcherRulePlugin.js +18 -7
  369. package/lib/rules/ObjectMatcherRulePlugin.js +17 -6
  370. package/lib/rules/RuleSetCompiler.js +73 -32
  371. package/lib/rules/UseEffectRulePlugin.js +61 -25
  372. package/lib/runtime/AsyncModuleRuntimeModule.js +74 -9
  373. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -4
  374. package/lib/runtime/BaseUriRuntimeModule.js +2 -2
  375. package/lib/runtime/CompatRuntimeModule.js +0 -1
  376. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +1 -1
  377. package/lib/runtime/GetChunkFilenameRuntimeModule.js +34 -35
  378. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -1
  379. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  380. package/lib/runtime/LoadScriptRuntimeModule.js +0 -2
  381. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +248 -0
  382. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  383. package/lib/runtime/RuntimeIdRuntimeModule.js +2 -1
  384. package/lib/runtime/StartupChunkDependenciesPlugin.js +39 -42
  385. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +10 -9
  386. package/lib/runtime/StartupEntrypointRuntimeModule.js +0 -1
  387. package/lib/runtime/SystemContextRuntimeModule.js +0 -2
  388. package/lib/runtime/ToBinaryRuntimeModule.js +64 -0
  389. package/lib/schemes/DataUriPlugin.js +9 -31
  390. package/lib/schemes/FileUriPlugin.js +11 -6
  391. package/lib/schemes/HttpUriPlugin.js +381 -261
  392. package/lib/schemes/VirtualUrlPlugin.js +222 -0
  393. package/lib/serialization/AggregateErrorSerializer.js +41 -0
  394. package/lib/serialization/BinaryMiddleware.js +51 -33
  395. package/lib/serialization/ErrorObjectSerializer.js +7 -2
  396. package/lib/serialization/FileMiddleware.js +101 -71
  397. package/lib/serialization/NullPrototypeObjectSerializer.js +5 -3
  398. package/lib/serialization/ObjectMiddleware.js +130 -54
  399. package/lib/serialization/PlainObjectSerializer.js +1 -1
  400. package/lib/serialization/Serializer.js +38 -20
  401. package/lib/serialization/SerializerMiddleware.js +121 -49
  402. package/lib/serialization/SingleItemMiddleware.js +9 -7
  403. package/lib/serialization/types.js +1 -1
  404. package/lib/sharing/ConsumeSharedModule.js +9 -9
  405. package/lib/sharing/ConsumeSharedPlugin.js +14 -14
  406. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -8
  407. package/lib/sharing/ProvideSharedModule.js +9 -11
  408. package/lib/sharing/ProvideSharedModuleFactory.js +5 -3
  409. package/lib/sharing/ProvideSharedPlugin.js +15 -10
  410. package/lib/sharing/SharePlugin.js +3 -4
  411. package/lib/sharing/ShareRuntimeModule.js +7 -6
  412. package/lib/sharing/resolveMatchedConfigs.js +27 -13
  413. package/lib/sharing/utils.js +37 -43
  414. package/lib/stats/DefaultStatsFactoryPlugin.js +455 -286
  415. package/lib/stats/DefaultStatsPresetPlugin.js +77 -46
  416. package/lib/stats/DefaultStatsPrinterPlugin.js +583 -419
  417. package/lib/stats/StatsFactory.js +75 -32
  418. package/lib/stats/StatsPrinter.js +71 -51
  419. package/lib/url/URLParserPlugin.js +264 -0
  420. package/lib/util/ArrayHelpers.js +6 -8
  421. package/lib/util/ArrayQueue.js +1 -1
  422. package/lib/util/AsyncQueue.js +11 -10
  423. package/lib/util/Hash.js +37 -5
  424. package/lib/util/IterableHelpers.js +4 -4
  425. package/lib/util/LazyBucketSortedSet.js +46 -27
  426. package/lib/util/LazySet.js +16 -10
  427. package/lib/util/MapHelpers.js +1 -1
  428. package/lib/util/ParallelismFactorCalculator.js +2 -2
  429. package/lib/util/Semaphore.js +3 -3
  430. package/lib/util/SetHelpers.js +6 -6
  431. package/lib/util/SortableSet.js +11 -9
  432. package/lib/util/StackedCacheMap.js +2 -2
  433. package/lib/util/StackedMap.js +3 -3
  434. package/lib/util/StringXor.js +2 -1
  435. package/lib/util/TupleQueue.js +11 -8
  436. package/lib/util/TupleSet.js +44 -19
  437. package/lib/util/URLAbsoluteSpecifier.js +3 -4
  438. package/lib/util/WeakTupleMap.js +56 -42
  439. package/lib/util/binarySearchBounds.js +4 -3
  440. package/lib/util/chainedImports.js +3 -1
  441. package/lib/util/cleverMerge.js +171 -107
  442. package/lib/util/comparators.js +265 -162
  443. package/lib/util/compileBooleanMatcher.js +120 -41
  444. package/lib/util/concatenate.js +20 -16
  445. package/lib/util/conventions.js +73 -74
  446. package/lib/util/create-schema-validation.js +8 -8
  447. package/lib/util/createHash.js +32 -135
  448. package/lib/util/dataURL.js +39 -0
  449. package/lib/util/deprecation.js +119 -116
  450. package/lib/util/deterministicGrouping.js +56 -47
  451. package/lib/util/extractSourceMap.js +319 -0
  452. package/lib/util/extractUrlAndGlobal.js +1 -1
  453. package/lib/util/findGraphRoots.js +19 -9
  454. package/lib/util/fs.js +169 -141
  455. package/lib/util/hash/BatchedHash.js +50 -10
  456. package/lib/util/hash/BulkUpdateHash.js +138 -0
  457. package/lib/util/hash/DebugHash.js +75 -0
  458. package/lib/util/hash/hash-digest.js +216 -0
  459. package/lib/util/hash/md4.js +2 -2
  460. package/lib/util/hash/wasm-hash.js +59 -17
  461. package/lib/util/identifier.js +124 -61
  462. package/lib/util/internalSerializables.js +4 -6
  463. package/lib/util/magicComment.js +9 -5
  464. package/lib/util/makeSerializable.js +2 -2
  465. package/lib/util/memoize.js +5 -2
  466. package/lib/util/objectToMap.js +3 -2
  467. package/lib/util/processAsyncTree.js +5 -5
  468. package/lib/util/propertyAccess.js +1 -1
  469. package/lib/util/propertyName.js +2 -3
  470. package/lib/util/registerExternalSerializer.js +16 -20
  471. package/lib/util/removeBOM.js +25 -0
  472. package/lib/util/runtime.js +72 -56
  473. package/lib/util/semver.js +44 -33
  474. package/lib/util/serialization.js +56 -56
  475. package/lib/util/smartGrouping.js +42 -27
  476. package/lib/util/source.js +5 -4
  477. package/lib/util/traverseDestructuringAssignmentProperties.js +45 -0
  478. package/lib/validateSchema.js +7 -9
  479. package/lib/wasm/EnableWasmLoadingPlugin.js +22 -12
  480. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -5
  481. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +15 -3
  482. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +28 -22
  483. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +47 -57
  484. package/lib/wasm-async/AsyncWebAssemblyParser.js +2 -10
  485. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +8 -4
  486. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +23 -17
  487. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +55 -57
  488. package/lib/wasm-sync/WebAssemblyGenerator.js +56 -41
  489. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +6 -3
  490. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +25 -10
  491. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +11 -12
  492. package/lib/wasm-sync/WebAssemblyParser.js +10 -17
  493. package/lib/wasm-sync/WebAssemblyUtils.js +1 -1
  494. package/lib/web/FetchCompileAsyncWasmPlugin.js +4 -4
  495. package/lib/web/FetchCompileWasmPlugin.js +6 -8
  496. package/lib/web/JsonpChunkLoadingPlugin.js +74 -74
  497. package/lib/web/JsonpChunkLoadingRuntimeModule.js +10 -26
  498. package/lib/web/JsonpTemplatePlugin.js +0 -1
  499. package/lib/webpack.js +107 -87
  500. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +79 -75
  501. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +38 -51
  502. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -0
  503. package/module.d.ts +5 -0
  504. package/package.json +149 -129
  505. package/schemas/WebpackOptions.check.d.ts +1 -1
  506. package/schemas/WebpackOptions.check.js +2 -2
  507. package/schemas/WebpackOptions.json +543 -190
  508. package/schemas/plugins/BannerPlugin.check.d.ts +1 -1
  509. package/schemas/plugins/BannerPlugin.check.js +2 -2
  510. package/schemas/plugins/BannerPlugin.json +4 -0
  511. package/schemas/plugins/DllPlugin.check.d.ts +1 -1
  512. package/schemas/plugins/DllPlugin.check.js +1 -1
  513. package/schemas/plugins/DllReferencePlugin.check.d.ts +1 -1
  514. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  515. package/schemas/plugins/IgnorePlugin.check.d.ts +1 -1
  516. package/schemas/plugins/IgnorePlugin.check.js +1 -1
  517. package/schemas/plugins/IgnorePlugin.json +1 -1
  518. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +1 -1
  519. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  520. package/schemas/plugins/{HashedModuleIdsPlugin.check.d.ts → ManifestPlugin.check.d.ts} +2 -2
  521. package/schemas/plugins/ManifestPlugin.check.js +6 -0
  522. package/schemas/plugins/ManifestPlugin.json +98 -0
  523. package/schemas/plugins/ProgressPlugin.check.d.ts +1 -1
  524. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  525. package/schemas/plugins/ProgressPlugin.json +1 -1
  526. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -2
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +23 -6
  529. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +1 -1
  530. package/schemas/plugins/WatchIgnorePlugin.check.js +1 -1
  531. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +1 -1
  532. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +1 -1
  534. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  535. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +1 -1
  536. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  537. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +1 -1
  538. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  539. package/schemas/plugins/container/ContainerPlugin.check.d.ts +1 -1
  540. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  541. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +1 -1
  542. package/schemas/plugins/container/ContainerReferencePlugin.check.js +2 -2
  543. package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
  544. package/schemas/plugins/container/ExternalsType.check.d.ts +1 -1
  545. package/schemas/plugins/container/ExternalsType.check.js +2 -2
  546. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +1 -1
  547. package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -2
  548. package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
  549. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +1 -1
  550. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  551. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +1 -1
  552. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +2 -2
  553. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +1 -1
  554. package/schemas/plugins/css/CssModuleParserOptions.check.js +2 -2
  555. package/schemas/plugins/css/CssParserOptions.check.d.ts +1 -1
  556. package/schemas/plugins/css/CssParserOptions.check.js +2 -2
  557. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +1 -1
  558. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  559. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +7 -0
  560. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +6 -0
  561. package/schemas/plugins/{HashedModuleIdsPlugin.json → ids/HashedModuleIdsPlugin.json} +15 -2
  562. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +1 -1
  563. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -1
  564. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +1 -1
  565. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -1
  566. package/schemas/plugins/{css/CssGlobalParserOptions.check.d.ts → json/JsonModulesPluginGenerator.check.d.ts} +1 -1
  567. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +6 -0
  568. package/schemas/plugins/json/JsonModulesPluginGenerator.json +3 -0
  569. package/schemas/plugins/{css/CssGlobalGeneratorOptions.check.d.ts → json/JsonModulesPluginParser.check.d.ts} +1 -1
  570. package/schemas/plugins/json/JsonModulesPluginParser.check.js +6 -0
  571. package/schemas/plugins/json/JsonModulesPluginParser.json +3 -0
  572. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +1 -1
  573. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  574. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +1 -1
  575. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  576. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +1 -1
  577. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -1
  578. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +1 -1
  579. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  580. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +1 -1
  581. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  582. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +7 -0
  583. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +6 -0
  584. package/schemas/plugins/schemes/VirtualUrlPlugin.json +77 -0
  585. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +1 -1
  586. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +1 -1
  587. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +1 -1
  588. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +1 -1
  589. package/schemas/plugins/sharing/SharePlugin.check.d.ts +1 -1
  590. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  591. package/types.d.ts +5115 -1863
  592. package/SECURITY.md +0 -9
  593. package/lib/ModuleSourceTypesConstants.js +0 -112
  594. package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
  595. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +0 -111
  596. package/lib/library/ModernModuleLibraryPlugin.js +0 -144
  597. package/schemas/plugins/HashedModuleIdsPlugin.check.js +0 -6
  598. package/schemas/plugins/JsonModulesPluginParser.check.d.ts +0 -7
  599. package/schemas/plugins/JsonModulesPluginParser.check.js +0 -6
  600. package/schemas/plugins/JsonModulesPluginParser.json +0 -12
  601. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +0 -7
  602. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +0 -6
  603. package/schemas/plugins/css/CssAutoGeneratorOptions.json +0 -3
  604. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +0 -7
  605. package/schemas/plugins/css/CssAutoParserOptions.check.js +0 -6
  606. package/schemas/plugins/css/CssAutoParserOptions.json +0 -3
  607. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +0 -6
  608. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +0 -3
  609. package/schemas/plugins/css/CssGlobalParserOptions.check.js +0 -6
  610. package/schemas/plugins/css/CssGlobalParserOptions.json +0 -3
@@ -12,8 +12,8 @@ const { requestToId } = require("../ids/IdHelpers");
12
12
  const { isSubset } = require("../util/SetHelpers");
13
13
  const SortableSet = require("../util/SortableSet");
14
14
  const {
15
- compareModulesByIdentifier,
16
- compareIterables
15
+ compareIterables,
16
+ compareModulesByIdentifier
17
17
  } = require("../util/comparators");
18
18
  const createHash = require("../util/createHash");
19
19
  const deterministicGrouping = require("../util/deterministicGrouping");
@@ -25,37 +25,46 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
25
25
  /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksGetCacheGroups} OptimizationSplitChunksGetCacheGroups */
26
26
  /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksOptions} OptimizationSplitChunksOptions */
27
27
  /** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksSizes} OptimizationSplitChunksSizes */
28
- /** @typedef {import("../../declarations/WebpackOptions").Output} OutputOptions */
28
+ /** @typedef {import("../config/defaults").OutputNormalizedWithDefaults} OutputOptions */
29
+ /** @typedef {import("../Chunk").ChunkName} ChunkName */
29
30
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
30
31
  /** @typedef {import("../ChunkGroup")} ChunkGroup */
31
32
  /** @typedef {import("../Compiler")} Compiler */
32
33
  /** @typedef {import("../Module")} Module */
34
+ /** @typedef {import("../Module").SourceType} SourceType */
33
35
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
34
36
  /** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
35
37
  /** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
36
38
  /** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
37
39
 
38
- /** @typedef {Record<string, number>} SplitChunksSizes */
39
-
40
40
  /**
41
- * @callback ChunkFilterFunction
41
+ * @callback ChunkFilterFn
42
42
  * @param {Chunk} chunk
43
43
  * @returns {boolean | undefined}
44
44
  */
45
45
 
46
+ /** @typedef {number} Priority */
47
+ /** @typedef {number} Size */
48
+ /** @typedef {number} CountOfChunk */
49
+ /** @typedef {number} CountOfRequest */
50
+
46
51
  /**
47
52
  * @callback CombineSizeFunction
48
- * @param {number} a
49
- * @param {number} b
50
- * @returns {number}
53
+ * @param {Size} a
54
+ * @param {Size} b
55
+ * @returns {Size}
51
56
  */
52
57
 
58
+ /** @typedef {SourceType[]} SourceTypes */
59
+ /** @typedef {SourceType[]} DefaultSizeTypes */
60
+ /** @typedef {Record<SourceType, Size>} SplitChunksSizes */
61
+
53
62
  /**
54
63
  * @typedef {object} CacheGroupSource
55
- * @property {string=} key
56
- * @property {number=} priority
57
- * @property {GetName=} getName
58
- * @property {ChunkFilterFunction=} chunksFilter
64
+ * @property {string} key
65
+ * @property {Priority=} priority
66
+ * @property {GetNameFn=} getName
67
+ * @property {ChunkFilterFn=} chunksFilter
59
68
  * @property {boolean=} enforce
60
69
  * @property {SplitChunksSizes} minSize
61
70
  * @property {SplitChunksSizes} minSizeReduction
@@ -63,9 +72,9 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
63
72
  * @property {SplitChunksSizes} enforceSizeThreshold
64
73
  * @property {SplitChunksSizes} maxAsyncSize
65
74
  * @property {SplitChunksSizes} maxInitialSize
66
- * @property {number=} minChunks
67
- * @property {number=} maxAsyncRequests
68
- * @property {number=} maxInitialRequests
75
+ * @property {CountOfChunk=} minChunks
76
+ * @property {CountOfRequest=} maxAsyncRequests
77
+ * @property {CountOfRequest=} maxInitialRequests
69
78
  * @property {TemplatePath=} filename
70
79
  * @property {string=} idHint
71
80
  * @property {string=} automaticNameDelimiter
@@ -76,20 +85,20 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
76
85
  /**
77
86
  * @typedef {object} CacheGroup
78
87
  * @property {string} key
79
- * @property {number=} priority
80
- * @property {GetName=} getName
81
- * @property {ChunkFilterFunction=} chunksFilter
88
+ * @property {Priority} priority
89
+ * @property {GetNameFn=} getName
90
+ * @property {ChunkFilterFn} chunksFilter
82
91
  * @property {SplitChunksSizes} minSize
83
92
  * @property {SplitChunksSizes} minSizeReduction
84
93
  * @property {SplitChunksSizes} minRemainingSize
85
94
  * @property {SplitChunksSizes} enforceSizeThreshold
86
95
  * @property {SplitChunksSizes} maxAsyncSize
87
96
  * @property {SplitChunksSizes} maxInitialSize
88
- * @property {number=} minChunks
89
- * @property {number=} maxAsyncRequests
90
- * @property {number=} maxInitialRequests
97
+ * @property {CountOfChunk} minChunks
98
+ * @property {CountOfRequest} maxAsyncRequests
99
+ * @property {CountOfRequest} maxInitialRequests
91
100
  * @property {TemplatePath=} filename
92
- * @property {string=} idHint
101
+ * @property {string} idHint
93
102
  * @property {string} automaticNameDelimiter
94
103
  * @property {boolean} reuseExistingChunk
95
104
  * @property {boolean} usedExports
@@ -101,7 +110,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
101
110
 
102
111
  /**
103
112
  * @typedef {object} FallbackCacheGroup
104
- * @property {ChunkFilterFunction} chunksFilter
113
+ * @property {ChunkFilterFn} chunksFilter
105
114
  * @property {SplitChunksSizes} minSize
106
115
  * @property {SplitChunksSizes} maxAsyncSize
107
116
  * @property {SplitChunksSizes} maxInitialSize
@@ -118,55 +127,58 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
118
127
  * @callback GetCacheGroups
119
128
  * @param {Module} module
120
129
  * @param {CacheGroupsContext} context
121
- * @returns {CacheGroupSource[]}
130
+ * @returns {CacheGroupSource[] | null}
122
131
  */
123
132
 
124
133
  /**
125
- * @callback GetName
126
- * @param {Module=} module
127
- * @param {Chunk[]=} chunks
128
- * @param {string=} key
129
- * @returns {string=}
134
+ * @callback GetNameFn
135
+ * @param {Module} module
136
+ * @param {Chunk[]} chunks
137
+ * @param {string} key
138
+ * @returns {string | undefined}
130
139
  */
131
140
 
132
141
  /**
133
142
  * @typedef {object} SplitChunksOptions
134
- * @property {ChunkFilterFunction} chunksFilter
135
- * @property {string[]} defaultSizeTypes
143
+ * @property {ChunkFilterFn} chunksFilter
144
+ * @property {DefaultSizeTypes} defaultSizeTypes
136
145
  * @property {SplitChunksSizes} minSize
137
146
  * @property {SplitChunksSizes} minSizeReduction
138
147
  * @property {SplitChunksSizes} minRemainingSize
139
148
  * @property {SplitChunksSizes} enforceSizeThreshold
140
149
  * @property {SplitChunksSizes} maxInitialSize
141
150
  * @property {SplitChunksSizes} maxAsyncSize
142
- * @property {number} minChunks
143
- * @property {number} maxAsyncRequests
144
- * @property {number} maxInitialRequests
151
+ * @property {CountOfChunk} minChunks
152
+ * @property {CountOfRequest} maxAsyncRequests
153
+ * @property {CountOfRequest} maxInitialRequests
145
154
  * @property {boolean} hidePathInfo
146
- * @property {TemplatePath} filename
155
+ * @property {TemplatePath=} filename
147
156
  * @property {string} automaticNameDelimiter
148
157
  * @property {GetCacheGroups} getCacheGroups
149
- * @property {GetName} getName
158
+ * @property {GetNameFn} getName
150
159
  * @property {boolean} usedExports
151
160
  * @property {FallbackCacheGroup} fallbackCacheGroup
152
161
  */
153
162
 
163
+ /** @typedef {Set<Chunk>} ChunkSet */
164
+
154
165
  /**
155
166
  * @typedef {object} ChunksInfoItem
156
167
  * @property {SortableSet<Module>} modules
157
168
  * @property {CacheGroup} cacheGroup
158
169
  * @property {number} cacheGroupIndex
159
- * @property {string} name
160
- * @property {Record<string, number>} sizes
161
- * @property {Set<Chunk>} chunks
162
- * @property {Set<Chunk>} reusableChunks
170
+ * @property {string=} name
171
+ * @property {SplitChunksSizes} sizes
172
+ * @property {ChunkSet} chunks
173
+ * @property {ChunkSet} reusableChunks
163
174
  * @property {Set<bigint | Chunk>} chunksKeys
164
175
  */
165
176
 
166
- const defaultGetName = /** @type {GetName} */ (() => {});
177
+ /** @type {GetNameFn} */
178
+ const defaultGetName = () => undefined;
167
179
 
168
180
  const deterministicGroupingForModules =
169
- /** @type {function(DeterministicGroupingOptionsForModule): DeterministicGroupingGroupedItemsForModule[]} */
181
+ /** @type {(options: DeterministicGroupingOptionsForModule) => DeterministicGroupingGroupedItemsForModule[]} */
170
182
  (deterministicGrouping);
171
183
 
172
184
  /** @type {WeakMap<Module, string>} */
@@ -190,9 +202,9 @@ const hashFilename = (name, outputOptions) => {
190
202
 
191
203
  /**
192
204
  * @param {Chunk} chunk the chunk
193
- * @returns {number} the number of requests
205
+ * @returns {CountOfRequest} the number of requests
194
206
  */
195
- const getRequests = chunk => {
207
+ const getRequests = (chunk) => {
196
208
  let requests = 0;
197
209
  for (const chunkGroup of chunk.groupsIterable) {
198
210
  requests = Math.max(requests, chunkGroup.chunks.length);
@@ -204,7 +216,7 @@ const getRequests = chunk => {
204
216
  * @template {object} T
205
217
  * @template {object} R
206
218
  * @param {T} obj obj an object
207
- * @param {function(T[keyof T], keyof T): T[keyof T]} fn fn
219
+ * @param {(obj: T[keyof T], key: keyof T) => T[keyof T]} fn fn
208
220
  * @returns {T} result
209
221
  */
210
222
  const mapObject = (obj, fn) => {
@@ -269,26 +281,26 @@ const compareEntries = (a, b) => {
269
281
  * @param {Chunk} chunk the chunk
270
282
  * @returns {boolean} true, if the chunk is an entry chunk
271
283
  */
272
- const INITIAL_CHUNK_FILTER = chunk => chunk.canBeInitial();
284
+ const INITIAL_CHUNK_FILTER = (chunk) => chunk.canBeInitial();
273
285
  /**
274
286
  * @param {Chunk} chunk the chunk
275
287
  * @returns {boolean} true, if the chunk is an async chunk
276
288
  */
277
- const ASYNC_CHUNK_FILTER = chunk => !chunk.canBeInitial();
289
+ const ASYNC_CHUNK_FILTER = (chunk) => !chunk.canBeInitial();
278
290
  /**
279
- * @param {Chunk} chunk the chunk
291
+ * @param {Chunk} _chunk the chunk
280
292
  * @returns {boolean} always true
281
293
  */
282
- const ALL_CHUNK_FILTER = chunk => true;
294
+ const ALL_CHUNK_FILTER = (_chunk) => true;
283
295
 
284
296
  /**
285
297
  * @param {OptimizationSplitChunksSizes | undefined} value the sizes
286
- * @param {string[]} defaultSizeTypes the default size types
298
+ * @param {DefaultSizeTypes} defaultSizeTypes the default size types
287
299
  * @returns {SplitChunksSizes} normalized representation
288
300
  */
289
301
  const normalizeSizes = (value, defaultSizeTypes) => {
290
302
  if (typeof value === "number") {
291
- /** @type {Record<string, number>} */
303
+ /** @type {SplitChunksSizes} */
292
304
  const o = {};
293
305
  for (const sizeType of defaultSizeTypes) o[sizeType] = value;
294
306
  return o;
@@ -315,8 +327,8 @@ const mergeSizes = (...sizes) => {
315
327
  * @param {SplitChunksSizes} sizes the sizes
316
328
  * @returns {boolean} true, if there are sizes > 0
317
329
  */
318
- const hasNonZeroSizes = sizes => {
319
- for (const key of Object.keys(sizes)) {
330
+ const hasNonZeroSizes = (sizes) => {
331
+ for (const key of /** @type {SourceType[]} */ (Object.keys(sizes))) {
320
332
  if (sizes[key] > 0) return true;
321
333
  }
322
334
  return false;
@@ -329,8 +341,8 @@ const hasNonZeroSizes = sizes => {
329
341
  * @returns {SplitChunksSizes} the combine sizes
330
342
  */
331
343
  const combineSizes = (a, b, combine) => {
332
- const aKeys = new Set(Object.keys(a));
333
- const bKeys = new Set(Object.keys(b));
344
+ const aKeys = /** @type {Set<SourceType>} */ (new Set(Object.keys(a)));
345
+ const bKeys = /** @type {Set<SourceType>} */ (new Set(Object.keys(b)));
334
346
  /** @type {SplitChunksSizes} */
335
347
  const result = {};
336
348
  for (const key of aKeys) {
@@ -350,7 +362,7 @@ const combineSizes = (a, b, combine) => {
350
362
  * @returns {boolean} true if there are sizes and all existing sizes are at least `minSize`
351
363
  */
352
364
  const checkMinSize = (sizes, minSize) => {
353
- for (const key of Object.keys(minSize)) {
365
+ for (const key of /** @type {SourceType[]} */ (Object.keys(minSize))) {
354
366
  const size = sizes[key];
355
367
  if (size === undefined || size === 0) continue;
356
368
  if (size < minSize[key]) return false;
@@ -361,11 +373,13 @@ const checkMinSize = (sizes, minSize) => {
361
373
  /**
362
374
  * @param {SplitChunksSizes} sizes the sizes
363
375
  * @param {SplitChunksSizes} minSizeReduction the min sizes
364
- * @param {number} chunkCount number of chunks
376
+ * @param {CountOfChunk} chunkCount number of chunks
365
377
  * @returns {boolean} true if there are sizes and all existing sizes are at least `minSizeReduction`
366
378
  */
367
379
  const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
368
- for (const key of Object.keys(minSizeReduction)) {
380
+ for (const key of /** @type {SourceType[]} */ (
381
+ Object.keys(minSizeReduction)
382
+ )) {
369
383
  const size = sizes[key];
370
384
  if (size === undefined || size === 0) continue;
371
385
  if (size * chunkCount < minSizeReduction[key]) return false;
@@ -376,11 +390,12 @@ const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
376
390
  /**
377
391
  * @param {SplitChunksSizes} sizes the sizes
378
392
  * @param {SplitChunksSizes} minSize the min sizes
379
- * @returns {undefined | string[]} list of size types that are below min size
393
+ * @returns {undefined | SourceTypes} list of size types that are below min size
380
394
  */
381
395
  const getViolatingMinSizes = (sizes, minSize) => {
396
+ /** @type {SourceTypes | undefined} */
382
397
  let list;
383
- for (const key of Object.keys(minSize)) {
398
+ for (const key of /** @type {SourceType[]} */ (Object.keys(minSize))) {
384
399
  const size = sizes[key];
385
400
  if (size === undefined || size === 0) continue;
386
401
  if (size < minSize[key]) {
@@ -393,34 +408,34 @@ const getViolatingMinSizes = (sizes, minSize) => {
393
408
 
394
409
  /**
395
410
  * @param {SplitChunksSizes} sizes the sizes
396
- * @returns {number} the total size
411
+ * @returns {Size} the total size
397
412
  */
398
- const totalSize = sizes => {
413
+ const totalSize = (sizes) => {
399
414
  let size = 0;
400
- for (const key of Object.keys(sizes)) {
415
+ for (const key of /** @type {SourceType[]} */ (Object.keys(sizes))) {
401
416
  size += sizes[key];
402
417
  }
403
418
  return size;
404
419
  };
405
420
 
406
421
  /**
407
- * @param {false|string|Function|undefined} name the chunk name
408
- * @returns {GetName | undefined} a function to get the name of the chunk
422
+ * @param {OptimizationSplitChunksCacheGroup["name"]} name the chunk name
423
+ * @returns {GetNameFn | undefined} a function to get the name of the chunk
409
424
  */
410
- const normalizeName = name => {
425
+ const normalizeName = (name) => {
411
426
  if (typeof name === "string") {
412
427
  return () => name;
413
428
  }
414
429
  if (typeof name === "function") {
415
- return /** @type {GetName} */ (name);
430
+ return /** @type {GetNameFn} */ (name);
416
431
  }
417
432
  };
418
433
 
419
434
  /**
420
435
  * @param {OptimizationSplitChunksCacheGroup["chunks"]} chunks the chunk filter option
421
- * @returns {ChunkFilterFunction} the chunk filter function
436
+ * @returns {ChunkFilterFn | undefined} the chunk filter function
422
437
  */
423
- const normalizeChunksFilter = chunks => {
438
+ const normalizeChunksFilter = (chunks) => {
424
439
  if (chunks === "initial") {
425
440
  return INITIAL_CHUNK_FILTER;
426
441
  }
@@ -431,7 +446,7 @@ const normalizeChunksFilter = chunks => {
431
446
  return ALL_CHUNK_FILTER;
432
447
  }
433
448
  if (chunks instanceof RegExp) {
434
- return chunk => (chunk.name ? chunks.test(chunk.name) : false);
449
+ return (chunk) => (chunk.name ? chunks.test(chunk.name) : false);
435
450
  }
436
451
  if (typeof chunks === "function") {
437
452
  return chunks;
@@ -439,8 +454,8 @@ const normalizeChunksFilter = chunks => {
439
454
  };
440
455
 
441
456
  /**
442
- * @param {GetCacheGroups | Record<string, false|string|RegExp|OptimizationSplitChunksGetCacheGroups|OptimizationSplitChunksCacheGroup>} cacheGroups the cache group options
443
- * @param {string[]} defaultSizeTypes the default size types
457
+ * @param {undefined | GetCacheGroups | Record<string, false | string | RegExp | OptimizationSplitChunksGetCacheGroups | OptimizationSplitChunksCacheGroup>} cacheGroups the cache group options
458
+ * @param {DefaultSizeTypes} defaultSizeTypes the default size types
444
459
  * @returns {GetCacheGroups} a function to get the cache groups
445
460
  */
446
461
  const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
@@ -448,7 +463,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
448
463
  return cacheGroups;
449
464
  }
450
465
  if (typeof cacheGroups === "object" && cacheGroups !== null) {
451
- /** @type {(function(Module, CacheGroupsContext, CacheGroupSource[]): void)[]} */
466
+ /** @type {((module: Module, context: CacheGroupsContext, results: CacheGroupSource[]) => void)[]} */
452
467
  const handlers = [];
453
468
  for (const key of Object.keys(cacheGroups)) {
454
469
  const option = cacheGroups[key];
@@ -516,7 +531,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
516
531
  };
517
532
 
518
533
  /**
519
- * @param {undefined|boolean|string|RegExp|Function} test test option
534
+ * @param {OptimizationSplitChunksCacheGroup["test"]} test test option
520
535
  * @param {Module} module the module
521
536
  * @param {CacheGroupsContext} context context object
522
537
  * @returns {boolean} true, if the module should be selected
@@ -529,17 +544,17 @@ const checkTest = (test, module, context) => {
529
544
  if (typeof test === "boolean") return test;
530
545
  if (typeof test === "string") {
531
546
  const name = module.nameForCondition();
532
- return name && name.startsWith(test);
547
+ return name ? name.startsWith(test) : false;
533
548
  }
534
549
  if (test instanceof RegExp) {
535
550
  const name = module.nameForCondition();
536
- return name && test.test(name);
551
+ return name ? test.test(name) : false;
537
552
  }
538
553
  return false;
539
554
  };
540
555
 
541
556
  /**
542
- * @param {undefined|string|RegExp|Function} test type option
557
+ * @param {OptimizationSplitChunksCacheGroup["type"]} test type option
543
558
  * @param {Module} module the module
544
559
  * @returns {boolean} true, if the module should be selected
545
560
  */
@@ -560,7 +575,7 @@ const checkModuleType = (test, module) => {
560
575
  };
561
576
 
562
577
  /**
563
- * @param {undefined|string|RegExp|Function} test type option
578
+ * @param {OptimizationSplitChunksCacheGroup["layer"]} test type option
564
579
  * @param {Module} module the module
565
580
  * @returns {boolean} true, if the module should be selected
566
581
  */
@@ -571,11 +586,11 @@ const checkModuleLayer = (test, module) => {
571
586
  }
572
587
  if (typeof test === "string") {
573
588
  const layer = module.layer;
574
- return test === "" ? !layer : layer && layer.startsWith(test);
589
+ return test === "" ? !layer : layer ? layer.startsWith(test) : false;
575
590
  }
576
591
  if (test instanceof RegExp) {
577
592
  const layer = module.layer;
578
- return test.test(layer);
593
+ return layer ? test.test(layer) : false;
579
594
  }
580
595
  return false;
581
596
  };
@@ -583,7 +598,7 @@ const checkModuleLayer = (test, module) => {
583
598
  /**
584
599
  * @param {OptimizationSplitChunksCacheGroup} options the group options
585
600
  * @param {string} key key of cache group
586
- * @param {string[]} defaultSizeTypes the default size types
601
+ * @param {DefaultSizeTypes} defaultSizeTypes the default size types
587
602
  * @returns {CacheGroupSource} the normalized cached group
588
603
  */
589
604
  const createCacheGroupSource = (options, key, defaultSizeTypes) => {
@@ -628,6 +643,8 @@ const createCacheGroupSource = (options, key, defaultSizeTypes) => {
628
643
  };
629
644
  };
630
645
 
646
+ const PLUGIN_NAME = "SplitChunksPlugin";
647
+
631
648
  module.exports = class SplitChunksPlugin {
632
649
  /**
633
650
  * @param {OptimizationSplitChunksOptions=} options plugin options
@@ -647,7 +664,9 @@ module.exports = class SplitChunksPlugin {
647
664
 
648
665
  /** @type {SplitChunksOptions} */
649
666
  this.options = {
650
- chunksFilter: normalizeChunksFilter(options.chunks || "all"),
667
+ chunksFilter:
668
+ /** @type {ChunkFilterFn} */
669
+ (normalizeChunksFilter(options.chunks || "all")),
651
670
  defaultSizeTypes,
652
671
  minSize,
653
672
  minSizeReduction,
@@ -676,13 +695,19 @@ module.exports = class SplitChunksPlugin {
676
695
  options.cacheGroups,
677
696
  defaultSizeTypes
678
697
  ),
679
- getName: options.name ? normalizeName(options.name) : defaultGetName,
680
- automaticNameDelimiter: options.automaticNameDelimiter,
681
- usedExports: options.usedExports,
698
+ getName: options.name
699
+ ? /** @type {GetNameFn} */ (normalizeName(options.name))
700
+ : defaultGetName,
701
+ automaticNameDelimiter: options.automaticNameDelimiter || "-",
702
+ usedExports: options.usedExports || false,
682
703
  fallbackCacheGroup: {
683
- chunksFilter: normalizeChunksFilter(
684
- fallbackCacheGroup.chunks || options.chunks || "all"
685
- ),
704
+ chunksFilter:
705
+ /** @type {ChunkFilterFn} */
706
+ (
707
+ normalizeChunksFilter(
708
+ fallbackCacheGroup.chunks || options.chunks || "all"
709
+ )
710
+ ),
686
711
  minSize: mergeSizes(
687
712
  normalizeSizes(fallbackCacheGroup.minSize, defaultSizeTypes),
688
713
  minSize
@@ -733,6 +758,7 @@ module.exports = class SplitChunksPlugin {
733
758
  cacheGroupSource.enforceSizeThreshold,
734
759
  cacheGroupSource.enforce ? undefined : this.options.enforceSizeThreshold
735
760
  );
761
+ /** @type {CacheGroup} */
736
762
  const cacheGroup = {
737
763
  key: cacheGroupSource.key,
738
764
  priority: cacheGroupSource.priority || 0,
@@ -810,18 +836,18 @@ module.exports = class SplitChunksPlugin {
810
836
  compiler.context,
811
837
  compiler.root
812
838
  );
813
- compiler.hooks.thisCompilation.tap("SplitChunksPlugin", compilation => {
814
- const logger = compilation.getLogger("webpack.SplitChunksPlugin");
839
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
840
+ const logger = compilation.getLogger(`webpack.${PLUGIN_NAME}`);
815
841
  let alreadyOptimized = false;
816
- compilation.hooks.unseal.tap("SplitChunksPlugin", () => {
842
+ compilation.hooks.unseal.tap(PLUGIN_NAME, () => {
817
843
  alreadyOptimized = false;
818
844
  });
819
845
  compilation.hooks.optimizeChunks.tap(
820
846
  {
821
- name: "SplitChunksPlugin",
847
+ name: PLUGIN_NAME,
822
848
  stage: STAGE_ADVANCED
823
849
  },
824
- chunks => {
850
+ (chunks) => {
825
851
  if (alreadyOptimized) return;
826
852
  alreadyOptimized = true;
827
853
  logger.time("prepare");
@@ -839,13 +865,13 @@ module.exports = class SplitChunksPlugin {
839
865
  chunk,
840
866
  index | BigInt((Math.random() * 0x7fffffff) | 0)
841
867
  );
842
- index = index << ONE;
868
+ index <<= ONE;
843
869
  }
844
870
  /**
845
871
  * @param {Iterable<Chunk>} chunks list of chunks
846
872
  * @returns {bigint | Chunk} key of the chunks
847
873
  */
848
- const getKey = chunks => {
874
+ const getKey = (chunks) => {
849
875
  const iterator = chunks[Symbol.iterator]();
850
876
  let result = iterator.next();
851
877
  if (result.done) return ZERO;
@@ -853,10 +879,11 @@ module.exports = class SplitChunksPlugin {
853
879
  result = iterator.next();
854
880
  if (result.done) return first;
855
881
  let key =
856
- chunkIndexMap.get(first) | chunkIndexMap.get(result.value);
882
+ /** @type {bigint} */ (chunkIndexMap.get(first)) |
883
+ /** @type {bigint} */ (chunkIndexMap.get(result.value));
857
884
  while (!(result = iterator.next()).done) {
858
885
  const raw = chunkIndexMap.get(result.value);
859
- key = key ^ raw;
886
+ key ^= /** @type {bigint} */ (raw);
860
887
  }
861
888
  return key;
862
889
  };
@@ -864,15 +891,15 @@ module.exports = class SplitChunksPlugin {
864
891
  * @param {bigint | Chunk} key key of the chunks
865
892
  * @returns {string} stringified key
866
893
  */
867
- const keyToString = key => {
894
+ const keyToString = (key) => {
868
895
  if (typeof key === "bigint") return key.toString(16);
869
- return chunkIndexMap.get(key).toString(16);
896
+ return /** @type {bigint} */ (chunkIndexMap.get(key)).toString(16);
870
897
  };
871
898
 
872
899
  const getChunkSetsInGraph = memoize(() => {
873
- /** @type {Map<bigint, Set<Chunk>>} */
900
+ /** @type {Map<bigint, ChunkSet>} */
874
901
  const chunkSetsInGraph = new Map();
875
- /** @type {Set<Chunk>} */
902
+ /** @type {ChunkSet} */
876
903
  const singleChunkSets = new Set();
877
904
  for (const module of compilation.modules) {
878
905
  const chunks = chunkGraph.getModuleChunksIterable(module);
@@ -892,7 +919,7 @@ module.exports = class SplitChunksPlugin {
892
919
  * @param {Module} module the module
893
920
  * @returns {Iterable<Chunk[]>} groups of chunks with equal exports
894
921
  */
895
- const groupChunksByExports = module => {
922
+ const groupChunksByExports = (module) => {
896
923
  const exportsInfo = moduleGraph.getExportsInfo(module);
897
924
  const groupedByUsedExports = new Map();
898
925
  for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
@@ -910,19 +937,21 @@ module.exports = class SplitChunksPlugin {
910
937
  /** @type {Map<Module, Iterable<Chunk[]>>} */
911
938
  const groupedByExportsMap = new Map();
912
939
 
940
+ /** @typedef {Map<bigint | Chunk, ChunkSet>} ChunkSetsInGraph */
941
+
913
942
  const getExportsChunkSetsInGraph = memoize(() => {
914
- /** @type {Map<bigint, Set<Chunk>>} */
943
+ /** @type {ChunkSetsInGraph} */
915
944
  const chunkSetsInGraph = new Map();
916
- /** @type {Set<Chunk>} */
945
+ /** @type {ChunkSet} */
917
946
  const singleChunkSets = new Set();
918
947
  for (const module of compilation.modules) {
919
- const groupedChunks = Array.from(groupChunksByExports(module));
948
+ const groupedChunks = [...groupChunksByExports(module)];
920
949
  groupedByExportsMap.set(module, groupedChunks);
921
950
  for (const chunks of groupedChunks) {
922
951
  if (chunks.length === 1) {
923
952
  singleChunkSets.add(chunks[0]);
924
953
  } else {
925
- const chunksKey = /** @type {bigint} */ (getKey(chunks));
954
+ const chunksKey = getKey(chunks);
926
955
  if (!chunkSetsInGraph.has(chunksKey)) {
927
956
  chunkSetsInGraph.set(chunksKey, new Set(chunks));
928
957
  }
@@ -932,15 +961,17 @@ module.exports = class SplitChunksPlugin {
932
961
  return { chunkSetsInGraph, singleChunkSets };
933
962
  });
934
963
 
964
+ /** @typedef {Map<CountOfChunk, ChunkSet[]>} ChunkSetsByCount */
965
+
935
966
  // group these set of chunks by count
936
967
  // to allow to check less sets via isSubset
937
968
  // (only smaller sets can be subset)
938
969
  /**
939
- * @param {IterableIterator<Set<Chunk>>} chunkSets set of sets of chunks
940
- * @returns {Map<number, Array<Set<Chunk>>>} map of sets of chunks by count
970
+ * @param {IterableIterator<ChunkSet>} chunkSets set of sets of chunks
971
+ * @returns {ChunkSetsByCount} map of sets of chunks by count
941
972
  */
942
- const groupChunkSetsByCount = chunkSets => {
943
- /** @type {Map<number, Array<Set<Chunk>>>} */
973
+ const groupChunkSetsByCount = (chunkSets) => {
974
+ /** @type {ChunkSetsByCount} */
944
975
  const chunkSetsByCount = new Map();
945
976
  for (const chunksSet of chunkSets) {
946
977
  const count = chunksSet.size;
@@ -964,16 +995,24 @@ module.exports = class SplitChunksPlugin {
964
995
  )
965
996
  );
966
997
 
998
+ /** @typedef {(ChunkSet | Chunk)[]} Combinations */
999
+
967
1000
  // Create a list of possible combinations
1001
+ /**
1002
+ * @param {ChunkSetsInGraph} chunkSets chunk sets
1003
+ * @param {ChunkSet} singleChunkSets single chunks sets
1004
+ * @param {ChunkSetsByCount} chunkSetsByCount chunk sets by count
1005
+ * @returns {(key: bigint | Chunk) => Combinations} combinations
1006
+ */
968
1007
  const createGetCombinations = (
969
1008
  chunkSets,
970
1009
  singleChunkSets,
971
1010
  chunkSetsByCount
972
1011
  ) => {
973
- /** @type {Map<bigint | Chunk, (Set<Chunk> | Chunk)[]>} */
1012
+ /** @type {Map<bigint | Chunk, Combinations>} */
974
1013
  const combinationsCache = new Map();
975
1014
 
976
- return key => {
1015
+ return (key) => {
977
1016
  const cacheEntry = combinationsCache.get(key);
978
1017
  if (cacheEntry !== undefined) return cacheEntry;
979
1018
  if (key instanceof Chunk) {
@@ -981,8 +1020,10 @@ module.exports = class SplitChunksPlugin {
981
1020
  combinationsCache.set(key, result);
982
1021
  return result;
983
1022
  }
984
- const chunksSet = chunkSets.get(key);
985
- /** @type {(Set<Chunk> | Chunk)[]} */
1023
+ const chunksSet =
1024
+ /** @type {ChunkSet} */
1025
+ (chunkSets.get(key));
1026
+ /** @type {Combinations} */
986
1027
  const array = [chunksSet];
987
1028
  for (const [count, setArray] of chunkSetsByCount) {
988
1029
  // "equal" is not needed because they would have been merge in the first step
@@ -1012,7 +1053,12 @@ module.exports = class SplitChunksPlugin {
1012
1053
  getChunkSetsByCount()
1013
1054
  );
1014
1055
  });
1015
- const getCombinations = key => getCombinationsFactory()(key);
1056
+
1057
+ /**
1058
+ * @param {bigint | Chunk} key key
1059
+ * @returns {Combinations} combinations by key
1060
+ */
1061
+ const getCombinations = (key) => getCombinationsFactory()(key);
1016
1062
 
1017
1063
  const getExportsCombinationsFactory = memoize(() => {
1018
1064
  const { chunkSetsInGraph, singleChunkSets } =
@@ -1023,7 +1069,11 @@ module.exports = class SplitChunksPlugin {
1023
1069
  getExportsChunkSetsByCount()
1024
1070
  );
1025
1071
  });
1026
- const getExportsCombinations = key =>
1072
+ /**
1073
+ * @param {bigint | Chunk} key key
1074
+ * @returns {Combinations} exports combinations by key
1075
+ */
1076
+ const getExportsCombinations = (key) =>
1027
1077
  getExportsCombinationsFactory()(key);
1028
1078
 
1029
1079
  /**
@@ -1032,14 +1082,14 @@ module.exports = class SplitChunksPlugin {
1032
1082
  * @property {bigint | Chunk} key a key of the list
1033
1083
  */
1034
1084
 
1035
- /** @type {WeakMap<Set<Chunk> | Chunk, WeakMap<ChunkFilterFunction, SelectedChunksResult>>} */
1085
+ /** @type {WeakMap<ChunkSet | Chunk, WeakMap<ChunkFilterFn, SelectedChunksResult>>} */
1036
1086
  const selectedChunksCacheByChunksSet = new WeakMap();
1037
1087
 
1038
1088
  /**
1039
1089
  * get list and key by applying the filter function to the list
1040
1090
  * It is cached for performance reasons
1041
- * @param {Set<Chunk> | Chunk} chunks list of chunks
1042
- * @param {ChunkFilterFunction} chunkFilter filter function for chunks
1091
+ * @param {ChunkSet | Chunk} chunks list of chunks
1092
+ * @param {ChunkFilterFn} chunkFilter filter function for chunks
1043
1093
  * @returns {SelectedChunksResult} list and key
1044
1094
  */
1045
1095
  const getSelectedChunks = (chunks, chunkFilter) => {
@@ -1098,11 +1148,12 @@ module.exports = class SplitChunksPlugin {
1098
1148
  // Break if minimum number of chunks is not reached
1099
1149
  if (selectedChunks.length < cacheGroup.minChunks) return;
1100
1150
  // Determine name for split chunk
1151
+
1101
1152
  const name =
1102
- /** @type {string} */
1103
- (cacheGroup.getName(module, selectedChunks, cacheGroup.key));
1153
+ /** @type {GetNameFn} */
1154
+ (cacheGroup.getName)(module, selectedChunks, cacheGroup.key);
1104
1155
  // Check if the name is ok
1105
- const existingChunk = compilation.namedChunks.get(name);
1156
+ const existingChunk = name && compilation.namedChunks.get(name);
1106
1157
  if (existingChunk) {
1107
1158
  const parentValidationKey = `${name}|${
1108
1159
  typeof selectedChunksKey === "bigint"
@@ -1140,7 +1191,7 @@ module.exports = class SplitChunksPlugin {
1140
1191
  alreadyReportedErrors.add(name);
1141
1192
  compilation.errors.push(
1142
1193
  new WebpackError(
1143
- "SplitChunksPlugin\n" +
1194
+ `${PLUGIN_NAME}\n` +
1144
1195
  `Cache group "${cacheGroup.key}" conflicts with existing chunk.\n` +
1145
1196
  `Both have the same name "${name}" and existing chunk is not a parent of the selected modules.\n` +
1146
1197
  "Use a different name for the cache group or make sure that the existing chunk is a parent (e. g. via dependOn).\n" +
@@ -1167,7 +1218,7 @@ module.exports = class SplitChunksPlugin {
1167
1218
  ? ` name:${name}`
1168
1219
  : ` chunks:${keyToString(selectedChunksKey)}`);
1169
1220
  // Add module to maps
1170
- let info = /** @type {ChunksInfoItem} */ (chunksInfoMap.get(key));
1221
+ let info = chunksInfoMap.get(key);
1171
1222
  if (info === undefined) {
1172
1223
  chunksInfoMap.set(
1173
1224
  key,
@@ -1230,15 +1281,16 @@ module.exports = class SplitChunksPlugin {
1230
1281
  const getCombsByUsedExports = memoize(() => {
1231
1282
  // fill the groupedByExportsMap
1232
1283
  getExportsChunkSetsInGraph();
1233
- /** @type {Set<Set<Chunk> | Chunk>} */
1284
+ /** @type {Set<ChunkSet | Chunk>} */
1234
1285
  const set = new Set();
1235
1286
  const groupedByUsedExports =
1236
1287
  /** @type {Iterable<Chunk[]>} */
1237
1288
  (groupedByExportsMap.get(module));
1238
1289
  for (const chunks of groupedByUsedExports) {
1239
1290
  const chunksKey = getKey(chunks);
1240
- for (const comb of getExportsCombinations(chunksKey))
1291
+ for (const comb of getExportsCombinations(chunksKey)) {
1241
1292
  set.add(comb);
1293
+ }
1242
1294
  }
1243
1295
  return set;
1244
1296
  });
@@ -1260,7 +1312,8 @@ module.exports = class SplitChunksPlugin {
1260
1312
  const { chunks: selectedChunks, key: selectedChunksKey } =
1261
1313
  getSelectedChunks(
1262
1314
  chunkCombination,
1263
- /** @type {ChunkFilterFunction} */ (cacheGroup.chunksFilter)
1315
+ /** @type {ChunkFilterFn} */
1316
+ (cacheGroup.chunksFilter)
1264
1317
  );
1265
1318
 
1266
1319
  addModuleToChunksInfoMap(
@@ -1281,12 +1334,12 @@ module.exports = class SplitChunksPlugin {
1281
1334
 
1282
1335
  /**
1283
1336
  * @param {ChunksInfoItem} info entry
1284
- * @param {string[]} sourceTypes source types to be removed
1337
+ * @param {SourceTypes} sourceTypes source types to be removed
1285
1338
  */
1286
1339
  const removeModulesWithSourceType = (info, sourceTypes) => {
1287
1340
  for (const module of info.modules) {
1288
1341
  const types = module.getSourceTypes();
1289
- if (sourceTypes.some(type => types.has(type))) {
1342
+ if (sourceTypes.some((type) => types.has(type))) {
1290
1343
  info.modules.delete(module);
1291
1344
  for (const type of types) {
1292
1345
  info.sizes[type] -= module.size(type);
@@ -1299,7 +1352,7 @@ module.exports = class SplitChunksPlugin {
1299
1352
  * @param {ChunksInfoItem} info entry
1300
1353
  * @returns {boolean} true, if entry become empty
1301
1354
  */
1302
- const removeMinSizeViolatingModules = info => {
1355
+ const removeMinSizeViolatingModules = (info) => {
1303
1356
  if (!info.cacheGroup._validateSize) return false;
1304
1357
  const violatingSizes = getViolatingMinSizes(
1305
1358
  info.sizes,
@@ -1356,7 +1409,7 @@ module.exports = class SplitChunksPlugin {
1356
1409
  const item = /** @type {ChunksInfoItem} */ (bestEntry);
1357
1410
  chunksInfoMap.delete(/** @type {string} */ (bestEntryKey));
1358
1411
 
1359
- /** @type {Chunk["name"] | undefined} */
1412
+ /** @type {ChunkName | undefined} */
1360
1413
  let chunkName = item.name;
1361
1414
  // Variable for the new chunk (lazy created)
1362
1415
  /** @type {Chunk | undefined} */
@@ -1428,18 +1481,14 @@ module.exports = class SplitChunksPlugin {
1428
1481
  ) {
1429
1482
  for (const chunk of usedChunks) {
1430
1483
  // respect max requests
1431
- const maxRequests = /** @type {number} */ (
1432
- chunk.isOnlyInitial()
1433
- ? item.cacheGroup.maxInitialRequests
1434
- : chunk.canBeInitial()
1435
- ? Math.min(
1436
- /** @type {number} */
1437
- (item.cacheGroup.maxInitialRequests),
1438
- /** @type {number} */
1439
- (item.cacheGroup.maxAsyncRequests)
1440
- )
1441
- : item.cacheGroup.maxAsyncRequests
1442
- );
1484
+ const maxRequests = chunk.isOnlyInitial()
1485
+ ? item.cacheGroup.maxInitialRequests
1486
+ : chunk.canBeInitial()
1487
+ ? Math.min(
1488
+ item.cacheGroup.maxInitialRequests,
1489
+ item.cacheGroup.maxAsyncRequests
1490
+ )
1491
+ : item.cacheGroup.maxAsyncRequests;
1443
1492
  if (
1444
1493
  Number.isFinite(maxRequests) &&
1445
1494
  getRequests(chunk) >= maxRequests
@@ -1459,13 +1508,11 @@ module.exports = class SplitChunksPlugin {
1459
1508
  // Were some (invalid) chunks removed from usedChunks?
1460
1509
  // => readd all modules to the queue, as things could have been changed
1461
1510
  if (usedChunks.size < item.chunks.size) {
1462
- if (isExistingChunk)
1511
+ if (isExistingChunk) {
1463
1512
  usedChunks.add(/** @type {Chunk} */ (newChunk));
1464
- if (
1465
- /** @type {number} */ (usedChunks.size) >=
1466
- /** @type {number} */ (item.cacheGroup.minChunks)
1467
- ) {
1468
- const chunksArr = Array.from(usedChunks);
1513
+ }
1514
+ if (usedChunks.size >= item.cacheGroup.minChunks) {
1515
+ const chunksArr = [...usedChunks];
1469
1516
  for (const module of item.modules) {
1470
1517
  addModuleToChunksInfoMap(
1471
1518
  item.cacheGroup,
@@ -1591,7 +1638,7 @@ module.exports = class SplitChunksPlugin {
1591
1638
  : item.cacheGroup.maxInitialSize,
1592
1639
  automaticNameDelimiter: item.cacheGroup.automaticNameDelimiter,
1593
1640
  keys: oldMaxSizeSettings
1594
- ? oldMaxSizeSettings.keys.concat(item.cacheGroup.key)
1641
+ ? [...oldMaxSizeSettings.keys, item.cacheGroup.key]
1595
1642
  : [item.cacheGroup.key]
1596
1643
  });
1597
1644
  }
@@ -1645,7 +1692,7 @@ module.exports = class SplitChunksPlugin {
1645
1692
 
1646
1693
  // Make sure that maxSize is fulfilled
1647
1694
  const { fallbackCacheGroup } = this.options;
1648
- for (const chunk of Array.from(compilation.chunks)) {
1695
+ for (const chunk of compilation.chunks) {
1649
1696
  const chunkConfig = maxSizeQueueMap.get(chunk);
1650
1697
  const {
1651
1698
  minSize,
@@ -1653,8 +1700,9 @@ module.exports = class SplitChunksPlugin {
1653
1700
  maxInitialSize,
1654
1701
  automaticNameDelimiter
1655
1702
  } = chunkConfig || fallbackCacheGroup;
1656
- if (!chunkConfig && !fallbackCacheGroup.chunksFilter(chunk))
1703
+ if (!chunkConfig && !fallbackCacheGroup.chunksFilter(chunk)) {
1657
1704
  continue;
1705
+ }
1658
1706
  /** @type {SplitChunksSizes} */
1659
1707
  let maxSize;
1660
1708
  if (chunk.isOnlyInitial()) {
@@ -1667,7 +1715,9 @@ module.exports = class SplitChunksPlugin {
1667
1715
  if (Object.keys(maxSize).length === 0) {
1668
1716
  continue;
1669
1717
  }
1670
- for (const key of Object.keys(maxSize)) {
1718
+ for (const key of /** @type {SourceType[]} */ (
1719
+ Object.keys(maxSize)
1720
+ )) {
1671
1721
  const maxSizeValue = maxSize[key];
1672
1722
  const minSizeValue = minSize[key];
1673
1723
  if (
@@ -1738,11 +1788,12 @@ module.exports = class SplitChunksPlugin {
1738
1788
  hashFilename(name, outputOptions);
1739
1789
  }
1740
1790
  if (i !== results.length - 1) {
1741
- const newPart = compilation.addChunk(
1742
- /** @type {Chunk["name"]} */ (name)
1743
- );
1791
+ const newPart = compilation.addChunk(name);
1744
1792
  chunk.split(newPart);
1745
1793
  newPart.chunkReason = chunk.chunkReason;
1794
+ if (chunk.filenameTemplate) {
1795
+ newPart.filenameTemplate = chunk.filenameTemplate;
1796
+ }
1746
1797
  // Add all modules to the new chunk
1747
1798
  for (const module of group.items) {
1748
1799
  if (!module.chunkCondition(newPart, compilation)) {
@@ -1755,7 +1806,7 @@ module.exports = class SplitChunksPlugin {
1755
1806
  }
1756
1807
  } else {
1757
1808
  // change the chunk to be a part
1758
- chunk.name = /** @type {Chunk["name"]} */ (name);
1809
+ chunk.name = name;
1759
1810
  }
1760
1811
  }
1761
1812
  }