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
@@ -19,6 +19,7 @@ const memoize = require("../util/memoize");
19
19
  const SerializerMiddleware = require("./SerializerMiddleware");
20
20
 
21
21
  /** @typedef {typeof import("../util/Hash")} Hash */
22
+ /** @typedef {import("../util/fs").IStats} IStats */
22
23
  /** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
23
24
  /** @typedef {import("./types").BufferSerializableType} BufferSerializableType */
24
25
 
@@ -40,6 +41,8 @@ Section -> Buffer
40
41
 
41
42
  // "wpc" + 1 in little-endian
42
43
  const VERSION = 0x01637077;
44
+ const WRITE_LIMIT_TOTAL = 0x7fff0000;
45
+ const WRITE_LIMIT_CHUNK = 511 * 1024 * 1024;
43
46
 
44
47
  /**
45
48
  * @param {Buffer[]} buffers buffers
@@ -55,39 +58,39 @@ const hashForName = (buffers, hashFunction) => {
55
58
  const COMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
56
59
  const DECOMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
57
60
 
61
+ /** @type {function(Buffer, number, number): void} */
58
62
  const writeUInt64LE = Buffer.prototype.writeBigUInt64LE
59
63
  ? (buf, value, offset) => {
60
64
  buf.writeBigUInt64LE(BigInt(value), offset);
61
- }
65
+ }
62
66
  : (buf, value, offset) => {
63
67
  const low = value % 0x100000000;
64
68
  const high = (value - low) / 0x100000000;
65
69
  buf.writeUInt32LE(low, offset);
66
70
  buf.writeUInt32LE(high, offset + 4);
67
- };
71
+ };
68
72
 
73
+ /** @type {function(Buffer, number): void} */
69
74
  const readUInt64LE = Buffer.prototype.readBigUInt64LE
70
- ? (buf, offset) => {
71
- return Number(buf.readBigUInt64LE(offset));
72
- }
75
+ ? (buf, offset) => Number(buf.readBigUInt64LE(offset))
73
76
  : (buf, offset) => {
74
77
  const low = buf.readUInt32LE(offset);
75
78
  const high = buf.readUInt32LE(offset + 4);
76
79
  return high * 0x100000000 + low;
77
- };
80
+ };
78
81
 
79
82
  /**
80
- * @typedef {Object} SerializeResult
83
+ * @typedef {object} SerializeResult
81
84
  * @property {string | false} name
82
85
  * @property {number} size
83
- * @property {Promise=} backgroundJob
86
+ * @property {Promise<any>=} backgroundJob
84
87
  */
85
88
 
86
89
  /**
87
90
  * @param {FileMiddleware} middleware this
88
91
  * @param {BufferSerializableType[] | Promise<BufferSerializableType[]>} data data to be serialized
89
92
  * @param {string | boolean} name file base name
90
- * @param {function(string | false, Buffer[]): Promise<void>} writeFile writes a file
93
+ * @param {function(string | false, Buffer[], number): Promise<void>} writeFile writes a file
91
94
  * @param {string | Hash} hashFunction hash function to use
92
95
  * @returns {Promise<SerializeResult>} resulting file pointer and promise
93
96
  */
