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
@@ -8,20 +8,21 @@
8
8
  const { STAGE_ADVANCED } = require("../OptimizationStages");
9
9
  const { intersect } = require("../util/SetHelpers");
10
10
  const {
11
- compareModulesByIdentifier,
12
- compareChunks
11
+ compareChunks,
12
+ compareModulesByIdentifier
13
13
  } = require("../util/comparators");
14
14
  const createSchemaValidation = require("../util/create-schema-validation");
15
15
  const identifierUtils = require("../util/identifier");
16
16
 
17
17
  /** @typedef {import("../../declarations/plugins/optimize/AggressiveSplittingPlugin").AggressiveSplittingPluginOptions} AggressiveSplittingPluginOptions */
18
18
  /** @typedef {import("../Chunk")} Chunk */
19
+ /** @typedef {import("../Chunk").ChunkId} ChunkId */
19
20
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
20
21
  /** @typedef {import("../Compiler")} Compiler */
21
22
  /** @typedef {import("../Module")} Module */
22
23
 
23
24
  const validate = createSchemaValidation(
24
- require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.check.js"),
25
+ require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.check"),
25
26
  () =>
26
27
  require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.json"),
27
28
  {
@@ -36,7 +37,7 @@ const validate = createSchemaValidation(
36
37
  * @param {Chunk} newChunk the new chunk
37
38
  * @returns {(module: Module) => void} function to move module between chunks
38
39
  */
39
- const moveModuleBetween = (chunkGraph, oldChunk, newChunk) => module => {
40
+ const moveModuleBetween = (chunkGraph, oldChunk, newChunk) => (module) => {
40
41
  chunkGraph.disconnectChunkAndModule(oldChunk, module);
41
42
  chunkGraph.connectChunkAndModule(newChunk, module);
42
43
  };
@@ -44,14 +45,18 @@ const moveModuleBetween = (chunkGraph, oldChunk, newChunk) => module => {
44
45
  /**
45
46
  * @param {ChunkGraph} chunkGraph the chunk graph
46
47
  * @param {Chunk} chunk the chunk
47
- * @returns {function(Module): boolean} filter for entry module
48
+ * @returns {(module: Module) => boolean} filter for entry module
48
49
  */
49
- const isNotAEntryModule = (chunkGraph, chunk) => module =>
50
+ const isNotAEntryModule = (chunkGraph, chunk) => (module) =>
50
51
  !chunkGraph.isEntryModuleInChunk(module, chunk);
51
52
 
53
+ /** @typedef {{ id?: NonNullable<Chunk["id"]>, hash?: NonNullable<Chunk["hash"]>, modules: Module[], size: number }} SplitData */
54
+
52
55
  /** @type {WeakSet<Chunk>} */
53
56
  const recordedChunks = new WeakSet();
54
57
 
58
+ const PLUGIN_NAME = "AggressiveSplittingPlugin";
59
+
55
60
  class AggressiveSplittingPlugin {
56
61
  /**
57
62
  * @param {AggressiveSplittingPluginOptions=} options options object
@@ -88,261 +93,251 @@ class AggressiveSplittingPlugin {
88
93
  * @returns {void}
89
94
  */
90
95
  apply(compiler) {
91
- compiler.hooks.thisCompilation.tap(
92
- "AggressiveSplittingPlugin",
93
- compilation => {
94
- let needAdditionalSeal = false;
95
- /** @typedef {{ id?: NonNullable<Chunk["id"]>, hash?: NonNullable<Chunk["hash"]>, modules: Module[], size: number }} SplitData */
96
- /** @type {SplitData[]} */
97
- let newSplits;
98
- /** @type {Set<Chunk>} */
99
- let fromAggressiveSplittingSet;
100
- /** @type {Map<Chunk, SplitData>} */
101
- let chunkSplitDataMap;
102
- compilation.hooks.optimize.tap("AggressiveSplittingPlugin", () => {
103
- newSplits = [];
104
- fromAggressiveSplittingSet = new Set();
105
- chunkSplitDataMap = new Map();
106
- });
107
- compilation.hooks.optimizeChunks.tap(
108
- {
109
- name: "AggressiveSplittingPlugin",
110
- stage: STAGE_ADVANCED
111
- },
112
- chunks => {
113
- const chunkGraph = compilation.chunkGraph;
114
- // Precompute stuff
115
- const nameToModuleMap = new Map();
116
- const moduleToNameMap = new Map();
117
- const makePathsRelative =
118
- identifierUtils.makePathsRelative.bindContextCache(
119
- compiler.context,
120
- compiler.root
121
- );
122
- for (const m of compilation.modules) {
123
- const name = makePathsRelative(m.identifier());
124
- nameToModuleMap.set(name, m);
125
- moduleToNameMap.set(m, name);
126
- }
96
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
97
+ let needAdditionalSeal = false;
98
+ /** @type {SplitData[]} */
99
+ let newSplits;
100
+ /** @type {Set<Chunk>} */
101
+ let fromAggressiveSplittingSet;
102
+ /** @type {Map<Chunk, SplitData>} */
103
+ let chunkSplitDataMap;
104
+ compilation.hooks.optimize.tap(PLUGIN_NAME, () => {
105
+ newSplits = [];
106
+ fromAggressiveSplittingSet = new Set();
107
+ chunkSplitDataMap = new Map();
108
+ });
109
+ compilation.hooks.optimizeChunks.tap(
110
+ {
111
+ name: PLUGIN_NAME,
112
+ stage: STAGE_ADVANCED
113
+ },
114
+ (chunks) => {
115
+ const chunkGraph = compilation.chunkGraph;
116
+ // Precompute stuff
117
+ const nameToModuleMap = new Map();
118
+ const moduleToNameMap = new Map();
119
+ const makePathsRelative =
120
+ identifierUtils.makePathsRelative.bindContextCache(
121
+ compiler.context,
122
+ compiler.root
123
+ );
124
+ for (const m of compilation.modules) {
125
+ const name = makePathsRelative(m.identifier());
126
+ nameToModuleMap.set(name, m);
127
+ moduleToNameMap.set(m, name);
128
+ }
129
+
130
+ // Check used chunk ids
131
+ /** @typedef {Set<ChunkId>} */
132
+ const usedIds = new Set();
133
+ for (const chunk of chunks) {
134
+ usedIds.add(chunk.id);
135
+ }
136
+
137
+ const recordedSplits =
138
+ (compilation.records && compilation.records.aggressiveSplits) || [];
139
+ const usedSplits = newSplits
140
+ ? [...recordedSplits, ...newSplits]
141
+ : recordedSplits;
142
+
143
+ const minSize = /** @type {number} */ (this.options.minSize);
144
+ const maxSize = /** @type {number} */ (this.options.maxSize);
127
145
 
128
- // Check used chunk ids
129
- const usedIds = new Set();
130
- for (const chunk of chunks) {
131
- usedIds.add(chunk.id);
146
+ /**
147
+ * @param {SplitData} splitData split data
148
+ * @returns {boolean} true when applied, otherwise false
149
+ */
150
+ const applySplit = (splitData) => {
151
+ // Cannot split if id is already taken
152
+ if (splitData.id !== undefined && usedIds.has(splitData.id)) {
153
+ return false;
132
154
  }
133
155
 
134
- const recordedSplits =
135
- (compilation.records && compilation.records.aggressiveSplits) ||
136
- [];
137
- const usedSplits = newSplits
138
- ? recordedSplits.concat(newSplits)
139
- : recordedSplits;
140
-
141
- const minSize = /** @type {number} */ (this.options.minSize);
142
- const maxSize = /** @type {number} */ (this.options.maxSize);
143
-
144
- /**
145
- * @param {SplitData} splitData split data
146
- * @returns {boolean} true when applied, otherwise false
147
- */
148
- const applySplit = splitData => {
149
- // Cannot split if id is already taken
150
- if (splitData.id !== undefined && usedIds.has(splitData.id)) {
151
- return false;
152
- }
156
+ // Get module objects from names
157
+ const selectedModules = splitData.modules.map((name) =>
158
+ nameToModuleMap.get(name)
159
+ );
153
160
 
154
- // Get module objects from names
155
- const selectedModules = splitData.modules.map(name =>
156
- nameToModuleMap.get(name)
157
- );
158
-
159
- // Does the modules exist at all?
160
- if (!selectedModules.every(Boolean)) return false;
161
-
162
- // Check if size matches (faster than waiting for hash)
163
- let size = 0;
164
- for (const m of selectedModules) size += m.size();
165
- if (size !== splitData.size) return false;
166
-
167
- // get chunks with all modules
168
- const selectedChunks = intersect(
169
- selectedModules.map(
170
- m => new Set(chunkGraph.getModuleChunksIterable(m))
171
- )
172
- );
173
-
174
- // No relevant chunks found
175
- if (selectedChunks.size === 0) return false;
176
-
177
- // The found chunk is already the split or similar
178
- if (
179
- selectedChunks.size === 1 &&
180
- chunkGraph.getNumberOfChunkModules(
181
- Array.from(selectedChunks)[0]
182
- ) === selectedModules.length
183
- ) {
184
- const chunk = Array.from(selectedChunks)[0];
185
- if (fromAggressiveSplittingSet.has(chunk)) return false;
186
- fromAggressiveSplittingSet.add(chunk);
187
- chunkSplitDataMap.set(chunk, splitData);
188
- return true;
189
- }
161
+ // Does the modules exist at all?
162
+ if (!selectedModules.every(Boolean)) return false;
190
163
 
191
- // split the chunk into two parts
192
- const newChunk = compilation.addChunk();
193
- newChunk.chunkReason = "aggressive splitted";
194
- for (const chunk of selectedChunks) {
195
- for (const module of selectedModules) {
196
- moveModuleBetween(chunkGraph, chunk, newChunk)(module);
197
- }
198
- chunk.split(newChunk);
199
- chunk.name = /** @type {TODO} */ (null);
200
- }
201
- fromAggressiveSplittingSet.add(newChunk);
202
- chunkSplitDataMap.set(newChunk, splitData);
164
+ // Check if size matches (faster than waiting for hash)
165
+ let size = 0;
166
+ for (const m of selectedModules) size += m.size();
167
+ if (size !== splitData.size) return false;
203
168
 
204
- if (splitData.id !== null && splitData.id !== undefined) {
205
- newChunk.id = splitData.id;
206
- newChunk.ids = [splitData.id];
207
- }
208
- return true;
209
- };
169
+ // get chunks with all modules
170
+ const selectedChunks = intersect(
171
+ selectedModules.map(
172
+ (m) => new Set(chunkGraph.getModuleChunksIterable(m))
173
+ )
174
+ );
210
175
 
211
- // try to restore to recorded splitting
212
- let changed = false;
213
- for (let j = 0; j < usedSplits.length; j++) {
214
- const splitData = usedSplits[j];
215
- if (applySplit(splitData)) changed = true;
176
+ // No relevant chunks found
177
+ if (selectedChunks.size === 0) return false;
178
+
179
+ // The found chunk is already the split or similar
180
+ if (
181
+ selectedChunks.size === 1 &&
182
+ chunkGraph.getNumberOfChunkModules([...selectedChunks][0]) ===
183
+ selectedModules.length
184
+ ) {
185
+ const chunk = [...selectedChunks][0];
186
+ if (fromAggressiveSplittingSet.has(chunk)) return false;
187
+ fromAggressiveSplittingSet.add(chunk);
188
+ chunkSplitDataMap.set(chunk, splitData);
189
+ return true;
216
190
  }
217
191
 
218
- // for any chunk which isn't splitted yet, split it and create a new entry
219
- // start with the biggest chunk
220
- const cmpFn = compareChunks(chunkGraph);
221
- const sortedChunks = Array.from(chunks).sort((a, b) => {
222
- const diff1 =
223
- chunkGraph.getChunkModulesSize(b) -
224
- chunkGraph.getChunkModulesSize(a);
225
- if (diff1) return diff1;
226
- const diff2 =
227
- chunkGraph.getNumberOfChunkModules(a) -
228
- chunkGraph.getNumberOfChunkModules(b);
229
- if (diff2) return diff2;
230
- return cmpFn(a, b);
231
- });
232
- for (const chunk of sortedChunks) {
233
- if (fromAggressiveSplittingSet.has(chunk)) continue;
234
- const size = chunkGraph.getChunkModulesSize(chunk);
235
- if (
236
- size > maxSize &&
237
- chunkGraph.getNumberOfChunkModules(chunk) > 1
238
- ) {
239
- const modules = chunkGraph
240
- .getOrderedChunkModules(chunk, compareModulesByIdentifier)
241
- .filter(isNotAEntryModule(chunkGraph, chunk));
242
- const selectedModules = [];
243
- let selectedModulesSize = 0;
244
- for (let k = 0; k < modules.length; k++) {
245
- const module = modules[k];
246
- const newSize = selectedModulesSize + module.size();
247
- if (newSize > maxSize && selectedModulesSize >= minSize) {
248
- break;
249
- }
250
- selectedModulesSize = newSize;
251
- selectedModules.push(module);
252
- }
253
- if (selectedModules.length === 0) continue;
254
- /** @type {SplitData} */
255
- const splitData = {
256
- modules: selectedModules
257
- .map(m => moduleToNameMap.get(m))
258
- .sort(),
259
- size: selectedModulesSize
260
- };
261
-
262
- if (applySplit(splitData)) {
263
- newSplits = (newSplits || []).concat(splitData);
264
- changed = true;
265
- }
192
+ // split the chunk into two parts
193
+ const newChunk = compilation.addChunk();
194
+ newChunk.chunkReason = "aggressive splitted";
195
+ for (const chunk of selectedChunks) {
196
+ for (const module of selectedModules) {
197
+ moveModuleBetween(chunkGraph, chunk, newChunk)(module);
266
198
  }
199
+ chunk.split(newChunk);
200
+ chunk.name = null;
267
201
  }
268
- if (changed) return true;
269
- }
270
- );
271
- compilation.hooks.recordHash.tap(
272
- "AggressiveSplittingPlugin",
273
- records => {
274
- // 4. save made splittings to records
275
- const allSplits = new Set();
276
- /** @type {Set<SplitData>} */
277
- const invalidSplits = new Set();
278
-
279
- // Check if some splittings are invalid
280
- // We remove invalid splittings and try again
281
- for (const chunk of compilation.chunks) {
282
- const splitData = chunkSplitDataMap.get(chunk);
283
- if (
284
- splitData !== undefined &&
285
- splitData.hash &&
286
- chunk.hash !== splitData.hash
287
- ) {
288
- // Split was successful, but hash doesn't equal
289
- // We can throw away the split since it's useless now
290
- invalidSplits.add(splitData);
291
- }
202
+ fromAggressiveSplittingSet.add(newChunk);
203
+ chunkSplitDataMap.set(newChunk, splitData);
204
+
205
+ if (splitData.id !== null && splitData.id !== undefined) {
206
+ newChunk.id = splitData.id;
207
+ newChunk.ids = [splitData.id];
292
208
  }
209
+ return true;
210
+ };
211
+
212
+ // try to restore to recorded splitting
213
+ let changed = false;
214
+ for (let j = 0; j < usedSplits.length; j++) {
215
+ const splitData = usedSplits[j];
216
+ if (applySplit(splitData)) changed = true;
217
+ }
293
218
 
294
- if (invalidSplits.size > 0) {
295
- records.aggressiveSplits =
296
- /** @type {SplitData[]} */
297
- (records.aggressiveSplits).filter(
298
- splitData => !invalidSplits.has(splitData)
299
- );
300
- needAdditionalSeal = true;
301
- } else {
302
- // set hash and id values on all (new) splittings
303
- for (const chunk of compilation.chunks) {
304
- const splitData = chunkSplitDataMap.get(chunk);
305
- if (splitData !== undefined) {
306
- splitData.hash =
307
- /** @type {NonNullable<Chunk["hash"]>} */
308
- (chunk.hash);
309
- splitData.id =
310
- /** @type {NonNullable<Chunk["id"]>} */
311
- (chunk.id);
312
- allSplits.add(splitData);
313
- // set flag for stats
314
- recordedChunks.add(chunk);
219
+ // for any chunk which isn't splitted yet, split it and create a new entry
220
+ // start with the biggest chunk
221
+ const cmpFn = compareChunks(chunkGraph);
222
+ const sortedChunks = [...chunks].sort((a, b) => {
223
+ const diff1 =
224
+ chunkGraph.getChunkModulesSize(b) -
225
+ chunkGraph.getChunkModulesSize(a);
226
+ if (diff1) return diff1;
227
+ const diff2 =
228
+ chunkGraph.getNumberOfChunkModules(a) -
229
+ chunkGraph.getNumberOfChunkModules(b);
230
+ if (diff2) return diff2;
231
+ return cmpFn(a, b);
232
+ });
233
+ for (const chunk of sortedChunks) {
234
+ if (fromAggressiveSplittingSet.has(chunk)) continue;
235
+ const size = chunkGraph.getChunkModulesSize(chunk);
236
+ if (
237
+ size > maxSize &&
238
+ chunkGraph.getNumberOfChunkModules(chunk) > 1
239
+ ) {
240
+ const modules = chunkGraph
241
+ .getOrderedChunkModules(chunk, compareModulesByIdentifier)
242
+ .filter(isNotAEntryModule(chunkGraph, chunk));
243
+ const selectedModules = [];
244
+ let selectedModulesSize = 0;
245
+ for (let k = 0; k < modules.length; k++) {
246
+ const module = modules[k];
247
+ const newSize = selectedModulesSize + module.size();
248
+ if (newSize > maxSize && selectedModulesSize >= minSize) {
249
+ break;
315
250
  }
251
+ selectedModulesSize = newSize;
252
+ selectedModules.push(module);
316
253
  }
254
+ if (selectedModules.length === 0) continue;
255
+ /** @type {SplitData} */
256
+ const splitData = {
257
+ modules: selectedModules
258
+ .map((m) => moduleToNameMap.get(m))
259
+ .sort(),
260
+ size: selectedModulesSize
261
+ };
317
262
 
318
- // Also add all unused historical splits (after the used ones)
319
- // They can still be used in some future compilation
320
- const recordedSplits =
321
- compilation.records && compilation.records.aggressiveSplits;
322
- if (recordedSplits) {
323
- for (const splitData of recordedSplits) {
324
- if (!invalidSplits.has(splitData)) allSplits.add(splitData);
325
- }
263
+ if (applySplit(splitData)) {
264
+ newSplits = [...(newSplits || []), splitData];
265
+ changed = true;
326
266
  }
267
+ }
268
+ }
269
+ if (changed) return true;
270
+ }
271
+ );
272
+ compilation.hooks.recordHash.tap(PLUGIN_NAME, (records) => {
273
+ // 4. save made splittings to records
274
+ const allSplits = new Set();
275
+ /** @type {Set<SplitData>} */
276
+ const invalidSplits = new Set();
327
277
 
328
- // record all splits
329
- records.aggressiveSplits = Array.from(allSplits);
278
+ // Check if some splittings are invalid
279
+ // We remove invalid splittings and try again
280
+ for (const chunk of compilation.chunks) {
281
+ const splitData = chunkSplitDataMap.get(chunk);
282
+ if (
283
+ splitData !== undefined &&
284
+ splitData.hash &&
285
+ chunk.hash !== splitData.hash
286
+ ) {
287
+ // Split was successful, but hash doesn't equal
288
+ // We can throw away the split since it's useless now
289
+ invalidSplits.add(splitData);
290
+ }
291
+ }
330
292
 
331
- needAdditionalSeal = false;
293
+ if (invalidSplits.size > 0) {
294
+ records.aggressiveSplits =
295
+ /** @type {SplitData[]} */
296
+ (records.aggressiveSplits).filter(
297
+ (splitData) => !invalidSplits.has(splitData)
298
+ );
299
+ needAdditionalSeal = true;
300
+ } else {
301
+ // set hash and id values on all (new) splittings
302
+ for (const chunk of compilation.chunks) {
303
+ const splitData = chunkSplitDataMap.get(chunk);
304
+ if (splitData !== undefined) {
305
+ splitData.hash =
306
+ /** @type {NonNullable<Chunk["hash"]>} */
307
+ (chunk.hash);
308
+ splitData.id =
309
+ /** @type {NonNullable<Chunk["id"]>} */
310
+ (chunk.id);
311
+ allSplits.add(splitData);
312
+ // set flag for stats
313
+ recordedChunks.add(chunk);
332
314
  }
333
315
  }
334
- );
335
- compilation.hooks.needAdditionalSeal.tap(
336
- "AggressiveSplittingPlugin",
337
- () => {
338
- if (needAdditionalSeal) {
339
- needAdditionalSeal = false;
340
- return true;
316
+
317
+ // Also add all unused historical splits (after the used ones)
318
+ // They can still be used in some future compilation
319
+ const recordedSplits =
320
+ compilation.records && compilation.records.aggressiveSplits;
321
+ if (recordedSplits) {
322
+ for (const splitData of recordedSplits) {
323
+ if (!invalidSplits.has(splitData)) allSplits.add(splitData);
341
324
  }
342
325
  }
343
- );
344
- }
345
- );
326
+
327
+ // record all splits
328
+ records.aggressiveSplits = [...allSplits];
329
+
330
+ needAdditionalSeal = false;
331
+ }
332
+ });
333
+ compilation.hooks.needAdditionalSeal.tap(PLUGIN_NAME, () => {
334
+ if (needAdditionalSeal) {
335
+ needAdditionalSeal = false;
336
+ return true;
337
+ }
338
+ });
339
+ });
346
340
  }
347
341
  }
342
+
348
343
  module.exports = AggressiveSplittingPlugin;