webpack 5.59.0 → 5.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -11,83 +11,108 @@ const smartGrouping = require("../util/smartGrouping");
11
11
 
12
12
  /** @typedef {import("../Chunk")} Chunk */
13
13
  /** @typedef {import("../Compilation")} Compilation */
14
+ /** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
14
15
  /** @typedef {import("../Module")} Module */
15
16
  /** @typedef {import("../WebpackError")} WebpackError */
17
+ /** @typedef {import("../util/comparators").Comparator<any>} Comparator */
16
18
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
17
-
18
19
  /** @typedef {import("../util/smartGrouping").GroupConfig<any, object>} GroupConfig */
19
20
 
20
21
  /**
21
- * @typedef {Object} KnownStatsFactoryContext
22
+ * @typedef {object} KnownStatsFactoryContext
22
23
  * @property {string} type
23
- * @property {function(string): string=} makePathsRelative
24
- * @property {Compilation=} compilation
25
- * @property {Set<Module>=} rootModules
26
- * @property {Map<string,Chunk[]>=} compilationFileToChunks
27
- * @property {Map<string,Chunk[]>=} compilationAuxiliaryFileToChunks
28
- * @property {RuntimeSpec=} runtime
29
- * @property {function(Compilation): WebpackError[]=} cachedGetErrors
30
- * @property {function(Compilation): WebpackError[]=} cachedGetWarnings
24
+ * @property {function(string): string} makePathsRelative
25
+ * @property {Compilation} compilation
26
+ * @property {Set<Module>} rootModules
27
+ * @property {Map<string,Chunk[]>} compilationFileToChunks
28
+ * @property {Map<string,Chunk[]>} compilationAuxiliaryFileToChunks
29
+ * @property {RuntimeSpec} runtime
30
+ * @property {function(Compilation): WebpackError[]} cachedGetErrors
31
+ * @property {function(Compilation): WebpackError[]} cachedGetWarnings
32
+ */
33
+
34
+ /** @typedef {Record<string, any> & KnownStatsFactoryContext} StatsFactoryContext */
35
+
36
+ /** @typedef {any} CreatedObject */
37
+ /** @typedef {any} FactoryData */
38
+ /** @typedef {any} FactoryDataItem */
39
+ /** @typedef {any} Result */
40
+ /** @typedef {Record<string, any>} ObjectForExtract */
41
+
42
+ /**
43
+ * @typedef {object} StatsFactoryHooks
44
+ * @property {HookMap<SyncBailHook<[ObjectForExtract, FactoryData, StatsFactoryContext], undefined>>} extract
45
+ * @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filter
46
+ * @property {HookMap<SyncBailHook<[Comparator[], StatsFactoryContext], undefined>>} sort
47
+ * @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filterSorted
48
+ * @property {HookMap<SyncBailHook<[GroupConfig[], StatsFactoryContext], undefined>>} groupResults
49
+ * @property {HookMap<SyncBailHook<[Comparator[], StatsFactoryContext], undefined>>} sortResults
50
+ * @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filterResults
51
+ * @property {HookMap<SyncBailHook<[FactoryDataItem[], StatsFactoryContext], Result>>} merge
52
+ * @property {HookMap<SyncBailHook<[Result, StatsFactoryContext], Result>>} result
53
+ * @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext], string>>} getItemName
54
+ * @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext], StatsFactory | undefined>>} getItemFactory
31
55
  */
32
56
 
33
- /** @typedef {KnownStatsFactoryContext & Record<string, any>} StatsFactoryContext */
57
+ /**
58
+ * @template T
59
+ * @typedef {Map<string, T[]>} Caches
60
+ */
34
61
 
