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
@@ -13,11 +13,18 @@ const { compareSelect, compareStrings } = require("../util/comparators");
13
13
  const createHash = require("../util/createHash");
14
14
 
15
15
  /** @typedef {import("webpack-sources").Source} Source */
16
+ /** @typedef {import("../Cache").Etag} Etag */
16
17
  /** @typedef {import("../Compilation").AssetInfo} AssetInfo */
17
18
  /** @typedef {import("../Compiler")} Compiler */
19
+ /** @typedef {typeof import("../util/Hash")} Hash */
18
20
 
19
21
  const EMPTY_SET = new Set();
20
22
 
23
+ /**
24
+ * @template T
25
+ * @param {T | T[]} itemOrItems item or items
26
+ * @param {Set<T>} list list
27
+ */
21
28
  const addToList = (itemOrItems, list) => {
22
29
  if (Array.isArray(itemOrItems)) {
23
30
  for (const item of itemOrItems) {
@@ -54,12 +61,14 @@ const mapAndDeduplicateBuffers = (input, fn) => {
54
61
  * @param {string} str String to quote
55
62
  * @returns {string} Escaped string
56
63
  */
57
- const quoteMeta = str => {
58
- return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
59
- };
64
+ const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
60
65
 
61
66
  const cachedSourceMap = new WeakMap();
62
67
 
68
+ /**
69
+ * @param {Source} source source
70
+ * @returns {CachedSource} cached source
71
+ */
63
72
  const toCachedSource = source => {
64
73
  if (source instanceof CachedSource) {
65
74
  return source;
@@ -71,23 +80,27 @@ const toCachedSource = source => {
71
80
  return newSource;
72
81
  };
73
82
 
83
+ /** @typedef {Set<string>} OwnHashes */
84
+ /** @typedef {Set<string>} ReferencedHashes */
85
+ /** @typedef {Set<string>} Hashes */
86
+
74
87
  /**
75
- * @typedef {Object} AssetInfoForRealContentHash
88
+ * @typedef {object} AssetInfoForRealContentHash
76
89
  * @property {string} name
77
90
  * @property {AssetInfo} info
78
91
  * @property {Source} source
79
92
  * @property {RawSource | undefined} newSource
80
93
  * @property {RawSource | undefined} newSourceWithoutOwn
81
94
  * @property {string} content
82
- * @property {Set<string>} ownHashes
83
- * @property {Promise} contentComputePromise
84
- * @property {Promise} contentComputeWithoutOwnPromise
85
- * @property {Set<string>} referencedHashes
86
- * @property {Set<string>} hashes
95
+ * @property {OwnHashes | undefined} ownHashes
96
+ * @property {Promise<void> | undefined} contentComputePromise
97
+ * @property {Promise<void> | undefined} contentComputeWithoutOwnPromise
98
+ * @property {ReferencedHashes | undefined} referencedHashes
99
+ * @property {Hashes} hashes
87
100
  */
88
101
 
89
102
  /**
90
- * @typedef {Object} CompilationHooks
103
+ * @typedef {object} CompilationHooks
91
104
  * @property {SyncBailHook<[Buffer[], string], string>} updateHash
92
105
  */
93
106
 
@@ -115,6 +128,11 @@ class RealContentHashPlugin {
115
128
  return hooks;
116
129
  }
117
130
 
131
+ /**
132
+ * @param {object} options options object
133
+ * @param {string | Hash} options.hashFunction the hash function to use
134
+ * @param {string} options.hashDigest the hash digest to use
135
+ */
118
136
  constructor({ hashFunction, hashDigest }) {
119
137
  this._hashFunction = hashFunction;
120
138
  this._hashDigest = hashDigest;
@@ -143,27 +161,25 @@ class RealContentHashPlugin {
143
161
  const assets = compilation.getAssets();
144
162
  /** @type {AssetInfoForRealContentHash[]} */
145
163
  const assetsWithInfo = [];
164
+ /** @type {Map<string, [AssetInfoForRealContentHash]>} */
146
165
  const hashToAssets = new Map();
147
166
  for (const { source, info, name } of assets) {
148
167
  const cachedSource = toCachedSource(source);
149
- const content = cachedSource.source();
150
- /** @type {Set<string>} */
168
+ const content = /** @type {string} */ (cachedSource.source());
169
+ /** @type {Hashes} */
151
170
  const hashes = new Set();
152
171
  addToList(info.contenthash, hashes);
172
+ /** @type {AssetInfoForRealContentHash} */
153
173
  const data = {
154
174
  name,
155
175
  info,
156
176
  source: cachedSource,
157
- /** @type {RawSource | undefined} */
158
177
  newSource: undefined,
159
- /** @type {RawSource | undefined} */
160
178
  newSourceWithoutOwn: undefined,
161
179
  content,
162
- /** @type {Set<string>} */
163
180
  ownHashes: undefined,
164
181
  contentComputePromise: undefined,
165
182
  contentComputeWithoutOwnPromise: undefined,
166
- /** @type {Set<string>} */
167
183
  referencedHashes: undefined,
168
184
  hashes
169
185
  };
@@ -197,7 +213,7 @@ class RealContentHashPlugin {
197
213
  [asset.referencedHashes, asset.ownHashes] =
198
214
  await cacheAnalyse.providePromise(name, etag, () => {
199
215
  const referencedHashes = new Set();
200
- let ownHashes = new Set();
216
+ const ownHashes = new Set();
201
217
  const inContent = content.match(hashRegExp);
202
218
  if (inContent) {
203
219
  for (const hash of inContent) {
@@ -212,11 +228,17 @@ class RealContentHashPlugin {
212
228
  });
213
229
  })
214
230
  );
231
+ /**
232
+ * @param {string} hash the hash
233
+ * @returns {undefined | ReferencedHashes} the referenced hashes
234
+ */
215
235
  const getDependencies = hash => {
216
236
  const assets = hashToAssets.get(hash);
217
237
  if (!assets) {
218
238
  const referencingAssets = assetsWithInfo.filter(asset =>
219
- asset.referencedHashes.has(hash)
239
+ /** @type {ReferencedHashes} */ (asset.referencedHashes).has(
240
+ hash
241
+ )
220
242
  );
221
243
  const err = new WebpackError(`RealContentHashPlugin
222
244
  Some kind of unexpected caching problem occurred.
@@ -232,27 +254,40 @@ ${referencingAssets
232
254
  })
233
255
  .join("\n")}`);
234
256
  compilation.errors.push(err);
235
- return undefined;
257
+ return;
236
258
  }
237
259
  const hashes = new Set();
238
260
  for (const { referencedHashes, ownHashes } of assets) {
239
- if (!ownHashes.has(hash)) {
240
- for (const hash of ownHashes) {
261
+ if (!(/** @type {OwnHashes} */ (ownHashes).has(hash))) {
262
+ for (const hash of /** @type {OwnHashes} */ (ownHashes)) {
241
263
  hashes.add(hash);
242
264
  }
243
265
  }
244
- for (const hash of referencedHashes) {
266
+ for (const hash of /** @type {ReferencedHashes} */ (
267
+ referencedHashes
268
+ )) {
245
269
  hashes.add(hash);
246
270
  }
247
271
  }
248
272
  return hashes;
249
273
  };
274
+ /**
275
+ * @param {string} hash the hash
276
+ * @returns {string} the hash info
277
+ */
250
278
  const hashInfo = hash => {
251
279
  const assets = hashToAssets.get(hash);
252
- return `${hash} (${Array.from(assets, a => a.name)})`;
280
+ return `${hash} (${Array.from(
281
+ /** @type {AssetInfoForRealContentHash[]} */ (assets),
282
+ a => a.name
283
+ )})`;
253
284
  };
254
285
  const hashesInOrder = new Set();
255
286
  for (const hash of hashToAssets.keys()) {
287
+ /**
288
+ * @param {string} hash the hash
289
+ * @param {Set<string>} stack stack of hashes
290
+ */
256
291
  const add = (hash, stack) => {
257
292
  const deps = getDependencies(hash);
258
293
  if (!deps) return;
@@ -276,21 +311,31 @@ ${referencingAssets
276
311
  add(hash, new Set());
277
312
  }
278
313
  const hashToNewHash = new Map();
314
+ /**
315
+ * @param {AssetInfoForRealContentHash} asset asset info
316
+ * @returns {Etag} etag
317
+ */
279
318
  const getEtag = asset =>
280
319
  cacheGenerate.mergeEtags(
281
320
  cacheGenerate.getLazyHashedEtag(asset.source),
282
- Array.from(asset.referencedHashes, hash =>
283
- hashToNewHash.get(hash)
321
+ Array.from(
322
+ /** @type {ReferencedHashes} */ (asset.referencedHashes),
323
+ hash => hashToNewHash.get(hash)
284
324
  ).join("|")
285
325
  );
326
+ /**
327
+ * @param {AssetInfoForRealContentHash} asset asset info
328
+ * @returns {Promise<void>}
329
+ */
286
330
  const computeNewContent = asset => {
287
331
  if (asset.contentComputePromise) return asset.contentComputePromise;
288
332
  return (asset.contentComputePromise = (async () => {
289
333
  if (
290
- asset.ownHashes.size > 0 ||
291
- Array.from(asset.referencedHashes).some(
292
- hash => hashToNewHash.get(hash) !== hash
293
- )
334
+ /** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
335
+ Array.from(
336
+ /** @type {ReferencedHashes} */
337
+ (asset.referencedHashes)
338
+ ).some(hash => hashToNewHash.get(hash) !== hash)
294
339
  ) {
295
340
  const identifier = asset.name;
296
341
  const etag = getEtag(asset);
@@ -307,17 +352,22 @@ ${referencingAssets
307
352
  }
308
353
  })());
309
354
  };
355
+ /**
356
+ * @param {AssetInfoForRealContentHash} asset asset info
357
+ * @returns {Promise<void>}
358
+ */
310
359
  const computeNewContentWithoutOwn = asset => {
311
360
  if (asset.contentComputeWithoutOwnPromise)
312
361
  return asset.contentComputeWithoutOwnPromise;
313
362
  return (asset.contentComputeWithoutOwnPromise = (async () => {
314
363
  if (
315
- asset.ownHashes.size > 0 ||
316
- Array.from(asset.referencedHashes).some(
317
- hash => hashToNewHash.get(hash) !== hash
318
- )
364
+ /** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
365
+ Array.from(
366
+ /** @type {ReferencedHashes} */
367
+ (asset.referencedHashes)
368
+ ).some(hash => hashToNewHash.get(hash) !== hash)
319
369
  ) {
320
- const identifier = asset.name + "|without-own";
370
+ const identifier = `${asset.name}|without-own`;
321
371
  const etag = getEtag(asset);
322
372
  asset.newSourceWithoutOwn = await cacheGenerate.providePromise(
323
373
  identifier,
@@ -326,7 +376,9 @@ ${referencingAssets
326
376
  const newContent = asset.content.replace(
327
377
  hashRegExp,
328
378
  hash => {
329
- if (asset.ownHashes.has(hash)) {
379
+ if (
380
+ /** @type {OwnHashes} */ (asset.ownHashes).has(hash)
381
+ ) {
330
382
  return "";
331
383
  }
332
384
  return hashToNewHash.get(hash);
@@ -340,29 +392,33 @@ ${referencingAssets
340
392
  };
341
393
  const comparator = compareSelect(a => a.name, compareStrings);
342
394
  for (const oldHash of hashesInOrder) {
343
- const assets = hashToAssets.get(oldHash);
395
+ const assets =
396
+ /** @type {AssetInfoForRealContentHash[]} */
397
+ (hashToAssets.get(oldHash));
344
398
  assets.sort(comparator);
345
- const hash = createHash(this._hashFunction);
346
399
  await Promise.all(
347
400
  assets.map(asset =>
348
- asset.ownHashes.has(oldHash)
401
+ /** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)
349
402
  ? computeNewContentWithoutOwn(asset)
350
403
  : computeNewContent(asset)
351
404
  )
352
405
  );
353
406
  const assetsContent = mapAndDeduplicateBuffers(assets, asset => {
354
- if (asset.ownHashes.has(oldHash)) {
407
+ if (/** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)) {
355
408
  return asset.newSourceWithoutOwn
356
409
  ? asset.newSourceWithoutOwn.buffer()
357
410
  : asset.source.buffer();
358
- } else {
359
- return asset.newSource
360
- ? asset.newSource.buffer()
361
- : asset.source.buffer();
362
411
  }
412
+ return asset.newSource
413
+ ? asset.newSource.buffer()
414
+ : asset.source.buffer();
363
415
  });
364
416
  let newHash = hooks.updateHash.call(assetsContent, oldHash);
365
417
  if (!newHash) {
418
+ const hash = createHash(this._hashFunction);
419
+ if (compilation.outputOptions.hashSalt) {
420
+ hash.update(compilation.outputOptions.hashSalt);
421
+ }
366
422
  for (const content of assetsContent) {
367
423
  hash.update(content);
368
424
  }
@@ -6,10 +6,58 @@
6
6
  "use strict";
7
7
 
8
8
  const { STAGE_BASIC } = require("../OptimizationStages");
9
- const Queue = require("../util/Queue");
10
- const { intersect } = require("../util/SetHelpers");
11
9
 
10
+ /** @typedef {import("../Chunk")} Chunk */
11
+ /** @typedef {import("../ChunkGroup")} ChunkGroup */
12
12
  /** @typedef {import("../Compiler")} Compiler */
13
+ /** @typedef {import("../Module")} Module */
14
+
15
+ /**
16
+ * Intersects multiple masks represented as bigints
17
+ * @param {bigint[]} masks The module masks to intersect
18
+ * @returns {bigint} The intersection of all masks
19
+ */
20
+ function intersectMasks(masks) {
21
+ let result = masks[0];
22
+ for (let i = masks.length - 1; i >= 1; i--) {
23
+ result &= masks[i];
24
+ }
25
+ return result;
26
+ }
27
+
28
+ const ZERO_BIGINT = BigInt(0);
29
+ const ONE_BIGINT = BigInt(1);
30
+ const THIRTY_TWO_BIGINT = BigInt(32);
31
+
32
+ /**
33
+ * Parses the module mask and returns the modules represented by it
34
+ * @param {bigint} mask the module mask
35
+ * @param {Module[]} ordinalModules the modules in the order they were added to the mask (LSB is index 0)
36
+ * @returns {Generator<Module>} the modules represented by the mask
37
+ */
38
+ function* getModulesFromMask(mask, ordinalModules) {
39
+ let offset = 31;
40
+ while (mask !== ZERO_BIGINT) {
41
+ // Consider the last 32 bits, since that's what Math.clz32 can handle
42
+ let last32 = Number(BigInt.asUintN(32, mask));
43
+ while (last32 > 0) {
44
+ const last = Math.clz32(last32);
45
+ // The number of trailing zeros is the number trimmed off the input mask + 31 - the number of leading zeros
46
+ // The 32 is baked into the initial value of offset
47
+ const moduleIndex = offset - last;
48
+ // The number of trailing zeros is the index into the array generated by getOrCreateModuleMask
49
+ const module = ordinalModules[moduleIndex];
50
+ yield module;
51
+ // Remove the matched module from the mask
52
+ // Since we can only count leading zeros, not trailing, we can't just downshift the mask
53
+ last32 &= ~(1 << (31 - last));
54
+ }
55
+
56
+ // Remove the processed chunk from the mask
57
+ mask >>= THIRTY_TWO_BIGINT;
58
+ offset += 32;
59
+ }
60
+ }
13
61
 
14
62
  class RemoveParentModulesPlugin {
15
63
  /**
@@ -18,94 +66,129 @@ class RemoveParentModulesPlugin {
18
66
  */
19
67
  apply(compiler) {
20
68
  compiler.hooks.compilation.tap("RemoveParentModulesPlugin", compilation => {
69
+ /**
70
+ * @param {Iterable<Chunk>} chunks the chunks
71
+ * @param {ChunkGroup[]} chunkGroups the chunk groups
72
+ */
21
73
  const handler = (chunks, chunkGroups) => {
22
74
  const chunkGraph = compilation.chunkGraph;
23
- const queue = new Queue();
75
+ const queue = new Set();
24
76
  const availableModulesMap = new WeakMap();
25
77
 
78
+ let nextModuleMask = ONE_BIGINT;
79
+ const maskByModule = new WeakMap();
80
+ /** @type {Module[]} */
81
+ const ordinalModules = [];
82
+
83
+ /**
84
+ * Gets or creates a unique mask for a module
85
+ * @param {Module} mod the module to get the mask for
86
+ * @returns {bigint} the module mask to uniquely identify the module
87
+ */
88
+ const getOrCreateModuleMask = mod => {
89
+ let id = maskByModule.get(mod);
90
+ if (id === undefined) {
91
+ id = nextModuleMask;
92
+ ordinalModules.push(mod);
93
+ maskByModule.set(mod, id);
94
+ nextModuleMask <<= ONE_BIGINT;
95
+ }
96
+ return id;
97
+ };
98
+
99
+ // Initialize masks by chunk and by chunk group for quicker comparisons
100
+ const chunkMasks = new WeakMap();
101
+ for (const chunk of chunks) {
102
+ let mask = ZERO_BIGINT;
103
+ for (const m of chunkGraph.getChunkModulesIterable(chunk)) {
104
+ const id = getOrCreateModuleMask(m);
105
+ mask |= id;
106
+ }
107
+ chunkMasks.set(chunk, mask);
108
+ }
109
+
110
+ const chunkGroupMasks = new WeakMap();
111
+ for (const chunkGroup of chunkGroups) {
112
+ let mask = ZERO_BIGINT;
113
+ for (const chunk of chunkGroup.chunks) {
114
+ const chunkMask = chunkMasks.get(chunk);
115
+ if (chunkMask !== undefined) {
116
+ mask |= chunkMask;
117
+ }
118
+ }
119
+ chunkGroupMasks.set(chunkGroup, mask);
120
+ }
121
+
26
122
  for (const chunkGroup of compilation.entrypoints.values()) {
27
123
  // initialize available modules for chunks without parents
28
- availableModulesMap.set(chunkGroup, new Set());
124
+ availableModulesMap.set(chunkGroup, ZERO_BIGINT);
29
125
  for (const child of chunkGroup.childrenIterable) {
30
- queue.enqueue(child);
126
+ queue.add(child);
31
127
  }
32
128
  }
33
129
  for (const chunkGroup of compilation.asyncEntrypoints) {
34
130
  // initialize available modules for chunks without parents
35
- availableModulesMap.set(chunkGroup, new Set());
131
+ availableModulesMap.set(chunkGroup, ZERO_BIGINT);
36
132
  for (const child of chunkGroup.childrenIterable) {
37
- queue.enqueue(child);
133
+ queue.add(child);
38
134
  }
39
135
  }
40
136
 
41
- while (queue.length > 0) {
42
- const chunkGroup = queue.dequeue();
43
- let availableModules = availableModulesMap.get(chunkGroup);
137
+ for (const chunkGroup of queue) {
138
+ let availableModulesMask = availableModulesMap.get(chunkGroup);
44
139
  let changed = false;
45
140
  for (const parent of chunkGroup.parentsIterable) {
46
141
  const availableModulesInParent = availableModulesMap.get(parent);
47
142
  if (availableModulesInParent !== undefined) {
143
+ const parentMask =
144
+ availableModulesInParent | chunkGroupMasks.get(parent);
48
145
  // If we know the available modules in parent: process these
49
- if (availableModules === undefined) {
146
+ if (availableModulesMask === undefined) {
50
147
  // if we have not own info yet: create new entry
51
- availableModules = new Set(availableModulesInParent);
52
- for (const chunk of parent.chunks) {
53
- for (const m of chunkGraph.getChunkModulesIterable(chunk)) {
54
- availableModules.add(m);
55
- }
56
- }
57
- availableModulesMap.set(chunkGroup, availableModules);
148
+ availableModulesMask = parentMask;
58
149
  changed = true;
59
150
  } else {
60
- for (const m of availableModules) {
61
- if (
62
- !chunkGraph.isModuleInChunkGroup(m, parent) &&
63
- !availableModulesInParent.has(m)
64
- ) {
65
- availableModules.delete(m);
66
- changed = true;
67
- }
151
+ const newMask = availableModulesMask & parentMask;
152
+ if (newMask !== availableModulesMask) {
153
+ changed = true;
154
+ availableModulesMask = newMask;
68
155
  }
69
156
  }
70
157
  }
71
158
  }
159
+
72
160
  if (changed) {
161
+ availableModulesMap.set(chunkGroup, availableModulesMask);
73
162
  // if something changed: enqueue our children
74
163
  for (const child of chunkGroup.childrenIterable) {
75
- queue.enqueue(child);
164
+ // Push the child to the end of the queue
165
+ queue.delete(child);
166
+ queue.add(child);
76
167
  }
77
168
  }
78
169
  }
79
170
 
80
171
  // now we have available modules for every chunk
81
172
  for (const chunk of chunks) {
173
+ const chunkMask = chunkMasks.get(chunk);
174
+ if (chunkMask === undefined) continue; // No info about this chunk
175
+
82
176
  const availableModulesSets = Array.from(
83
177
  chunk.groupsIterable,
84
178
  chunkGroup => availableModulesMap.get(chunkGroup)
85
179
  );
86
- if (availableModulesSets.some(s => s === undefined)) continue; // No info about this chunk group
87
- const availableModules =
88
- availableModulesSets.length === 1
89
- ? availableModulesSets[0]
90
- : intersect(availableModulesSets);
91
- const numberOfModules = chunkGraph.getNumberOfChunkModules(chunk);
92
- const toRemove = new Set();
93
- if (numberOfModules < availableModules.size) {
94
- for (const m of chunkGraph.getChunkModulesIterable(chunk)) {
95
- if (availableModules.has(m)) {
96
- toRemove.add(m);
97
- }
98
- }
99
- } else {
100
- for (const m of availableModules) {
101
- if (chunkGraph.isModuleInChunk(m, chunk)) {
102
- toRemove.add(m);
103
- }
180
+ if (availableModulesSets.includes(undefined)) continue; // No info about this chunk group
181
+
182
+ const availableModulesMask = intersectMasks(availableModulesSets);
183
+ const toRemoveMask = chunkMask & availableModulesMask;
184
+ if (toRemoveMask !== ZERO_BIGINT) {
185
+ for (const module of getModulesFromMask(
186
+ toRemoveMask,
187
+ ordinalModules
188
+ )) {
189
+ chunkGraph.disconnectChunkAndModule(chunk, module);
104
190
  }
105
191
  }
106
- for (const module of toRemove) {
107
- chunkGraph.disconnectChunkAndModule(chunk, module);
108
- }
109
192
  }
110
193
  };
111
194
  compilation.hooks.optimizeChunks.tap(
@@ -5,11 +5,20 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../Compilation").EntryData} EntryData */
8
9
  /** @typedef {import("../Compiler")} Compiler */
10
+ /** @typedef {import("../Entrypoint")} Entrypoint */
9
11
 
10
12
  class RuntimeChunkPlugin {
13
+ /**
14
+ * @param {{ name?: (entrypoint: { name: string }) => string }} options options
15
+ */
11
16
  constructor(options) {
12
17
  this.options = {
18
+ /**
19
+ * @param {Entrypoint} entrypoint entrypoint name
20
+ * @returns {string} runtime chunk name
21
+ */
13
22
  name: entrypoint => `runtime~${entrypoint.name}`,
14
23
  ...options
15
24
  };
@@ -26,10 +35,14 @@ class RuntimeChunkPlugin {
26
35
  "RuntimeChunkPlugin",
27
36
  (_, { name: entryName }) => {
28
37
  if (entryName === undefined) return;
29
- const data = compilation.entries.get(entryName);
38
+ const data =
39
+ /** @type {EntryData} */
40
+ (compilation.entries.get(entryName));
30
41
  if (data.options.runtime === undefined && !data.options.dependOn) {
31
42
  // Determine runtime chunk name
32
- let name = this.options.name;
43
+ let name =
44
+ /** @type {string | ((entrypoint: { name: string }) => string)} */
45
+ (this.options.name);
33
46
  if (typeof name === "function") {
34
47
  name = name({ name: entryName });
35
48
  }