seroval 0.6.0 → 0.8.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 (45) hide show
  1. package/README.md +15 -3
  2. package/dist/cjs/development/index.cjs +1431 -991
  3. package/dist/cjs/development/index.cjs.map +4 -4
  4. package/dist/cjs/production/index.cjs +3 -3
  5. package/dist/esm/development/index.mjs +1431 -991
  6. package/dist/esm/development/index.mjs.map +4 -4
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/assert.d.ts +1 -1
  9. package/dist/types/compat.d.ts +1 -1
  10. package/dist/types/context.d.ts +13 -7
  11. package/dist/types/index.d.ts +3 -4
  12. package/dist/types/string.d.ts +3 -0
  13. package/dist/types/tree/UnsupportedTypeError.d.ts +3 -0
  14. package/dist/types/tree/async.d.ts +3 -3
  15. package/dist/types/tree/constants.d.ts +11 -0
  16. package/dist/types/tree/deserialize.d.ts +2 -2
  17. package/dist/types/tree/primitives.d.ts +11 -14
  18. package/dist/types/tree/serialize.d.ts +2 -2
  19. package/dist/types/tree/shared.d.ts +10 -8
  20. package/dist/types/tree/sync.d.ts +3 -3
  21. package/dist/types/tree/types.d.ts +106 -70
  22. package/dist/types/tree/web-api.d.ts +4 -2
  23. package/dist/types/types.d.ts +4 -4
  24. package/package.json +11 -8
  25. package/src/assert.ts +2 -2
  26. package/src/compat.ts +1 -2
  27. package/src/context.ts +24 -13
  28. package/src/get-identifier.ts +1 -1
  29. package/src/index.ts +35 -26
  30. package/src/string.ts +53 -0
  31. package/src/tree/UnsupportedTypeError.ts +8 -0
  32. package/src/tree/async.ts +313 -222
  33. package/src/tree/constants.ts +72 -0
  34. package/src/tree/deserialize.ts +239 -119
  35. package/src/tree/primitives.ts +154 -143
  36. package/src/tree/reference.ts +4 -3
  37. package/src/tree/serialize.ts +394 -170
  38. package/src/tree/shared.ts +31 -22
  39. package/src/tree/symbols.ts +13 -13
  40. package/src/tree/sync.ts +288 -191
  41. package/src/tree/types.ts +173 -91
  42. package/src/tree/web-api.ts +59 -6
  43. package/src/types.ts +7 -3
  44. package/dist/types/quote.d.ts +0 -2
  45. package/src/quote.ts +0 -56
@@ -0,0 +1,72 @@
1
+ import type { SerovalConstantNode } from './types';
2
+ import { SerovalConstant, SerovalNodeType } from './types';
3
+
4
+ function createConstantNode(value: SerovalConstant): SerovalConstantNode {
5
+ return {
6
+ t: SerovalNodeType.Constant,
7
+ i: undefined,
8
+ s: value,
9
+ l: undefined,
10
+ c: undefined,
11
+ m: undefined,
12
+ d: undefined,
13
+ a: undefined,
14
+ f: undefined,
15
+ b: undefined,
16
+ };
17
+ }
18
+
19
+ export const TRUE_NODE = createConstantNode(SerovalConstant.True);
20
+ export const FALSE_NODE = createConstantNode(SerovalConstant.False);
21
+ export const UNDEFINED_NODE = createConstantNode(SerovalConstant.Undefined);
22
+ export const NULL_NODE = createConstantNode(SerovalConstant.Null);
23
+ export const NEG_ZERO_NODE = createConstantNode(SerovalConstant.NegativeZero);
24
+ export const INFINITY_NODE = createConstantNode(SerovalConstant.Infinity);
25
+ export const NEG_INFINITY_NODE = createConstantNode(SerovalConstant.NegativeInfinity);
26
+ export const NAN_NODE = createConstantNode(SerovalConstant.NaN);
27
+
28
+ export function serializeConstant(node: SerovalConstantNode): string {
29
+ switch (node.s) {
30
+ case SerovalConstant.True:
31
+ return '!0';
32
+ case SerovalConstant.False:
33
+ return '!1';
34
+ case SerovalConstant.Undefined:
35
+ return 'void 0';
36
+ case SerovalConstant.Null:
37
+ return 'null';
38
+ case SerovalConstant.NegativeZero:
39
+ return '-0';
40
+ case SerovalConstant.Infinity:
41
+ return '1/0';
42
+ case SerovalConstant.NegativeInfinity:
43
+ return '-1/0';
44
+ case SerovalConstant.NaN:
45
+ return 'NaN';
46
+ default:
47
+ throw new Error('invariant');
48
+ }
49
+ }
50
+
51
+ export function deserializeConstant(node: SerovalConstantNode): unknown {
52
+ switch (node.s) {
53
+ case SerovalConstant.True:
54
+ return true;
55
+ case SerovalConstant.False:
56
+ return false;
57
+ case SerovalConstant.Undefined:
58
+ return undefined;
59
+ case SerovalConstant.Null:
60
+ return null;
61
+ case SerovalConstant.NegativeZero:
62
+ return -0;
63
+ case SerovalConstant.Infinity:
64
+ return Infinity;
65
+ case SerovalConstant.NegativeInfinity:
66
+ return -Infinity;
67
+ case SerovalConstant.NaN:
68
+ return NaN;
69
+ default:
70
+ throw new Error('invariant');
71
+ }
72
+ }
@@ -1,153 +1,163 @@
1
+ /* eslint-disable prefer-spread */
1
2
  /* eslint-disable @typescript-eslint/no-use-before-define */