35
62
  class StatsFactory {
36
63
  constructor() {
64
+ /** @type {StatsFactoryHooks} */
37
65
  this.hooks = Object.freeze({
38
- /** @type {HookMap<SyncBailHook<[Object, any, StatsFactoryContext]>>} */
39
66
  extract: new HookMap(
40
67
  () => new SyncBailHook(["object", "data", "context"])
41
68
  ),
42
- /** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
43
69
  filter: new HookMap(
44
70
  () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
45
71
  ),
46
- /** @type {HookMap<SyncBailHook<[(function(any, any): number)[], StatsFactoryContext]>>} */
47
72
  sort: new HookMap(() => new SyncBailHook(["comparators", "context"])),
48
- /** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
49
73
  filterSorted: new HookMap(
50
74
  () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
51
75
  ),
52
- /** @type {HookMap<SyncBailHook<[GroupConfig[], StatsFactoryContext]>>} */
53
76
  groupResults: new HookMap(
54
77
  () => new SyncBailHook(["groupConfigs", "context"])
55
78
  ),
56
- /** @type {HookMap<SyncBailHook<[(function(any, any): number)[], StatsFactoryContext]>>} */
57
79
  sortResults: new HookMap(
58
80
  () => new SyncBailHook(["comparators", "context"])
59
81
  ),
60
- /** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
61
82
  filterResults: new HookMap(
62
83
  () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
63
84
  ),
64
- /** @type {HookMap<SyncBailHook<[any[], StatsFactoryContext]>>} */
65
85
  merge: new HookMap(() => new SyncBailHook(["items", "context"])),
66
- /** @type {HookMap<SyncBailHook<[any[], StatsFactoryContext]>>} */
67
86
  result: new HookMap(() => new SyncWaterfallHook(["result", "context"])),
68
- /** @type {HookMap<SyncBailHook<[any, StatsFactoryContext]>>} */
69
87
  getItemName: new HookMap(() => new SyncBailHook(["item", "context"])),
70
- /** @type {HookMap<SyncBailHook<[any, StatsFactoryContext]>>} */
71
88
  getItemFactory: new HookMap(() => new SyncBailHook(["item", "context"]))
72
89
  });
73
90
  const hooks = this.hooks;
74
- this._caches =
75
- /** @type {Record<keyof typeof hooks, Map<string, SyncBailHook<[any[], StatsFactoryContext]>[]>>} */ ({});
91
+ this._caches = /** @type {TODO} */ ({});
76
92
  for (const key of Object.keys(hooks)) {
77
- this._caches[key] = new Map();
93
+ this._caches[/** @type {keyof StatsFactoryHooks} */ (key)] = new Map();
78
94
  }
79
95
  this._inCreate = false;
80
96
  }
81
97
 
98
+ /**
99
+ * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
100
+ * @template {HM extends HookMap<infer H> ? H : never} H
101
+ * @param {HM} hookMap hook map
102
+ * @param {Caches<H>} cache cache
103
+ * @param {string} type type
104
+ * @returns {H[]} hooks
105
+ * @private
106
+ */
82
107
  _getAllLevelHooks(hookMap, cache, type) {
83
108
  const cacheEntry = cache.get(type);
84
109
  if (cacheEntry !== undefined) {
85
110
  return cacheEntry;
86
111
  }
87
- const hooks = [];
112
+ const hooks = /** @type {H[]} */ ([]);
88
113
  const typeParts = type.split(".");
89
114
  for (let i = 0; i < typeParts.length; i++) {
90
- const hook = hookMap.get(typeParts.slice(i).join("."));
115
+ const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join(".")));
91
116
  if (hook) {
92
117
  hooks.push(hook);
93
118
  }
@@ -96,27 +121,62 @@ class StatsFactory {
96
121
  return hooks;
97
122
  }
98
123
 
124
+ /**
125
+ * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
126
+ * @template {HM extends HookMap<infer H> ? H : never} H
127
+ * @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
128
+ * @param {HM} hookMap hook map
129
+ * @param {Caches<H>} cache cache
130
+ * @param {string} type type
131
+ * @param {function(H): R | undefined} fn fn
132
+ * @returns {R | undefined} hook
133
+ * @private
134
+ */
99
135
  _forEachLevel(hookMap, cache, type, fn) {
100
136
  for (const hook of this._getAllLevelHooks(hookMap, cache, type)) {
101
- const result = fn(hook);
137
+ const result = fn(/** @type {H} */ (hook));
102
138
  if (result !== undefined) return result;
103
139
  }
104
140
  }
105
141
 
142
+ /**
143
+ * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
144
+ * @template {HM extends HookMap<infer H> ? H : never} H
145
+ * @param {HM} hookMap hook map
146
+ * @param {Caches<H>} cache cache
147
+ * @param {string} type type
148
+ * @param {FactoryData} data data
149
+ * @param {function(H, FactoryData): FactoryData} fn fn
150
+ * @returns {FactoryData} data
151
+ * @private
152
+ */
106
153
  _forEachLevelWaterfall(hookMap, cache, type, data, fn) {
107
154
  for (const hook of this._getAllLevelHooks(hookMap, cache, type)) {
108
- data = fn(hook, data);
155
+ data = fn(/** @type {H} */ (hook), data);
109
156
  }
110
157
  return data;
111
158
  }
112
159
 
160
+ /**
161
+ * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} T
162
+ * @template {T extends HookMap<infer H> ? H : never} H
163
+ * @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
164
+ * @param {T} hookMap hook map
165
+ * @param {Caches<H>} cache cache
166
+ * @param {string} type type
167
+ * @param {Array<FactoryData>} items items
168
+ * @param {function(H, R, number, number): R | undefined} fn fn
169
+ * @param {boolean} forceClone force clone
170
+ * @returns {R[]} result for each level
171
+ * @private
172
+ */
113
173
  _forEachLevelFilter(hookMap, cache, type, items, fn, forceClone) {
114
174
  const hooks = this._getAllLevelHooks(hookMap, cache, type);
115
175
  if (hooks.length === 0) return forceClone ? items.slice() : items;
116
176
  let i = 0;
117
177
  return items.filter((item, idx) => {
118
178
  for (const hook of hooks) {
119
- const r = fn(hook, item, idx, i);
179
+ const r = fn(/** @type {H} */ (hook), item, idx, i);
120
180
  if (r !== undefined) {
121
181
  if (r) i++;
122
182
  return r;
@@ -129,30 +189,37 @@ class StatsFactory {
129
189
 
130
190
  /**
131
191
  * @param {string} type type
132
- * @param {any} data factory data
192
+ * @param {FactoryData} data factory data
133
193
  * @param {Omit<StatsFactoryContext, "type">} baseContext context used as base
134
- * @returns {any} created object
194
+ * @returns {CreatedObject} created object
135
195
  */
136
196
  create(type, data, baseContext) {
137
197
  if (this._inCreate) {
138
198
  return this._create(type, data, baseContext);
139
- } else {
140
- try {
141
- this._inCreate = true;
142
- return this._create(type, data, baseContext);
143
- } finally {
144
- for (const key of Object.keys(this._caches)) this._caches[key].clear();
145
- this._inCreate = false;
146
- }
199
+ }
200
+ try {
201
+ this._inCreate = true;
202
+ return this._create(type, data, baseContext);
203
+ } finally {
204
+ for (const key of Object.keys(this._caches))
205
+ this._caches[/** @type {keyof StatsFactoryHooks} */ (key)].clear();
206
+ this._inCreate = false;
147
207
  }
148
208
  }
149
209
 
210
+ /**
211
+ * @param {string} type type
212
+ * @param {FactoryData} data factory data
213
+ * @param {Omit<StatsFactoryContext, "type">} baseContext context used as base
214
+ * @returns {CreatedObject} created object
215
+ * @private
216
+ */
150
217
  _create(type, data, baseContext) {
151
- const context = {
218
+ const context = /** @type {StatsFactoryContext} */ ({
152
219
  ...baseContext,
153
220
  type,
154
221
  [type]: data
155
- };
222
+ });
156
223
  if (Array.isArray(data)) {
157
224
  // run filter on unsorted items
158
225
  const items = this._forEachLevelFilter(
@@ -165,6 +232,7 @@ class StatsFactory {
165
232
  );
166
233
 
167
234
  // sort items
235
+ /** @type {Comparator[]} */
168
236
  const comparators = [];
169
237
  this._forEachLevel(this.hooks.sort, this._caches.sort, type, h =>
170
238
  h.call(comparators, context)
@@ -188,6 +256,7 @@ class StatsFactory {
188
256
 
189
257
  // for each item
190
258
  let resultItems = items2.map((item, i) => {
259
+ /** @type {StatsFactoryContext} */
191
260
  const itemContext = {
192
261
  ...context,
193
262
  _index: i
@@ -217,6 +286,7 @@ class StatsFactory {
217
286
  });
218
287
 
219
288
  // sort result items
289
+ /** @type {Comparator[]} */
220
290
  const comparators2 = [];
221
291
  this._forEachLevel(
222
292
  this.hooks.sortResults,
@@ -232,6 +302,7 @@ class StatsFactory {
232
302
  }
233
303
 
234
304
  // group result items
305
+ /** @type {GroupConfig[]} */
235
306
  const groupConfigs = [];
236
307
  this._forEachLevel(
237
308
  this.hooks.groupResults,
@@ -270,23 +341,23 @@ class StatsFactory {
270
341
  result,
271
342
  (h, r) => h.call(r, context)
272
343
  );
273
- } else {
274
- const object = {};
344
+ }
345
+ /** @type {ObjectForExtract} */
346
+ const object = {};
275
347
 
276
- // run extract on value
277
- this._forEachLevel(this.hooks.extract, this._caches.extract, type, h =>
278
- h.call(object, data, context)
279
- );
348
+ // run extract on value
349
+ this._forEachLevel(this.hooks.extract, this._caches.extract, type, h =>
350
+ h.call(object, data, context)
351
+ );
280
352
 
281
- // run result on extracted object
282
- return this._forEachLevelWaterfall(
283
- this.hooks.result,
284
- this._caches.result,
285
- type,
286
- object,
287
- (h, r) => h.call(r, context)
288
- );
289
- }
353
+ // run result on extracted object
354
+ return this._forEachLevelWaterfall(
355
+ this.hooks.result,
356
+ this._caches.result,
357
+ type,
358
+ object,
359
+ (h, r) => h.call(r, context)
360
+ );
290
361
  }
291
362
  }
292
363
  module.exports = StatsFactory;
@@ -7,73 +7,102 @@
7
7
 
8
8
  const { HookMap, SyncWaterfallHook, SyncBailHook } = require("tapable");
9
9
 
10
- /** @template T @typedef {import("tapable").AsArray<T>} AsArray<T> */
11
- /** @typedef {import("tapable").Hook} Hook */
12
10
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */
13
11
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */
14
12
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */
15
13
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
14
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */
15
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */
16
16
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsModule} StatsModule */
17
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */
17
18
  /** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */
19
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */
20
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */
21
+ /** @typedef {import("./DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */
18
22
 
19
23
  /**
20
- * @typedef {Object} PrintedElement
24
+ * @typedef {object} PrintedElement
21
25
  * @property {string} element
22
26
  * @property {string} content
23
27
  */
24
28
 
25
29
  /**
26
- * @typedef {Object} KnownStatsPrinterContext
30
+ * @typedef {object} KnownStatsPrinterContext
27
31
  * @property {string=} type
28
32
  * @property {StatsCompilation=} compilation
29
33
  * @property {StatsChunkGroup=} chunkGroup
34
+ * @property {string=} chunkGroupKind
30
35
  * @property {StatsAsset=} asset
31
36
  * @property {StatsModule=} module
32
37
  * @property {StatsChunk=} chunk
33
38
  * @property {StatsModuleReason=} moduleReason
39
+ * @property {StatsModuleIssuer=} moduleIssuer
40
+ * @property {StatsError=} error
41
+ * @property {StatsProfile=} profile
42
+ * @property {StatsLogging=} logging
43
+ * @property {StatsModuleTraceItem=} moduleTraceItem
44
+ * @property {StatsModuleTraceDependency=} moduleTraceDependency
45
+ */
46
+
47
+ /**
48
+ * @typedef {object} KnownStatsPrinterColorFn
34
49
  * @property {(str: string) => string=} bold
35
50
  * @property {(str: string) => string=} yellow
36
51
  * @property {(str: string) => string=} red
37
52
  * @property {(str: string) => string=} green
38
53
  * @property {(str: string) => string=} magenta
39
54
  * @property {(str: string) => string=} cyan
55
+ */
56
+
57
+ /**
58
+ * @typedef {object} KnownStatsPrinterFormaters
40
59
  * @property {(file: string, oversize?: boolean) => string=} formatFilename
41
60
  * @property {(id: string) => string=} formatModuleId
42
61
  * @property {(id: string, direction?: "parent"|"child"|"sibling") => string=} formatChunkId
43
62
  * @property {(size: number) => string=} formatSize
63
+ * @property {(size: string) => string=} formatLayer
44
64
  * @property {(dateTime: number) => string=} formatDateTime
45
65
  * @property {(flag: string) => string=} formatFlag
46
66
  * @property {(time: number, boldQuantity?: boolean) => string=} formatTime
47
- * @property {string=} chunkGroupKind
67
+ * @property {(message: string) => string=} formatError
48
68
  */
49
69
 
50
- /** @typedef {KnownStatsPrinterContext & Record<string, any>} StatsPrinterContext */
70
+ /** @typedef {Record<string, any> & KnownStatsPrinterColorFn & KnownStatsPrinterFormaters & KnownStatsPrinterContext} StatsPrinterContext */
71
+ /** @typedef {any} PrintObject */
72
+
73
+ /**
74
+ * @typedef {object} StatsPrintHooks
75
+ * @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], void>>} sortElements
76
+ * @property {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string | undefined>>} printElements
77
+ * @property {HookMap<SyncBailHook<[PrintObject[], StatsPrinterContext], true>>} sortItems
78
+ * @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string>>} getItemName
79
+ * @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], string | undefined>>} printItems
80
+ * @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string | void>>} print
81
+ * @property {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} result
82
+ */
51
83
 
52
84
  class StatsPrinter {
53
85
  constructor() {
86
+ /** @type {StatsPrintHooks} */
54
87
  this.hooks = Object.freeze({
55
- /** @type {HookMap<SyncBailHook<[string[], StatsPrinterContext], true>>} */
56
88
  sortElements: new HookMap(
57
89
  () => new SyncBailHook(["elements", "context"])
58
90
  ),
59
- /** @type {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string>>} */
60
91
  printElements: new HookMap(
61
92
  () => new SyncBailHook(["printedElements", "context"])
62
93
  ),
63
- /** @type {HookMap<SyncBailHook<[any[], StatsPrinterContext], true>>} */
64
94
  sortItems: new HookMap(() => new SyncBailHook(["items", "context"])),
65
- /** @type {HookMap<SyncBailHook<[any, StatsPrinterContext], string>>} */
66
95
  getItemName: new HookMap(() => new SyncBailHook(["item", "context"])),
67
- /** @type {HookMap<SyncBailHook<[string[], StatsPrinterContext], string>>} */
68
96
  printItems: new HookMap(
69
97
  () => new SyncBailHook(["printedItems", "context"])
70
98
  ),
71
- /** @type {HookMap<SyncBailHook<[{}, StatsPrinterContext], string>>} */
72
99
  print: new HookMap(() => new SyncBailHook(["object", "context"])),
73
100
  /** @type {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} */
74
101
  result: new HookMap(() => new SyncWaterfallHook(["result", "context"]))
75
102
  });
76
- /** @type {Map<HookMap<Hook>, Map<string, Hook[]>>} */
103
+ /**
104
+ * @type {TODO}
105
+ */
77
106
  this._levelHookCache = new Map();
78
107
  this._inPrint = false;
79
108
  }
@@ -81,15 +110,14 @@ class StatsPrinter {
81
110
  /**
82
111
  * get all level hooks
83
112
  * @private
84
- * @template {Hook} T
85
- * @param {HookMap<T>} hookMap HookMap
113
+ * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
114
+ * @template {HM extends HookMap<infer H> ? H : never} H
115
+ * @param {HM} hookMap hook map
86
116
  * @param {string} type type
87
- * @returns {T[]} hooks
117
+ * @returns {H[]} hooks
88
118
  */
89
119
  _getAllLevelHooks(hookMap, type) {
90
- let cache = /** @type {Map<string, T[]>} */ (
91
- this._levelHookCache.get(hookMap)
92
- );
120
+ let cache = this._levelHookCache.get(hookMap);
93
121
  if (cache === undefined) {
94
122
  cache = new Map();
95
123
  this._levelHookCache.set(hookMap, cache);
@@ -98,11 +126,11 @@ class StatsPrinter {
98
126
  if (cacheEntry !== undefined) {
99
127
  return cacheEntry;
100
128
  }
101
- /** @type {T[]} */
129
+ /** @type {H[]} */
102
130
  const hooks = [];
103
131
  const typeParts = type.split(".");
104
132
  for (let i = 0; i < typeParts.length; i++) {
105
- const hook = hookMap.get(typeParts.slice(i).join("."));
133
+ const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join(".")));
106
134
  if (hook) {
107
135
  hooks.push(hook);
108
136
  }
@@ -114,16 +142,17 @@ class StatsPrinter {
114
142
  /**
115
143
  * Run `fn` for each level
116
144
  * @private
117
- * @template T
118
- * @template R
119
- * @param {HookMap<SyncBailHook<T, R>>} hookMap HookMap
145
+ * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
146
+ * @template {HM extends HookMap<infer H> ? H : never} H
147
+ * @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
148
+ * @param {HM} hookMap hook map
120
149
  * @param {string} type type
121
- * @param {(hook: SyncBailHook<T, R>) => R} fn function
122
- * @returns {R} result of `fn`
150
+ * @param {function(H): R | undefined} fn fn
151
+ * @returns {R | undefined} hook
123
152
  */
124
153
  _forEachLevel(hookMap, type, fn) {
125
154
  for (const hook of this._getAllLevelHooks(hookMap, type)) {
126
- const result = fn(hook);
155
+ const result = fn(/** @type {H} */ (hook));
127
156
  if (result !== undefined) return result;
128
157
  }
129
158
  }
@@ -131,48 +160,49 @@ class StatsPrinter {
131
160
  /**
132
161
  * Run `fn` for each level
133
162
  * @private
134
- * @template T
135
- * @param {HookMap<SyncWaterfallHook<T>>} hookMap HookMap
163
+ * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
164
+ * @template {HM extends HookMap<infer H> ? H : never} H
165
+ * @param {HM} hookMap hook map
136
166
  * @param {string} type type
137
- * @param {AsArray<T>[0]} data data
138
- * @param {(hook: SyncWaterfallHook<T>, data: AsArray<T>[0]) => AsArray<T>[0]} fn function
139
- * @returns {AsArray<T>[0]} result of `fn`
167
+ * @param {string} data data
168
+ * @param {function(H, string): string} fn fn
169
+ * @returns {string} result of `fn`
140
170
  */
141
171
  _forEachLevelWaterfall(hookMap, type, data, fn) {
142
172
  for (const hook of this._getAllLevelHooks(hookMap, type)) {
143
- data = fn(hook, data);
173
+ data = fn(/** @type {H} */ (hook), data);
144
174
  }
145
175
  return data;
146
176
  }
147
177
 
148
178
  /**
149
179
  * @param {string} type The type
150
- * @param {Object} object Object to print
151
- * @param {Object=} baseContext The base context
180
+ * @param {PrintObject} object Object to print
181
+ * @param {StatsPrinterContext=} baseContext The base context
152
182
  * @returns {string} printed result
153
183
  */
154
184
  print(type, object, baseContext) {
155
185
  if (this._inPrint) {
156
186
  return this._print(type, object, baseContext);
157
- } else {
158
- try {
159
- this._inPrint = true;
160
- return this._print(type, object, baseContext);
161
- } finally {
162
- this._levelHookCache.clear();
163
- this._inPrint = false;
164
- }
187
+ }
188
+ try {
189
+ this._inPrint = true;
190
+ return this._print(type, object, baseContext);
191
+ } finally {
192
+ this._levelHookCache.clear();
193
+ this._inPrint = false;
165
194
  }
166
195
  }
167
196
 
168
197
  /**
169
198
  * @private
170
199
  * @param {string} type type
171
- * @param {Object} object object
172
- * @param {Object=} baseContext context
200
+ * @param {PrintObject} object object
201
+ * @param {StatsPrinterContext=} baseContext context
173
202
  * @returns {string} printed result
174
203
  */
175
204
  _print(type, object, baseContext) {
205
+ /** @type {StatsPrinterContext} */
176
206
  const context = {
177
207
  ...baseContext,
178
208
  type,
@@ -189,6 +219,7 @@ class StatsPrinter {
189
219
  h.call(sortedItems, context)
190
220
  );
191
221
  const printedItems = sortedItems.map((item, i) => {
222
+ /** @type {StatsPrinterContext} */
192
223
  const itemContext = {
193
224
  ...context,
194
225
  _index: i
@@ -241,7 +272,7 @@ class StatsPrinter {
241
272
  return this._forEachLevelWaterfall(
242
273
  this.hooks.result,
243
274
  type,
244
- printResult,
275
+ /** @type {string} */ (printResult),
245
276
  (h, r) => h.call(r, context)
246
277
  );
247
278
  }
@@ -5,10 +5,44 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- exports.equals = (a, b) => {
8
+ /**
9
+ * Compare two arrays or strings by performing strict equality check for each value.
10
+ * @template T [T=any]
11
+ * @param {ArrayLike<T>} a Array of values to be compared
12
+ * @param {ArrayLike<T>} b Array of values to be compared
13
+ * @returns {boolean} returns true if all the elements of passed arrays are strictly equal.
14
+ */
15
+
16
+ module.exports.equals = (a, b) => {
9
17
  if (a.length !== b.length) return false;
10
18
  for (let i = 0; i < a.length; i++) {
11
19
  if (a[i] !== b[i]) return false;
12
20
  }
13
21
  return true;
14
22
  };
23
+
24
+ /**
25
+ * Partition an array by calling a predicate function on each value.
26
+ * @template T [T=any]
27
+ * @param {Array<T>} arr Array of values to be partitioned
28
+ * @param {(value: T) => boolean} fn Partition function which partitions based on truthiness of result.
29
+ * @returns {[Array<T>, Array<T>]} returns the values of `arr` partitioned into two new arrays based on fn predicate.
30
+ */
31
+
32
+ module.exports.groupBy = (
33
+ // eslint-disable-next-line default-param-last
34
+ arr = [],
35
+ fn
36
+ ) =>
37
+ arr.reduce(
38
+ /**
39
+ * @param {[Array<T>, Array<T>]} groups An accumulator storing already partitioned values returned from previous call.
40
+ * @param {T} value The value of the current element
41
+ * @returns {[Array<T>, Array<T>]} returns an array of partitioned groups accumulator resulting from calling a predicate on the current value.
42
+ */
43
+ (groups, value) => {
44
+ groups[fn(value) ? 0 : 1].push(value);
45
+ return groups;
46
+ },
47
+ [[], []]
48
+ );