seroval 1.5.5 → 1.6.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/dist/index.d.ts +761 -0
- package/dist/index.js +2928 -0
- package/package.json +14 -23
- package/dist/cjs/development/index.cjs +0 -4230
- package/dist/cjs/development/index.cjs.map +0 -7
- package/dist/cjs/production/index.cjs +0 -3
- package/dist/esm/development/index.mjs +0 -4207
- package/dist/esm/development/index.mjs.map +0 -7
- package/dist/esm/production/index.mjs +0 -3
- package/dist/types/core/Serializer.d.ts +0 -28
- package/dist/types/core/Serializer.d.ts.map +0 -1
- package/dist/types/core/base-primitives.d.ts +0 -28
- package/dist/types/core/base-primitives.d.ts.map +0 -1
- package/dist/types/core/compat.d.ts +0 -15
- package/dist/types/core/compat.d.ts.map +0 -1
- package/dist/types/core/constants.d.ts +0 -105
- package/dist/types/core/constants.d.ts.map +0 -1
- package/dist/types/core/constructors.d.ts +0 -50
- package/dist/types/core/constructors.d.ts.map +0 -1
- package/dist/types/core/context/async-parser.d.ts +0 -20
- package/dist/types/core/context/async-parser.d.ts.map +0 -1
- package/dist/types/core/context/deserializer.d.ts +0 -52
- package/dist/types/core/context/deserializer.d.ts.map +0 -1
- package/dist/types/core/context/parser.d.ts +0 -62
- package/dist/types/core/context/parser.d.ts.map +0 -1
- package/dist/types/core/context/serializer.d.ts +0 -103
- package/dist/types/core/context/serializer.d.ts.map +0 -1
- package/dist/types/core/context/sync-parser.d.ts +0 -61
- package/dist/types/core/context/sync-parser.d.ts.map +0 -1
- package/dist/types/core/cross/index.d.ts +0 -24
- package/dist/types/core/cross/index.d.ts.map +0 -1
- package/dist/types/core/errors.d.ts +0 -47
- package/dist/types/core/errors.d.ts.map +0 -1
- package/dist/types/core/function-string.d.ts +0 -3
- package/dist/types/core/function-string.d.ts.map +0 -1
- package/dist/types/core/keys.d.ts +0 -4
- package/dist/types/core/keys.d.ts.map +0 -1
- package/dist/types/core/literals.d.ts +0 -10
- package/dist/types/core/literals.d.ts.map +0 -1
- package/dist/types/core/node.d.ts +0 -8
- package/dist/types/core/node.d.ts.map +0 -1
- package/dist/types/core/opaque-reference.d.ts +0 -9
- package/dist/types/core/opaque-reference.d.ts.map +0 -1
- package/dist/types/core/plugin.d.ts +0 -52
- package/dist/types/core/plugin.d.ts.map +0 -1
- package/dist/types/core/reference.d.ts +0 -6
- package/dist/types/core/reference.d.ts.map +0 -1
- package/dist/types/core/sequence.d.ts +0 -11
- package/dist/types/core/sequence.d.ts.map +0 -1
- package/dist/types/core/special-reference.d.ts +0 -16
- package/dist/types/core/special-reference.d.ts.map +0 -1
- package/dist/types/core/stream.d.ts +0 -17
- package/dist/types/core/stream.d.ts.map +0 -1
- package/dist/types/core/string.d.ts +0 -4
- package/dist/types/core/string.d.ts.map +0 -1
- package/dist/types/core/symbols.d.ts +0 -14
- package/dist/types/core/symbols.d.ts.map +0 -1
- package/dist/types/core/tree/index.d.ts +0 -21
- package/dist/types/core/tree/index.d.ts.map +0 -1
- package/dist/types/core/types.d.ts +0 -233
- package/dist/types/core/types.d.ts.map +0 -1
- package/dist/types/core/utils/error.d.ts +0 -6
- package/dist/types/core/utils/error.d.ts.map +0 -1
- package/dist/types/core/utils/get-identifier.d.ts +0 -2
- package/dist/types/core/utils/get-identifier.d.ts.map +0 -1
- package/dist/types/core/utils/get-object-flag.d.ts +0 -3
- package/dist/types/core/utils/get-object-flag.d.ts.map +0 -1
- package/dist/types/core/utils/is-valid-identifier.d.ts +0 -2
- package/dist/types/core/utils/is-valid-identifier.d.ts.map +0 -1
- package/dist/types/core/utils/promise-to-result.d.ts +0 -2
- package/dist/types/core/utils/promise-to-result.d.ts.map +0 -1
- package/dist/types/core/utils/typed-array.d.ts +0 -6
- package/dist/types/core/utils/typed-array.d.ts.map +0 -1
- package/dist/types/core/utils/valid-properties.d.ts +0 -3
- package/dist/types/core/utils/valid-properties.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -18
- package/dist/types/index.d.ts.map +0 -1
- package/src/core/Serializer.ts +0 -119
- package/src/core/base-primitives.ts +0 -537
- package/src/core/compat.ts +0 -23
- package/src/core/constants.ts +0 -202
- package/src/core/constructors.ts +0 -265
- package/src/core/context/async-parser.ts +0 -663
- package/src/core/context/deserializer.ts +0 -832
- package/src/core/context/parser.ts +0 -335
- package/src/core/context/serializer.ts +0 -1524
- package/src/core/context/sync-parser.ts +0 -943
- package/src/core/cross/index.ts +0 -190
- package/src/core/errors.ts +0 -196
- package/src/core/function-string.ts +0 -31
- package/src/core/keys.ts +0 -17
- package/src/core/literals.ts +0 -43
- package/src/core/node.ts +0 -40
- package/src/core/opaque-reference.ts +0 -9
- package/src/core/plugin.ts +0 -105
- package/src/core/reference.ts +0 -66
- package/src/core/sequence.ts +0 -59
- package/src/core/special-reference.ts +0 -42
- package/src/core/stream.ts +0 -71
- package/src/core/string.ts +0 -86
- package/src/core/symbols.ts +0 -20
- package/src/core/tree/index.ts +0 -134
- package/src/core/types.ts +0 -377
- package/src/core/utils/error.ts +0 -73
- package/src/core/utils/get-identifier.ts +0 -18
- package/src/core/utils/get-object-flag.ts +0 -14
- package/src/core/utils/is-valid-identifier.ts +0 -12
- package/src/core/utils/promise-to-result.ts +0 -9
- package/src/core/utils/typed-array.ts +0 -56
- package/src/core/utils/valid-properties.ts +0 -34
- package/src/index.ts +0 -36
|
@@ -1,832 +0,0 @@
|
|
|
1
|
-
import { ALL_ENABLED, Feature } from '../compat';
|
|
2
|
-
import {
|
|
3
|
-
CONSTANT_VAL,
|
|
4
|
-
ERROR_CONSTRUCTOR,
|
|
5
|
-
NIL,
|
|
6
|
-
SerovalNodeType,
|
|
7
|
-
SerovalObjectFlags,
|
|
8
|
-
SYMBOL_REF,
|
|
9
|
-
} from '../constants';
|
|
10
|
-
import {
|
|
11
|
-
ARRAY_BUFFER_CONSTRUCTOR,
|
|
12
|
-
PROMISE_CONSTRUCTOR,
|
|
13
|
-
type PromiseConstructorResolver,
|
|
14
|
-
} from '../constructors';
|
|
15
|
-
import {
|
|
16
|
-
SerovalDepthLimitError,
|
|
17
|
-
SerovalDeserializationError,
|
|
18
|
-
SerovalMalformedNodeError,
|
|
19
|
-
SerovalMissingInstanceError,
|
|
20
|
-
SerovalMissingPluginError,
|
|
21
|
-
SerovalUnsupportedNodeError,
|
|
22
|
-
} from '../errors';
|
|
23
|
-
import type { PluginAccessOptions } from '../plugin';
|
|
24
|
-
import { SerovalMode } from '../plugin';
|
|
25
|
-
import { getReference } from '../reference';
|
|
26
|
-
import { createSequence, type Sequence, sequenceToIterator } from '../sequence';
|
|
27
|
-
import type { Stream } from '../stream';
|
|
28
|
-
import { createStream, streamToAsyncIterable } from '../stream';
|
|
29
|
-
import { deserializeString } from '../string';
|
|
30
|
-
import type {
|
|
31
|
-
SerovalAggregateErrorNode,
|
|
32
|
-
SerovalArrayBufferNode,
|
|
33
|
-
SerovalArrayNode,
|
|
34
|
-
SerovalAsyncIteratorFactoryInstanceNode,
|
|
35
|
-
SerovalAsyncIteratorFactoryNode,
|
|
36
|
-
SerovalBigIntTypedArrayNode,
|
|
37
|
-
SerovalBoxedNode,
|
|
38
|
-
SerovalDataViewNode,
|
|
39
|
-
SerovalDateNode,
|
|
40
|
-
SerovalErrorNode,
|
|
41
|
-
SerovalIteratorFactoryInstanceNode,
|
|
42
|
-
SerovalIteratorFactoryNode,
|
|
43
|
-
SerovalMapNode,
|
|
44
|
-
SerovalNode,
|
|
45
|
-
SerovalNullConstructorNode,
|
|
46
|
-
SerovalObjectNode,
|
|
47
|
-
SerovalObjectRecordNode,
|
|
48
|
-
SerovalPluginNode,
|
|
49
|
-
SerovalPromiseConstructorNode,
|
|
50
|
-
SerovalPromiseNode,
|
|
51
|
-
SerovalPromiseRejectNode,
|
|
52
|
-
SerovalPromiseResolveNode,
|
|
53
|
-
SerovalReferenceNode,
|
|
54
|
-
SerovalRegExpNode,
|
|
55
|
-
SerovalSequenceNode,
|
|
56
|
-
SerovalSetNode,
|
|
57
|
-
SerovalStreamConstructorNode,
|
|
58
|
-
SerovalStreamNextNode,
|
|
59
|
-
SerovalStreamReturnNode,
|
|
60
|
-
SerovalStreamThrowNode,
|
|
61
|
-
SerovalTypedArrayNode,
|
|
62
|
-
} from '../types';
|
|
63
|
-
import type {
|
|
64
|
-
BigIntTypedArrayValue,
|
|
65
|
-
TypedArrayValue,
|
|
66
|
-
} from '../utils/typed-array';
|
|
67
|
-
import { getTypedArrayConstructor } from '../utils/typed-array';
|
|
68
|
-
import { isValidKey, isValidSymbol } from '../utils/valid-properties';
|
|
69
|
-
|
|
70
|
-
const MAX_BASE64_LENGTH = 1_000_000; // ~0.75MB decoded
|
|
71
|
-
const MAX_BIGINT_LENGTH = 10_000;
|
|
72
|
-
const MAX_REGEXP_SOURCE_LENGTH = 20_000;
|
|
73
|
-
|
|
74
|
-
function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
|
|
75
|
-
switch (flag) {
|
|
76
|
-
case SerovalObjectFlags.Frozen:
|
|
77
|
-
return Object.freeze(obj);
|
|
78
|
-
case SerovalObjectFlags.NonExtensible:
|
|
79
|
-
return Object.preventExtensions(obj);
|
|
80
|
-
case SerovalObjectFlags.Sealed:
|
|
81
|
-
return Object.seal(obj);
|
|
82
|
-
default:
|
|
83
|
-
return obj;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
type AssignableValue = AggregateError | Error | Iterable<unknown>;
|
|
88
|
-
type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode;
|
|
89
|
-
|
|
90
|
-
export interface BaseDeserializerContextOptions extends PluginAccessOptions {
|
|
91
|
-
refs?: Map<number, unknown>;
|
|
92
|
-
features?: number;
|
|
93
|
-
disabledFeatures?: number;
|
|
94
|
-
depthLimit?: number;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface BaseDeserializerContext extends PluginAccessOptions {
|
|
98
|
-
readonly mode: SerovalMode;
|
|
99
|
-
/**
|
|
100
|
-
* Mapping ids to values
|
|
101
|
-
*/
|
|
102
|
-
refs: Map<number, unknown> & { types: Map<number, SerovalNodeType> };
|
|
103
|
-
features: number;
|
|
104
|
-
depthLimit: number;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const DEFAULT_DEPTH_LIMIT = 1000;
|
|
108
|
-
|
|
109
|
-
export function createBaseDeserializerContext(
|
|
110
|
-
mode: SerovalMode,
|
|
111
|
-
options: BaseDeserializerContextOptions,
|
|
112
|
-
): BaseDeserializerContext {
|
|
113
|
-
const refs = options.refs || new Map();
|
|
114
|
-
if (!('types' in refs)) {
|
|
115
|
-
Object.assign(refs, {
|
|
116
|
-
types: new Map(),
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
mode,
|
|
121
|
-
plugins: options.plugins,
|
|
122
|
-
refs: refs as BaseDeserializerContext['refs'],
|
|
123
|
-
features: options.features ?? ALL_ENABLED ^ (options.disabledFeatures || 0),
|
|
124
|
-
depthLimit: options.depthLimit || DEFAULT_DEPTH_LIMIT,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export interface VanillaDeserializerContextOptions
|
|
129
|
-
extends Omit<BaseDeserializerContextOptions, 'refs'> {
|
|
130
|
-
markedRefs: number[] | Set<number>;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export interface VanillaDeserializerState {
|
|
134
|
-
marked: Set<number>;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export interface VanillaDeserializerContext {
|
|
138
|
-
mode: SerovalMode.Vanilla;
|
|
139
|
-
base: BaseDeserializerContext;
|
|
140
|
-
child: DeserializePluginContext | undefined;
|
|
141
|
-
state: VanillaDeserializerState;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function createVanillaDeserializerContext(
|
|
145
|
-
options: VanillaDeserializerContextOptions,
|
|
146
|
-
): VanillaDeserializerContext {
|
|
147
|
-
return {
|
|
148
|
-
mode: SerovalMode.Vanilla,
|
|
149
|
-
base: createBaseDeserializerContext(SerovalMode.Vanilla, options),
|
|
150
|
-
child: NIL,
|
|
151
|
-
state: {
|
|
152
|
-
marked: new Set(options.markedRefs),
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export interface CrossDeserializerContext {
|
|
158
|
-
mode: SerovalMode.Cross;
|
|
159
|
-
base: BaseDeserializerContext;
|
|
160
|
-
child: DeserializePluginContext | undefined;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export type CrossDeserializerContextOptions = BaseDeserializerContextOptions;
|
|
164
|
-
|
|
165
|
-
export function createCrossDeserializerContext(
|
|
166
|
-
options: CrossDeserializerContextOptions,
|
|
167
|
-
): CrossDeserializerContext {
|
|
168
|
-
return {
|
|
169
|
-
mode: SerovalMode.Cross,
|
|
170
|
-
base: createBaseDeserializerContext(SerovalMode.Cross, options),
|
|
171
|
-
child: NIL,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
type DeserializerContext =
|
|
176
|
-
| VanillaDeserializerContext
|
|
177
|
-
| CrossDeserializerContext;
|
|
178
|
-
|
|
179
|
-
export class DeserializePluginContext {
|
|
180
|
-
constructor(
|
|
181
|
-
private _p: DeserializerContext,
|
|
182
|
-
private depth: number,
|
|
183
|
-
) {}
|
|
184
|
-
|
|
185
|
-
deserialize<T>(node: SerovalNode): T {
|
|
186
|
-
return deserialize(this._p, this.depth, node) as T;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
function guardIndexedValue(ctx: BaseDeserializerContext, id: number): void {
|
|
191
|
-
if (id < 0 || !Number.isFinite(id) || !Number.isInteger(id)) {
|
|
192
|
-
throw new SerovalMalformedNodeError({
|
|
193
|
-
t: SerovalNodeType.IndexedValue,
|
|
194
|
-
i: id,
|
|
195
|
-
} as SerovalNode);
|
|
196
|
-
}
|
|
197
|
-
if (ctx.refs.has(id)) {
|
|
198
|
-
throw new Error('Conflicted ref id: ' + id);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function assignIndexedValueVanilla<T>(
|
|
203
|
-
ctx: VanillaDeserializerContext,
|
|
204
|
-
id: number,
|
|
205
|
-
value: T,
|
|
206
|
-
): T {
|
|
207
|
-
guardIndexedValue(ctx.base, id);
|
|
208
|
-
if (ctx.state.marked.has(id)) {
|
|
209
|
-
ctx.base.refs.set(id, value);
|
|
210
|
-
}
|
|
211
|
-
return value;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function assignIndexedValueCross<T>(
|
|
215
|
-
ctx: CrossDeserializerContext,
|
|
216
|
-
id: number,
|
|
217
|
-
value: T,
|
|
218
|
-
): T {
|
|
219
|
-
guardIndexedValue(ctx.base, id);
|
|
220
|
-
ctx.base.refs.set(id, value);
|
|
221
|
-
return value;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function assignIndexedValue<T>(
|
|
225
|
-
ctx: DeserializerContext,
|
|
226
|
-
id: number,
|
|
227
|
-
value: T,
|
|
228
|
-
): T {
|
|
229
|
-
return ctx.mode === SerovalMode.Vanilla
|
|
230
|
-
? assignIndexedValueVanilla(ctx, id, value)
|
|
231
|
-
: assignIndexedValueCross(ctx, id, value);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function deserializeKnownValue<
|
|
235
|
-
T extends Record<string, unknown>,
|
|
236
|
-
K extends keyof T,
|
|
237
|
-
>(node: SerovalNode, record: T, key: K): T[K] {
|
|
238
|
-
if (Object.hasOwn(record, key)) {
|
|
239
|
-
return record[key];
|
|
240
|
-
}
|
|
241
|
-
throw new SerovalMalformedNodeError(node);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function deserializeReference(
|
|
245
|
-
ctx: DeserializerContext,
|
|
246
|
-
node: SerovalReferenceNode,
|
|
247
|
-
): unknown {
|
|
248
|
-
return assignIndexedValue(
|
|
249
|
-
ctx,
|
|
250
|
-
node.i,
|
|
251
|
-
getReference(deserializeString(node.s)),
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
function deserializeArray(
|
|
256
|
-
ctx: DeserializerContext,
|
|
257
|
-
depth: number,
|
|
258
|
-
node: SerovalArrayNode,
|
|
259
|
-
): unknown[] {
|
|
260
|
-
const items = node.a;
|
|
261
|
-
const len = items.length;
|
|
262
|
-
const result: unknown[] = assignIndexedValue(
|
|
263
|
-
ctx,
|
|
264
|
-
node.i,
|
|
265
|
-
new Array<unknown>(len),
|
|
266
|
-
);
|
|
267
|
-
for (let i = 0, item: SerovalNode | 0; i < len; i++) {
|
|
268
|
-
item = items[i];
|
|
269
|
-
if (item) {
|
|
270
|
-
result[i] = deserialize(ctx, depth, item);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
applyObjectFlag(result, node.o);
|
|
274
|
-
return result;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
function assignStringProperty(
|
|
278
|
-
object: Record<string | symbol, unknown>,
|
|
279
|
-
key: string,
|
|
280
|
-
value: unknown,
|
|
281
|
-
): void {
|
|
282
|
-
if (isValidKey(key)) {
|
|
283
|
-
object[key] = value;
|
|
284
|
-
} else {
|
|
285
|
-
Object.defineProperty(object, key, {
|
|
286
|
-
value,
|
|
287
|
-
configurable: true,
|
|
288
|
-
enumerable: true,
|
|
289
|
-
writable: true,
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
function assignProperty(
|
|
295
|
-
ctx: DeserializerContext,
|
|
296
|
-
depth: number,
|
|
297
|
-
object: Record<string | symbol, unknown>,
|
|
298
|
-
key: string | SerovalNode,
|
|
299
|
-
value: SerovalNode,
|
|
300
|
-
): void {
|
|
301
|
-
if (typeof key === 'string') {
|
|
302
|
-
assignStringProperty(
|
|
303
|
-
object,
|
|
304
|
-
deserializeString(key),
|
|
305
|
-
deserialize(ctx, depth, value),
|
|
306
|
-
);
|
|
307
|
-
} else {
|
|
308
|
-
const actual = deserialize(ctx, depth, key);
|
|
309
|
-
switch (typeof actual) {
|
|
310
|
-
case 'string':
|
|
311
|
-
assignStringProperty(object, actual, deserialize(ctx, depth, value));
|
|
312
|
-
break;
|
|
313
|
-
case 'symbol':
|
|
314
|
-
if (isValidSymbol(actual)) {
|
|
315
|
-
object[actual] = deserialize(ctx, depth, value);
|
|
316
|
-
}
|
|
317
|
-
break;
|
|
318
|
-
default:
|
|
319
|
-
throw new SerovalMalformedNodeError(key);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
function assignNodeType(
|
|
325
|
-
ctx: DeserializerContext,
|
|
326
|
-
id: number,
|
|
327
|
-
type: SerovalNodeType,
|
|
328
|
-
): void {
|
|
329
|
-
ctx.base.refs.types.set(id, type);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function validateNodeType(
|
|
333
|
-
ctx: DeserializerContext,
|
|
334
|
-
node: SerovalNode,
|
|
335
|
-
id: number,
|
|
336
|
-
type: SerovalNodeType,
|
|
337
|
-
): asserts id is SerovalNodeType {
|
|
338
|
-
if (ctx.base.refs.types.get(id) !== type) {
|
|
339
|
-
throw new SerovalMalformedNodeError(node);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function deserializeProperties(
|
|
344
|
-
ctx: DeserializerContext,
|
|
345
|
-
depth: number,
|
|
346
|
-
node: SerovalObjectRecordNode,
|
|
347
|
-
result: Record<string | symbol, unknown>,
|
|
348
|
-
): Record<string | symbol, unknown> {
|
|
349
|
-
const keys = node.k;
|
|
350
|
-
const len = keys.length;
|
|
351
|
-
if (len > 0) {
|
|
352
|
-
for (let i = 0, vals = node.v, len = keys.length; i < len; i++) {
|
|
353
|
-
assignProperty(ctx, depth, result, keys[i], vals[i]);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
return result;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
function deserializeObject(
|
|
360
|
-
ctx: DeserializerContext,
|
|
361
|
-
depth: number,
|
|
362
|
-
node: SerovalObjectNode | SerovalNullConstructorNode,
|
|
363
|
-
): Record<string, unknown> {
|
|
364
|
-
const result = assignIndexedValue(
|
|
365
|
-
ctx,
|
|
366
|
-
node.i,
|
|
367
|
-
(node.t === SerovalNodeType.Object ? {} : Object.create(null)) as Record<
|
|
368
|
-
string,
|
|
369
|
-
unknown
|
|
370
|
-
>,
|
|
371
|
-
);
|
|
372
|
-
deserializeProperties(ctx, depth, node.p, result);
|
|
373
|
-
applyObjectFlag(result, node.o);
|
|
374
|
-
return result;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
function deserializeDate(
|
|
378
|
-
ctx: DeserializerContext,
|
|
379
|
-
node: SerovalDateNode,
|
|
380
|
-
): Date {
|
|
381
|
-
return assignIndexedValue(ctx, node.i, new Date(node.s));
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
function deserializeRegExp(
|
|
385
|
-
ctx: DeserializerContext,
|
|
386
|
-
node: SerovalRegExpNode,
|
|
387
|
-
): RegExp {
|
|
388
|
-
if (ctx.base.features & Feature.RegExp) {
|
|
389
|
-
const source = deserializeString(node.c);
|
|
390
|
-
if (source.length > MAX_REGEXP_SOURCE_LENGTH) {
|
|
391
|
-
throw new SerovalMalformedNodeError(node);
|
|
392
|
-
}
|
|
393
|
-
return assignIndexedValue(ctx, node.i, new RegExp(source, node.m));
|
|
394
|
-
}
|
|
395
|
-
throw new SerovalUnsupportedNodeError(node);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function deserializeSet(
|
|
399
|
-
ctx: DeserializerContext,
|
|
400
|
-
depth: number,
|
|
401
|
-
node: SerovalSetNode,
|
|
402
|
-
): Set<unknown> {
|
|
403
|
-
const result = assignIndexedValue(ctx, node.i, new Set<unknown>());
|
|
404
|
-
for (let i = 0, items = node.a, len = items.length; i < len; i++) {
|
|
405
|
-
result.add(deserialize(ctx, depth, items[i]));
|
|
406
|
-
}
|
|
407
|
-
return result;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
function deserializeMap(
|
|
411
|
-
ctx: DeserializerContext,
|
|
412
|
-
depth: number,
|
|
413
|
-
node: SerovalMapNode,
|
|
414
|
-
): Map<unknown, unknown> {
|
|
415
|
-
const result = assignIndexedValue(ctx, node.i, new Map<unknown, unknown>());
|
|
416
|
-
for (
|
|
417
|
-
let i = 0, keys = node.e.k, vals = node.e.v, len = keys.length;
|
|
418
|
-
i < len;
|
|
419
|
-
i++
|
|
420
|
-
) {
|
|
421
|
-
result.set(
|
|
422
|
-
deserialize(ctx, depth, keys[i]),
|
|
423
|
-
deserialize(ctx, depth, vals[i]),
|
|
424
|
-
);
|
|
425
|
-
}
|
|
426
|
-
return result;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
function deserializeArrayBuffer(
|
|
430
|
-
ctx: DeserializerContext,
|
|
431
|
-
node: SerovalArrayBufferNode,
|
|
432
|
-
): ArrayBuffer {
|
|
433
|
-
if (node.s.length > MAX_BASE64_LENGTH) {
|
|
434
|
-
throw new SerovalMalformedNodeError(node);
|
|
435
|
-
}
|
|
436
|
-
const result = assignIndexedValue(
|
|
437
|
-
ctx,
|
|
438
|
-
node.i,
|
|
439
|
-
ARRAY_BUFFER_CONSTRUCTOR(deserializeString(node.s)),
|
|
440
|
-
);
|
|
441
|
-
return result;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
function deserializeTypedArray(
|
|
445
|
-
ctx: DeserializerContext,
|
|
446
|
-
depth: number,
|
|
447
|
-
node: SerovalTypedArrayNode | SerovalBigIntTypedArrayNode,
|
|
448
|
-
): TypedArrayValue | BigIntTypedArrayValue {
|
|
449
|
-
const construct = getTypedArrayConstructor(node.c) as Int8ArrayConstructor;
|
|
450
|
-
const source = deserialize(ctx, depth, node.f) as ArrayBuffer;
|
|
451
|
-
const offset = node.b ?? 0;
|
|
452
|
-
if (offset < 0 || offset > source.byteLength) {
|
|
453
|
-
throw new SerovalMalformedNodeError(node);
|
|
454
|
-
}
|
|
455
|
-
const result = assignIndexedValue(
|
|
456
|
-
ctx,
|
|
457
|
-
node.i,
|
|
458
|
-
new construct(source, offset, node.l),
|
|
459
|
-
);
|
|
460
|
-
return result;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
function deserializeDataView(
|
|
464
|
-
ctx: DeserializerContext,
|
|
465
|
-
depth: number,
|
|
466
|
-
node: SerovalDataViewNode,
|
|
467
|
-
): DataView {
|
|
468
|
-
const source = deserialize(ctx, depth, node.f) as ArrayBuffer;
|
|
469
|
-
const offset = node.b ?? 0;
|
|
470
|
-
if (offset < 0 || offset > source.byteLength) {
|
|
471
|
-
throw new SerovalMalformedNodeError(node);
|
|
472
|
-
}
|
|
473
|
-
const result = assignIndexedValue(
|
|
474
|
-
ctx,
|
|
475
|
-
node.i,
|
|
476
|
-
new DataView(source, offset, node.l),
|
|
477
|
-
);
|
|
478
|
-
return result;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
function deserializeDictionary<T extends AssignableValue>(
|
|
482
|
-
ctx: DeserializerContext,
|
|
483
|
-
depth: number,
|
|
484
|
-
node: AssignableNode,
|
|
485
|
-
result: T,
|
|
486
|
-
): T {
|
|
487
|
-
if (node.p) {
|
|
488
|
-
const fields = deserializeProperties(ctx, depth, node.p, {});
|
|
489
|
-
Object.defineProperties(result, Object.getOwnPropertyDescriptors(fields));
|
|
490
|
-
}
|
|
491
|
-
return result;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
function deserializeAggregateError(
|
|
495
|
-
ctx: DeserializerContext,
|
|
496
|
-
depth: number,
|
|
497
|
-
node: SerovalAggregateErrorNode,
|
|
498
|
-
): AggregateError {
|
|
499
|
-
// Serialize the required arguments
|
|
500
|
-
const result = assignIndexedValue(
|
|
501
|
-
ctx,
|
|
502
|
-
node.i,
|
|
503
|
-
new AggregateError([], deserializeString(node.m)),
|
|
504
|
-
);
|
|
505
|
-
// `AggregateError` might've been extended
|
|
506
|
-
// either through class or custom properties
|
|
507
|
-
// Make sure to assign extra properties
|
|
508
|
-
return deserializeDictionary(ctx, depth, node, result);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
function deserializeError(
|
|
512
|
-
ctx: DeserializerContext,
|
|
513
|
-
depth: number,
|
|
514
|
-
node: SerovalErrorNode,
|
|
515
|
-
): Error {
|
|
516
|
-
const construct = deserializeKnownValue(node, ERROR_CONSTRUCTOR, node.s);
|
|
517
|
-
const result = assignIndexedValue(
|
|
518
|
-
ctx,
|
|
519
|
-
node.i,
|
|
520
|
-
new construct(deserializeString(node.m)),
|
|
521
|
-
);
|
|
522
|
-
return deserializeDictionary(ctx, depth, node, result);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
function deserializePromise(
|
|
526
|
-
ctx: DeserializerContext,
|
|
527
|
-
depth: number,
|
|
528
|
-
node: SerovalPromiseNode,
|
|
529
|
-
): Promise<unknown> {
|
|
530
|
-
const deferred = PROMISE_CONSTRUCTOR();
|
|
531
|
-
const result = assignIndexedValue(ctx, node.i, deferred.p);
|
|
532
|
-
const deserialized = deserialize(ctx, depth, node.f);
|
|
533
|
-
if (node.s) {
|
|
534
|
-
deferred.s(deserialized);
|
|
535
|
-
} else {
|
|
536
|
-
deferred.f(deserialized);
|
|
537
|
-
}
|
|
538
|
-
return result;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
function deserializeBoxed(
|
|
542
|
-
ctx: DeserializerContext,
|
|
543
|
-
depth: number,
|
|
544
|
-
node: SerovalBoxedNode,
|
|
545
|
-
): unknown {
|
|
546
|
-
return assignIndexedValue(
|
|
547
|
-
ctx,
|
|
548
|
-
node.i,
|
|
549
|
-
// biome-ignore lint/style/useConsistentBuiltinInstantiation: intended
|
|
550
|
-
Object(deserialize(ctx, depth, node.f)),
|
|
551
|
-
);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
function deserializePlugin(
|
|
555
|
-
ctx: DeserializerContext,
|
|
556
|
-
depth: number,
|
|
557
|
-
node: SerovalPluginNode,
|
|
558
|
-
): unknown {
|
|
559
|
-
const currentPlugins = ctx.base.plugins;
|
|
560
|
-
if (currentPlugins) {
|
|
561
|
-
const tag = deserializeString(node.c);
|
|
562
|
-
for (let i = 0, len = currentPlugins.length; i < len; i++) {
|
|
563
|
-
const plugin = currentPlugins[i];
|
|
564
|
-
if (plugin.tag === tag) {
|
|
565
|
-
return assignIndexedValue(
|
|
566
|
-
ctx,
|
|
567
|
-
node.i,
|
|
568
|
-
plugin.deserialize(node.s, new DeserializePluginContext(ctx, depth), {
|
|
569
|
-
id: node.i,
|
|
570
|
-
}),
|
|
571
|
-
);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
throw new SerovalMissingPluginError(node.c);
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
function deserializePromiseConstructor(
|
|
579
|
-
ctx: DeserializerContext,
|
|
580
|
-
node: SerovalPromiseConstructorNode,
|
|
581
|
-
): unknown {
|
|
582
|
-
const value = assignIndexedValue(
|
|
583
|
-
ctx,
|
|
584
|
-
node.i,
|
|
585
|
-
assignIndexedValue(ctx, node.s, PROMISE_CONSTRUCTOR()).p,
|
|
586
|
-
);
|
|
587
|
-
assignNodeType(ctx, node.s, SerovalNodeType.PromiseConstructor);
|
|
588
|
-
return value;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
function deserializePromiseResolve(
|
|
592
|
-
ctx: DeserializerContext,
|
|
593
|
-
depth: number,
|
|
594
|
-
node: SerovalPromiseResolveNode,
|
|
595
|
-
): unknown {
|
|
596
|
-
const deferred = ctx.base.refs.get(node.i) as
|
|
597
|
-
| PromiseConstructorResolver
|
|
598
|
-
| undefined;
|
|
599
|
-
if (deferred) {
|
|
600
|
-
validateNodeType(ctx, node, node.i, SerovalNodeType.PromiseConstructor);
|
|
601
|
-
deferred.s(deserialize(ctx, depth, node.a[1]));
|
|
602
|
-
return NIL;
|
|
603
|
-
}
|
|
604
|
-
throw new SerovalMissingInstanceError('Promise');
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
function deserializePromiseReject(
|
|
608
|
-
ctx: DeserializerContext,
|
|
609
|
-
depth: number,
|
|
610
|
-
node: SerovalPromiseRejectNode,
|
|
611
|
-
): unknown {
|
|
612
|
-
const deferred = ctx.base.refs.get(node.i) as
|
|
613
|
-
| PromiseConstructorResolver
|
|
614
|
-
| undefined;
|
|
615
|
-
if (deferred) {
|
|
616
|
-
validateNodeType(ctx, node, node.i, SerovalNodeType.PromiseConstructor);
|
|
617
|
-
deferred.f(deserialize(ctx, depth, node.a[1]));
|
|
618
|
-
return NIL;
|
|
619
|
-
}
|
|
620
|
-
throw new SerovalMissingInstanceError('Promise');
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
function deserializeIteratorFactoryInstance(
|
|
624
|
-
ctx: DeserializerContext,
|
|
625
|
-
depth: number,
|
|
626
|
-
node: SerovalIteratorFactoryInstanceNode,
|
|
627
|
-
): unknown {
|
|
628
|
-
deserialize(ctx, depth, node.a[0]);
|
|
629
|
-
const source = deserialize(ctx, depth, node.a[1]);
|
|
630
|
-
return sequenceToIterator(source as Sequence);
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
function deserializeAsyncIteratorFactoryInstance(
|
|
634
|
-
ctx: DeserializerContext,
|
|
635
|
-
depth: number,
|
|
636
|
-
node: SerovalAsyncIteratorFactoryInstanceNode,
|
|
637
|
-
): unknown {
|
|
638
|
-
deserialize(ctx, depth, node.a[0]);
|
|
639
|
-
const source = deserialize(ctx, depth, node.a[1]);
|
|
640
|
-
return streamToAsyncIterable(source as Stream<any>);
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
function deserializeStreamConstructor(
|
|
644
|
-
ctx: DeserializerContext,
|
|
645
|
-
depth: number,
|
|
646
|
-
node: SerovalStreamConstructorNode,
|
|
647
|
-
): unknown {
|
|
648
|
-
const result = assignIndexedValue(ctx, node.i, createStream());
|
|
649
|
-
assignNodeType(ctx, node.i, SerovalNodeType.StreamConstructor);
|
|
650
|
-
const items = node.a;
|
|
651
|
-
const len = items.length;
|
|
652
|
-
if (len) {
|
|
653
|
-
for (let i = 0; i < len; i++) {
|
|
654
|
-
deserialize(ctx, depth, items[i]);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
return result;
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
function deserializeStreamNext(
|
|
661
|
-
ctx: DeserializerContext,
|
|
662
|
-
depth: number,
|
|
663
|
-
node: SerovalStreamNextNode,
|
|
664
|
-
): unknown {
|
|
665
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
666
|
-
if (deferred) {
|
|
667
|
-
validateNodeType(ctx, node, node.i, SerovalNodeType.StreamConstructor);
|
|
668
|
-
deferred.next(deserialize(ctx, depth, node.f));
|
|
669
|
-
return NIL;
|
|
670
|
-
}
|
|
671
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
function deserializeStreamThrow(
|
|
675
|
-
ctx: DeserializerContext,
|
|
676
|
-
depth: number,
|
|
677
|
-
node: SerovalStreamThrowNode,
|
|
678
|
-
): unknown {
|
|
679
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
680
|
-
if (deferred) {
|
|
681
|
-
validateNodeType(ctx, node, node.i, SerovalNodeType.StreamConstructor);
|
|
682
|
-
deferred.throw(deserialize(ctx, depth, node.f));
|
|
683
|
-
return NIL;
|
|
684
|
-
}
|
|
685
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
function deserializeStreamReturn(
|
|
689
|
-
ctx: DeserializerContext,
|
|
690
|
-
depth: number,
|
|
691
|
-
node: SerovalStreamReturnNode,
|
|
692
|
-
): unknown {
|
|
693
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
694
|
-
if (deferred) {
|
|
695
|
-
validateNodeType(ctx, node, node.i, SerovalNodeType.StreamConstructor);
|
|
696
|
-
deferred.return(deserialize(ctx, depth, node.f));
|
|
697
|
-
return NIL;
|
|
698
|
-
}
|
|
699
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
function deserializeIteratorFactory(
|
|
703
|
-
ctx: DeserializerContext,
|
|
704
|
-
depth: number,
|
|
705
|
-
node: SerovalIteratorFactoryNode,
|
|
706
|
-
): unknown {
|
|
707
|
-
deserialize(ctx, depth, node.f);
|
|
708
|
-
return NIL;
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
function deserializeAsyncIteratorFactory(
|
|
712
|
-
ctx: DeserializerContext,
|
|
713
|
-
depth: number,
|
|
714
|
-
node: SerovalAsyncIteratorFactoryNode,
|
|
715
|
-
): unknown {
|
|
716
|
-
deserialize(ctx, depth, node.a[1]);
|
|
717
|
-
return NIL;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
function deserializeSequence(
|
|
721
|
-
ctx: DeserializerContext,
|
|
722
|
-
depth: number,
|
|
723
|
-
node: SerovalSequenceNode,
|
|
724
|
-
): Sequence {
|
|
725
|
-
const result = assignIndexedValue(
|
|
726
|
-
ctx,
|
|
727
|
-
node.i,
|
|
728
|
-
createSequence([], node.s, node.l),
|
|
729
|
-
);
|
|
730
|
-
for (let i = 0, len = node.a.length; i < len; i++) {
|
|
731
|
-
result.v[i] = deserialize(ctx, depth, node.a[i]);
|
|
732
|
-
}
|
|
733
|
-
return result;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
function deserialize(
|
|
737
|
-
ctx: DeserializerContext,
|
|
738
|
-
depth: number,
|
|
739
|
-
node: SerovalNode,
|
|
740
|
-
): unknown {
|
|
741
|
-
if (depth > ctx.base.depthLimit) {
|
|
742
|
-
throw new SerovalDepthLimitError(ctx.base.depthLimit);
|
|
743
|
-
}
|
|
744
|
-
depth += 1;
|
|
745
|
-
switch (node.t) {
|
|
746
|
-
case SerovalNodeType.Constant:
|
|
747
|
-
return deserializeKnownValue(node, CONSTANT_VAL, node.s);
|
|
748
|
-
case SerovalNodeType.Number:
|
|
749
|
-
return Number(node.s);
|
|
750
|
-
case SerovalNodeType.String:
|
|
751
|
-
return deserializeString(String(node.s));
|
|
752
|
-
case SerovalNodeType.BigInt:
|
|
753
|
-
if (String(node.s).length > MAX_BIGINT_LENGTH) {
|
|
754
|
-
throw new SerovalMalformedNodeError(node);
|
|
755
|
-
}
|
|
756
|
-
return BigInt(node.s);
|
|
757
|
-
case SerovalNodeType.IndexedValue:
|
|
758
|
-
return ctx.base.refs.get(node.i);
|
|
759
|
-
case SerovalNodeType.Reference:
|
|
760
|
-
return deserializeReference(ctx, node);
|
|
761
|
-
case SerovalNodeType.Array:
|
|
762
|
-
return deserializeArray(ctx, depth, node);
|
|
763
|
-
case SerovalNodeType.Object:
|
|
764
|
-
case SerovalNodeType.NullConstructor:
|
|
765
|
-
return deserializeObject(ctx, depth, node);
|
|
766
|
-
case SerovalNodeType.Date:
|
|
767
|
-
return deserializeDate(ctx, node);
|
|
768
|
-
case SerovalNodeType.RegExp:
|
|
769
|
-
return deserializeRegExp(ctx, node);
|
|
770
|
-
case SerovalNodeType.Set:
|
|
771
|
-
return deserializeSet(ctx, depth, node);
|
|
772
|
-
case SerovalNodeType.Map:
|
|
773
|
-
return deserializeMap(ctx, depth, node);
|
|
774
|
-
case SerovalNodeType.ArrayBuffer:
|
|
775
|
-
return deserializeArrayBuffer(ctx, node);
|
|
776
|
-
case SerovalNodeType.BigIntTypedArray:
|
|
777
|
-
case SerovalNodeType.TypedArray:
|
|
778
|
-
return deserializeTypedArray(ctx, depth, node);
|
|
779
|
-
case SerovalNodeType.DataView:
|
|
780
|
-
return deserializeDataView(ctx, depth, node);
|
|
781
|
-
case SerovalNodeType.AggregateError:
|
|
782
|
-
return deserializeAggregateError(ctx, depth, node);
|
|
783
|
-
case SerovalNodeType.Error:
|
|
784
|
-
return deserializeError(ctx, depth, node);
|
|
785
|
-
case SerovalNodeType.Promise:
|
|
786
|
-
return deserializePromise(ctx, depth, node);
|
|
787
|
-
case SerovalNodeType.WKSymbol:
|
|
788
|
-
return deserializeKnownValue(node, SYMBOL_REF, node.s);
|
|
789
|
-
case SerovalNodeType.Boxed:
|
|
790
|
-
return deserializeBoxed(ctx, depth, node);
|
|
791
|
-
case SerovalNodeType.Plugin:
|
|
792
|
-
return deserializePlugin(ctx, depth, node);
|
|
793
|
-
case SerovalNodeType.PromiseConstructor:
|
|
794
|
-
return deserializePromiseConstructor(ctx, node);
|
|
795
|
-
case SerovalNodeType.PromiseSuccess:
|
|
796
|
-
return deserializePromiseResolve(ctx, depth, node);
|
|
797
|
-
case SerovalNodeType.PromiseFailure:
|
|
798
|
-
return deserializePromiseReject(ctx, depth, node);
|
|
799
|
-
case SerovalNodeType.IteratorFactoryInstance:
|
|
800
|
-
return deserializeIteratorFactoryInstance(ctx, depth, node);
|
|
801
|
-
case SerovalNodeType.AsyncIteratorFactoryInstance:
|
|
802
|
-
return deserializeAsyncIteratorFactoryInstance(ctx, depth, node);
|
|
803
|
-
case SerovalNodeType.StreamConstructor:
|
|
804
|
-
return deserializeStreamConstructor(ctx, depth, node);
|
|
805
|
-
case SerovalNodeType.StreamNext:
|
|
806
|
-
return deserializeStreamNext(ctx, depth, node);
|
|
807
|
-
case SerovalNodeType.StreamThrow:
|
|
808
|
-
return deserializeStreamThrow(ctx, depth, node);
|
|
809
|
-
case SerovalNodeType.StreamReturn:
|
|
810
|
-
return deserializeStreamReturn(ctx, depth, node);
|
|
811
|
-
case SerovalNodeType.IteratorFactory:
|
|
812
|
-
return deserializeIteratorFactory(ctx, depth, node);
|
|
813
|
-
case SerovalNodeType.AsyncIteratorFactory:
|
|
814
|
-
return deserializeAsyncIteratorFactory(ctx, depth, node);
|
|
815
|
-
// case SerovalNodeType.SpecialReference:
|
|
816
|
-
case SerovalNodeType.Sequence:
|
|
817
|
-
return deserializeSequence(ctx, depth, node);
|
|
818
|
-
default:
|
|
819
|
-
throw new SerovalUnsupportedNodeError(node);
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
export function deserializeTop(
|
|
824
|
-
ctx: DeserializerContext,
|
|
825
|
-
node: SerovalNode,
|
|
826
|
-
): unknown {
|
|
827
|
-
try {
|
|
828
|
-
return deserialize(ctx, 0, node);
|
|
829
|
-
} catch (error) {
|
|
830
|
-
throw new SerovalDeserializationError(error);
|
|
831
|
-
}
|
|
832
|
-
}
|