webpack 5.92.1 → 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 (350) hide show
  1. package/README.md +8 -5
  2. package/bin/webpack.js +6 -7
  3. package/hot/log.js +1 -2
  4. package/hot/only-dev-server.js +1 -1
  5. package/hot/poll.js +1 -1
  6. package/hot/signal.js +1 -1
  7. package/lib/APIPlugin.js +4 -3
  8. package/lib/AbstractMethodError.js +10 -5
  9. package/lib/AutomaticPrefetchPlugin.js +1 -1
  10. package/lib/BannerPlugin.js +12 -6
  11. package/lib/Cache.js +8 -10
  12. package/lib/CacheFacade.js +3 -3
  13. package/lib/CaseSensitiveModulesWarning.js +5 -7
  14. package/lib/Chunk.js +14 -11
  15. package/lib/ChunkGraph.js +58 -36
  16. package/lib/ChunkGroup.js +2 -3
  17. package/lib/ChunkTemplate.js +43 -0
  18. package/lib/CleanPlugin.js +10 -11
  19. package/lib/CodeGenerationResults.js +6 -5
  20. package/lib/CommentCompilationWarning.js +0 -1
  21. package/lib/Compilation.js +223 -191
  22. package/lib/Compiler.js +81 -82
  23. package/lib/ConcatenationScope.js +3 -6
  24. package/lib/ConditionalInitFragment.js +6 -7
  25. package/lib/ConstPlugin.js +7 -15
  26. package/lib/ContextExclusionPlugin.js +3 -3
  27. package/lib/ContextModule.js +36 -21
  28. package/lib/ContextModuleFactory.js +89 -44
  29. package/lib/ContextReplacementPlugin.js +10 -9
  30. package/lib/DefinePlugin.js +76 -69
  31. package/lib/DelegatedModule.js +7 -3
  32. package/lib/DelegatedModuleFactoryPlugin.js +36 -22
  33. package/lib/DelegatedPlugin.js +4 -0
  34. package/lib/DependenciesBlock.js +0 -1
  35. package/lib/Dependency.js +10 -14
  36. package/lib/DllEntryPlugin.js +4 -2
  37. package/lib/DllModuleFactory.js +1 -0
  38. package/lib/DllPlugin.js +9 -7
  39. package/lib/DllReferencePlugin.js +30 -15
  40. package/lib/EntryPlugin.js +1 -3
  41. package/lib/EnvironmentPlugin.js +5 -2
  42. package/lib/ErrorHelpers.js +11 -12
  43. package/lib/EvalDevToolModulePlugin.js +10 -12
  44. package/lib/EvalSourceMapDevToolPlugin.js +15 -13
  45. package/lib/ExportsInfo.js +185 -120
  46. package/lib/ExternalModule.js +104 -64
  47. package/lib/ExternalModuleFactoryPlugin.js +23 -10
  48. package/lib/FileSystemInfo.js +791 -422
  49. package/lib/FlagAllModulesAsUsedPlugin.js +1 -1
  50. package/lib/FlagDependencyExportsPlugin.js +12 -11
  51. package/lib/FlagDependencyUsagePlugin.js +1 -1
  52. package/lib/Generator.js +2 -5
  53. package/lib/GraphHelpers.js +3 -2
  54. package/lib/HookWebpackError.js +8 -10
  55. package/lib/HotModuleReplacementPlugin.js +78 -64
  56. package/lib/IgnoreErrorModuleFactory.js +3 -3
  57. package/lib/IgnorePlugin.js +1 -3
  58. package/lib/IgnoreWarningsPlugin.js +6 -9
  59. package/lib/InitFragment.js +2 -3
  60. package/lib/LibManifestPlugin.js +4 -3
  61. package/lib/MainTemplate.js +72 -19
  62. package/lib/Module.js +25 -9
  63. package/lib/ModuleBuildError.js +4 -11
  64. package/lib/ModuleDependencyError.js +5 -5
  65. package/lib/ModuleDependencyWarning.js +5 -5
  66. package/lib/ModuleError.js +1 -5
  67. package/lib/ModuleFilenameHelpers.js +29 -46
  68. package/lib/ModuleGraph.js +7 -6
  69. package/lib/ModuleGraphConnection.js +6 -6
  70. package/lib/ModuleInfoHeaderPlugin.js +82 -30
  71. package/lib/ModuleParseError.js +8 -9
  72. package/lib/ModuleRestoreError.js +1 -1
  73. package/lib/ModuleStoreError.js +1 -1
  74. package/lib/ModuleTemplate.js +33 -1
  75. package/lib/ModuleTypeConstants.js +21 -22
  76. package/lib/ModuleWarning.js +1 -5
  77. package/lib/MultiCompiler.js +24 -26
  78. package/lib/MultiStats.js +73 -31
  79. package/lib/MultiWatching.js +1 -1
  80. package/lib/NormalModule.js +132 -70
  81. package/lib/NormalModuleFactory.js +53 -49
  82. package/lib/OptimizationStages.js +3 -3
  83. package/lib/ProgressPlugin.js +9 -9
  84. package/lib/ProvidePlugin.js +4 -4
  85. package/lib/RuntimeGlobals.js +71 -70
  86. package/lib/RuntimeModule.js +1 -1
  87. package/lib/RuntimePlugin.js +24 -12
  88. package/lib/RuntimeTemplate.js +40 -44
  89. package/lib/SizeFormatHelpers.js +2 -4
  90. package/lib/SourceMapDevToolPlugin.js +42 -34
  91. package/lib/Stats.js +5 -11
  92. package/lib/Template.js +18 -24
  93. package/lib/TemplatedPathPlugin.js +12 -10
  94. package/lib/UseStrictPlugin.js +8 -1
  95. package/lib/WarnDeprecatedOptionPlugin.js +0 -1
  96. package/lib/WatchIgnorePlugin.js +26 -9
  97. package/lib/Watching.js +10 -5
  98. package/lib/WebpackOptionsApply.js +89 -62
  99. package/lib/asset/AssetGenerator.js +107 -42
  100. package/lib/asset/AssetModulesPlugin.js +29 -23
  101. package/lib/asset/AssetSourceGenerator.js +2 -7
  102. package/lib/async-modules/AwaitDependenciesInitFragment.js +6 -7
  103. package/lib/buildChunkGraph.js +14 -19
  104. package/lib/cache/IdleFileCachePlugin.js +4 -4
  105. package/lib/cache/MemoryWithGcCachePlugin.js +5 -5
  106. package/lib/cache/PackFileCacheStrategy.js +51 -50
  107. package/lib/cache/ResolverCachePlugin.js +6 -6
  108. package/lib/cache/mergeEtags.js +16 -21
  109. package/lib/cli.js +148 -104
  110. package/lib/config/browserslistTargetHandler.js +16 -13
  111. package/lib/config/defaults.js +31 -28
  112. package/lib/config/normalization.js +335 -344
  113. package/lib/config/target.js +42 -52
  114. package/lib/container/ContainerEntryModule.js +2 -2
  115. package/lib/container/ContainerPlugin.js +1 -1
  116. package/lib/container/RemoteRuntimeModule.js +11 -8
  117. package/lib/container/options.js +18 -4
  118. package/lib/css/CssExportsGenerator.js +39 -40
  119. package/lib/css/CssGenerator.js +11 -14
  120. package/lib/css/CssLoadingRuntimeModule.js +10 -10
  121. package/lib/css/CssModulesPlugin.js +127 -47
  122. package/lib/css/CssParser.js +20 -18
  123. package/lib/css/walkCssTokens.js +80 -95
  124. package/lib/debug/ProfilingPlugin.js +19 -20
  125. package/lib/dependencies/AMDDefineDependency.js +1 -1
  126. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +83 -47
  127. package/lib/dependencies/AMDRequireArrayDependency.js +9 -10
  128. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +22 -16
  129. package/lib/dependencies/AMDRuntimeModules.js +2 -2
  130. package/lib/dependencies/CommonJsDependencyHelpers.js +6 -2
  131. package/lib/dependencies/CommonJsExportRequireDependency.js +37 -41
  132. package/lib/dependencies/CommonJsExportsDependency.js +0 -1
  133. package/lib/dependencies/CommonJsExportsParserPlugin.js +19 -23
  134. package/lib/dependencies/CommonJsFullRequireDependency.js +1 -1
  135. package/lib/dependencies/CommonJsImportsParserPlugin.js +52 -61
  136. package/lib/dependencies/CommonJsSelfReferenceDependency.js +6 -8
  137. package/lib/dependencies/ConstDependency.js +1 -1
  138. package/lib/dependencies/ContextDependency.js +1 -1
  139. package/lib/dependencies/ContextDependencyHelpers.js +31 -34
  140. package/lib/dependencies/ContextElementDependency.js +2 -2
  141. package/lib/dependencies/CriticalDependencyWarning.js +1 -1
  142. package/lib/dependencies/CssExportDependency.js +72 -9
  143. package/lib/dependencies/CssImportDependency.js +0 -2
  144. package/lib/dependencies/CssLocalIdentifierDependency.js +68 -21
  145. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +2 -1
  146. package/lib/dependencies/CssUrlDependency.js +4 -5
  147. package/lib/dependencies/DynamicExports.js +5 -5
  148. package/lib/dependencies/ExportsInfoDependency.js +1 -2
  149. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -1
  150. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +4 -5
  151. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +27 -16
  152. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  153. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +107 -64
  154. package/lib/dependencies/HarmonyExports.js +2 -2
  155. package/lib/dependencies/HarmonyImportDependency.js +2 -4
  156. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +19 -4
  157. package/lib/dependencies/HarmonyImportSpecifierDependency.js +41 -16
  158. package/lib/dependencies/ImportDependency.js +1 -1
  159. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +5 -5
  160. package/lib/dependencies/ImportMetaPlugin.js +11 -13
  161. package/lib/dependencies/ImportParserPlugin.js +39 -44
  162. package/lib/dependencies/JsonExportsDependency.js +22 -18
  163. package/lib/dependencies/LoaderPlugin.js +47 -36
  164. package/lib/dependencies/LocalModule.js +1 -1
  165. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  166. package/lib/dependencies/ModuleDecoratorDependency.js +1 -1
  167. package/lib/dependencies/ProvidedDependency.js +1 -1
  168. package/lib/dependencies/PureExpressionDependency.js +6 -6
  169. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  170. package/lib/dependencies/RuntimeRequirementsDependency.js +1 -1
  171. package/lib/dependencies/SystemPlugin.js +1 -1
  172. package/lib/dependencies/URLDependency.js +3 -3
  173. package/lib/dependencies/URLPlugin.js +66 -12
  174. package/lib/dependencies/WorkerPlugin.js +25 -24
  175. package/lib/dependencies/processExportInfo.js +3 -1
  176. package/lib/electron/ElectronTargetPlugin.js +1 -0
  177. package/lib/esm/ModuleChunkFormatPlugin.js +11 -12
  178. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +7 -3
  179. package/lib/formatLocation.js +1 -2
  180. package/lib/hmr/HotModuleReplacement.runtime.js +4 -5
  181. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -0
  182. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +9 -12
  183. package/lib/hmr/LazyCompilationPlugin.js +27 -12
  184. package/lib/hmr/lazyCompilationBackend.js +64 -40
  185. package/lib/ids/ChunkModuleIdRangePlugin.js +1 -3
  186. package/lib/ids/DeterministicChunkIdsPlugin.js +2 -4
  187. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  188. package/lib/ids/HashedModuleIdsPlugin.js +5 -1
  189. package/lib/ids/IdHelpers.js +29 -39
  190. package/lib/ids/SyncModuleIdsPlugin.js +7 -2
  191. package/lib/index.js +1 -5
  192. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +6 -4
  193. package/lib/javascript/BasicEvaluatedExpression.js +4 -19
  194. package/lib/javascript/ChunkHelpers.js +1 -1
  195. package/lib/javascript/CommonJsChunkFormatPlugin.js +10 -11
  196. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -6
  197. package/lib/javascript/JavascriptGenerator.js +23 -7
  198. package/lib/javascript/JavascriptModulesPlugin.js +97 -70
  199. package/lib/javascript/JavascriptParser.js +179 -200
  200. package/lib/javascript/JavascriptParserHelpers.js +20 -21
  201. package/lib/javascript/StartupHelpers.js +41 -13
  202. package/lib/json/JsonGenerator.js +7 -13
  203. package/lib/json/JsonModulesPlugin.js +1 -4
  204. package/lib/json/JsonParser.js +5 -3
  205. package/lib/library/AmdLibraryPlugin.js +12 -16
  206. package/lib/library/AssignLibraryPlugin.js +9 -11
  207. package/lib/library/EnableLibraryPlugin.js +25 -15
  208. package/lib/library/ExportPropertyLibraryPlugin.js +8 -2
  209. package/lib/library/JsonpLibraryPlugin.js +2 -1
  210. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  211. package/lib/library/ModuleLibraryPlugin.js +2 -1
  212. package/lib/library/SystemLibraryPlugin.js +2 -1
  213. package/lib/library/UmdLibraryPlugin.js +66 -92
  214. package/lib/logging/Logger.js +32 -4
  215. package/lib/logging/createConsoleLogger.js +12 -13
  216. package/lib/logging/runtime.js +7 -8
  217. package/lib/logging/truncateArgs.js +5 -8
  218. package/lib/node/NodeWatchFileSystem.js +3 -18
  219. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +2 -2
  220. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +1 -0
  221. package/lib/node/RequireChunkLoadingRuntimeModule.js +2 -2
  222. package/lib/node/nodeConsole.js +22 -22
  223. package/lib/optimize/AggressiveMergingPlugin.js +2 -4
  224. package/lib/optimize/AggressiveSplittingPlugin.js +16 -19
  225. package/lib/optimize/ConcatenatedModule.js +144 -61
  226. package/lib/optimize/EnsureChunkConditionsPlugin.js +1 -1
  227. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -3
  228. package/lib/optimize/InnerGraph.js +17 -17
  229. package/lib/optimize/InnerGraphPlugin.js +8 -7
  230. package/lib/optimize/LimitChunkCountPlugin.js +2 -3
  231. package/lib/optimize/MangleExportsPlugin.js +1 -0
  232. package/lib/optimize/MinMaxSizeWarning.js +1 -1
  233. package/lib/optimize/ModuleConcatenationPlugin.js +56 -78
  234. package/lib/optimize/RealContentHashPlugin.js +7 -10
  235. package/lib/optimize/RemoveParentModulesPlugin.js +3 -3
  236. package/lib/optimize/SideEffectsFlagPlugin.js +6 -2
  237. package/lib/optimize/SplitChunksPlugin.js +34 -30
  238. package/lib/performance/SizeLimitsPlugin.js +2 -2
  239. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +1 -0
  240. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +1 -1
  241. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +1 -1
  242. package/lib/rules/BasicEffectRulePlugin.js +3 -1
  243. package/lib/rules/BasicMatcherRulePlugin.js +3 -1
  244. package/lib/rules/ObjectMatcherRulePlugin.js +4 -1
  245. package/lib/rules/RuleSetCompiler.js +41 -22
  246. package/lib/rules/UseEffectRulePlugin.js +36 -32
  247. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  248. package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
  249. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
  250. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +1 -1
  251. package/lib/runtime/EnsureChunkRuntimeModule.js +10 -11
  252. package/lib/runtime/GetChunkFilenameRuntimeModule.js +11 -17
  253. package/lib/runtime/LoadScriptRuntimeModule.js +17 -18
  254. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -3
  255. package/lib/schemes/DataUriPlugin.js +1 -1
  256. package/lib/schemes/HttpUriPlugin.js +241 -126
  257. package/lib/serialization/BinaryMiddleware.js +44 -28
  258. package/lib/serialization/DateObjectSerializer.js +1 -0
  259. package/lib/serialization/ErrorObjectSerializer.js +2 -0
  260. package/lib/serialization/FileMiddleware.js +154 -106
  261. package/lib/serialization/MapObjectSerializer.js +2 -1
  262. package/lib/serialization/NullPrototypeObjectSerializer.js +3 -2
  263. package/lib/serialization/ObjectMiddleware.js +52 -56
  264. package/lib/serialization/PlainObjectSerializer.js +32 -6
  265. package/lib/serialization/RegExpObjectSerializer.js +1 -0
  266. package/lib/serialization/Serializer.js +4 -5
  267. package/lib/serialization/SerializerMiddleware.js +6 -6
  268. package/lib/serialization/SetObjectSerializer.js +2 -1
  269. package/lib/sharing/ConsumeSharedModule.js +19 -14
  270. package/lib/sharing/ConsumeSharedPlugin.js +116 -97
  271. package/lib/sharing/ConsumeSharedRuntimeModule.js +108 -141
  272. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  273. package/lib/sharing/ProvideSharedPlugin.js +2 -2
  274. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  275. package/lib/sharing/utils.js +15 -27
  276. package/lib/stats/DefaultStatsFactoryPlugin.js +424 -281
  277. package/lib/stats/DefaultStatsPresetPlugin.js +73 -18
  278. package/lib/stats/DefaultStatsPrinterPlugin.js +370 -101
  279. package/lib/stats/StatsFactory.js +127 -56
  280. package/lib/stats/StatsPrinter.js +75 -44
  281. package/lib/util/ArrayHelpers.js +8 -4
  282. package/lib/util/ArrayQueue.js +1 -1
  283. package/lib/util/AsyncQueue.js +31 -12
  284. package/lib/util/IterableHelpers.js +3 -4
  285. package/lib/util/LazyBucketSortedSet.js +60 -44
  286. package/lib/util/LazySet.js +1 -0
  287. package/lib/util/MapHelpers.js +1 -3
  288. package/lib/util/ParallelismFactorCalculator.js +1 -1
  289. package/lib/util/Queue.js +1 -1
  290. package/lib/util/Semaphore.js +4 -7
  291. package/lib/util/SetHelpers.js +5 -5
  292. package/lib/util/SortableSet.js +4 -3
  293. package/lib/util/StackedCacheMap.js +4 -6
  294. package/lib/util/StackedMap.js +1 -3
  295. package/lib/util/StringXor.js +0 -5
  296. package/lib/util/TupleQueue.js +1 -1
  297. package/lib/util/TupleSet.js +15 -5
  298. package/lib/util/URLAbsoluteSpecifier.js +7 -7
  299. package/lib/util/WeakTupleMap.js +19 -21
  300. package/lib/util/binarySearchBounds.js +5 -12
  301. package/lib/util/chainedImports.js +1 -1
  302. package/lib/util/cleverMerge.js +21 -19
  303. package/lib/util/comparators.js +57 -52
  304. package/lib/util/compileBooleanMatcher.js +3 -6
  305. package/lib/util/conventions.js +10 -13
  306. package/lib/util/createHash.js +9 -6
  307. package/lib/util/deprecation.js +22 -12
  308. package/lib/util/deterministicGrouping.js +19 -26
  309. package/lib/util/findGraphRoots.js +2 -2
  310. package/lib/util/fs.js +31 -31
  311. package/lib/util/hash/md4.js +2 -2
  312. package/lib/util/hash/wasm-hash.js +7 -7
  313. package/lib/util/hash/xxhash64.js +2 -2
  314. package/lib/util/identifier.js +81 -59
  315. package/lib/util/memoize.js +8 -10
  316. package/lib/util/mergeScope.js +6 -9
  317. package/lib/util/nonNumericOnlyHash.js +2 -2
  318. package/lib/util/numberHash.js +1 -6
  319. package/lib/util/objectToMap.js +0 -1
  320. package/lib/util/propertyAccess.js +2 -5
  321. package/lib/util/propertyName.js +1 -3
  322. package/lib/util/registerExternalSerializer.js +1 -1
  323. package/lib/util/runtime.js +103 -113
  324. package/lib/util/semver.js +29 -27
  325. package/lib/util/serialization.js +16 -1
  326. package/lib/util/smartGrouping.js +5 -5
  327. package/lib/util/source.js +1 -1
  328. package/lib/wasm/EnableWasmLoadingPlugin.js +5 -4
  329. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
  330. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -6
  331. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +3 -3
  332. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +20 -19
  333. package/lib/wasm-sync/WebAssemblyGenerator.js +14 -29
  334. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +1 -1
  335. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  336. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -3
  337. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -1
  338. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +1 -1
  339. package/package.json +17 -16
  340. package/schemas/WebpackOptions.check.js +1 -1
  341. package/schemas/WebpackOptions.json +17 -0
  342. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  343. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  344. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  345. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  346. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  347. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  348. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  349. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  350. package/types.d.ts +682 -347
