@depup/webpack 5.106.1-depup.0 → 5.109.2-depup.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 (669) hide show
  1. package/README.md +9 -11
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +16 -24
  4. package/hot/dev-server.js +2 -0
  5. package/lib/APIPlugin.js +60 -35
  6. package/lib/AsyncDependenciesBlock.js +3 -0
  7. package/lib/AutomaticPrefetchPlugin.js +6 -1
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +27 -5
  10. package/lib/CacheFacade.js +41 -0
  11. package/lib/Chunk.js +71 -25
  12. package/lib/ChunkGraph.js +153 -19
  13. package/lib/ChunkGroup.js +115 -28
  14. package/lib/ChunkTemplate.js +9 -0
  15. package/lib/CircularModulesPlugin.js +190 -0
  16. package/lib/CleanPlugin.js +27 -28
  17. package/lib/CodeGenerationResults.js +19 -0
  18. package/lib/CompatibilityPlugin.js +85 -37
  19. package/lib/Compilation.js +656 -112
  20. package/lib/Compiler.js +109 -35
  21. package/lib/ConcatenationScope.js +34 -4
  22. package/lib/ConditionalInitFragment.js +6 -0
  23. package/lib/ConstPlugin.js +15 -12
  24. package/lib/ContextExclusionPlugin.js +3 -1
  25. package/lib/ContextModule.js +345 -55
  26. package/lib/ContextModuleFactory.js +193 -51
  27. package/lib/ContextReplacementPlugin.js +8 -1
  28. package/lib/DefinePlugin.js +537 -139
  29. package/lib/DependenciesBlock.js +6 -1
  30. package/lib/Dependency.js +159 -11
  31. package/lib/DependencyTemplate.js +7 -1
  32. package/lib/DependencyTemplates.js +4 -0
  33. package/lib/DotenvPlugin.js +3 -0
  34. package/lib/DynamicEntryPlugin.js +3 -1
  35. package/lib/EntryOptionPlugin.js +42 -2
  36. package/lib/EntryPlugin.js +4 -1
  37. package/lib/Entrypoint.js +5 -1
  38. package/lib/EnvironmentPlugin.js +3 -2
  39. package/lib/ErrorHelpers.js +7 -0
  40. package/lib/EvalDevToolModulePlugin.js +3 -1
  41. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  42. package/lib/ExportsInfo.js +421 -113
  43. package/lib/ExportsInfoApiPlugin.js +4 -3
  44. package/lib/ExternalModule.js +381 -80
  45. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  46. package/lib/ExternalsPlugin.js +3 -1
  47. package/lib/FileSystemInfo.js +701 -175
  48. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  49. package/lib/FlagDependencyExportsPlugin.js +82 -9
  50. package/lib/FlagDependencyUsagePlugin.js +115 -8
  51. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  52. package/lib/Generator.js +24 -3
  53. package/lib/HotModuleReplacementPlugin.js +110 -44
  54. package/lib/IgnorePlugin.js +5 -2
  55. package/lib/IgnoreWarningsPlugin.js +2 -1
  56. package/lib/InitFragment.js +33 -30
  57. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  58. package/lib/LazyBarrel.js +389 -0
  59. package/lib/LibraryTemplatePlugin.js +2 -1
  60. package/lib/LoaderOptionsPlugin.js +3 -1
  61. package/lib/LoaderTargetPlugin.js +3 -1
  62. package/lib/MainTemplate.js +15 -0
  63. package/lib/ManifestPlugin.js +9 -2
  64. package/lib/Module.js +121 -57
  65. package/lib/ModuleFactory.js +6 -1
  66. package/lib/ModuleFilenameHelpers.js +18 -4
  67. package/lib/ModuleGraph.js +69 -2
  68. package/lib/ModuleGraphConnection.js +9 -0
  69. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  70. package/lib/ModuleNotFoundError.js +3 -83
  71. package/lib/ModuleProfile.js +27 -1
  72. package/lib/ModuleSourceTypeConstants.js +52 -19
  73. package/lib/ModuleTemplate.js +10 -0
  74. package/lib/ModuleTypeConstants.js +20 -4
  75. package/lib/MultiCompiler.js +59 -4
  76. package/lib/MultiStats.js +9 -0
  77. package/lib/MultiWatching.js +6 -0
  78. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  79. package/lib/NodeStuffPlugin.js +78 -46
  80. package/lib/NormalModule.js +519 -206
  81. package/lib/NormalModuleFactory.js +156 -31
  82. package/lib/NormalModuleReplacementPlugin.js +3 -1
  83. package/lib/NullFactory.js +1 -0
  84. package/lib/OptionsApply.js +1 -0
  85. package/lib/Parser.js +3 -1
  86. package/lib/PlatformPlugin.js +2 -1
  87. package/lib/PrefetchPlugin.js +4 -1
  88. package/lib/ProgressPlugin.js +351 -161
  89. package/lib/ProvidePlugin.js +6 -3
  90. package/lib/RawModule.js +32 -16
  91. package/lib/RecordIdsPlugin.js +9 -0
  92. package/lib/RequestShortener.js +8 -0
  93. package/lib/ResolverFactory.js +5 -0
  94. package/lib/RuntimeGlobals.js +58 -5
  95. package/lib/RuntimeModule.js +22 -7
  96. package/lib/RuntimePlugin.js +123 -118
  97. package/lib/RuntimeTemplate.js +616 -37
  98. package/lib/SelfModuleFactory.js +3 -0
  99. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  100. package/lib/SourceMapDevToolPlugin.js +341 -63
  101. package/lib/Stats.js +6 -0
  102. package/lib/Template.js +52 -6
  103. package/lib/TemplatedPathPlugin.js +505 -138
  104. package/lib/UseStrictPlugin.js +3 -2
  105. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  106. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  107. package/lib/WarnNoModeSetPlugin.js +18 -2
  108. package/lib/WatchIgnorePlugin.js +5 -1
  109. package/lib/Watching.js +25 -3
  110. package/lib/WebpackError.js +3 -74
  111. package/lib/WebpackIsIncludedPlugin.js +4 -2
  112. package/lib/WebpackOptionsApply.js +88 -25
  113. package/lib/WebpackOptionsDefaulter.js +1 -0
  114. package/lib/asset/AssetBytesGenerator.js +28 -10
  115. package/lib/asset/AssetBytesParser.js +1 -0
  116. package/lib/asset/AssetGenerator.js +199 -60
  117. package/lib/asset/AssetModule.js +47 -0
  118. package/lib/asset/AssetModulesPlugin.js +115 -24
  119. package/lib/asset/AssetParser.js +4 -2
  120. package/lib/asset/AssetSourceGenerator.js +26 -8
  121. package/lib/asset/AssetSourceParser.js +1 -0
  122. package/lib/asset/RawDataUrlModule.js +23 -13
  123. package/lib/asset/WebManifestGenerator.js +164 -0
  124. package/lib/asset/WebManifestParser.js +130 -0
  125. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  126. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  127. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  128. package/lib/async-modules/isGeneratorLowered.js +26 -0
  129. package/lib/buildChunkGraph.js +107 -15
  130. package/lib/bun/BunTargetPlugin.js +42 -0
  131. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  132. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  133. package/lib/cache/IdleFileCachePlugin.js +6 -1
  134. package/lib/cache/MemoryCachePlugin.js +1 -1
  135. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  136. package/lib/cache/PackFileCacheStrategy.js +302 -12
  137. package/lib/cache/ResolverCachePlugin.js +12 -1
  138. package/lib/cache/getLazyHashedEtag.js +13 -2
  139. package/lib/cache/mergeEtags.js +4 -0
  140. package/lib/cli.js +142 -20
  141. package/lib/config/browserslistTargetHandler.js +141 -0
  142. package/lib/config/defaults.js +612 -43
  143. package/lib/config/defineConfig.js +31 -0
  144. package/lib/config/normalization.js +46 -1
  145. package/lib/config/target.js +200 -2
  146. package/lib/container/ContainerEntryDependency.js +2 -0
  147. package/lib/container/ContainerEntryModule.js +27 -14
  148. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  149. package/lib/container/ContainerExposedDependency.js +6 -2
  150. package/lib/container/ContainerPlugin.js +2 -1
  151. package/lib/container/ContainerReferencePlugin.js +3 -2
  152. package/lib/container/FallbackDependency.js +9 -7
  153. package/lib/container/FallbackItemDependency.js +1 -0
  154. package/lib/container/FallbackModule.js +22 -9
  155. package/lib/container/FallbackModuleFactory.js +1 -0
  156. package/lib/container/HoistContainerReferencesPlugin.js +47 -55
  157. package/lib/container/ModuleFederationPlugin.js +21 -29
  158. package/lib/container/RemoteModule.js +33 -10
  159. package/lib/container/RemoteRuntimeModule.js +15 -12
  160. package/lib/container/RemoteToExternalDependency.js +1 -0
  161. package/lib/container/options.js +7 -0
  162. package/lib/css/CssGenerator.js +540 -272
  163. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  164. package/lib/css/CssLoadingRuntimeModule.js +173 -81
  165. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  166. package/lib/css/CssModulesPlugin.js +371 -208
  167. package/lib/css/CssParser.js +3538 -1963
  168. package/lib/css/syntax.js +4155 -0
  169. package/lib/debug/ProfilingPlugin.js +33 -2
  170. package/lib/deno/DenoTargetPlugin.js +41 -0
  171. package/lib/dependencies/AMDDefineDependency.js +29 -17
  172. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  173. package/lib/dependencies/AMDPlugin.js +6 -3
  174. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  175. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  176. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  177. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  178. package/lib/dependencies/AMDRequireDependency.js +28 -20
  179. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  180. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  181. package/lib/dependencies/CachedConstDependency.js +9 -1
  182. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  183. package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
  184. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  185. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  186. package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
  187. package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
  188. package/lib/dependencies/CommonJsPlugin.js +7 -4
  189. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  190. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  191. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  192. package/lib/dependencies/ConstDependency.js +22 -12
  193. package/lib/dependencies/ContextDependency.js +13 -2
  194. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  195. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  196. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  197. package/lib/dependencies/ContextElementDependency.js +27 -14
  198. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  199. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  200. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  201. package/lib/dependencies/CssIcssExportDependency.js +681 -367
  202. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  203. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  204. package/lib/dependencies/CssImportDependency.js +37 -1
  205. package/lib/dependencies/CssUrlDependency.js +87 -14
  206. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  207. package/lib/dependencies/DllEntryDependency.js +12 -13
  208. package/lib/dependencies/DynamicExports.js +5 -0
  209. package/lib/dependencies/EntryDependency.js +1 -0
  210. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  211. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  212. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  213. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  214. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  215. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  216. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  217. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  218. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  219. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
  220. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  221. package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
  222. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
  224. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  226. package/lib/dependencies/HarmonyExports.js +6 -1
  227. package/lib/dependencies/HarmonyImportDependency.js +60 -4
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  229. package/lib/dependencies/HarmonyImportGuard.js +427 -0
  230. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  231. package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
  232. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  233. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  234. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  235. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  236. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  237. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  238. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  239. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  240. package/lib/dependencies/ImportContextDependency.js +9 -9
  241. package/lib/dependencies/ImportDependency.js +92 -3
  242. package/lib/dependencies/ImportEagerDependency.js +2 -0
  243. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  244. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  245. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  246. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  247. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  248. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  249. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  250. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  251. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  252. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  253. package/lib/dependencies/ImportParserPlugin.js +114 -27
  254. package/lib/dependencies/ImportPhase.js +17 -11
  255. package/lib/dependencies/ImportPlugin.js +2 -1
  256. package/lib/dependencies/ImportWeakDependency.js +3 -0
  257. package/lib/dependencies/JsonExportsDependency.js +15 -10
  258. package/lib/dependencies/LoaderDependency.js +2 -0
  259. package/lib/dependencies/LoaderImportDependency.js +3 -0
  260. package/lib/dependencies/LoaderPlugin.js +9 -2
  261. package/lib/dependencies/LocalModule.js +15 -12
  262. package/lib/dependencies/LocalModuleDependency.js +15 -13
  263. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  264. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  265. package/lib/dependencies/ModuleDependency.js +14 -0
  266. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  267. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  268. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  269. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  270. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  271. package/lib/dependencies/NullDependency.js +2 -0
  272. package/lib/dependencies/PrefetchDependency.js +1 -0
  273. package/lib/dependencies/ProvidedDependency.js +36 -27
  274. package/lib/dependencies/PureExpressionDependency.js +14 -10
  275. package/lib/dependencies/RequireContextDependency.js +1 -0
  276. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  277. package/lib/dependencies/RequireContextPlugin.js +2 -1
  278. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  279. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  280. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  281. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  282. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  283. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  284. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  285. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  286. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  287. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  288. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  289. package/lib/dependencies/RequireResolveDependency.js +2 -0
  290. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  291. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  292. package/lib/dependencies/StaticExportsDependency.js +13 -10
  293. package/lib/dependencies/SystemPlugin.js +9 -6
  294. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  295. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  296. package/lib/dependencies/URLContextDependency.js +8 -7
  297. package/lib/dependencies/URLDependency.js +157 -33
  298. package/lib/dependencies/URLPlugin.js +2 -0
  299. package/lib/dependencies/UnsupportedDependency.js +12 -13
  300. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  301. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  302. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  303. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  304. package/lib/dependencies/WorkerDependency.js +111 -27
  305. package/lib/dependencies/WorkletDependency.js +278 -0
  306. package/lib/dependencies/getFunctionExpression.js +1 -0
  307. package/lib/dependencies/processExportInfo.js +14 -11
  308. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  309. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  310. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  311. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  312. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  313. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  314. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  315. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  316. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  317. package/lib/electron/ElectronTargetPlugin.js +24 -5
  318. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  319. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  320. package/lib/errors/BuildCycleError.js +1 -1
  321. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  322. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  323. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  324. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  325. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  326. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  327. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  328. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  329. package/lib/errors/JSONParseError.js +115 -0
  330. package/lib/errors/LoaderLoadingError.js +20 -0
  331. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  332. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  333. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  334. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  335. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  336. package/lib/errors/ModuleNotFoundError.js +94 -0
  337. package/lib/errors/ModuleParseError.js +141 -0
  338. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  339. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  340. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  341. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  342. package/lib/errors/NonErrorEmittedError.js +30 -0
  343. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  344. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  345. package/lib/errors/WebpackError.js +84 -0
  346. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  347. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  348. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  349. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
  350. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  351. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  352. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  353. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  354. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  355. package/lib/hmr/lazyCompilationBackend.js +53 -12
  356. package/lib/html/HtmlGenerator.js +1490 -0
  357. package/lib/html/HtmlModule.js +41 -0
  358. package/lib/html/HtmlModulesPlugin.js +1129 -0
  359. package/lib/html/HtmlParser.js +1970 -0
  360. package/lib/html/favicon.svg +1 -0
  361. package/lib/html/syntax.js +9106 -0
  362. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  363. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  364. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  365. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  366. package/lib/ids/IdHelpers.js +49 -12
  367. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  368. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  369. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  370. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  371. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  372. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  373. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  374. package/lib/index.js +66 -15
  375. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  376. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  377. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  378. package/lib/javascript/ChunkHelpers.js +1 -0
  379. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  380. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  381. package/lib/javascript/JavascriptGenerator.js +213 -51
  382. package/lib/javascript/JavascriptModule.js +54 -0
  383. package/lib/javascript/JavascriptModulesPlugin.js +628 -198
  384. package/lib/javascript/JavascriptParser.js +1334 -471
  385. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  386. package/lib/javascript/StartupHelpers.js +5 -0
  387. package/lib/javascript/syntax.js +5037 -0
  388. package/lib/json/JsonData.js +5 -0
  389. package/lib/json/JsonGenerator.js +21 -0
  390. package/lib/json/JsonModule.js +40 -0
  391. package/lib/json/JsonModulesPlugin.js +8 -1
  392. package/lib/json/JsonParser.js +18 -27
  393. package/lib/library/AbstractLibraryPlugin.js +17 -2
  394. package/lib/library/AmdLibraryPlugin.js +8 -0
  395. package/lib/library/AssignLibraryPlugin.js +21 -3
  396. package/lib/library/EnableLibraryPlugin.js +8 -2
  397. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  398. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  399. package/lib/library/JsonpLibraryPlugin.js +8 -0
  400. package/lib/library/ModuleLibraryPlugin.js +154 -7
  401. package/lib/library/SystemLibraryPlugin.js +11 -3
  402. package/lib/library/UmdLibraryPlugin.js +16 -0
  403. package/lib/loaders/LoaderRunner.js +714 -0
  404. package/lib/loaders/loadLoader.js +100 -0
  405. package/lib/logging/Logger.js +17 -0
  406. package/lib/logging/createConsoleLogger.js +7 -0
  407. package/lib/logging/runtime.js +2 -0
  408. package/lib/logging/truncateArgs.js +2 -0
  409. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  410. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  411. package/lib/node/NodeSourcePlugin.js +1 -1
  412. package/lib/node/NodeTargetPlugin.js +4 -63
  413. package/lib/node/NodeTemplatePlugin.js +3 -1
  414. package/lib/node/NodeWatchFileSystem.js +40 -22
  415. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  416. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
  417. package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
  418. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  419. package/lib/node/nodeBuiltins.js +80 -0
  420. package/lib/node/nodeConsole.js +116 -64
  421. package/lib/optimize/AggressiveMergingPlugin.js +22 -16
  422. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  423. package/lib/optimize/ConcatenatedModule.js +603 -130
  424. package/lib/optimize/ConstExportsPlugin.js +211 -0
  425. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  426. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  427. package/lib/optimize/InlineExports.js +178 -0
  428. package/lib/optimize/InnerGraph.js +374 -262
  429. package/lib/optimize/InnerGraphPlugin.js +246 -117
  430. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  431. package/lib/optimize/MangleExportsPlugin.js +5 -1
  432. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  433. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  434. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  435. package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
  436. package/lib/optimize/RealContentHashPlugin.js +130 -52
  437. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  438. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  439. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  440. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  441. package/lib/optimize/SplitChunksPlugin.js +200 -50
  442. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  443. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  444. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  445. package/lib/performance/SizeLimitsPlugin.js +8 -2
  446. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  448. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  449. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  450. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  451. package/lib/prefetch/ResourceHintPlugin.js +687 -0
  452. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  453. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  454. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  455. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  456. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  457. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  458. package/lib/rules/RuleSetCompiler.js +132 -0
  459. package/lib/rules/UseEffectRulePlugin.js +10 -3
  460. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  461. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  462. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  463. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  464. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  465. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  466. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  467. package/lib/runtime/CompatRuntimeModule.js +2 -0
  468. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  469. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  470. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  471. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  472. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  473. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  474. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  475. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  476. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  477. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  478. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  479. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  480. package/lib/runtime/HelperRuntimeModule.js +5 -0
  481. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  482. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  483. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  484. package/lib/runtime/NonceRuntimeModule.js +1 -0
  485. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  486. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  487. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  488. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  489. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  490. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  491. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  492. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  493. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  494. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  495. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  496. package/lib/schemes/DataUriPlugin.js +14 -2
  497. package/lib/schemes/FileUriPlugin.js +1 -1
  498. package/lib/schemes/HttpUriPlugin.js +86 -4
  499. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  500. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  501. package/lib/serialization/ArraySerializer.js +6 -8
  502. package/lib/serialization/BinaryMiddleware.js +427 -1006
  503. package/lib/serialization/DateObjectSerializer.js +4 -2
  504. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  505. package/lib/serialization/FileMiddleware.js +345 -59
  506. package/lib/serialization/MapObjectSerializer.js +7 -9
  507. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  508. package/lib/serialization/ObjectMiddleware.js +73 -13
  509. package/lib/serialization/PlainObjectSerializer.js +16 -8
  510. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  511. package/lib/serialization/Serializer.js +6 -0
  512. package/lib/serialization/SerializerMiddleware.js +14 -2
  513. package/lib/serialization/SetObjectSerializer.js +6 -8
  514. package/lib/serialization/SingleItemMiddleware.js +3 -0
  515. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  516. package/lib/sharing/ConsumeSharedModule.js +21 -7
  517. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  518. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  519. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  520. package/lib/sharing/ProvideSharedDependency.js +34 -15
  521. package/lib/sharing/ProvideSharedModule.js +42 -12
  522. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  523. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  524. package/lib/sharing/SharePlugin.js +5 -1
  525. package/lib/sharing/ShareRuntimeModule.js +19 -16
  526. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  527. package/lib/sharing/utils.js +9 -1
  528. package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
  529. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  530. package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
  531. package/lib/stats/StatsFactory.js +70 -27
  532. package/lib/stats/StatsPrinter.js +16 -2
  533. package/lib/typescript/TypeScriptPlugin.js +210 -0
  534. package/lib/url/URLParserPlugin.js +111 -23
  535. package/lib/util/ArrayHelpers.js +1 -0
  536. package/lib/util/ArrayQueue.js +10 -5
  537. package/lib/util/AsyncQueue.js +154 -74
  538. package/lib/util/Hash.js +2 -2
  539. package/lib/util/IterableHelpers.js +3 -0
  540. package/lib/util/LazyBucketSortedSet.js +26 -0
  541. package/lib/util/LazySet.js +45 -4
  542. package/lib/util/LocConverter.js +64 -0
  543. package/lib/util/ParallelismFactorCalculator.js +1 -0
  544. package/lib/util/Queue.js +6 -3
  545. package/lib/util/Semaphore.js +15 -1
  546. package/lib/util/SetHelpers.js +4 -1
  547. package/lib/util/SortableSet.js +7 -1
  548. package/lib/util/SourceProcessor.js +119 -0
  549. package/lib/util/StackedCacheMap.js +20 -3
  550. package/lib/util/StackedMap.js +162 -43
  551. package/lib/util/StringXor.js +1 -1
  552. package/lib/util/TupleQueue.js +7 -3
  553. package/lib/util/TupleSet.js +14 -0
  554. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  555. package/lib/util/WeakTupleMap.js +60 -1
  556. package/lib/util/binarySearchBounds.js +3 -2
  557. package/lib/util/chainedImports.js +3 -3
  558. package/lib/util/cleverMerge.js +19 -2
  559. package/lib/util/comparators.js +35 -4
  560. package/lib/util/compileBooleanMatcher.js +9 -0
  561. package/lib/util/concatenate.js +80 -24
  562. package/lib/util/conventions.js +46 -1
  563. package/lib/util/createHash.js +0 -1
  564. package/lib/util/createHooksRegistry.js +43 -0
  565. package/lib/util/createMappings.js +118 -0
  566. package/lib/util/dataURL.js +3 -2
  567. package/lib/util/deprecation.js +19 -0
  568. package/lib/util/deterministicGrouping.js +46 -17
  569. package/lib/util/extractSourceMap.js +2 -1
  570. package/lib/util/extractUrlAndGlobal.js +1 -0
  571. package/lib/util/findGraphRoots.js +7 -0
  572. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  573. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  574. package/lib/util/fs.js +87 -14
  575. package/lib/util/generateDebugId.js +1 -0
  576. package/lib/util/globUtils.js +710 -0
  577. package/lib/util/hash/BatchedHash.js +1 -0
  578. package/lib/util/hash/BulkUpdateHash.js +1 -0
  579. package/lib/util/hash/DebugHash.js +1 -0
  580. package/lib/util/hash/hash-digest.js +32 -15
  581. package/lib/util/hash/md4.js +1 -1
  582. package/lib/util/hash/wasm-hash.js +5 -0
  583. package/lib/util/hash/xxhash64.js +1 -1
  584. package/lib/util/identifier.js +118 -7
  585. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  586. package/lib/util/internalSerializables.js +102 -60
  587. package/lib/util/magicComment.js +149 -7
  588. package/lib/util/makeSerializable.js +7 -0
  589. package/lib/util/memoize.js +2 -0
  590. package/lib/util/mimeTypes.js +176 -0
  591. package/lib/util/nonNumericOnlyHash.js +31 -1
  592. package/lib/util/numberHash.js +2 -2
  593. package/lib/util/parseJson.js +41 -0
  594. package/lib/util/processAsyncTree.js +8 -0
  595. package/lib/util/property.js +9 -2
  596. package/lib/util/publicPathPlaceholder.js +64 -0
  597. package/lib/util/registerExternalSerializer.js +24 -4
  598. package/lib/util/removeBOM.js +1 -0
  599. package/lib/util/runtime.js +32 -0
  600. package/lib/util/semver.js +15 -0
  601. package/lib/util/serialization.js +2 -0
  602. package/lib/util/smartGrouping.js +8 -0
  603. package/lib/util/source.js +23 -0
  604. package/lib/util/topologicalSort.js +69 -0
  605. package/lib/validateSchema.js +1 -0
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  607. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  608. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  609. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  610. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  611. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  612. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  613. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  614. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  615. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  616. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  623. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  626. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  627. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  629. package/lib/web/JsonpTemplatePlugin.js +2 -1
  630. package/lib/webpack.js +78 -1
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +21 -0
  635. package/package.json +79 -77
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +1173 -80
  638. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  639. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  640. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  641. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  642. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  643. package/schemas/plugins/HtmlParserOptions.json +3 -0
  644. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  645. package/schemas/plugins/ProgressPlugin.json +38 -0
  646. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  647. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  648. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  649. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  650. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  652. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  653. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  654. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  655. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  656. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  657. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  658. package/types.d.ts +11053 -3019
  659. package/lib/CaseSensitiveModulesWarning.js +0 -72
  660. package/lib/GraphHelpers.js +0 -46
  661. package/lib/ModuleParseError.js +0 -125
  662. package/lib/NoModeWarning.js +0 -23
  663. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  664. package/lib/css/walkCssTokens.js +0 -1843
  665. package/lib/util/AppendOnlyStackedSet.js +0 -78
  666. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  668. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  669. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -4,11 +4,12 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
