webpack 5.93.0 → 5.94.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/bin/webpack.js +6 -7
- package/hot/log.js +1 -2
- package/hot/only-dev-server.js +1 -1
- package/hot/poll.js +1 -1
- package/hot/signal.js +1 -1
- package/lib/APIPlugin.js +4 -3
- package/lib/AbstractMethodError.js +10 -5
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +12 -6
- package/lib/Cache.js +8 -10
- package/lib/CacheFacade.js +3 -3
- package/lib/CaseSensitiveModulesWarning.js +5 -7
- package/lib/Chunk.js +14 -11
- package/lib/ChunkGraph.js +58 -36
- package/lib/ChunkGroup.js +2 -3
- package/lib/ChunkTemplate.js +43 -0
- package/lib/CleanPlugin.js +10 -11
- package/lib/CodeGenerationResults.js +6 -5
- package/lib/CommentCompilationWarning.js +0 -1
- package/lib/Compilation.js +223 -191
- package/lib/Compiler.js +81 -82
- package/lib/ConcatenationScope.js +3 -6
- package/lib/ConditionalInitFragment.js +6 -7
- package/lib/ConstPlugin.js +7 -15
- package/lib/ContextExclusionPlugin.js +3 -3
- package/lib/ContextModule.js +33 -20
- package/lib/ContextModuleFactory.js +89 -44
- package/lib/ContextReplacementPlugin.js +10 -9
- package/lib/DefinePlugin.js +75 -68
- package/lib/DelegatedModule.js +7 -3
- package/lib/DelegatedModuleFactoryPlugin.js +36 -22
- package/lib/DelegatedPlugin.js +4 -0
- package/lib/DependenciesBlock.js +0 -1
- package/lib/Dependency.js +10 -14
- package/lib/DllEntryPlugin.js +4 -2
- package/lib/DllModuleFactory.js +1 -0
- package/lib/DllPlugin.js +9 -7
- package/lib/DllReferencePlugin.js +30 -15
- package/lib/EntryPlugin.js +1 -3
- package/lib/EnvironmentPlugin.js +5 -2
- package/lib/ErrorHelpers.js +11 -12
- package/lib/EvalDevToolModulePlugin.js +10 -12
- package/lib/EvalSourceMapDevToolPlugin.js +15 -13
- package/lib/ExportsInfo.js +185 -120
- package/lib/ExternalModule.js +104 -64
- package/lib/ExternalModuleFactoryPlugin.js +23 -10
- package/lib/FileSystemInfo.js +791 -422
- package/lib/FlagAllModulesAsUsedPlugin.js +1 -1
- package/lib/FlagDependencyExportsPlugin.js +12 -11
- package/lib/FlagDependencyUsagePlugin.js +1 -1
- package/lib/Generator.js +2 -5
- package/lib/GraphHelpers.js +3 -2
- package/lib/HookWebpackError.js +8 -10
- package/lib/HotModuleReplacementPlugin.js +78 -64
- package/lib/IgnoreErrorModuleFactory.js +3 -3
- package/lib/IgnorePlugin.js +1 -3
- package/lib/IgnoreWarningsPlugin.js +6 -9
- package/lib/InitFragment.js +2 -3
- package/lib/LibManifestPlugin.js +4 -3
- package/lib/MainTemplate.js +72 -19
- package/lib/Module.js +25 -9
- package/lib/ModuleBuildError.js +4 -11
- package/lib/ModuleDependencyError.js +5 -5
- package/lib/ModuleDependencyWarning.js +5 -5
- package/lib/ModuleError.js +1 -5
- package/lib/ModuleFilenameHelpers.js +29 -46
- package/lib/ModuleGraph.js +7 -6
- package/lib/ModuleGraphConnection.js +6 -6
- package/lib/ModuleInfoHeaderPlugin.js +82 -30
- package/lib/ModuleParseError.js +8 -9
- package/lib/ModuleRestoreError.js +1 -1
- package/lib/ModuleStoreError.js +1 -1
- package/lib/ModuleTemplate.js +33 -1
- package/lib/ModuleTypeConstants.js +21 -22
- package/lib/ModuleWarning.js +1 -5
- package/lib/MultiCompiler.js +24 -26
- package/lib/MultiStats.js +73 -31
- package/lib/MultiWatching.js +1 -1
- package/lib/NormalModule.js +126 -69
- package/lib/NormalModuleFactory.js +53 -49
- package/lib/OptimizationStages.js +3 -3
- package/lib/ProgressPlugin.js +9 -9
- package/lib/ProvidePlugin.js +4 -4
- package/lib/RuntimeGlobals.js +71 -70
- package/lib/RuntimeModule.js +1 -1
- package/lib/RuntimePlugin.js +24 -12
- package/lib/RuntimeTemplate.js +40 -44
- package/lib/SizeFormatHelpers.js +2 -4
- package/lib/SourceMapDevToolPlugin.js +42 -34
- package/lib/Stats.js +5 -11
- package/lib/Template.js +18 -24
- package/lib/TemplatedPathPlugin.js +12 -10
- package/lib/WarnDeprecatedOptionPlugin.js +0 -1
- package/lib/WatchIgnorePlugin.js +26 -9
- package/lib/Watching.js +10 -5
- package/lib/WebpackOptionsApply.js +84 -62
- package/lib/asset/AssetGenerator.js +107 -42
- package/lib/asset/AssetModulesPlugin.js +29 -23
- package/lib/asset/AssetSourceGenerator.js +2 -7
- package/lib/async-modules/AwaitDependenciesInitFragment.js +6 -7
- package/lib/buildChunkGraph.js +14 -19
- package/lib/cache/IdleFileCachePlugin.js +4 -4
- package/lib/cache/MemoryWithGcCachePlugin.js +5 -5
- package/lib/cache/PackFileCacheStrategy.js +51 -50
- package/lib/cache/ResolverCachePlugin.js +6 -6
- package/lib/cache/mergeEtags.js +16 -21
- package/lib/cli.js +148 -104
- package/lib/config/browserslistTargetHandler.js +16 -13
- package/lib/config/defaults.js +31 -28
- package/lib/config/normalization.js +335 -344
- package/lib/config/target.js +42 -52
- package/lib/container/ContainerEntryModule.js +2 -2
- package/lib/container/ContainerPlugin.js +1 -1
- package/lib/container/RemoteRuntimeModule.js +11 -8
- package/lib/container/options.js +18 -4
- package/lib/css/CssExportsGenerator.js +26 -24
- package/lib/css/CssGenerator.js +9 -4
- package/lib/css/CssLoadingRuntimeModule.js +10 -10
- package/lib/css/CssModulesPlugin.js +127 -47
- package/lib/css/CssParser.js +20 -18
- package/lib/css/walkCssTokens.js +80 -95
- package/lib/debug/ProfilingPlugin.js +19 -20
- package/lib/dependencies/AMDDefineDependency.js +1 -1
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +83 -47
- package/lib/dependencies/AMDRequireArrayDependency.js +9 -10
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +22 -16
- package/lib/dependencies/AMDRuntimeModules.js +2 -2
- package/lib/dependencies/CommonJsDependencyHelpers.js +6 -2
- package/lib/dependencies/CommonJsExportRequireDependency.js +37 -41
- package/lib/dependencies/CommonJsExportsDependency.js +0 -1
- package/lib/dependencies/CommonJsExportsParserPlugin.js +19 -23
- package/lib/dependencies/CommonJsFullRequireDependency.js +1 -1
- package/lib/dependencies/CommonJsImportsParserPlugin.js +52 -61
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +6 -8
- package/lib/dependencies/ConstDependency.js +1 -1
- package/lib/dependencies/ContextDependency.js +1 -1
- package/lib/dependencies/ContextDependencyHelpers.js +31 -34
- package/lib/dependencies/ContextElementDependency.js +2 -2
- package/lib/dependencies/CriticalDependencyWarning.js +1 -1
- package/lib/dependencies/CssExportDependency.js +7 -7
- package/lib/dependencies/CssImportDependency.js +0 -2
- package/lib/dependencies/CssLocalIdentifierDependency.js +3 -3
- package/lib/dependencies/CssSelfLocalIdentifierDependency.js +2 -1
- package/lib/dependencies/CssUrlDependency.js +4 -5
- package/lib/dependencies/DynamicExports.js +5 -5
- package/lib/dependencies/ExportsInfoDependency.js +1 -2
- package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -1
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +4 -5
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +27 -16
- package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +107 -64
- package/lib/dependencies/HarmonyExports.js +2 -2
- package/lib/dependencies/HarmonyImportDependency.js +2 -4
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +19 -4
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -15
- package/lib/dependencies/ImportDependency.js +1 -1
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +5 -5
- package/lib/dependencies/ImportMetaPlugin.js +11 -13
- package/lib/dependencies/ImportParserPlugin.js +39 -44
- package/lib/dependencies/JsonExportsDependency.js +22 -18
- package/lib/dependencies/LoaderPlugin.js +47 -36
- package/lib/dependencies/LocalModule.js +1 -1
- package/lib/dependencies/LocalModulesHelpers.js +4 -4
- package/lib/dependencies/ModuleDecoratorDependency.js +1 -1
- package/lib/dependencies/ProvidedDependency.js +1 -1
- package/lib/dependencies/PureExpressionDependency.js +6 -6
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/RuntimeRequirementsDependency.js +1 -1
- package/lib/dependencies/SystemPlugin.js +1 -1
- package/lib/dependencies/URLDependency.js +3 -3
- package/lib/dependencies/URLPlugin.js +66 -12
- package/lib/dependencies/WorkerPlugin.js +25 -24
- package/lib/dependencies/processExportInfo.js +3 -1
- package/lib/electron/ElectronTargetPlugin.js +1 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +3 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +7 -3
- package/lib/formatLocation.js +1 -2
- package/lib/hmr/HotModuleReplacement.runtime.js +4 -5
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -0
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +9 -12
- package/lib/hmr/LazyCompilationPlugin.js +27 -12
- package/lib/hmr/lazyCompilationBackend.js +64 -40
- package/lib/ids/ChunkModuleIdRangePlugin.js +1 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +2 -4
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/ids/HashedModuleIdsPlugin.js +5 -1
- package/lib/ids/IdHelpers.js +29 -39
- package/lib/ids/SyncModuleIdsPlugin.js +7 -2
- package/lib/index.js +1 -5
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -4
- package/lib/javascript/BasicEvaluatedExpression.js +4 -19
- package/lib/javascript/ChunkHelpers.js +1 -1
- package/lib/javascript/CommonJsChunkFormatPlugin.js +3 -2
- package/lib/javascript/EnableChunkLoadingPlugin.js +7 -6
- package/lib/javascript/JavascriptGenerator.js +23 -7
- package/lib/javascript/JavascriptModulesPlugin.js +91 -69
- package/lib/javascript/JavascriptParser.js +179 -200
- package/lib/javascript/JavascriptParserHelpers.js +20 -21
- package/lib/javascript/StartupHelpers.js +41 -13
- package/lib/json/JsonGenerator.js +7 -13
- package/lib/json/JsonModulesPlugin.js +1 -4
- package/lib/json/JsonParser.js +5 -3
- package/lib/library/AmdLibraryPlugin.js +12 -16
- package/lib/library/AssignLibraryPlugin.js +8 -10
- package/lib/library/EnableLibraryPlugin.js +15 -14
- package/lib/library/JsonpLibraryPlugin.js +2 -1
- package/lib/library/ModernModuleLibraryPlugin.js +8 -6
- package/lib/library/ModuleLibraryPlugin.js +2 -1
- package/lib/library/SystemLibraryPlugin.js +2 -1
- package/lib/library/UmdLibraryPlugin.js +66 -92
- package/lib/logging/Logger.js +32 -4
- package/lib/logging/createConsoleLogger.js +12 -13
- package/lib/logging/runtime.js +7 -8
- package/lib/logging/truncateArgs.js +5 -8
- package/lib/node/NodeWatchFileSystem.js +3 -18
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +2 -2
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +1 -0
- package/lib/node/RequireChunkLoadingRuntimeModule.js +2 -2
- package/lib/node/nodeConsole.js +22 -22
- package/lib/optimize/AggressiveMergingPlugin.js +2 -4
- package/lib/optimize/AggressiveSplittingPlugin.js +16 -19
- package/lib/optimize/ConcatenatedModule.js +80 -48
- package/lib/optimize/EnsureChunkConditionsPlugin.js +1 -1
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -3
- package/lib/optimize/InnerGraph.js +17 -17
- package/lib/optimize/InnerGraphPlugin.js +8 -7
- package/lib/optimize/LimitChunkCountPlugin.js +2 -3
- package/lib/optimize/MangleExportsPlugin.js +1 -0
- package/lib/optimize/MinMaxSizeWarning.js +1 -1
- package/lib/optimize/ModuleConcatenationPlugin.js +54 -78
- package/lib/optimize/RealContentHashPlugin.js +7 -10
- package/lib/optimize/RemoveParentModulesPlugin.js +3 -3
- package/lib/optimize/SideEffectsFlagPlugin.js +6 -2
- package/lib/optimize/SplitChunksPlugin.js +34 -30
- package/lib/performance/SizeLimitsPlugin.js +2 -2
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +1 -1
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +1 -1
- package/lib/rules/BasicEffectRulePlugin.js +3 -1
- package/lib/rules/BasicMatcherRulePlugin.js +3 -1
- package/lib/rules/ObjectMatcherRulePlugin.js +4 -1
- package/lib/rules/RuleSetCompiler.js +41 -22
- package/lib/rules/UseEffectRulePlugin.js +36 -32
- package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
- package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +1 -1
- package/lib/runtime/EnsureChunkRuntimeModule.js +10 -11
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +11 -17
- package/lib/runtime/LoadScriptRuntimeModule.js +17 -18
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -3
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +241 -126
- package/lib/serialization/BinaryMiddleware.js +44 -28
- package/lib/serialization/DateObjectSerializer.js +1 -0
- package/lib/serialization/ErrorObjectSerializer.js +2 -0
- package/lib/serialization/FileMiddleware.js +154 -106
- package/lib/serialization/MapObjectSerializer.js +2 -1
- package/lib/serialization/NullPrototypeObjectSerializer.js +3 -2
- package/lib/serialization/ObjectMiddleware.js +52 -56
- package/lib/serialization/PlainObjectSerializer.js +32 -6
- package/lib/serialization/RegExpObjectSerializer.js +1 -0
- package/lib/serialization/Serializer.js +4 -5
- package/lib/serialization/SerializerMiddleware.js +6 -6
- package/lib/serialization/SetObjectSerializer.js +2 -1
- package/lib/sharing/ConsumeSharedPlugin.js +116 -97
- package/lib/sharing/ConsumeSharedRuntimeModule.js +4 -4
- package/lib/sharing/ProvideForSharedDependency.js +0 -1
- package/lib/sharing/ProvideSharedPlugin.js +2 -2
- package/lib/sharing/resolveMatchedConfigs.js +2 -1
- package/lib/sharing/utils.js +15 -27
- package/lib/stats/DefaultStatsFactoryPlugin.js +424 -281
- package/lib/stats/DefaultStatsPresetPlugin.js +73 -18
- package/lib/stats/DefaultStatsPrinterPlugin.js +370 -101
- package/lib/stats/StatsFactory.js +127 -56
- package/lib/stats/StatsPrinter.js +75 -44
- package/lib/util/ArrayHelpers.js +8 -4
- package/lib/util/ArrayQueue.js +1 -1
- package/lib/util/AsyncQueue.js +31 -12
- package/lib/util/IterableHelpers.js +3 -4
- package/lib/util/LazyBucketSortedSet.js +60 -44
- package/lib/util/LazySet.js +1 -0
- package/lib/util/MapHelpers.js +1 -3
- package/lib/util/ParallelismFactorCalculator.js +1 -1
- package/lib/util/Queue.js +1 -1
- package/lib/util/Semaphore.js +4 -7
- package/lib/util/SetHelpers.js +5 -5
- package/lib/util/SortableSet.js +4 -3
- package/lib/util/StackedCacheMap.js +4 -6
- package/lib/util/StackedMap.js +1 -3
- package/lib/util/StringXor.js +0 -5
- package/lib/util/TupleQueue.js +1 -1
- package/lib/util/TupleSet.js +15 -5
- package/lib/util/URLAbsoluteSpecifier.js +7 -7
- package/lib/util/WeakTupleMap.js +19 -21
- package/lib/util/binarySearchBounds.js +5 -12
- package/lib/util/chainedImports.js +1 -1
- package/lib/util/cleverMerge.js +21 -19
- package/lib/util/comparators.js +57 -52
- package/lib/util/compileBooleanMatcher.js +3 -6
- package/lib/util/conventions.js +8 -11
- package/lib/util/createHash.js +9 -6
- package/lib/util/deprecation.js +22 -12
- package/lib/util/deterministicGrouping.js +19 -26
- package/lib/util/findGraphRoots.js +2 -2
- package/lib/util/fs.js +31 -31
- package/lib/util/hash/md4.js +2 -2
- package/lib/util/hash/wasm-hash.js +7 -7
- package/lib/util/hash/xxhash64.js +2 -2
- package/lib/util/identifier.js +81 -59
- package/lib/util/memoize.js +8 -10
- package/lib/util/mergeScope.js +6 -9
- package/lib/util/nonNumericOnlyHash.js +2 -2
- package/lib/util/numberHash.js +1 -6
- package/lib/util/objectToMap.js +0 -1
- package/lib/util/propertyAccess.js +2 -5
- package/lib/util/propertyName.js +1 -3
- package/lib/util/registerExternalSerializer.js +1 -1
- package/lib/util/runtime.js +103 -113
- package/lib/util/semver.js +29 -27
- package/lib/util/serialization.js +16 -1
- package/lib/util/smartGrouping.js +5 -5
- package/lib/util/source.js +1 -1
- package/lib/wasm/EnableWasmLoadingPlugin.js +5 -4
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -6
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +3 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +20 -19
- package/lib/wasm-sync/WebAssemblyGenerator.js +14 -29
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +1 -1
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -3
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -1
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +1 -1
- package/package.json +15 -14
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +1 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
- package/types.d.ts +667 -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
|
-
|
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
|
-
|
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(
|
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
|
-
|
292
|
-
|
293
|
-
|
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
|
-
|
677
|
-
|
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 =
|
746
|
-
|
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
|
-
|
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;
|
@@ -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
|
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
|
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
|
-
|
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(
|
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(
|
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(
|
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
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
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(
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
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
|
-
|
480
|
-
|
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
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
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
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
507
|
+
if (i === len) {
|
508
|
+
stream.end();
|
509
|
+
return;
|
510
|
+
}
|
495
511
|
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
+
// queue up a batch of chunks up to the write limit
|
513
|
+
// end is exclusive
|
514
|
+
let end = i;
|
515
|
+
let sum = chunks[end++].length;
|
516
|
+
while (end < len) {
|
517
|
+
sum += chunks[end].length;
|
518
|
+
if (sum > WRITE_LIMIT_TOTAL) break;
|
519
|
+
end++;
|
520
|
+
}
|
521
|
+
while (i < end - 1) {
|
522
|
+
stream.write(chunks[i++]);
|
523
|
+
}
|
524
|
+
stream.write(chunks[i++], batchWrite);
|
525
|
+
};
|
526
|
+
batchWrite();
|
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(
|
522
|
-
|
523
|
-
|
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(
|
533
|
-
|
534
|
-
|
535
|
-
|
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(
|
543
|
-
|
544
|
-
|
545
|
-
|
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 {
|
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
|
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,
|
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 =
|
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
|
-
|
692
|
+
/** @type {number} */
|
693
|
+
(currentBufferUsed) += bytesRead;
|
649
694
|
remaining -= bytesRead;
|
650
|
-
if (
|
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
|
-
|
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
|
}
|