@@ -150,6 +150,11 @@ class BinaryMiddleware extends SerializerMiddleware {
150
150
  return this._serialize(data, context);
151
151
  }
152
152
 
153
+ /**
154
+ * @param {function(): Promise<any> | any} fn lazy function
155
+ * @param {object} context serialize function
156
+ * @returns {function(): Promise<any> | any} new lazy
157
+ */
153
158
  _serializeLazy(fn, context) {
154
159
  return SerializerMiddleware.serializeLazy(fn, data =>
155
160
  this._serialize(data, context)
@@ -171,17 +176,20 @@ class BinaryMiddleware extends SerializerMiddleware {
171
176
  leftOverBuffer: null
172
177
  }
173
178
  ) {
174
- /** @type {Buffer} */
179
+ /** @type {Buffer | null} */
175
180
  let leftOverBuffer = null;
176
181
  /** @type {BufferSerializableType[]} */
177
182
  let buffers = [];
178
- /** @type {Buffer} */
183
+ /** @type {Buffer | null} */
179
184
  let currentBuffer = allocationScope ? allocationScope.leftOverBuffer : null;
180
185
  allocationScope.leftOverBuffer = null;
181
186
  let currentPosition = 0;
182
187
  if (currentBuffer === null) {
183
188
  currentBuffer = Buffer.allocUnsafe(allocationScope.allocationSize);
184
189
  }
190
+ /**
191
+ * @param {number} bytesNeeded bytes needed
192
+ */
185
193
  const allocate = bytesNeeded => {
186
194
  if (currentBuffer !== null) {
187
195
  if (currentBuffer.length - currentPosition >= bytesNeeded) return;
@@ -233,13 +241,15 @@ class BinaryMiddleware extends SerializerMiddleware {
233
241
  * @param {number} byte byte
234
242
  */
235
243
  const writeU8 = byte => {
236
- currentBuffer.writeUInt8(byte, currentPosition++);
244
+ /** @type {Buffer} */
245
+ (currentBuffer).writeUInt8(byte, currentPosition++);
237
246
  };
238
247
  /**
239
248
  * @param {number} ui32 ui32
240
249
  */
241
250
  const writeU32 = ui32 => {
242
- currentBuffer.writeUInt32LE(ui32, currentPosition);
251
+ /** @type {Buffer} */
252
+ (currentBuffer).writeUInt32LE(ui32, currentPosition);
243
253
  currentPosition += 4;
244
254
  };
245
255
  /** @type {number[]} */
@@ -251,8 +261,8 @@ class BinaryMiddleware extends SerializerMiddleware {
251
261
  * @returns {number} size
252
262
  */
253
263
  const measureEnd = () => {
254
- const oldPos = measureStack.pop();
255
- const buffersIndex = measureStack.pop();
264
+ const oldPos = /** @type {number} */ (measureStack.pop());
265
+ const buffersIndex = /** @type {number} */ (measureStack.pop());
256
266
  let size = currentPosition - oldPos;
257
267
  for (let i = buffersIndex; i < buffers.length; i++) {
258
268
  size += buffers[i].length;
@@ -264,7 +274,7 @@ class BinaryMiddleware extends SerializerMiddleware {
264
274
  switch (typeof thing) {
265
275
  case "function": {
266
276
  if (!SerializerMiddleware.isLazy(thing))
267
- throw new Error("Unexpected function " + thing);
277
+ throw new Error(`Unexpected function ${thing}`);
268
278
  /** @type {SerializedType | (() => SerializedType)} */
269
279
  let serializedData =
270
280
  SerializerMiddleware.getLazySerializedValue(thing);
@@ -287,12 +297,10 @@ class BinaryMiddleware extends SerializerMiddleware {
287
297
  buffers.push(serializedData);
288
298
  break;
289
299
  }
290
- } else {
291
- if (typeof serializedData === "function") {
292
- flush();
293
- buffers.push(serializedData);
294
- break;
295
- }
300
+ } else if (typeof serializedData === "function") {
301
+ flush();
302
+ buffers.push(serializedData);
303
+ break;
296
304
  }
297
305
  /** @type {number[]} */
298
306
  const lengths = [];
@@ -612,6 +620,11 @@ class BinaryMiddleware extends SerializerMiddleware {
612
620
  }
613
621
  break;
614
622
  }
623
+ default: {
624
+ throw new Error(
625
+ `Unknown typeof "${typeof thing}" in binary middleware`
626
+ );
627
+ }
615
628
  }
616
629
  }
617
630
  flush();
@@ -673,9 +686,12 @@ class BinaryMiddleware extends SerializerMiddleware {
673
686
  currentIsBuffer = Buffer.isBuffer(currentBuffer);
674
687
  }
675
688
  };
676
- const isInCurrentBuffer = n => {
677
- return currentIsBuffer && n + currentPosition <= currentBuffer.length;
678
- };
689
+ /**
690
+ * @param {number} n n
691
+ * @returns {boolean} true when in current buffer, otherwise false
692
+ */
693
+ const isInCurrentBuffer = n =>
694
+ currentIsBuffer && n + currentPosition <= currentBuffer.length;
679
695
  const ensureBuffer = () => {
680
696
  if (!currentIsBuffer) {
681
697
  throw new Error(
@@ -742,9 +758,9 @@ class BinaryMiddleware extends SerializerMiddleware {
742
758
  * There is no need to check remaining buffer size here
743
759
  * since {@link checkOverflow} guarantees at least one byte remaining
744
760
  */
745
- const byte = /** @type {Buffer} */ (currentBuffer).readUInt8(
746
- currentPosition
747
- );
761
+ const byte =
762
+ /** @type {Buffer} */
763
+ (currentBuffer).readUInt8(currentPosition);
748
764
  currentPosition += I8_SIZE;
749
765
  checkOverflow();
750
766
  return byte;
@@ -752,9 +768,11 @@ class BinaryMiddleware extends SerializerMiddleware {
752
768
  /**
753
769
  * @returns {number} U32
754
770
  */
755
- const readU32 = () => {
756
- return read(I32_SIZE).readUInt32LE(0);
757
- };
771
+ const readU32 = () => read(I32_SIZE).readUInt32LE(0);
772
+ /**
773
+ * @param {number} data data
774
+ * @param {number} n n
775
+ */
758
776
  const readBits = (data, n) => {
759
777
  let mask = 1;
760
778
  while (n !== 0) {
@@ -1075,13 +1093,10 @@ class BinaryMiddleware extends SerializerMiddleware {
1075
1093
  }
1076
1094
  }
1077
1095
  };
1078
- } else {
1079
- return () => {
1080
- throw new Error(
1081
- `Unexpected header byte 0x${header.toString(16)}`
1082
- );
1083
- };
1084
1096
  }
1097
+ return () => {
1098
+ throw new Error(`Unexpected header byte 0x${header.toString(16)}`);
1099
+ };
1085
1100
  }
1086
1101
  });
1087
1102
 
@@ -1101,6 +1116,7 @@ class BinaryMiddleware extends SerializerMiddleware {
1101
1116
  }
1102
1117
 
1103
1118
  // avoid leaking memory in context
1119
+ // eslint-disable-next-line prefer-const
1104
1120
  let _result = result;
1105
1121
  result = undefined;
1106
1122
  return _result;
@@ -15,6 +15,7 @@ class DateObjectSerializer {
15
15
  serialize(obj, context) {
16
16
  context.write(obj.getTime());
17
17
  }
18
+
18
19
  /**
19
20
  * @param {ObjectDeserializerContext} context context
20
21
  * @returns {Date} date
@@ -14,6 +14,7 @@ class ErrorObjectSerializer {
14
14
  constructor(Type) {
15
15
  this.Type = Type;
16
16
  }
17
+
17
18
  /**
18
19
  * @param {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} obj error
19
20
  * @param {ObjectSerializerContext} context context
@@ -23,6 +24,7 @@ class ErrorObjectSerializer {
23
24
  context.write(obj.stack);
24
25
  context.write(/** @type {Error & { cause: "unknown" }} */ (obj).cause);
25
26
  }
27
+
26
28
  /**
27
29
  * @param {ObjectDeserializerContext} context context
28
30
  * @returns {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} error
@@ -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
 
@@ -57,6 +58,7 @@ const hashForName = (buffers, hashFunction) => {
57
58
  const COMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
58
59
  const DECOMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
59
60
 
61
+ /** @type {function(Buffer, number, number): void} */
60
62
  const writeUInt64LE = Buffer.prototype.writeBigUInt64LE
61
63
  ? (buf, value, offset) => {
62
64
  buf.writeBigUInt64LE(BigInt(value), offset);
@@ -68,10 +70,9 @@ const writeUInt64LE = Buffer.prototype.writeBigUInt64LE
68
70
  buf.writeUInt32LE(high, offset + 4);
69
71
  };
70
72
 
73
+ /** @type {function(Buffer, number): void} */
71
74
  const readUInt64LE = Buffer.prototype.readBigUInt64LE
72
- ? (buf, offset) => {
73
- return Number(buf.readBigUInt64LE(offset));
74
- }
75
+ ? (buf, offset) => Number(buf.readBigUInt64LE(offset))
75
76
  : (buf, offset) => {
76
77
  const low = buf.readUInt32LE(offset);
77
78
  const high = buf.readUInt32LE(offset + 4);
@@ -82,7 +83,7 @@ const readUInt64LE = Buffer.prototype.readBigUInt64LE
82
83
  * @typedef {object} SerializeResult
83
84
  * @property {string | false} name
84
85
  * @property {number} size
85
- * @property {Promise=} backgroundJob
86
+ * @property {Promise<any>=} backgroundJob
86
87
  */
87
88
 
88
89
  /**
@@ -104,8 +105,8 @@ const serialize = async (
104
105
  const processedData = [];
105
106
  /** @type {WeakMap<SerializeResult, function(): any | Promise<any>>} */
106
107
  const resultToLazy = new WeakMap();
107
- /** @type {Buffer[]} */
108
- let lastBuffers = undefined;
108
+ /** @type {Buffer[] | undefined} */
109
+ let lastBuffers;
109
110
  for (const item of await data) {
110
111
  if (typeof item === "function") {
111
112
  if (!SerializerMiddleware.isLazy(item))
@@ -163,9 +164,8 @@ const serialize = async (
163
164
  const backgroundJobs = [];
164
165
  const resolvedData = (
165
166
  await Promise.all(
166
- /** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */ (
167
- processedData
168
- )
167
+ /** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */
168
+ (processedData)
169
169
  )
170
170
  ).map(item => {
171
171
  if (Array.isArray(item) || Buffer.isBuffer(item)) return item;
@@ -195,7 +195,7 @@ const serialize = async (
195
195
  } else if (item) {
196
196
  lengths.push(-item.length);
197
197
  } else {
198
- throw new Error("Unexpected falsy value in resolved data " + item);
198
+ throw new Error(`Unexpected falsy value in resolved data ${item}`);
199
199
  }
200
200
  }
201
201
  const header = Buffer.allocUnsafe(8 + lengths.length * 4);
@@ -237,12 +237,12 @@ const serialize = async (
237
237
  */
238
238
  const deserialize = async (middleware, name, readFile) => {
239
239
  const contents = await readFile(name);
240
- if (contents.length === 0) throw new Error("Empty file " + name);
240
+ if (contents.length === 0) throw new Error(`Empty file ${name}`);
241
241
  let contentsIndex = 0;
242
242
  let contentItem = contents[0];
243
243
  let contentItemLength = contentItem.length;
244
244
  let contentPosition = 0;
245
- if (contentItemLength === 0) throw new Error("Empty file " + name);
245
+ if (contentItemLength === 0) throw new Error(`Empty file ${name}`);
246
246
  const nextContent = () => {
247
247
  contentsIndex++;
248
248
  contentItem = contents[contentsIndex];
@@ -378,18 +378,16 @@ const deserialize = async (middleware, name, readFile) => {
378
378
  length -= l;
379
379
  contentPosition = contentItemLength;
380
380
  }
381
+ } else if (length >= contentItemLength) {
382
+ result.push(contentItem);
383
+ length -= contentItemLength;
384
+ contentPosition = contentItemLength;
381
385
  } else {
382
- if (length >= contentItemLength) {
383
- result.push(contentItem);
384
- length -= contentItemLength;
385
- contentPosition = contentItemLength;
386
- } else {
387
- result.push(
388
- Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
389
- );
390
- contentPosition += length;
391
- length = 0;
392
- }
386
+ result.push(
387
+ Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
388
+ );
389
+ contentPosition += length;
390
+ length = 0;
393
391
  }
394
392
  while (length > 0) {
395
393
  nextContent();
@@ -410,6 +408,8 @@ const deserialize = async (middleware, name, readFile) => {
410
408
  return result;
411
409
  };
412
410
 
411
+ /** @typedef {{ filename: string, extension?: string }} FileMiddlewareContext */
412
+
413
413
  /**
414
414
  * @typedef {BufferSerializableType[]} DeserializedType
415
415
  * @typedef {true} SerializedType
@@ -425,6 +425,7 @@ class FileMiddleware extends SerializerMiddleware {
425
425
  this.fs = fs;
426
426
  this._hashFunction = hashFunction;
427
427
  }
428
+
428
429
  /**
429
430
  * @param {DeserializedType} data data
430
431
  * @param {object} context context object
@@ -439,76 +440,92 @@ class FileMiddleware extends SerializerMiddleware {
439
440
  // It's important that we don't touch existing files during serialization
440
441
  // because serialize may read existing files (when deserializing)
441
442
  const allWrittenFiles = new Set();
443
+ /**
444
+ * @param {string | false} name name
445
+ * @param {Buffer[]} content content
446
+ * @param {number} size size
447
+ * @returns {Promise<void>}
448
+ */
442
449
  const writeFile = async (name, content, size) => {
443
450
  const file = name
444
451
  ? join(this.fs, filename, `../${name}${extension}`)
445
452
  : filename;
446
- await new Promise((resolve, reject) => {
447
- let stream = this.fs.createWriteStream(file + "_");
448
- let compression;
449
- if (file.endsWith(".gz")) {
450
- compression = createGzip({
451
- chunkSize: COMPRESSION_CHUNK_SIZE,
452
- level: zConstants.Z_BEST_SPEED
453
- });
454
- } else if (file.endsWith(".br")) {
455
- compression = createBrotliCompress({
456
- chunkSize: COMPRESSION_CHUNK_SIZE,
457
- params: {
458
- [zConstants.BROTLI_PARAM_MODE]: zConstants.BROTLI_MODE_TEXT,
459
- [zConstants.BROTLI_PARAM_QUALITY]: 2,
460
- [zConstants.BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING]: true,
461
- [zConstants.BROTLI_PARAM_SIZE_HINT]: size
462
- }
463
- });
464
- }
465
- if (compression) {
466
- pipeline(compression, stream, reject);
467
- stream = compression;
468
- stream.on("finish", () => resolve());
469
- } else {
470
- stream.on("error", err => reject(err));
471
- stream.on("finish", () => resolve());
472
- }
473
- // split into chunks for WRITE_LIMIT_CHUNK size
474
- const chunks = [];
475
- for (const b of content) {
476
- if (b.length < WRITE_LIMIT_CHUNK) {
477
- chunks.push(b);
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());
478
481
  } else {
479
- for (let i = 0; i < b.length; i += WRITE_LIMIT_CHUNK) {
480
- chunks.push(b.slice(i, i + WRITE_LIMIT_CHUNK));
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
+ }
481
495
  }
482
496
  }
483
- }
484
497
 
485
- const len = chunks.length;
486
- let i = 0;
487
- const batchWrite = err => {
488
- // will be handled in "on" error handler
489
- if (err) return;
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;
490
506
 
491
- if (i === len) {
492
- stream.end();
493
- return;
494
- }
507
+ if (i === len) {
508
+ stream.end();
509
+ return;
510
+ }
495
511
 
496
- // queue up a batch of chunks up to the write limit
497
- // end is exclusive
498
- let end = i;
499
- let sum = chunks[end++].length;
500
- while (end < len) {
501
- sum += chunks[end].length;
502
- if (sum > WRITE_LIMIT_TOTAL) break;
503
- end++;
504
- }
505
- while (i < end - 1) {
506
- stream.write(chunks[i++]);
507
- }
508
- stream.write(chunks[i++], batchWrite);
509
- };
510
- batchWrite();
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();
527
+ }
528
+ );
512
529
  if (name) allWrittenFiles.add(file);
513
530
  };
514
531
 
@@ -518,10 +535,15 @@ class FileMiddleware extends SerializerMiddleware {
518
535
  await backgroundJob;
519
536
 
520
537
  // Rename the index file to disallow access during inconsistent file state
521
- await new Promise(resolve =>
522
- this.fs.rename(filename, filename + ".old", err => {
523
- resolve();
524
- })
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
+ }
525
547
  );
526
548
 
527
549
  // update all written files
@@ -529,22 +551,35 @@ class FileMiddleware extends SerializerMiddleware {
529
551
  Array.from(
530
552
  allWrittenFiles,
531
553
  file =>
532
- new Promise((resolve, reject) => {
533
- this.fs.rename(file + "_", file, err => {
534
- if (err) return reject(err);
535
- resolve();
536
- });
537
- })
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
+ )
538
567
  )
539
568
  );
540
569
 
541
570
  // As final step automatically update the index file to have a consistent pack again
542
- await new Promise(resolve => {
543
- this.fs.rename(filename + "_", filename, err => {
544
- if (err) return reject(err);
545
- resolve();
546
- });
547
- });
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
+ );
548
583
  return /** @type {true} */ (true);
549
584
  }
550
585
  )
@@ -560,6 +595,10 @@ class FileMiddleware extends SerializerMiddleware {
560
595
  */
561
596
  deserialize(data, context) {
562
597
  const { filename, extension = "" } = context;
598
+ /**
599
+ * @param {string | boolean} name name
600
+ * @returns {Promise<TODO>} result
601
+ */
563
602
  const readFile = name =>
564
603
  new Promise((resolve, reject) => {
565
604
  const file = name
@@ -570,11 +609,12 @@ class FileMiddleware extends SerializerMiddleware {
570
609
  reject(err);
571
610
  return;
572
611
  }
573
- let remaining = /** @type {number} */ (stats.size);
612
+ let remaining = /** @type {IStats} */ (stats).size;
574
613
  /** @type {Buffer | undefined} */
575
614
  let currentBuffer;
576
615
  /** @type {number | undefined} */
577
616
  let currentBufferUsed;
617
+ /** @type {any[]} */
578
618
  const buf = [];
579
619
  /** @type {import("zlib").Zlib & import("stream").Transform | undefined} */
580
620
  let decompression;
@@ -588,7 +628,8 @@ class FileMiddleware extends SerializerMiddleware {
588
628
  });
589
629
  }
590
630
  if (decompression) {
591
- let newResolve, newReject;
631
+ let newResolve;
632
+ let newReject;
592
633
  resolve(
593
634
  Promise.all([
594
635
  new Promise((rs, rj) => {
@@ -605,11 +646,12 @@ class FileMiddleware extends SerializerMiddleware {
605
646
  resolve = newResolve;
606
647
  reject = newReject;
607
648
  }
608
- this.fs.open(file, "r", (err, fd) => {
649
+ this.fs.open(file, "r", (err, _fd) => {
609
650
  if (err) {
610
651
  reject(err);
611
652
  return;
612
653
  }
654
+ const fd = /** @type {number} */ (_fd);
613
655
  const read = () => {
614
656
  if (currentBuffer === undefined) {
615
657
  currentBuffer = Buffer.allocUnsafeSlow(
@@ -622,8 +664,10 @@ class FileMiddleware extends SerializerMiddleware {
622
664
  currentBufferUsed = 0;
623
665
  }
624
666
  let readBuffer = currentBuffer;
625
- let readOffset = currentBufferUsed;
626
- let readLength = currentBuffer.length - currentBufferUsed;
667
+ let readOffset = /** @type {number} */ (currentBufferUsed);
668
+ let readLength =
669
+ currentBuffer.length -
670
+ /** @type {number} */ (currentBufferUsed);
627
671
  // values passed to fs.read must be valid int32 values
628
672
  if (readOffset > 0x7fffffff) {
629
673
  readBuffer = currentBuffer.slice(readOffset);
@@ -645,9 +689,13 @@ class FileMiddleware extends SerializerMiddleware {
645
689
  });
646
690
  return;
647
691
  }
648
- currentBufferUsed += bytesRead;
692
+ /** @type {number} */
693
+ (currentBufferUsed) += bytesRead;
649
694
  remaining -= bytesRead;
650
- if (currentBufferUsed === currentBuffer.length) {
695
+ if (
696
+ currentBufferUsed ===
697
+ /** @type {Buffer} */ (currentBuffer).length
698
+ ) {
651
699
  if (decompression) {
652
700
  decompression.write(currentBuffer);
653
701
  } else {
@@ -22,6 +22,7 @@ class MapObjectSerializer {
22
22
  context.write(value);
23
23
  }
24
24
  }
25
+
25
26
  /**
26
27
  * @template K, V
27
28
  * @param {ObjectDeserializerContext} context context
@@ -29,7 +30,7 @@ class MapObjectSerializer {
29
30
  */
30
31
  deserialize(context) {
31
32
  /** @type {number} */
32
- let size = context.read();
33
+ const size = context.read();
33
34
  /** @type {Map<K, V>} */
34
35
  const map = new Map();
35
36
  /** @type {K[]} */
@@ -21,9 +21,10 @@ class NullPrototypeObjectSerializer {
21
21
  }
22
22
  context.write(null);
23
23
  for (const key of keys) {
24
- context.write(obj[key]);
24
+ context.write(obj[/** @type {keyof T} */ (key)]);
25
25
  }
26
26
  }
27
+
27
28
  /**
28
29
  * @template {object} T
29
30
  * @param {ObjectDeserializerContext} context context
@@ -41,7 +42,7 @@ class NullPrototypeObjectSerializer {
41
42
  key = context.read();
42
43
  }
43
44
  for (const key of keys) {
44
- obj[key] = context.read();
45
+ obj[/** @type {keyof T} */ (key)] = context.read();
45
46
  }
46
47
  return obj;
47
48
  }