2
- import {
3
+ import type {
3
4
  SerializationContext,
4
5
  } from '../context';
5
- import { invQuote } from '../quote';
6
- import { AsyncServerValue } from '../types';
6
+ import { deserializeString } from '../string';
7
+ import type { BigIntTypedArrayValue, TypedArrayValue } from '../types';
8
+ import { deserializeConstant } from './constants';
7
9
  import { getReference } from './reference';
8
10
  import { getErrorConstructor, getTypedArrayConstructor } from './shared';
9
11
  import { SYMBOL_REF } from './symbols';
10
- import {
12
+ import type {
11
13
  SerovalAggregateErrorNode,
14
+ SerovalArrayBufferNode,
12
15
  SerovalArrayNode,
13
16
  SerovalBigIntTypedArrayNode,
17
+ SerovalBlobNode,
18
+ SerovalBoxedNode,
19
+ SerovalDataViewNode,
20
+ SerovalDateNode,
14
21
  SerovalErrorNode,
15
- SerovalIterableNode,
22
+ SerovalFileNode,
23
+ SerovalFormDataNode,
24
+ SerovalHeadersNode,
16
25
  SerovalMapNode,
17
26
  SerovalNode,
18
- SerovalNodeType,
19
27
  SerovalNullConstructorNode,
20
28
  SerovalObjectNode,
29
+ SerovalObjectRecordKey,
21
30
  SerovalObjectRecordNode,
22
31
  SerovalPromiseNode,
32
+ SerovalReferenceNode,
33
+ SerovalRegExpNode,
23
34
  SerovalSetNode,
24
35
  SerovalTypedArrayNode,
36
+ SerovalURLNode,
37
+ SerovalURLSearchParamsNode,
38
+ } from './types';
39
+ import {
40
+ SerovalNodeType,
41
+ SerovalObjectRecordSpecialKey,
25
42
  } from './types';
26
43
 
27
44
  function assignIndexedValue<T>(
28
45
  ctx: SerializationContext,
29
46
  index: number,
30
47
  value: T,
31
- ) {
32
- ctx.valueMap.set(index, value);
33
- return value;
34
- }
35
-
36
- function deserializeNodeList(
37
- ctx: SerializationContext,
38
- node: SerovalArrayNode | SerovalIterableNode | SerovalAggregateErrorNode,
39
- result: unknown[],
40
- ) {
41
- let item: SerovalNode;
42
- for (let i = 0, len = node.a.length; i < len; i++) {
43
- item = node.a[i];
44
- if (item) {
45
- result[i] = deserializeTree(ctx, item);
46
- }
48
+ ): T {
49
+ if (ctx.markedRefs.has(index)) {
50
+ ctx.valueMap.set(index, value);
47
51
  }
48
- return result;
52
+ return value;
49
53
  }
50
54
 
51
55
  function deserializeArray(
52
56
  ctx: SerializationContext,
53
57
  node: SerovalArrayNode,
54
- ) {
55
- const result: AsyncServerValue[] = assignIndexedValue(
58
+ ): unknown[] {
59
+ const len = node.l;
60
+ const result: unknown[] = assignIndexedValue(
56
61
  ctx,
57
62
  node.i,
58
- new Array<AsyncServerValue>(node.l),
63
+ new Array<unknown>(len),
59
64
  );
60
- ctx.stack.push(node.i);
61
- deserializeNodeList(ctx, node, result);
62
- ctx.stack.pop();
65
+ let item: SerovalNode | undefined;
66
+ for (let i = 0; i < len; i++) {
67
+ item = node.a[i];
68
+ if (item) {
69
+ result[i] = deserializeTree(ctx, item);
70
+ }
71
+ }
63
72
  return result;
64
73
  }
65
74
 
66
75
  function deserializeProperties(
67
76
  ctx: SerializationContext,
68
77
  node: SerovalObjectRecordNode,
69
- result: Record<string, unknown>,
70
- ) {
71
- if (node.s === 0) {
72
- return {};
73
- }
74
- for (let i = 0; i < node.s; i++) {
75
- result[node.k[i]] = deserializeTree(ctx, node.v[i]);
78
+ result: Record<string | symbol, unknown>,
79
+ ): Record<string | symbol, unknown> {
80
+ const len = node.s;
81
+ if (len) {
82
+ let key: SerovalObjectRecordKey;
83
+ let value: unknown;
84
+ const keys = node.k;
85
+ const vals = node.v;
86
+ for (let i = 0; i < len; i++) {
87
+ key = keys[i];
88
+ value = deserializeTree(ctx, vals[i]);
89
+ switch (key) {
90
+ case SerovalObjectRecordSpecialKey.SymbolIterator: {
91
+ const current = value as unknown[];
92
+ result[Symbol.iterator] = (): IterableIterator<unknown> => current.values();
93
+ }
94
+ break;
95
+ default:
96
+ result[deserializeString(key)] = value;
97
+ break;
98
+ }
99
+ }
76
100
  }
77
101
  return result;
78
102
  }
79
103
 
80
- function deserializeNullConstructor(
104
+ function deserializeObject(
81
105
  ctx: SerializationContext,
82
- node: SerovalNullConstructorNode,
83
- ) {
106
+ node: SerovalObjectNode | SerovalNullConstructorNode,
107
+ ): Record<string, unknown> {
84
108
  const result = assignIndexedValue(
85
109
  ctx,
86
110
  node.i,
87
- Object.create(null) as Record<string, AsyncServerValue>,
111
+ (node.t === SerovalNodeType.Object
112
+ ? {}
113
+ : Object.create(null)) as Record<string, unknown>,
88
114
  );
89
- ctx.stack.push(node.i);
90
115
  deserializeProperties(ctx, node.d, result);
91
- ctx.stack.pop();
92
- return result;
93
- }
94
-
95
- function deserializeObject(
96
- ctx: SerializationContext,
97
- node: SerovalObjectNode,
98
- ) {
99
- const result = assignIndexedValue(ctx, node.i, {} as Record<string, AsyncServerValue>);
100
- ctx.stack.push(node.i);
101
- deserializeProperties(ctx, node.d, result);
102
- ctx.stack.pop();
103
116
  return result;
104
117
  }
105
118
 
106
119
  function deserializeSet(
107
120
  ctx: SerializationContext,
108
121
  node: SerovalSetNode,
109
- ) {
122
+ ): Set<unknown> {
110
123
  const result = assignIndexedValue(ctx, node.i, new Set<unknown>());
111
- ctx.stack.push(node.i);
112
- for (let i = 0, len = node.a.length; i < len; i++) {
113
- result.add(deserializeTree(ctx, node.a[i]));
124
+ const items = node.a;
125
+ for (let i = 0, len = node.l; i < len; i++) {
126
+ result.add(deserializeTree(ctx, items[i]));
114
127
  }
115
- ctx.stack.pop();
116
128
  return result;
117
129
  }
118
130
 
119
131
  function deserializeMap(
120
132
  ctx: SerializationContext,
121
133
  node: SerovalMapNode,
122
- ) {
134
+ ): Map<unknown, unknown> {
123
135
  const result = assignIndexedValue(
124
136
  ctx,
125
137
  node.i,
126
138
  new Map<unknown, unknown>(),
127
139
  );
128
- ctx.stack.push(node.i);
129
- for (let i = 0; i < node.d.s; i++) {
140
+ const keys = node.d.k;
141
+ const vals = node.d.v;
142
+ for (let i = 0, len = node.d.s; i < len; i++) {
130
143
  result.set(
131
- deserializeTree(ctx, node.d.k[i]),
132
- deserializeTree(ctx, node.d.v[i]),
144
+ deserializeTree(ctx, keys[i]),
145
+ deserializeTree(ctx, vals[i]),
133
146
  );
134
147
  }
135
- ctx.stack.pop();
136
148
  return result;
137
149
  }
138
150
 
139
- type AssignableValue = AggregateError | Error | Iterable<AsyncServerValue>
140
- type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode | SerovalIterableNode;
151
+ type AssignableValue = AggregateError | Error | Iterable<unknown>
152
+ type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode;
141
153
 
142
154
  function deserializeDictionary<T extends AssignableValue>(
143
155
  ctx: SerializationContext,
144
156
  node: AssignableNode,
145
157
  result: T,
146
- ) {
158
+ ): T {
147
159
  if (node.d) {
148
- ctx.stack.push(node.i);
149
160
  const fields = deserializeProperties(ctx, node.d, {});
150
- ctx.stack.pop();
151
161
  Object.assign(result, fields);
152
162
  }
153
163
  return result;
@@ -156,12 +166,13 @@ function deserializeDictionary<T extends AssignableValue>(
156
166
  function deserializeAggregateError(
157
167
  ctx: SerializationContext,
158
168
  node: SerovalAggregateErrorNode,
159
- ) {
169
+ ): AggregateError {
160
170
  // Serialize the required arguments
161
- const result = assignIndexedValue(ctx, node.i, new AggregateError([], invQuote(node.m)));
162
- ctx.stack.push(node.i);
163
- result.errors = deserializeNodeList(ctx, node, new Array<AsyncServerValue>(node.l));
164
- ctx.stack.pop();
171
+ const result = assignIndexedValue(
172
+ ctx,
173
+ node.i,
174
+ new AggregateError([], deserializeString(node.m)),
175
+ );
165
176
  // `AggregateError` might've been extended
166
177
  // either through class or custom properties
167
178
  // Make sure to assign extra properties
@@ -171,9 +182,9 @@ function deserializeAggregateError(
171
182
  function deserializeError(
172
183
  ctx: SerializationContext,
173
184
  node: SerovalErrorNode,
174
- ) {
185
+ ): Error {
175
186
  const ErrorConstructor = getErrorConstructor(node.c);
176
- const result = assignIndexedValue(ctx, node.i, new ErrorConstructor(invQuote(node.m)));
187
+ const result = assignIndexedValue(ctx, node.i, new ErrorConstructor(deserializeString(node.m)));
177
188
  return deserializeDictionary(ctx, node, result);
178
189
  }
179
190
 
@@ -185,7 +196,7 @@ interface Deferred {
185
196
  function createDeferred(): Deferred {
186
197
  let resolver: Deferred['resolve'];
187
198
  return {
188
- resolve(v) {
199
+ resolve(v): void {
189
200
  resolver(v);
190
201
  },
191
202
  promise: new Promise((res) => {
@@ -194,44 +205,153 @@ function createDeferred(): Deferred {
194
205
  };
195
206
  }
196
207
 
197
- function deserializePromise(
208
+ async function deserializePromise(
198
209
  ctx: SerializationContext,
199
210
  node: SerovalPromiseNode,
200
- ) {
211
+ ): Promise<unknown> {
201
212
  const deferred = createDeferred();
202
213
  const result = assignIndexedValue(ctx, node.i, deferred.promise);
203
214
  deferred.resolve(deserializeTree(ctx, node.f));
204
215
  return result;
205
216
  }
206
217
 
218
+ function deserializeArrayBuffer(
219
+ ctx: SerializationContext,
220
+ node: SerovalArrayBufferNode,
221
+ ): ArrayBuffer {
222
+ const bytes = new Uint8Array(node.s);
223
+ const result = assignIndexedValue(ctx, node.i, bytes.buffer);
224
+ return result;
225
+ }
226
+
207
227
  function deserializeTypedArray(
208
228
  ctx: SerializationContext,
209
229
  node: SerovalTypedArrayNode | SerovalBigIntTypedArrayNode,
210
- ) {
230
+ ): TypedArrayValue | BigIntTypedArrayValue {
211
231
  const TypedArray = getTypedArrayConstructor(node.c);
212
- const dummy = new TypedArray();
232
+ const source = deserializeTree(ctx, node.f) as ArrayBuffer;
213
233
  const result = assignIndexedValue(ctx, node.i, new TypedArray(
214
- dummy.buffer,
234
+ source,
235
+ node.b,
236
+ node.l,
237
+ ));
238
+ return result;
239
+ }
240
+
241
+ function deserializeDate(
242
+ ctx: SerializationContext,
243
+ node: SerovalDateNode,
244
+ ): Date {
245
+ return assignIndexedValue(ctx, node.i, new Date(node.s));
246
+ }
247
+
248
+ function deserializeRegExp(
249
+ ctx: SerializationContext,
250
+ node: SerovalRegExpNode,
251
+ ): RegExp {
252
+ return assignIndexedValue(ctx, node.i, new RegExp(node.c, node.m));
253
+ }
254
+
255
+ function deserializeURL(
256
+ ctx: SerializationContext,
257
+ node: SerovalURLNode,
258
+ ): URL {
259
+ return assignIndexedValue(ctx, node.i, new URL(deserializeString(node.s)));
260
+ }
261
+
262
+ function deserializeURLSearchParams(
263
+ ctx: SerializationContext,
264
+ node: SerovalURLSearchParamsNode,
265
+ ): URLSearchParams {
266
+ return assignIndexedValue(ctx, node.i, new URLSearchParams(deserializeString(node.s)));
267
+ }
268
+
269
+ function deserializeReference(
270
+ ctx: SerializationContext,
271
+ node: SerovalReferenceNode,
272
+ ): unknown {
273
+ return assignIndexedValue(ctx, node.i, getReference(deserializeString(node.s)));
274
+ }
275
+
276
+ function deserializeDataView(
277
+ ctx: SerializationContext,
278
+ node: SerovalDataViewNode,
279
+ ): DataView {
280
+ const source = deserializeTree(ctx, node.f) as ArrayBuffer;
281
+ const result = assignIndexedValue(ctx, node.i, new DataView(
282
+ source,
283
+ node.b,
215
284
  node.l,
216
285
  ));
217
- for (let i = 0, len = node.s.length; i < len; i++) {
218
- result[i] = node.t === SerovalNodeType.BigIntTypedArray
219
- ? BigInt(node.s[i])
220
- : Number(node.s[i]);
286
+ return result;
287
+ }
288
+
289
+ function deserializeBlob(
290
+ ctx: SerializationContext,
291
+ node: SerovalBlobNode,
292
+ ): Blob {
293
+ const source = deserializeTree(ctx, node.f) as ArrayBuffer;
294
+ const result = assignIndexedValue(ctx, node.i, new Blob(
295
+ [source],
296
+ { type: deserializeString(node.c) },
297
+ ));
298
+ return result;
299
+ }
300
+
301
+ function deserializeFile(
302
+ ctx: SerializationContext,
303
+ node: SerovalFileNode,
304
+ ): File {
305
+ const source = deserializeTree(ctx, node.f) as ArrayBuffer;
306
+ const result = assignIndexedValue(ctx, node.i, new File(
307
+ [source],
308
+ deserializeString(node.m),
309
+ { type: deserializeString(node.c), lastModified: node.b },
310
+ ));
311
+ return result;
312
+ }
313
+
314
+ function deserializeHeaders(
315
+ ctx: SerializationContext,
316
+ node: SerovalHeadersNode,
317
+ ): Headers {
318
+ const result = assignIndexedValue(ctx, node.i, new Headers());
319
+ const keys = node.d.k;
320
+ const vals = node.d.v;
321
+ for (let i = 0, len = node.d.s; i < len; i++) {
322
+ result.set(
323
+ deserializeString(keys[i]),
324
+ deserializeTree(ctx, vals[i]) as string,
325
+ );
221
326
  }
222
327
  return result;
223
328
  }
224
329
 
225
- function deserializeIterable(
330
+ function deserializeFormData(
226
331
  ctx: SerializationContext,
227
- node: SerovalIterableNode,
228
- ) {
229
- const values: AsyncServerValue[] = [];
230
- deserializeNodeList(ctx, node, values);
231
- const result = assignIndexedValue(ctx, node.i, {
232
- [Symbol.iterator]: () => values.values(),
233
- });
234
- return deserializeDictionary(ctx, node, result);
332
+ node: SerovalFormDataNode,
333
+ ): FormData {
334
+ const result = assignIndexedValue(ctx, node.i, new FormData());
335
+ const keys = node.d.k;
336
+ const vals = node.d.v;
337
+ for (let i = 0, len = node.d.s; i < len; i++) {
338
+ result.set(
339
+ deserializeString(keys[i]),
340
+ deserializeTree(ctx, vals[i]) as FormDataEntryValue,
341
+ );
342
+ }
343
+ return result;
344
+ }
345
+
346
+ function deserializeBoxed(
347
+ ctx: SerializationContext,
348
+ node: SerovalBoxedNode,
349
+ ): unknown {
350
+ return assignIndexedValue(
351
+ ctx,
352
+ node.i,
353
+ Object(deserializeTree(ctx, node.f)),
354
+ );
235
355
  }
236
356
 
237
357
  export default function deserializeTree(
@@ -239,23 +359,12 @@ export default function deserializeTree(
239
359
  node: SerovalNode,
240
360
  ): unknown {
241
361
  switch (node.t) {
362
+ case SerovalNodeType.Constant:
363
+ return deserializeConstant(node);
242
364
  case SerovalNodeType.Number:
243
- case SerovalNodeType.Boolean:
244
365
  return node.s;
245
366
  case SerovalNodeType.String:
246
- return invQuote(node.s);
247
- case SerovalNodeType.Undefined:
248
- return undefined;
249
- case SerovalNodeType.Null:
250
- return null;
251
- case SerovalNodeType.NegativeZero:
252
- return -0;
253
- case SerovalNodeType.Infinity:
254
- return Infinity;
255
- case SerovalNodeType.NegativeInfinity:
256
- return -Infinity;
257
- case SerovalNodeType.NaN:
258
- return NaN;
367
+ return deserializeString(node.s);
259
368
  case SerovalNodeType.BigInt:
260
369
  return BigInt(node.s);
261
370
  case SerovalNodeType.IndexedValue:
@@ -263,37 +372,48 @@ export default function deserializeTree(
263
372
  case SerovalNodeType.Array:
264
373
  return deserializeArray(ctx, node);
265
374
  case SerovalNodeType.Object:
266
- return deserializeObject(ctx, node);
267
375
  case SerovalNodeType.NullConstructor:
268
- return deserializeNullConstructor(ctx, node);
376
+ return deserializeObject(ctx, node);
269
377
  case SerovalNodeType.Date:
270
- return assignIndexedValue(ctx, node.i, new Date(node.s));
378
+ return deserializeDate(ctx, node);
271
379
  case SerovalNodeType.RegExp:
272
- return assignIndexedValue(ctx, node.i, new RegExp(node.c, node.m));
380
+ return deserializeRegExp(ctx, node);
273
381
  case SerovalNodeType.Set:
274
382
  return deserializeSet(ctx, node);
275
383
  case SerovalNodeType.Map:
276
384
  return deserializeMap(ctx, node);
385
+ case SerovalNodeType.ArrayBuffer:
386
+ return deserializeArrayBuffer(ctx, node);
277
387
  case SerovalNodeType.BigIntTypedArray:
278
388
  case SerovalNodeType.TypedArray:
279
389
  return deserializeTypedArray(ctx, node);
390
+ case SerovalNodeType.DataView:
391
+ return deserializeDataView(ctx, node);
280
392
  case SerovalNodeType.AggregateError:
281
393
  return deserializeAggregateError(ctx, node);
282
394
  case SerovalNodeType.Error:
283
395
  return deserializeError(ctx, node);
284
- case SerovalNodeType.Iterable:
285
- return deserializeIterable(ctx, node);
286
396
  case SerovalNodeType.Promise:
287
397
  return deserializePromise(ctx, node);
288
398
  case SerovalNodeType.WKSymbol:
289
399
  return SYMBOL_REF[node.s];
290
400
  case SerovalNodeType.URL:
291
- return assignIndexedValue(ctx, node.i, new URL(node.s));
401
+ return deserializeURL(ctx, node);
292
402
  case SerovalNodeType.URLSearchParams:
293
- return assignIndexedValue(ctx, node.i, new URLSearchParams(node.s));
403
+ return deserializeURLSearchParams(ctx, node);
294
404
  case SerovalNodeType.Reference:
295
- return assignIndexedValue(ctx, node.i, getReference(invQuote(node.s)));
405
+ return deserializeReference(ctx, node);
406
+ case SerovalNodeType.Blob:
407
+ return deserializeBlob(ctx, node);
408
+ case SerovalNodeType.File:
409
+ return deserializeFile(ctx, node);
410
+ case SerovalNodeType.Headers:
411
+ return deserializeHeaders(ctx, node);
412
+ case SerovalNodeType.FormData:
413
+ return deserializeFormData(ctx, node);
414
+ case SerovalNodeType.Boxed:
415
+ return deserializeBoxed(ctx, node);
296
416
  default:
297
- throw new Error('Unsupported type');
417
+ throw new Error('invariant');
298
418
  }
299
419
  }