8
- /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
7
+ /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext<[number]>} ObjectDeserializerContext */
8
+ /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext<[number]>} ObjectSerializerContext */
9
9
 
10
10
  class DateObjectSerializer {
11
11
  /**
12
+ * Serializes this instance into the provided serializer context.
12
13
  * @param {Date} obj date
13
14
  * @param {ObjectSerializerContext} context context
14
15
  */
@@ -17,6 +18,7 @@ class DateObjectSerializer {
17
18
  }
18
19
 
19
20
  /**
21
+ * Restores this instance from the provided deserializer context.
20
22
  * @param {ObjectDeserializerContext} context context
21
23
  * @returns {Date} date
22
24
  */
@@ -4,13 +4,15 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
8
- /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
7
+ /** @typedef {import("./types").ComplexSerializableType} ComplexSerializableType */
8
+ /** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext<ComplexSerializableType[]>} ObjectDeserializerContext */
9
+ /** @typedef {import("./ObjectMiddleware").ObjectSerializerContext<ComplexSerializableType[]>} ObjectSerializerContext */
9
10
 
10
11
  /** @typedef {Error & { cause?: unknown }} ErrorWithCause */
11
12
 
12
13
  class ErrorObjectSerializer {
13
14
  /**
15
+ * Creates an instance of ErrorObjectSerializer.
14
16
  * @param {ErrorConstructor | EvalErrorConstructor | RangeErrorConstructor | ReferenceErrorConstructor | SyntaxErrorConstructor | TypeErrorConstructor} Type error type
15
17
  */
16
18
  constructor(Type) {
@@ -18,6 +20,7 @@ class ErrorObjectSerializer {
18
20
  }
19
21
 
20
22
  /**
23
+ * Serializes this instance into the provided serializer context.
21
24
  * @param {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} obj error
22
25
  * @param {ObjectSerializerContext} context context
23
26
  */
@@ -25,20 +28,21 @@ class ErrorObjectSerializer {
25
28
  context.write(obj.message);
26
29
  context.write(obj.stack);
27
30
  context.write(
28
- /** @type {ErrorWithCause} */
29
- (obj).cause
31
+ /** @type {ComplexSerializableType} */
32
+ (/** @type {ErrorWithCause} */ (obj).cause)
30
33
  );
31
34
  }
32
35
 
33
36
  /**
37
+ * Restores this instance from the provided deserializer context.
34
38
  * @param {ObjectDeserializerContext} context context
35
39
  * @returns {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} error
36
40
  */
37
41
  deserialize(context) {
38
42
  const err = new this.Type();
39
43
 
40
- err.message = context.read();
41
- err.stack = context.read();
44
+ err.message = /** @type {string} */ (context.read());
45
+ err.stack = /** @type {string | undefined} */ (context.read());
42
46
  /** @type {ErrorWithCause} */
43
47
  (err).cause = context.read();
44
48
 
@@ -7,13 +7,23 @@
7
7
  const { constants } = require("buffer");
8
8
  const { pipeline } = require("stream");
9
9
  const {
10
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
11
+ brotliDecompress,
10
12
  constants: zConstants,
11
13
  // eslint-disable-next-line n/no-unsupported-features/node-builtins
12
14
  createBrotliCompress,
13
15
  // eslint-disable-next-line n/no-unsupported-features/node-builtins
14
16
  createBrotliDecompress,
15
17
  createGunzip,
16
- createGzip
18
+ createGzip,
19
+ // zstd is only available on Node.js >= 22.15; guarded at use sites
20
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
21
+ createZstdCompress,
22
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
23
+ createZstdDecompress,
24
+ gunzip,
25
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
26
+ zstdDecompress
17
27
  } = require("zlib");
18
28
  const { DEFAULTS } = require("../config/defaults");
19
29
  const createHash = require("../util/createHash");
@@ -46,8 +56,11 @@ Section -> Buffer
46
56
  const VERSION = 0x01637077;
47
57
  const WRITE_LIMIT_TOTAL = 0x7fff0000;
48
58
  const WRITE_LIMIT_CHUNK = 511 * 1024 * 1024;
59
+ // headers and pointer sections are tiny; anything above this is a corrupt file
60
+ const MAX_HEADER_OR_POINTER_SIZE = 256 * 1024 * 1024;
49
61
 
50
62
  /**
63
+ * Returns hash.
51
64
  * @param {Buffer[]} buffers buffers
52
65
  * @param {HashFunction} hashFunction hash function to use
53
66
  * @returns {string} hash
@@ -85,6 +98,7 @@ const readUInt64LE = Buffer.prototype.readBigUInt64LE
85
98
  /** @typedef {Promise<void | void[]>} BackgroundJob */
86
99
 
87
100
  /**
101
+ * Defines the serialize result type used by this module.
88
102
  * @typedef {object} SerializeResult
89
103
  * @property {string | false} name
90
104
  * @property {number} size
@@ -93,15 +107,18 @@ const readUInt64LE = Buffer.prototype.readBigUInt64LE
93
107
 
94
108
  /** @typedef {{ name: string, size: number }} LazyOptions */
95
109
  /**
110
+ * Defines the lazy function type used by this module.
96
111
  * @typedef {import("./SerializerMiddleware").LazyFunction<BufferSerializableType[], Buffer, FileMiddleware, LazyOptions>} LazyFunction
97
112
  */
98
113
 
99
114
  /**
115
+ * Serializes this instance into the provided serializer context.
100
116
  * @param {FileMiddleware} middleware this
101
117
  * @param {(BufferSerializableType | LazyFunction)[]} data data to be serialized
102
118
  * @param {string | boolean} name file base name
103
119
  * @param {(name: string | false, buffers: Buffer[], size: number) => Promise<void>} writeFile writes a file
104
120
  * @param {HashFunction=} hashFunction hash function to use
121
+ * @param {Set<string>=} retainedNames collects names of files that stay referenced without being rewritten
105
122
  * @returns {Promise<SerializeResult>} resulting file pointer and promise
106
123
  */
107
124
  const serialize = async (
@@ -109,7 +126,8 @@ const serialize = async (
109
126
  data,
110
127
  name,
111
128
  writeFile,
112
- hashFunction = DEFAULTS.HASH_FUNCTION
129
+ hashFunction = DEFAULTS.HASH_FUNCTION,
130
+ retainedNames = undefined
113
131
  ) => {
114
132
  /** @type {(Buffer[] | Buffer | Promise<SerializeResult>)[]} */
115
133
  const processedData = [];
@@ -135,6 +153,10 @@ const serialize = async (
135
153
  "Unexpected lazy value with non-this target (can't pass through lazy values)"
136
154
  );
137
155
  } else {
156
+ if (retainedNames !== undefined) {
157
+ // pointer buffer layout: u64 size + utf-8 file name
158
+ retainedNames.add(serializedInfo.toString("utf8", 8));
159
+ }
138
160
  processedData.push(serializedInfo);
139
161
  }
140
162
  } else {
@@ -148,7 +170,8 @@ const serialize = async (
148
170
  (content),
149
171
  (options && options.name) || true,
150
172
  writeFile,
151
- hashFunction
173
+ hashFunction,
174
+ retainedNames
152
175
  ).then((result) => {
153
176
  /** @type {LazyOptions} */
154
177
  (item.options).size = result.size;
@@ -243,6 +266,7 @@ const serialize = async (
243
266
  };
244
267
 
245
268
  /**
269
+ * Restores this instance from the provided deserializer context.
246
270
  * @param {FileMiddleware} middleware this
247
271
  * @param {string | false} name filename
248
272
  * @param {(name: string | false) => Promise<Buffer[]>} readFile read content of a file
@@ -263,6 +287,7 @@ const deserialize = async (middleware, name, readFile) => {
263
287
  contentPosition = 0;
264
288
  };
265
289
  /**
290
+ * Processes the provided n.
266
291
  * @param {number} n number of bytes to ensure
267
292
  */
268
293
  const ensureData = (n) => {
@@ -294,6 +319,7 @@ const deserialize = async (middleware, name, readFile) => {
294
319
  }
295
320
  };
296
321
  /**
322
+ * Returns value value.
297
323
  * @returns {number} value value
298
324
  */
299
325
  const readUInt32LE = () => {
@@ -303,6 +329,7 @@ const deserialize = async (middleware, name, readFile) => {
303
329
  return value;
304
330
  };
305
331
  /**
332
+ * Returns value value.
306
333
  * @returns {number} value value
307
334
  */
308
335
  const readInt32LE = () => {
@@ -312,6 +339,7 @@ const deserialize = async (middleware, name, readFile) => {
312
339
  return value;
313
340
  };
314
341
  /**
342
+ * Returns buffer.
315
343
  * @param {number} l length
316
344
  * @returns {Buffer} buffer
317
345
  */
@@ -369,9 +397,13 @@ const deserialize = async (middleware, name, readFile) => {
369
397
  );
370
398
  result.push(lazy);
371
399
  } else {
400
+ // A section may start exactly at a content-buffer boundary; advance
401
+ // first, then read from the fresh buffer (don't fall through to the
402
+ // `while` below, which would skip it).
372
403
  if (contentPosition === contentItemLength) {
373
404
  nextContent();
374
- } else if (contentPosition !== 0) {
405
+ }
406
+ if (contentPosition !== 0) {
375
407
  if (length <= contentItemLength - contentPosition) {
376
408
  result.push(
377
409
  Buffer.from(
@@ -426,13 +458,22 @@ const deserialize = async (middleware, name, readFile) => {
426
458
 
427
459
  /** @typedef {BufferSerializableType[]} DeserializedType */
428
460
  /** @typedef {true} SerializedType */
429
- /** @typedef {{ filename: string, extension?: string }} Context */
461
+ /**
462
+ * `writtenFiles`/`retainedFiles` collect file names (without extension) during
463
+ * `serialize`: files written in this run and files that stay referenced by
464
+ * lazy pointers without being rewritten. Retained files may reference further
465
+ * files on disk not listed here (nested lazy segments); use
466
+ * `getReferencedFilenames` to walk them.
467
+ * @typedef {{ filename: string, extension?: string, writtenFiles?: Set<string>, retainedFiles?: Set<string> }} Context
468
+ */
430
469
 
431
470
  /**
471
+ * Represents FileMiddleware.
432
472
  * @extends {SerializerMiddleware<DeserializedType, SerializedType, Context>}
433
473
  */
434
474
  class FileMiddleware extends SerializerMiddleware {
435
475
  /**
476
+ * Creates an instance of FileMiddleware.
436
477
  * @param {IntermediateFileSystem} fs filesystem
437
478
  * @param {HashFunction} hashFunction hash function to use
438
479
  */
@@ -445,12 +486,13 @@ class FileMiddleware extends SerializerMiddleware {
445
486
  }
446
487
 
447
488
  /**
489
+ * Serializes this instance into the provided serializer context.
448
490
  * @param {DeserializedType} data data
449
491
  * @param {Context} context context object
450
492
  * @returns {SerializedType | Promise<SerializedType> | null} serialized data
451
493
  */
452
494
  serialize(data, context) {
453
- const { filename, extension = "" } = context;
495
+ const { filename, extension = "", writtenFiles, retainedFiles } = context;
454
496
  return new Promise((resolve, reject) => {
455
497
  mkdirp(this.fs, dirname(this.fs, filename), (err) => {
456
498
  if (err) return reject(err);
@@ -460,6 +502,7 @@ class FileMiddleware extends SerializerMiddleware {
460
502
  /** @type {Set<string>} */
461
503
  const allWrittenFiles = new Set();
462
504
  /**
505
+ * Processes the provided name.
463
506
  * @param {string | false} name name
464
507
  * @param {Buffer[]} content content
465
508
  * @param {number} size size
@@ -471,12 +514,13 @@ class FileMiddleware extends SerializerMiddleware {
471
514
  : filename;
472
515
  await new Promise(
473
516
  /**
517
+ * Handles the callback logic for this hook.
474
518
  * @param {(value?: undefined) => void} resolve resolve
475
519
  * @param {(reason?: Error | null) => void} reject reject
476
520
  */
477
521
  (resolve, reject) => {
478
522
  let stream = this.fs.createWriteStream(`${file}_`);
479
- /** @type {undefined | import("zlib").Gzip | import("zlib").BrotliCompress} */
523
+ /** @type {undefined | import("zlib").Gzip | import("zlib").BrotliCompress | import("zlib").ZstdCompress} */
480
524
  let compression;
481
525
  if (file.endsWith(".gz")) {
482
526
  compression = createGzip({
@@ -493,6 +537,17 @@ class FileMiddleware extends SerializerMiddleware {
493
537
  [zConstants.BROTLI_PARAM_SIZE_HINT]: size
494
538
  }
495
539
  });
540
+ } else if (file.endsWith(".zst")) {
541
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
542
+ const levelParam = zConstants.ZSTD_c_compressionLevel;
543
+ // default level 3; some runtimes (e.g. Deno) don't expose ZSTD_CLEVEL_DEFAULT
544
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
545
+ const defaultLevel = zConstants.ZSTD_CLEVEL_DEFAULT;
546
+ const level = defaultLevel === undefined ? 3 : defaultLevel;
547
+ compression = createZstdCompress({
548
+ chunkSize: COMPRESSION_CHUNK_SIZE,
549
+ params: { [levelParam]: level }
550
+ });
496
551
  }
497
552
  if (compression) {
498
553
  pipeline(compression, stream, reject);
@@ -518,6 +573,7 @@ class FileMiddleware extends SerializerMiddleware {
518
573
  const len = chunks.length;
519
574
  let i = 0;
520
575
  /**
576
+ * Processes the provided err.
521
577
  * @param {(Error | null)=} err err
522
578
  */
523
579
  const batchWrite = (err) => {
@@ -546,69 +602,81 @@ class FileMiddleware extends SerializerMiddleware {
546
602
  batchWrite();
547
603
  }
548
604
  );
549
- if (name) allWrittenFiles.add(file);
605
+ if (name) {
606
+ allWrittenFiles.add(file);
607
+ if (writtenFiles !== undefined) writtenFiles.add(name);
608
+ }
550
609
  };
551
610
 
552
611
  resolve(
553
- serialize(this, data, false, writeFile, this._hashFunction).then(
554
- async ({ backgroundJob }) => {
555
- await backgroundJob;
556
-
557
- // Rename the index file to disallow access during inconsistent file state
558
- await new Promise(
559
- /**
560
- * @param {(value?: undefined) => void} resolve resolve
561
- */
562
- (resolve) => {
563
- this.fs.rename(filename, `${filename}.old`, (_err) => {
564
- resolve();
565
- });
566
- }
567
- );
612
+ serialize(
613
+ this,
614
+ data,
615
+ false,
616
+ writeFile,
617
+ this._hashFunction,
618
+ retainedFiles
619
+ ).then(async ({ backgroundJob }) => {
620
+ await backgroundJob;
568
621
 
569
- // update all written files
570
- await Promise.all(
571
- Array.from(
572
- allWrittenFiles,
573
- (file) =>
574
- new Promise(
575
- /**
576
- * @param {(value?: undefined) => void} resolve resolve
577
- * @param {(reason?: Error | null) => void} reject reject
578
- * @returns {void}
579
- */
580
- (resolve, reject) => {
581
- this.fs.rename(`${file}_`, file, (err) => {
582
- if (err) return reject(err);
583
- resolve();
584
- });
585
- }
586
- )
587
- )
588
- );
622
+ // Rename the index file to disallow access during inconsistent file state
623
+ await new Promise(
624
+ /**
625
+ * Handles the callback logic for this hook.
626
+ * @param {(value?: undefined) => void} resolve resolve
627
+ */
628
+ (resolve) => {
629
+ this.fs.rename(filename, `${filename}.old`, (_err) => {
630
+ resolve();
631
+ });
632
+ }
633
+ );
589
634
 
590
- // As final step automatically update the index file to have a consistent pack again
591
- await new Promise(
592
- /**
593
- * @param {(value?: undefined) => void} resolve resolve
594
- * @returns {void}
595
- */
596
- (resolve) => {
597
- this.fs.rename(`${filename}_`, filename, (err) => {
598
- if (err) return reject(err);
599
- resolve();
600
- });
601
- }
602
- );
603
- return /** @type {true} */ (true);
604
- }
605
- )
635
+ // update all written files
636
+ await Promise.all(
637
+ Array.from(
638
+ allWrittenFiles,
639
+ (file) =>
640
+ new Promise(
641
+ /**
642
+ * Handles the callback logic for this hook.
643
+ * @param {(value?: undefined) => void} resolve resolve
644
+ * @param {(reason?: Error | null) => void} reject reject
645
+ * @returns {void}
646
+ */
647
+ (resolve, reject) => {
648
+ this.fs.rename(`${file}_`, file, (err) => {
649
+ if (err) return reject(err);
650
+ resolve();
651
+ });
652
+ }
653
+ )
654
+ )
655
+ );
656
+
657
+ // As final step automatically update the index file to have a consistent pack again
658
+ await new Promise(
659
+ /**
660
+ * Handles the callback logic for this hook.
661
+ * @param {(value?: undefined) => void} resolve resolve
662
+ * @returns {void}
663
+ */
664
+ (resolve) => {
665
+ this.fs.rename(`${filename}_`, filename, (err) => {
666
+ if (err) return reject(err);
667
+ resolve();
668
+ });
669
+ }
670
+ );
671
+ return /** @type {true} */ (true);
672
+ })
606
673
  );
607
674
  });
608
675
  });
609
676
  }
610
677
 
611
678
  /**
679
+ * Restores this instance from the provided deserializer context.
612
680
  * @param {SerializedType} data data
613
681
  * @param {Context} context context object
614
682
  * @returns {DeserializedType | Promise<DeserializedType>} deserialized data
@@ -616,6 +684,7 @@ class FileMiddleware extends SerializerMiddleware {
616
684
  deserialize(data, context) {
617
685
  const { filename, extension = "" } = context;
618
686
  /**
687
+ * Returns result.
619
688
  * @param {string | boolean} name name
620
689
  * @returns {Promise<Buffer[]>} result
621
690
  */
@@ -646,6 +715,10 @@ class FileMiddleware extends SerializerMiddleware {
646
715
  decompression = createBrotliDecompress({
647
716
  chunkSize: DECOMPRESSION_CHUNK_SIZE
648
717
  });
718
+ } else if (file.endsWith(".zst")) {
719
+ decompression = createZstdDecompress({
720
+ chunkSize: DECOMPRESSION_CHUNK_SIZE
721
+ });
649
722
  }
650
723
  if (decompression) {
651
724
  /** @typedef {(value: Buffer[] | PromiseLike<Buffer[]>) => void} NewResolve */
@@ -663,6 +736,7 @@ class FileMiddleware extends SerializerMiddleware {
663
736
  }),
664
737
  new Promise(
665
738
  /**
739
+ * Handles the chunk size callback for this hook.
666
740
  * @param {(value?: undefined) => void} resolve resolve
667
741
  * @param {(reason?: Error) => void} reject reject
668
742
  */
@@ -763,4 +837,216 @@ class FileMiddleware extends SerializerMiddleware {
763
837
  }
764
838
  }
765
839
 
840
+ /**
841
+ * Extracts the file names referenced by lazy pointer sections from serialized content.
842
+ * @param {Buffer} buf decompressed file content
843
+ * @returns {string[]} referenced file names (without extension)
844
+ */
845
+ const parsePointerNames = (buf) => {
846
+ const version = buf.readUInt32LE(0);
847
+ if (version !== VERSION) {
848
+ throw new Error(`Invalid file version ${version}`);
849
+ }
850
+ const sectionCount = buf.readUInt32LE(4);
851
+ let offset = 8 + sectionCount * 4;
852
+ // a corrupt section table must abort the walk, never silently drop a name
853
+ if (offset > buf.length) {
854
+ throw new Error(`Invalid section count ${sectionCount}`);
855
+ }
856
+ /** @type {string[]} */
857
+ const names = [];
858
+ for (let i = 0; i < sectionCount; i++) {
859
+ const length = buf.readInt32LE(8 + i * 4);
860
+ if (length < 0) {
861
+ // pointer section: u64 size + utf-8 file name
862
+ const end = offset - length;
863
+ if (end > buf.length) {
864
+ throw new Error("Truncated pointer section");
865
+ }
866
+ names.push(buf.toString("utf8", offset + 8, end));
867
+ offset = end;
868
+ } else {
869
+ offset += length;
870
+ }
871
+ }
872
+ if (offset !== buf.length) {
873
+ throw new Error("Section table does not match file size");
874
+ }
875
+ return names;
876
+ };
877
+
878
+ /**
879
+ * Reads the pointer names of a compressed file by decompressing it fully
880
+ * (compressed content cannot be read by byte range).
881
+ * @param {IntermediateFileSystem} fs a file system
882
+ * @param {string} file absolute path of the serialized file
883
+ * @returns {Promise<string[]>} referenced file names (without extension)
884
+ */
885
+ const getReferencedFilenamesCompressed = (fs, file) =>
886
+ new Promise((resolve, reject) => {
887
+ fs.readFile(file, (err, rawContent) => {
888
+ if (err) return reject(err);
889
+ /**
890
+ * Parses the decompressed content.
891
+ * @param {Error | null} err error
892
+ * @param {Buffer=} content decompressed content
893
+ * @returns {void}
894
+ */
895
+ const onContent = (err, content) => {
896
+ if (err) return reject(err);
897
+ try {
898
+ resolve(parsePointerNames(/** @type {Buffer} */ (content)));
899
+ } catch (err_) {
900
+ reject(/** @type {Error} */ (err_));
901
+ }
902
+ };
903
+ const buf = /** @type {Buffer} */ (rawContent);
904
+ if (file.endsWith(".gz")) {
905
+ gunzip(buf, onContent);
906
+ } else if (file.endsWith(".br")) {
907
+ brotliDecompress(buf, onContent);
908
+ } else {
909
+ if (!zstdDecompress) {
910
+ return reject(
911
+ new Error("zstd decompression requires Node.js >= 22.15.0")
912
+ );
913
+ }
914
+ zstdDecompress(buf, onContent);
915
+ }
916
+ });
917
+ });
918
+
919
+ /**
920
+ * Reads the pointer names of an uncompressed file by reading only the header
921
+ * and the pointer sections instead of the whole file.
922
+ * @param {IntermediateFileSystem} fs a file system
923
+ * @param {string} file absolute path of the serialized file
924
+ * @returns {Promise<string[]>} referenced file names (without extension)
925
+ */
926
+ const getReferencedFilenamesUncompressed = (fs, file) =>
927
+ new Promise((resolve, reject) => {
928
+ fs.open(file, "r", (err, _fd) => {
929
+ if (err) return reject(err);
930
+ const fd = /** @type {number} */ (_fd);
931
+ /**
932
+ * Closes the file descriptor and rejects.
933
+ * @param {Error} err error
934
+ */
935
+ const fail = (err) => {
936
+ fs.close(fd, () => reject(err));
937
+ };
938
+ /**
939
+ * Reads exactly `length` bytes at `position`.
940
+ * @param {number} position file position
941
+ * @param {number} length byte count
942
+ * @param {(buffer: Buffer) => void} callback called with the filled buffer
943
+ * @returns {void}
944
+ */
945
+ const readAt = (position, length, callback) => {
946
+ // corrupt headers can request absurd sizes; must reject, not crash
947
+ if (length > MAX_HEADER_OR_POINTER_SIZE) {
948
+ return fail(new Error(`Invalid section size ${length} in ${file}`));
949
+ }
950
+ /** @type {Buffer} */
951
+ let buffer;
952
+ try {
953
+ buffer = Buffer.allocUnsafe(length);
954
+ } catch (err) {
955
+ return fail(/** @type {Error} */ (err));
956
+ }
957
+ let bytesDone = 0;
958
+ const readMore = () => {
959
+ fs.read(
960
+ fd,
961
+ buffer,
962
+ bytesDone,
963
+ length - bytesDone,
964
+ position + bytesDone,
965
+ (err, bytesRead) => {
966
+ if (err) return fail(err);
967
+ if (bytesRead === 0) {
968
+ return fail(new Error(`Unexpected end of file ${file}`));
969
+ }
970
+ bytesDone += bytesRead;
971
+ if (bytesDone < length) return readMore();
972
+ callback(buffer);
973
+ }
974
+ );
975
+ };
976
+ readMore();
977
+ };
978
+ readAt(0, 8, (header) => {
979
+ const version = header.readUInt32LE(0);
980
+ if (version !== VERSION) {
981
+ return fail(new Error(`Invalid file version ${version}`));
982
+ }
983
+ const sectionCount = header.readUInt32LE(4);
984
+ if (sectionCount === 0) {
985
+ return fs.close(fd, (err) => (err ? reject(err) : resolve([])));
986
+ }
987
+ readAt(8, sectionCount * 4, (lengthsBuffer) => {
988
+ /** @type {{ position: number, length: number }[]} */
989
+ const pointerSections = [];
990
+ let position = 8 + sectionCount * 4;
991
+ for (let i = 0; i < sectionCount; i++) {
992
+ const length = lengthsBuffer.readInt32LE(i * 4);
993
+ if (length < 0) {
994
+ pointerSections.push({ position, length: -length });
995
+ position -= length;
996
+ } else {
997
+ position += length;
998
+ }
999
+ }
1000
+ // the section table must account for exactly the whole file,
1001
+ // otherwise pointer reads land on wrong bytes and under-report
1002
+ fs.stat(file, (err, stats) => {
1003
+ if (err) return fail(err);
1004
+ const stat = /** @type {import("../util/fs").IStats} */ (stats);
1005
+ if (stat.size !== position) {
1006
+ return fail(
1007
+ new Error(`Section table does not match size of ${file}`)
1008
+ );
1009
+ }
1010
+ /** @type {string[]} */
1011
+ const names = [];
1012
+ /**
1013
+ * Reads the pointer section at `index`, then the next one.
1014
+ * @param {number} index pointer section index
1015
+ * @returns {void}
1016
+ */
1017
+ const readNext = (index) => {
1018
+ if (index >= pointerSections.length) {
1019
+ return fs.close(fd, (err) =>
1020
+ err ? reject(err) : resolve(names)
1021
+ );
1022
+ }
1023
+ const section = pointerSections[index];
1024
+ readAt(section.position, section.length, (buffer) => {
1025
+ // pointer section: u64 size + utf-8 file name
1026
+ names.push(buffer.toString("utf8", 8));
1027
+ readNext(index + 1);
1028
+ });
1029
+ };
1030
+ readNext(0);
1031
+ });
1032
+ });
1033
+ });
1034
+ });
1035
+ });
1036
+
1037
+ /**
1038
+ * Reads the file names referenced by a serialized file (its lazy pointer sections)
1039
+ * without deserializing its content. Referenced files may reference further files.
1040
+ * @param {IntermediateFileSystem} fs a file system
1041
+ * @param {string} file absolute path of the serialized file
1042
+ * @returns {Promise<string[]>} referenced file names (without extension)
1043
+ */
1044
+ const getReferencedFilenames = (fs, file) =>
1045
+ file.endsWith(".gz") || file.endsWith(".br") || file.endsWith(".zst")
1046
+ ? getReferencedFilenamesCompressed(fs, file)
1047
+ : getReferencedFilenamesUncompressed(fs, file);
1048
+
766
1049
  module.exports = FileMiddleware;
1050
+ // Exposed for testing the content-buffer boundary handling in `deserialize`.
1051
+ module.exports._deserialize = deserialize;
1052
+ module.exports.getReferencedFilenames = getReferencedFilenames;