@@ -102,8 +105,8 @@ const serialize = async (
102
105
  const processedData = [];
103
106
  /** @type {WeakMap<SerializeResult, function(): any | Promise<any>>} */
104
107
  const resultToLazy = new WeakMap();
105
- /** @type {Buffer[]} */
106
- let lastBuffers = undefined;
108
+ /** @type {Buffer[] | undefined} */
109
+ let lastBuffers;
107
110
  for (const item of await data) {
108
111
  if (typeof item === "function") {
109
112
  if (!SerializerMiddleware.isLazy(item))
@@ -161,9 +164,8 @@ const serialize = async (
161
164
  const backgroundJobs = [];
162
165
  const resolvedData = (
163
166
  await Promise.all(
164
- /** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */ (
165
- processedData
166
- )
167
+ /** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */
168
+ (processedData)
167
169
  )
168
170
  ).map(item => {
169
171
  if (Array.isArray(item) || Buffer.isBuffer(item)) return item;
@@ -179,6 +181,7 @@ const serialize = async (
179
181
  SerializerMiddleware.setLazySerializedValue(lazy, buf);
180
182
  return buf;
181
183
  });
184
+ /** @type {number[]} */
182
185
  const lengths = [];
183
186
  for (const item of resolvedData) {
184
187
  if (Array.isArray(item)) {
@@ -192,7 +195,7 @@ const serialize = async (
192
195
  } else if (item) {
193
196
  lengths.push(-item.length);
194
197
  } else {
195
- throw new Error("Unexpected falsy value in resolved data " + item);
198
+ throw new Error(`Unexpected falsy value in resolved data ${item}`);
196
199
  }
197
200
  }
198
201
  const header = Buffer.allocUnsafe(8 + lengths.length * 4);
@@ -201,6 +204,7 @@ const serialize = async (
201
204
  for (let i = 0; i < lengths.length; i++) {
202
205
  header.writeInt32LE(lengths[i], 8 + i * 4);
203
206
  }
207
+ /** @type {Buffer[]} */
204
208
  const buf = [header];
205
209
  for (const item of resolvedData) {
206
210
  if (Array.isArray(item)) {
@@ -212,9 +216,9 @@ const serialize = async (
212
216
  if (name === true) {
213
217
  name = hashForName(buf, hashFunction);
214
218
  }
215
- backgroundJobs.push(writeFile(name, buf));
216
219
  let size = 0;
217
220
  for (const b of buf) size += b.length;
221
+ backgroundJobs.push(writeFile(name, buf, size));
218
222
  return {
219
223
  size,
220
224
  name,
@@ -233,18 +237,21 @@ const serialize = async (
233
237
  */
234
238
  const deserialize = async (middleware, name, readFile) => {
235
239
  const contents = await readFile(name);
236
- if (contents.length === 0) throw new Error("Empty file " + name);
240
+ if (contents.length === 0) throw new Error(`Empty file ${name}`);
237
241
  let contentsIndex = 0;
238
242
  let contentItem = contents[0];
239
243
  let contentItemLength = contentItem.length;
240
244
  let contentPosition = 0;
241
- if (contentItemLength === 0) throw new Error("Empty file " + name);
245
+ if (contentItemLength === 0) throw new Error(`Empty file ${name}`);
242
246
  const nextContent = () => {
243
247
  contentsIndex++;
244
248
  contentItem = contents[contentsIndex];
245
249
  contentItemLength = contentItem.length;
246
250
  contentPosition = 0;
247
251
  };
252
+ /**
253
+ * @param {number} n number of bytes to ensure
254
+ */
248
255
  const ensureData = n => {
249
256
  if (contentPosition === contentItemLength) {
250
257
  nextContent();
@@ -272,18 +279,28 @@ const deserialize = async (middleware, name, readFile) => {
272
279
  contentPosition = 0;
273
280
  }
274
281
  };
282
+ /**
283
+ * @returns {number} value value
284
+ */
275
285
  const readUInt32LE = () => {
276
286
  ensureData(4);
277
287
  const value = contentItem.readUInt32LE(contentPosition);
278
288
  contentPosition += 4;
279
289
  return value;
280
290
  };
291
+ /**
292
+ * @returns {number} value value
293
+ */
281
294
  const readInt32LE = () => {
282
295
  ensureData(4);
283
296
  const value = contentItem.readInt32LE(contentPosition);
284
297
  contentPosition += 4;
285
298
  return value;
286
299
  };
300
+ /**
301
+ * @param {number} l length
302
+ * @returns {Buffer} buffer
303
+ */
287
304
  const readSlice = l => {
288
305
  ensureData(l);
289
306
  if (contentPosition === 0 && contentItemLength === l) {
@@ -361,18 +378,16 @@ const deserialize = async (middleware, name, readFile) => {
361
378
  length -= l;
362
379
  contentPosition = contentItemLength;
363
380
  }
381
+ } else if (length >= contentItemLength) {
382
+ result.push(contentItem);
383
+ length -= contentItemLength;
384
+ contentPosition = contentItemLength;
364
385
  } else {
365
- if (length >= contentItemLength) {
366
- result.push(contentItem);
367
- length -= contentItemLength;
368
- contentPosition = contentItemLength;
369
- } else {
370
- result.push(
371
- Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
372
- );
373
- contentPosition += length;
374
- length = 0;
375
- }
386
+ result.push(
387
+ Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
388
+ );
389
+ contentPosition += length;
390
+ length = 0;
376
391
  }
377
392
  while (length > 0) {
378
393
  nextContent();
@@ -393,6 +408,8 @@ const deserialize = async (middleware, name, readFile) => {
393
408
  return result;
394
409
  };
395
410
 
411
+ /** @typedef {{ filename: string, extension?: string }} FileMiddlewareContext */
412
+
396
413
  /**
397
414
  * @typedef {BufferSerializableType[]} DeserializedType
398
415
  * @typedef {true} SerializedType
@@ -408,9 +425,10 @@ class FileMiddleware extends SerializerMiddleware {
408
425
  this.fs = fs;
409
426
  this._hashFunction = hashFunction;
410
427
  }
428
+
411
429
  /**
412
430
  * @param {DeserializedType} data data
413
- * @param {Object} context context object
431
+ * @param {object} context context object
414
432
  * @returns {SerializedType|Promise<SerializedType>} serialized data
415
433
  */
416
434
  serialize(data, context) {
@@ -422,43 +440,92 @@ class FileMiddleware extends SerializerMiddleware {
422
440
  // It's important that we don't touch existing files during serialization
423
441
  // because serialize may read existing files (when deserializing)
424
442
  const allWrittenFiles = new Set();
425
- const writeFile = async (name, content) => {
443
+ /**
444
+ * @param {string | false} name name
445
+ * @param {Buffer[]} content content
446
+ * @param {number} size size
447
+ * @returns {Promise<void>}
448
+ */
449
+ const writeFile = async (name, content, size) => {
426
450
  const file = name
427
451
  ? join(this.fs, filename, `../${name}${extension}`)
428
452
  : filename;
429
- await new Promise((resolve, reject) => {
430
- let stream = this.fs.createWriteStream(file + "_");
431
- let compression;
432
- if (file.endsWith(".gz")) {
433
- compression = createGzip({
434
- chunkSize: COMPRESSION_CHUNK_SIZE,
435
- level: zConstants.Z_BEST_SPEED
436
- });
437
- } else if (file.endsWith(".br")) {
438
- compression = createBrotliCompress({
439
- chunkSize: COMPRESSION_CHUNK_SIZE,
440
- params: {
441
- [zConstants.BROTLI_PARAM_MODE]: zConstants.BROTLI_MODE_TEXT,
442
- [zConstants.BROTLI_PARAM_QUALITY]: 2,
443
- [zConstants.BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING]: true,
444
- [zConstants.BROTLI_PARAM_SIZE_HINT]: content.reduce(
445
- (size, b) => size + b.length,
446
- 0
447
- )
453
+ await new Promise(
454
+ /**
455
+ * @param {(value?: undefined) => void} resolve resolve
456
+ * @param {(reason?: Error | null) => void} reject reject
457
+ */
458
+ (resolve, reject) => {
459
+ let stream = this.fs.createWriteStream(`${file}_`);
460
+ let compression;
461
+ if (file.endsWith(".gz")) {
462
+ compression = createGzip({
463
+ chunkSize: COMPRESSION_CHUNK_SIZE,
464
+ level: zConstants.Z_BEST_SPEED
465
+ });
466
+ } else if (file.endsWith(".br")) {
467
+ compression = createBrotliCompress({
468
+ chunkSize: COMPRESSION_CHUNK_SIZE,
469
+ params: {
470
+ [zConstants.BROTLI_PARAM_MODE]: zConstants.BROTLI_MODE_TEXT,
471
+ [zConstants.BROTLI_PARAM_QUALITY]: 2,
472
+ [zConstants.BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING]: true,
473
+ [zConstants.BROTLI_PARAM_SIZE_HINT]: size
474
+ }
475
+ });
476
+ }
477
+ if (compression) {
478
+ pipeline(compression, stream, reject);
479
+ stream = compression;
480
+ stream.on("finish", () => resolve());
481
+ } else {
482
+ stream.on("error", err => reject(err));
483
+ stream.on("finish", () => resolve());
484
+ }
485
+ // split into chunks for WRITE_LIMIT_CHUNK size
486
+ /** @type {TODO[]} */
487
+ const chunks = [];
488
+ for (const b of content) {
489
+ if (b.length < WRITE_LIMIT_CHUNK) {
490
+ chunks.push(b);
491
+ } else {
492
+ for (let i = 0; i < b.length; i += WRITE_LIMIT_CHUNK) {
493
+ chunks.push(b.slice(i, i + WRITE_LIMIT_CHUNK));
494
+ }
448
495
  }
449
- });
450
- }
451
- if (compression) {
452
- pipeline(compression, stream, reject);
453
- stream = compression;
454
- stream.on("finish", () => resolve());
455
- } else {
456
- stream.on("error", err => reject(err));
457
- stream.on("finish", () => resolve());
496
+ }
497
+
498
+ const len = chunks.length;
499
+ let i = 0;
500
+ /**
501
+ * @param {(Error | null)=} err err
502
+ */
503
+ const batchWrite = err => {
504
+ // will be handled in "on" error handler
505
+ if (err) return;
506
+
507
+ if (i === len) {
508
+ stream.end();
509
+ return;
510
+ }
511
+
512
+ // queue up a batch of chunks up to the write limit
513
+ // end is exclusive
514
+ let end = i;
515
+ let sum = chunks[end++].length;
516
+ while (end < len) {
517
+ sum += chunks[end].length;
518
+ if (sum > WRITE_LIMIT_TOTAL) break;
519
+ end++;
520
+ }
521
+ while (i < end - 1) {
522
+ stream.write(chunks[i++]);
523
+ }
524
+ stream.write(chunks[i++], batchWrite);
525
+ };
526
+ batchWrite();
458
527
  }
459
- for (const b of content) stream.write(b);
460
- stream.end();
461
- });
528
+ );
462
529
  if (name) allWrittenFiles.add(file);
463
530
  };
464
531
 
@@ -468,10 +535,15 @@ class FileMiddleware extends SerializerMiddleware {
468
535
  await backgroundJob;
469
536
 
470
537
  // Rename the index file to disallow access during inconsistent file state
471
- await new Promise(resolve =>
472
- this.fs.rename(filename, filename + ".old", err => {
473
- resolve();
474
- })
538
+ await new Promise(
539
+ /**
540
+ * @param {(value?: undefined) => void} resolve resolve
541
+ */
542
+ resolve => {
543
+ this.fs.rename(filename, `${filename}.old`, err => {
544
+ resolve();
545
+ });
546
+ }
475
547
  );
476
548
 
477
549
  // update all written files
@@ -479,22 +551,35 @@ class FileMiddleware extends SerializerMiddleware {
479
551
  Array.from(
480
552
  allWrittenFiles,
481
553
  file =>
482
- new Promise((resolve, reject) => {
483
- this.fs.rename(file + "_", file, err => {
484
- if (err) return reject(err);
485
- resolve();
486
- });
487
- })
554
+ new Promise(
555
+ /**
556
+ * @param {(value?: undefined) => void} resolve resolve
557
+ * @param {(reason?: Error | null) => void} reject reject
558
+ * @returns {void}
559
+ */
560
+ (resolve, reject) => {
561
+ this.fs.rename(`${file}_`, file, err => {
562
+ if (err) return reject(err);
563
+ resolve();
564
+ });
565
+ }
566
+ )
488
567
  )
489
568
  );
490
569
 
491
570
  // As final step automatically update the index file to have a consistent pack again
492
- await new Promise(resolve => {
493
- this.fs.rename(filename + "_", filename, err => {
494
- if (err) return reject(err);
495
- resolve();
496
- });
497
- });
571
+ await new Promise(
572
+ /**
573
+ * @param {(value?: undefined) => void} resolve resolve
574
+ * @returns {void}
575
+ */
576
+ resolve => {
577
+ this.fs.rename(`${filename}_`, filename, err => {
578
+ if (err) return reject(err);
579
+ resolve();
580
+ });
581
+ }
582
+ );
498
583
  return /** @type {true} */ (true);
499
584
  }
500
585
  )
@@ -505,11 +590,15 @@ class FileMiddleware extends SerializerMiddleware {
505
590
 
506
591
  /**
507
592
  * @param {SerializedType} data data
508
- * @param {Object} context context object
593
+ * @param {object} context context object
509
594
  * @returns {DeserializedType|Promise<DeserializedType>} deserialized data
510
595
  */
511
596
  deserialize(data, context) {
512
597
  const { filename, extension = "" } = context;
598
+ /**
599
+ * @param {string | boolean} name name
600
+ * @returns {Promise<TODO>} result
601
+ */
513
602
  const readFile = name =>
514
603
  new Promise((resolve, reject) => {
515
604
  const file = name
@@ -520,10 +609,14 @@ class FileMiddleware extends SerializerMiddleware {
520
609
  reject(err);
521
610
  return;
522
611
  }
523
- let remaining = /** @type {number} */ (stats.size);
612
+ let remaining = /** @type {IStats} */ (stats).size;
613
+ /** @type {Buffer | undefined} */
524
614
  let currentBuffer;
615
+ /** @type {number | undefined} */
525
616
  let currentBufferUsed;
617
+ /** @type {any[]} */
526
618
  const buf = [];
619
+ /** @type {import("zlib").Zlib & import("stream").Transform | undefined} */
527
620
  let decompression;
528
621
  if (file.endsWith(".gz")) {
529
622
  decompression = createGunzip({
@@ -535,7 +628,8 @@ class FileMiddleware extends SerializerMiddleware {
535
628
  });
536
629
  }
537
630
  if (decompression) {
538
- let newResolve, newReject;
631
+ let newResolve;
632
+ let newReject;
539
633
  resolve(
540
634
  Promise.all([
541
635
  new Promise((rs, rj) => {
@@ -552,11 +646,12 @@ class FileMiddleware extends SerializerMiddleware {
552
646
  resolve = newResolve;
553
647
  reject = newReject;
554
648
  }
555
- this.fs.open(file, "r", (err, fd) => {
649
+ this.fs.open(file, "r", (err, _fd) => {
556
650
  if (err) {
557
651
  reject(err);
558
652
  return;
559
653
  }
654
+ const fd = /** @type {number} */ (_fd);
560
655
  const read = () => {
561
656
  if (currentBuffer === undefined) {
562
657
  currentBuffer = Buffer.allocUnsafeSlow(
@@ -569,8 +664,10 @@ class FileMiddleware extends SerializerMiddleware {
569
664
  currentBufferUsed = 0;
570
665
  }
571
666
  let readBuffer = currentBuffer;
572
- let readOffset = currentBufferUsed;
573
- let readLength = currentBuffer.length - currentBufferUsed;
667
+ let readOffset = /** @type {number} */ (currentBufferUsed);
668
+ let readLength =
669
+ currentBuffer.length -
670
+ /** @type {number} */ (currentBufferUsed);
574
671
  // values passed to fs.read must be valid int32 values
575
672
  if (readOffset > 0x7fffffff) {
576
673
  readBuffer = currentBuffer.slice(readOffset);
@@ -592,9 +689,13 @@ class FileMiddleware extends SerializerMiddleware {
592
689
  });
593
690
  return;
594
691
  }
595
- currentBufferUsed += bytesRead;
692
+ /** @type {number} */
693
+ (currentBufferUsed) += bytesRead;
596
694
  remaining -= bytesRead;
597
- if (currentBufferUsed === currentBuffer.length) {
695
+ if (
696
+ currentBufferUsed ===
697
+ /** @type {Buffer} */ (currentBuffer).length
698
+ ) {
598
699
  if (decompression) {
599
700
  decompression.write(currentBuffer);
600
701
  } else {
@@ -4,25 +4,42 @@
4
4
 
5
5
  "use strict";
6
6
 
7
+ /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
8
+ /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
9
+
7
10
  class MapObjectSerializer {
8
- serialize(obj, { write }) {
9
- write(obj.size);
11
+ /**
12
+ * @template K, V
13
+ * @param {Map<K, V>} obj map
14
+ * @param {ObjectSerializerContext} context context
15
+ */
16
+ serialize(obj, context) {
17
+ context.write(obj.size);
10
18
  for (const key of obj.keys()) {
11
- write(key);
19
+ context.write(key);
12
20
  }
13
21
  for (const value of obj.values()) {
14
- write(value);
22
+ context.write(value);
15
23
  }
16
24
  }
17
- deserialize({ read }) {
18
- let size = read();
25
+
26
+ /**
27
+ * @template K, V
28
+ * @param {ObjectDeserializerContext} context context
29
+ * @returns {Map<K, V>} map
30
+ */
31
+ deserialize(context) {
32
+ /** @type {number} */
33
+ const size = context.read();
34
+ /** @type {Map<K, V>} */
19
35
  const map = new Map();
36
+ /** @type {K[]} */
20
37
  const keys = [];
21
38
  for (let i = 0; i < size; i++) {
22
- keys.push(read());
39
+ keys.push(context.read());
23
40
  }
24
41
  for (let i = 0; i < size; i++) {
25
- map.set(keys[i], read());
42
+ map.set(keys[i], context.read());
26
43
  }
27
44
  return map;
28
45
  }
@@ -4,27 +4,45 @@
4
4
 
5
5
  "use strict";
6
6
 
7
+ /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
8
+ /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
9
+
7
10
  class NullPrototypeObjectSerializer {
8
- serialize(obj, { write }) {
11
+ /**
12
+ * @template {object} T
13
+ * @param {T} obj null object
14
+ * @param {ObjectSerializerContext} context context
15
+ */
16
+ serialize(obj, context) {
17
+ /** @type {string[]} */
9
18
  const keys = Object.keys(obj);
10
19
  for (const key of keys) {
11
- write(key);
20
+ context.write(key);
12
21
  }
13
- write(null);
22
+ context.write(null);
14
23
  for (const key of keys) {
15
- write(obj[key]);
24
+ context.write(obj[/** @type {keyof T} */ (key)]);
16
25
  }
17
26
  }
18
- deserialize({ read }) {
27
+
28
+ /**
29
+ * @template {object} T
30
+ * @param {ObjectDeserializerContext} context context
31
+ * @returns {T} null object
32
+ */
33
+ deserialize(context) {
34
+ /** @type {T} */
19
35
  const obj = Object.create(null);
36
+ /** @type {string[]} */
20
37
  const keys = [];
21
- let key = read();
38
+ /** @type {string | null} */
39
+ let key = context.read();
22
40
  while (key !== null) {
23
41
  keys.push(key);
24
- key = read();
42
+ key = context.read();
25
43
  }
26
44
  for (const key of keys) {
27
- obj[key] = read();
45
+ obj[/** @type {keyof T} */ (key)] = context.read();
28
46
  }
29
47
  return obj;
30
48
  }