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
package/lib/ChunkGroup.js CHANGED
@@ -22,12 +22,13 @@ const {
22
22
  /** @typedef {import("./ModuleGraph")} ModuleGraph */
23
23
 
24
24
  /** @typedef {{id: number}} HasId */
25
- /** @typedef {{module: Module, loc: DependencyLocation, request: string}} OriginRecord */
25
+ /** @typedef {{module: Module | null, loc: DependencyLocation, request: string}} OriginRecord */
26
26
 
27
27
  /**
28
- * @typedef {Object} RawChunkGroupOptions
28
+ * @typedef {object} RawChunkGroupOptions
29
29
  * @property {number=} preloadOrder
30
30
  * @property {number=} prefetchOrder
31
+ * @property {("low" | "high" | "auto")=} fetchPriority
31
32
  */
32
33
 
33
34
  /** @typedef {RawChunkGroupOptions & { name?: string }} ChunkGroupOptions */
@@ -69,7 +70,7 @@ const sortOrigin = (a, b) => {
69
70
  class ChunkGroup {
70
71
  /**
71
72
  * Creates an instance of ChunkGroup.
72
- * @param {string|ChunkGroupOptions=} options chunk group options passed to chunkGroup
73
+ * @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup
73
74
  */
74
75
  constructor(options) {
75
76
  if (typeof options === "string") {
@@ -79,7 +80,7 @@ class ChunkGroup {
79
80
  }
80
81
  /** @type {number} */
81
82
  this.groupDebugId = debugId++;
82
- this.options = options;
83
+ this.options = /** @type {ChunkGroupOptions} */ (options);
83
84
  /** @type {SortableSet<ChunkGroup>} */
84
85
  this._children = new SortableSet(undefined, sortById);
85
86
  /** @type {SortableSet<ChunkGroup>} */
@@ -92,12 +93,18 @@ class ChunkGroup {
92
93
  /** @type {OriginRecord[]} */
93
94
  this.origins = [];
94
95
  /** Indices in top-down order */
95
- /** @private @type {Map<Module, number>} */
96
+ /**
97
+ * @private
98
+ * @type {Map<Module, number>}
99
+ */
96
100
  this._modulePreOrderIndices = new Map();
97
101
  /** Indices in bottom-up order */
98
- /** @private @type {Map<Module, number>} */
102
+ /**
103
+ * @private
104
+ * @type {Map<Module, number>}
105
+ */
99
106
  this._modulePostOrderIndices = new Map();
100
- /** @type {number} */
107
+ /** @type {number | undefined} */
101
108
  this.index = undefined;
102
109
  }
103
110
 
@@ -107,12 +114,18 @@ class ChunkGroup {
107
114
  * @returns {void}
108
115
  */
109
116
  addOptions(options) {
110
- for (const key of Object.keys(options)) {
117
+ for (const _key of Object.keys(options)) {
118
+ const key = /** @type {keyof ChunkGroupOptions} */ (_key);
111
119
  if (this.options[key] === undefined) {
112
- this.options[key] = options[key];
120
+ /** @type {TODO} */
121
+ (this.options)[key] = options[key];
113
122
  } else if (this.options[key] !== options[key]) {
114
123
  if (key.endsWith("Order")) {
115
- this.options[key] = Math.max(this.options[key], options[key]);
124
+ /** @type {TODO} */
125
+ (this.options)[key] = Math.max(
126
+ /** @type {number} */ (this.options[key]),
127
+ /** @type {number} */ (options[key])
128
+ );
116
129
  } else {
117
130
  throw new Error(
118
131
  `ChunkGroup.addOptions: No option merge strategy for ${key}`
@@ -124,7 +137,7 @@ class ChunkGroup {
124
137
 
125
138
  /**
126
139
  * returns the name of current ChunkGroup
127
- * @returns {string|undefined} returns the ChunkGroup name
140
+ * @returns {string | undefined} returns the ChunkGroup name
128
141
  */
129
142
  get name() {
130
143
  return this.options.name;
@@ -132,7 +145,7 @@ class ChunkGroup {
132
145
 
133
146
  /**
134
147
  * sets a new name for current ChunkGroup
135
- * @param {string} value the new name for ChunkGroup
148
+ * @param {string | undefined} value the new name for ChunkGroup
136
149
  * @returns {void}
137
150
  */
138
151
  set name(value) {
@@ -212,7 +225,7 @@ class ChunkGroup {
212
225
  /**
213
226
  * @param {Chunk} oldChunk chunk to be replaced
214
227
  * @param {Chunk} newChunk New chunk that will be replaced with
215
- * @returns {boolean} returns true if the replacement was successful
228
+ * @returns {boolean | undefined} returns true if the replacement was successful
216
229
  */
217
230
  replaceChunk(oldChunk, newChunk) {
218
231
  const oldIdx = this.chunks.indexOf(oldChunk);
@@ -353,7 +366,7 @@ class ChunkGroup {
353
366
  }
354
367
 
355
368
  /**
356
- * @returns {Array} an array containing the blocks
369
+ * @returns {Array<AsyncDependenciesBlock>} an array containing the blocks
357
370
  */
358
371
  getBlocks() {
359
372
  return this._blocks.getFromCache(getArray);
@@ -363,6 +376,10 @@ class ChunkGroup {
363
376
  return this._blocks.size;
364
377
  }
365
378
 
379
+ /**
380
+ * @param {AsyncDependenciesBlock} block block
381
+ * @returns {boolean} true, if block exists
382
+ */
366
383
  hasBlock(block) {
367
384
  return this._blocks.has(block);
368
385
  }
@@ -387,7 +404,7 @@ class ChunkGroup {
387
404
  }
388
405
 
389
406
  /**
390
- * @param {Module} module origin module
407
+ * @param {Module | null} module origin module
391
408
  * @param {DependencyLocation} loc location of the reference in the origin module
392
409
  * @param {string} request request name of the reference
393
410
  * @returns {void}
@@ -461,7 +478,6 @@ class ChunkGroup {
461
478
  /**
462
479
  * Sorting predicate which allows current ChunkGroup to be compared against another.
463
480
  * Sorting values are based off of number of chunks in ChunkGroup.
464
- *
465
481
  * @param {ChunkGraph} chunkGraph the chunk graph
466
482
  * @param {ChunkGroup} otherGroup the chunkGroup to compare this against
467
483
  * @returns {-1|0|1} sort position for comparison
@@ -486,13 +502,17 @@ class ChunkGroup {
486
502
  for (const childGroup of this._children) {
487
503
  for (const key of Object.keys(childGroup.options)) {
488
504
  if (key.endsWith("Order")) {
489
- const name = key.substr(0, key.length - "Order".length);
505
+ const name = key.slice(0, key.length - "Order".length);
490
506
  let list = lists.get(name);
491
507
  if (list === undefined) {
492
508
  lists.set(name, (list = []));
493
509
  }
494
510
  list.push({
495
- order: childGroup.options[key],
511
+ order:
512
+ /** @type {number} */
513
+ (
514
+ childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)]
515
+ ),
496
516
  group: childGroup
497
517
  });
498
518
  }
@@ -524,7 +544,7 @@ class ChunkGroup {
524
544
  /**
525
545
  * Gets the top-down index of a module in this ChunkGroup
526
546
  * @param {Module} module the module
527
- * @returns {number} index
547
+ * @returns {number | undefined} index
528
548
  */
529
549
  getModulePreOrderIndex(module) {
530
550
  return this._modulePreOrderIndices.get(module);
@@ -543,7 +563,7 @@ class ChunkGroup {
543
563
  /**
544
564
  * Gets the bottom-up index of a module in this ChunkGroup
545
565
  * @param {Module} module the module
546
- * @returns {number} index
566
+ * @returns {number | undefined} index
547
567
  */
548
568
  getModulePostOrderIndex(module) {
549
569
  return this._modulePostOrderIndices.get(module);
@@ -8,8 +8,21 @@
8
8
  const util = require("util");
9
9
  const memoize = require("./util/memoize");
10
10
 
11
+ /** @typedef {import("tapable").Tap} Tap */
11
12
  /** @typedef {import("../declarations/WebpackOptions").Output} OutputOptions */
13
+ /** @typedef {import("./Chunk")} Chunk */
12
14
  /** @typedef {import("./Compilation")} Compilation */
15
+ /** @typedef {import("./Compilation").ChunkHashContext} ChunkHashContext */
16
+ /** @typedef {import("./Compilation").Hash} Hash */
17
+ /** @typedef {import("./Compilation").RenderManifestEntry} RenderManifestEntry */
18
+ /** @typedef {import("./Compilation").RenderManifestOptions} RenderManifestOptions */
19
+ /** @typedef {import("./Compilation").Source} Source */
20
+ /** @typedef {import("./ModuleTemplate")} ModuleTemplate */
21
+ /** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
22
+ /**
23
+ * @template T
24
+ * @typedef {import("tapable").IfSet<T>} IfSet
25
+ */
13
26
 
14
27
  const getJavascriptModulesPlugin = memoize(() =>
15
28
  require("./javascript/JavascriptModulesPlugin")
@@ -26,6 +39,11 @@ class ChunkTemplate {
26
39
  this.hooks = Object.freeze({
27
40
  renderManifest: {
28
41
  tap: util.deprecate(
42
+ /**
43
+ * @template AdditionalOptions
44
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
45
+ * @param {function(RenderManifestEntry[], RenderManifestOptions): RenderManifestEntry[]} fn function
46
+ */
29
47
  (options, fn) => {
30
48
  compilation.hooks.renderManifest.tap(
31
49
  options,
@@ -41,6 +59,11 @@ class ChunkTemplate {
41
59
  },
42
60
  modules: {
43
61
  tap: util.deprecate(
62
+ /**
63
+ * @template AdditionalOptions
64
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
65
+ * @param {function(Source, ModuleTemplate, RenderContext): Source} fn function
66
+ */
44
67
  (options, fn) => {
45
68
  getJavascriptModulesPlugin()
46
69
  .getCompilationHooks(compilation)
@@ -58,6 +81,11 @@ class ChunkTemplate {
58
81
  },
59
82
  render: {
60
83
  tap: util.deprecate(
84
+ /**
85
+ * @template AdditionalOptions
86
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
87
+ * @param {function(Source, ModuleTemplate, RenderContext): Source} fn function
88
+ */
61
89
  (options, fn) => {
62
90
  getJavascriptModulesPlugin()
63
91
  .getCompilationHooks(compilation)
@@ -75,6 +103,11 @@ class ChunkTemplate {
75
103
  },
76
104
  renderWithEntry: {
77
105
  tap: util.deprecate(
106
+ /**
107
+ * @template AdditionalOptions
108
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
109
+ * @param {function(Source, Chunk): Source} fn function
110
+ */
78
111
  (options, fn) => {
79
112
  getJavascriptModulesPlugin()
80
113
  .getCompilationHooks(compilation)
@@ -96,6 +129,11 @@ class ChunkTemplate {
96
129
  },
97
130
  hash: {
98
131
  tap: util.deprecate(
132
+ /**
133
+ * @template AdditionalOptions
134
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
135
+ * @param {function(Hash): void} fn function
136
+ */
99
137
  (options, fn) => {
100
138
  compilation.hooks.fullHash.tap(options, fn);
101
139
  },
@@ -105,6 +143,11 @@ class ChunkTemplate {
105
143
  },
106
144
  hashForChunk: {
107
145
  tap: util.deprecate(
146
+ /**
147
+ * @template AdditionalOptions
148
+ * @param {string | Tap & IfSet<AdditionalOptions>} options options
149
+ * @param {function(Hash, Chunk, ChunkHashContext): void} fn function
150
+ */
108
151
  (options, fn) => {
109
152
  getJavascriptModulesPlugin()
110
153
  .getCompilationHooks(compilation)
@@ -7,7 +7,7 @@
7
7
 
8
8
  const asyncLib = require("neo-async");
9
9
  const { SyncBailHook } = require("tapable");
10
- const Compilation = require("../lib/Compilation");
10
+ const Compilation = require("./Compilation");
11
11
  const createSchemaValidation = require("./util/create-schema-validation");
12
12
  const { join } = require("./util/fs");
13
13
  const processAsyncTree = require("./util/processAsyncTree");
@@ -15,16 +15,25 @@ const processAsyncTree = require("./util/processAsyncTree");
15
15
  /** @typedef {import("../declarations/WebpackOptions").CleanOptions} CleanOptions */
16
16
  /** @typedef {import("./Compiler")} Compiler */
17
17
  /** @typedef {import("./logging/Logger").Logger} Logger */
18
+ /** @typedef {import("./util/fs").IStats} IStats */
18
19
  /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
20
+ /** @typedef {import("./util/fs").StatsCallback} StatsCallback */
19
21
 
20
22
  /** @typedef {(function(string):boolean)|RegExp} IgnoreItem */
23
+ /** @typedef {Map<string, number>} Assets */
21
24
  /** @typedef {function(IgnoreItem): void} AddToIgnoreCallback */
22
25
 
23
26
  /**
24
- * @typedef {Object} CleanPluginCompilationHooks
27
+ * @typedef {object} CleanPluginCompilationHooks
25
28
  * @property {SyncBailHook<[string], boolean>} keep when returning true the file/directory will be kept during cleaning, returning false will clean it and ignore the following plugins and config
26
29
  */
27
30
 
31
+ /**
32
+ * @callback KeepFn
33
+ * @param {string} path path
34
+ * @returns {boolean} true, if the path should be kept
35
+ */
36
+
28
37
  const validate = createSchemaValidation(
29
38
  undefined,
30
39
  () => {
@@ -39,18 +48,32 @@ const validate = createSchemaValidation(
39
48
  baseDataPath: "options"
40
49
  }
41
50
  );
51
+ const _10sec = 10 * 1000;
52
+
53
+ /**
54
+ * marge assets map 2 into map 1
55
+ * @param {Assets} as1 assets
56
+ * @param {Assets} as2 assets
57
+ * @returns {void}
58
+ */
59
+ const mergeAssets = (as1, as2) => {
60
+ for (const [key, value1] of as2) {
61
+ const value2 = as1.get(key);
62
+ if (!value2 || value1 > value2) as1.set(key, value1);
63
+ }
64
+ };
42
65
 
43
66
  /**
44
67
  * @param {OutputFileSystem} fs filesystem
45
68
  * @param {string} outputPath output path
46
- * @param {Set<string>} currentAssets filename of the current assets (must not start with .. or ., must only use / as path separator)
47
- * @param {function(Error=, Set<string>=): void} callback returns the filenames of the assets that shouldn't be there
69
+ * @param {Map<string, number>} currentAssets filename of the current assets (must not start with .. or ., must only use / as path separator)
70
+ * @param {function((Error | null)=, Set<string>=): void} callback returns the filenames of the assets that shouldn't be there
48
71
  * @returns {void}
49
72
  */
50
73
  const getDiffToFs = (fs, outputPath, currentAssets, callback) => {
51
74
  const directories = new Set();
52
75
  // get directories of assets
53
- for (const asset of currentAssets) {
76
+ for (const [asset] of currentAssets) {
54
77
  directories.add(asset.replace(/(^|\/)[^/]*$/, ""));
55
78
  }
56
79
  // and all parent directories
@@ -62,7 +85,8 @@ const getDiffToFs = (fs, outputPath, currentAssets, callback) => {
62
85
  directories,
63
86
  10,
64
87
  (directory, callback) => {
65
- fs.readdir(join(fs, outputPath, directory), (err, entries) => {
88
+ /** @type {NonNullable<OutputFileSystem["readdir"]>} */
89
+ (fs.readdir)(join(fs, outputPath, directory), (err, entries) => {
66
90
  if (err) {
67
91
  if (err.code === "ENOENT") return callback();
68
92
  if (err.code === "ENOTDIR") {
@@ -71,8 +95,8 @@ const getDiffToFs = (fs, outputPath, currentAssets, callback) => {
71
95
  }
72
96
  return callback(err);
73
97
  }
74
- for (const entry of entries) {
75
- const file = /** @type {string} */ (entry);
98
+ for (const entry of /** @type {string[]} */ (entries)) {
99
+ const file = entry;
76
100
  const filename = directory ? `${directory}/${file}` : file;
77
101
  if (!directories.has(filename) && !currentAssets.has(filename)) {
78
102
  diff.add(filename);
@@ -90,18 +114,35 @@ const getDiffToFs = (fs, outputPath, currentAssets, callback) => {
90
114
  };
91
115
 
92
116
  /**
93
- * @param {Set<string>} currentAssets assets list
94
- * @param {Set<string>} oldAssets old assets list
117
+ * @param {Assets} currentAssets assets list
118
+ * @param {Assets} oldAssets old assets list
95
119
  * @returns {Set<string>} diff
96
120
  */
97
121
  const getDiffToOldAssets = (currentAssets, oldAssets) => {
98
122
  const diff = new Set();
99
- for (const asset of oldAssets) {
123
+ const now = Date.now();
124
+ for (const [asset, ts] of oldAssets) {
125
+ if (ts >= now) continue;
100
126
  if (!currentAssets.has(asset)) diff.add(asset);
101
127
  }
102
128
  return diff;
103
129
  };
104
130
 
131
+ /**
132
+ * @param {OutputFileSystem} fs filesystem
133
+ * @param {string} filename path to file
134
+ * @param {StatsCallback} callback callback for provided filename
135
+ * @returns {void}
136
+ */
137
+ const doStat = (fs, filename, callback) => {
138
+ if ("lstat" in fs) {
139
+ /** @type {NonNullable<OutputFileSystem["lstat"]>} */
140
+ (fs.lstat)(filename, callback);
141
+ } else {
142
+ fs.stat(filename, callback);
143
+ }
144
+ };
145
+
105
146
  /**
106
147
  * @param {OutputFileSystem} fs filesystem
107
148
  * @param {string} outputPath output path
@@ -109,10 +150,13 @@ const getDiffToOldAssets = (currentAssets, oldAssets) => {
109
150
  * @param {Logger} logger logger
110
151
  * @param {Set<string>} diff filenames of the assets that shouldn't be there
111
152
  * @param {function(string): boolean} isKept check if the entry is ignored
112
- * @param {function(Error=): void} callback callback
153
+ * @param {function(Error=, Assets=): void} callback callback
113
154
  * @returns {void}
114
155
  */
115
156
  const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
157
+ /**
158
+ * @param {string} msg message
159
+ */
116
160
  const log = msg => {
117
161
  if (dry) {
118
162
  logger.info(msg);
@@ -122,15 +166,21 @@ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
122
166
  };
123
167
  /** @typedef {{ type: "check" | "unlink" | "rmdir", filename: string, parent: { remaining: number, job: Job } | undefined }} Job */
124
168
  /** @type {Job[]} */
125
- const jobs = Array.from(diff, filename => ({
169
+ const jobs = Array.from(diff.keys(), filename => ({
126
170
  type: "check",
127
171
  filename,
128
172
  parent: undefined
129
173
  }));
174
+ /** @type {Assets} */
175
+ const keptAssets = new Map();
130
176
  processAsyncTree(
131
177
  jobs,
132
178
  10,
133
179
  ({ type, filename, parent }, push, callback) => {
180
+ /**
181
+ * @param {Error & { code?: string }} err error
182
+ * @returns {void}
183
+ */
134
184
  const handleError = err => {
135
185
  if (err.code === "ENOENT") {
136
186
  log(`${filename} was removed during cleaning by something else`);
@@ -146,13 +196,14 @@ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
146
196
  switch (type) {
147
197
  case "check":
148
198
  if (isKept(filename)) {
199
+ keptAssets.set(filename, 0);
149
200
  // do not decrement parent entry as we don't want to delete the parent
150
201
  log(`${filename} will be kept`);
151
202
  return process.nextTick(callback);
152
203
  }
153
- fs.stat(path, (err, stats) => {
204
+ doStat(fs, path, (err, stats) => {
154
205
  if (err) return handleError(err);
155
- if (!stats.isDirectory()) {
206
+ if (!(/** @type {IStats} */ (stats).isDirectory())) {
156
207
  push({
157
208
  type: "unlink",
158
209
  filename,
@@ -160,7 +211,9 @@ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
160
211
  });
161
212
  return callback();
162
213
  }
163
- fs.readdir(path, (err, entries) => {
214
+
215
+ /** @type {NonNullable<OutputFileSystem["readdir"]>} */
216
+ (fs.readdir)(path, (err, _entries) => {
164
217
  if (err) return handleError(err);
165
218
  /** @type {Job} */
166
219
  const deleteJob = {
@@ -168,6 +221,7 @@ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
168
221
  filename,
169
222
  parent
170
223
  };
224
+ const entries = /** @type {string[]} */ (_entries);
171
225
  if (entries.length === 0) {
172
226
  push(deleteJob);
173
227
  } else {
@@ -232,7 +286,10 @@ const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
232
286
  break;
233
287
  }
234
288
  },
235
- callback
289
+ err => {
290
+ if (err) return callback(err);
291
+ callback(undefined, keptAssets);
292
+ }
236
293
  );
237
294
  };
238
295
 
@@ -275,18 +332,20 @@ class CleanPlugin {
275
332
  apply(compiler) {
276
333
  const { dry, keep } = this.options;
277
334
 
335
+ /** @type {KeepFn} */
278
336
  const keepFn =
279
337
  typeof keep === "function"
280
338
  ? keep
281
339
  : typeof keep === "string"
282
- ? path => path.startsWith(keep)
283
- : typeof keep === "object" && keep.test
284
- ? path => keep.test(path)
285
- : () => false;
340
+ ? path => path.startsWith(keep)
341
+ : typeof keep === "object" && keep.test
342
+ ? path => keep.test(path)
343
+ : () => false;
286
344
 
287
345
  // We assume that no external modification happens while the compiler is active
288
346
  // So we can store the old assets and only diff to them to avoid fs access on
289
347
  // incremental builds
348
+ /** @type {undefined|Assets} */
290
349
  let oldAssets;
291
350
 
292
351
  compiler.hooks.emit.tapAsync(
@@ -297,7 +356,7 @@ class CleanPlugin {
297
356
  (compilation, callback) => {
298
357
  const hooks = CleanPlugin.getCompilationHooks(compilation);
299
358
  const logger = compilation.getLogger("webpack.CleanPlugin");
300
- const fs = compiler.outputFileSystem;
359
+ const fs = /** @type {OutputFileSystem} */ (compiler.outputFileSystem);
301
360
 
302
361
  if (!fs.readdir) {
303
362
  return callback(
@@ -307,7 +366,9 @@ class CleanPlugin {
307
366
  );
308
367
  }
309
368
 
310
- const currentAssets = new Set();
369
+ /** @type {Assets} */
370
+ const currentAssets = new Map();
371
+ const now = Date.now();
311
372
  for (const asset of Object.keys(compilation.assets)) {
312
373
  if (/^[A-Za-z]:\\|^\/|^\\\\/.test(asset)) continue;
313
374
  let normalizedAsset;
@@ -320,30 +381,54 @@ class CleanPlugin {
320
381
  );
321
382
  } while (newNormalizedAsset !== normalizedAsset);
322
383
  if (normalizedAsset.startsWith("../")) continue;
323
- currentAssets.add(normalizedAsset);
384
+ const assetInfo = compilation.assetsInfo.get(asset);
385
+ if (assetInfo && assetInfo.hotModuleReplacement) {
386
+ currentAssets.set(normalizedAsset, now + _10sec);
387
+ } else {
388
+ currentAssets.set(normalizedAsset, 0);
389
+ }
324
390
  }
325
391
 
326
392
  const outputPath = compilation.getPath(compiler.outputPath, {});
327
393
 
394
+ /**
395
+ * @param {string} path path
396
+ * @returns {boolean} true, if needs to be kept
397
+ */
328
398
  const isKept = path => {
329
399
  const result = hooks.keep.call(path);
330
400
  if (result !== undefined) return result;
331
401
  return keepFn(path);
332
402
  };
333
403
 
404
+ /**
405
+ * @param {(Error | null)=} err err
406
+ * @param {Set<string>=} diff diff
407
+ */
334
408
  const diffCallback = (err, diff) => {
335
409
  if (err) {
336
410
  oldAssets = undefined;
337
- return callback(err);
411
+ callback(err);
412
+ return;
338
413
  }
339
- applyDiff(fs, outputPath, dry, logger, diff, isKept, err => {
340
- if (err) {
341
- oldAssets = undefined;
342
- } else {
343
- oldAssets = currentAssets;
414
+ applyDiff(
415
+ fs,
416
+ outputPath,
417
+ dry,
418
+ logger,
419
+ /** @type {Set<string>} */ (diff),
420
+ isKept,
421
+ (err, keptAssets) => {
422
+ if (err) {
423
+ oldAssets = undefined;
424
+ } else {
425
+ if (oldAssets) mergeAssets(currentAssets, oldAssets);
426
+ oldAssets = currentAssets;
427
+ if (keptAssets) mergeAssets(oldAssets, keptAssets);
428
+ }
429
+ callback(err);
344
430
  }
345
- callback(err);
346
- });
431
+ );
347
432
  };
348
433
 
349
434
  if (oldAssets) {
@@ -5,7 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const { provide } = require("./util/MapHelpers");
8
+ const { getOrInsert } = require("./util/MapHelpers");
9
9
  const { first } = require("./util/SetHelpers");
10
10
  const createHash = require("./util/createHash");
11
11
  const { runtimeToString, RuntimeSpecMap } = require("./util/runtime");
@@ -42,7 +42,9 @@ class CodeGenerationResults {
42
42
  );
43
43
  }
44
44
  if (runtime === undefined) {
45
- if (entry.size > 1) {
45
+ if (
46
+ /** @type {RuntimeSpecMap<CodeGenerationResult>} */ (entry).size > 1
47
+ ) {
46
48
  const results = new Set(entry.values());
47
49
  if (results.size !== 1) {
48
50
  throw new Error(
@@ -53,9 +55,9 @@ class CodeGenerationResults {
53
55
  Caller might not support runtime-dependent code generation (opt-out via optimization.usedExports: "global").`
54
56
  );
55
57
  }
56
- return first(results);
58
+ return /** @type {CodeGenerationResult} */ (first(results));
57
59
  }
58
- return entry.values().next().value;
60
+ return /** @type {CodeGenerationResult} */ (entry.values().next().value);
59
61
  }
60
62
  const result = entry.get(runtime);
61
63
  if (result === undefined) {
@@ -86,9 +88,8 @@ Caller might not support runtime-dependent code generation (opt-out via optimiza
86
88
  } else if (entry.size > 1) {
87
89
  const results = new Set(entry.values());
88
90
  return results.size === 1;
89
- } else {
90
- return entry.size === 1;
91
91
  }
92
+ return entry.size === 1;
92
93
  }
93
94
 
94
95
  /**
@@ -147,7 +148,7 @@ Caller might not support runtime-dependent code generation (opt-out via optimiza
147
148
  * @returns {void}
148
149
  */
149
150
  add(module, runtime, result) {
150
- const map = provide(this.map, module, () => new RuntimeSpecMap());
151
+ const map = getOrInsert(this.map, module, () => new RuntimeSpecMap());
151
152
  map.set(runtime, result);
152
153
  }
153
154
  }
@@ -12,7 +12,6 @@ const makeSerializable = require("./util/makeSerializable");
12
12
 
13
13
  class CommentCompilationWarning extends WebpackError {
14
14
  /**
15
- *
16
15
  * @param {string} message warning message
17
16
  * @param {DependencyLocation} loc affected lines of code
18
17
  */