seroval 0.8.0 → 0.10.1

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 (91) hide show
  1. package/README.md +4 -287
  2. package/dist/cjs/development/index.cjs +3858 -1385
  3. package/dist/cjs/development/index.cjs.map +4 -4
  4. package/dist/cjs/production/index.cjs +12 -3
  5. package/dist/esm/development/index.mjs +3611 -1136
  6. package/dist/esm/development/index.mjs.map +4 -4
  7. package/dist/esm/production/index.mjs +12 -3
  8. package/dist/types/core/Serializer.d.ts +14 -0
  9. package/dist/types/{tree → core}/UnsupportedTypeError.d.ts +4 -3
  10. package/dist/types/{assert.d.ts → core/assert.d.ts} +1 -1
  11. package/dist/types/core/assignments.d.ts +33 -0
  12. package/dist/types/core/base-primitives.d.ts +12 -0
  13. package/dist/types/{compat.d.ts → core/compat.d.ts} +22 -22
  14. package/dist/types/core/constants.d.ts +89 -0
  15. package/dist/types/core/context.d.ts +9 -0
  16. package/dist/types/core/cross/async.d.ts +3 -0
  17. package/dist/types/core/cross/context.d.ts +30 -0
  18. package/dist/types/core/cross/index.d.ts +7 -0
  19. package/dist/types/core/cross/primitives.d.ts +9 -0
  20. package/dist/types/core/cross/serialize.d.ts +5 -0
  21. package/dist/types/core/cross/stream.d.ts +3 -0
  22. package/dist/types/core/cross/sync.d.ts +3 -0
  23. package/dist/types/core/cross/web-api.d.ts +4 -0
  24. package/dist/types/{get-identifier.d.ts → core/get-identifier.d.ts} +1 -1
  25. package/dist/types/core/keys.d.ts +12 -0
  26. package/dist/types/{tree/constants.d.ts → core/literals.d.ts} +9 -11
  27. package/dist/types/core/promise-to-result.d.ts +1 -0
  28. package/dist/types/{tree → core}/reference.d.ts +5 -6
  29. package/dist/types/{tree → core}/shared.d.ts +13 -11
  30. package/dist/types/{string.d.ts → core/string.d.ts} +3 -3
  31. package/dist/types/core/tree/async.d.ts +3 -0
  32. package/dist/types/core/tree/context.d.ts +45 -0
  33. package/dist/types/core/tree/deserialize.d.ts +3 -0
  34. package/dist/types/core/tree/index.d.ts +15 -0
  35. package/dist/types/core/tree/primitives.d.ts +9 -0
  36. package/dist/types/core/tree/serialize.d.ts +4 -0
  37. package/dist/types/core/tree/sync.d.ts +3 -0
  38. package/dist/types/core/tree/web-api.d.ts +4 -0
  39. package/dist/types/{tree → core}/types.d.ts +228 -228
  40. package/dist/types/core/web-api.d.ts +4 -0
  41. package/dist/types/index.d.ts +9 -19
  42. package/dist/types/types.d.ts +20 -20
  43. package/package.json +7 -7
  44. package/src/core/Serializer.ts +46 -0
  45. package/src/{tree → core}/UnsupportedTypeError.ts +1 -1
  46. package/src/core/assignments.ts +159 -0
  47. package/src/{tree/primitives.ts → core/base-primitives.ts} +42 -133
  48. package/src/core/constants.ts +169 -0
  49. package/src/core/context.ts +15 -0
  50. package/src/core/cross/async.ts +614 -0
  51. package/src/core/cross/context.ts +79 -0
  52. package/src/core/cross/index.ts +154 -0
  53. package/src/core/cross/primitives.ts +137 -0
  54. package/src/core/cross/serialize.ts +846 -0
  55. package/src/core/cross/stream.ts +740 -0
  56. package/src/core/cross/sync.ts +561 -0
  57. package/src/core/cross/web-api.ts +55 -0
  58. package/src/core/header.js +65 -0
  59. package/src/core/keys.ts +33 -0
  60. package/src/core/literals.ts +28 -0
  61. package/src/core/promise-to-result.ts +9 -0
  62. package/src/{tree → core}/reference.ts +6 -8
  63. package/src/{tree → core}/shared.ts +17 -3
  64. package/src/{tree → core/tree}/async.ts +57 -34
  65. package/src/core/tree/context.ts +136 -0
  66. package/src/{tree → core/tree}/deserialize.ts +83 -54
  67. package/src/core/tree/index.ts +146 -0
  68. package/src/core/tree/primitives.ts +132 -0
  69. package/src/{tree → core/tree}/serialize.ts +124 -178
  70. package/src/{tree → core/tree}/sync.ts +60 -39
  71. package/src/{tree → core/tree}/web-api.ts +10 -50
  72. package/src/{tree → core}/types.ts +82 -54
  73. package/src/core/web-api.ts +51 -0
  74. package/src/index.ts +7 -141
  75. package/src/types.ts +1 -1
  76. package/dist/types/context.d.ts +0 -61
  77. package/dist/types/tree/async.d.ts +0 -3
  78. package/dist/types/tree/deserialize.d.ts +0 -3
  79. package/dist/types/tree/primitives.d.ts +0 -19
  80. package/dist/types/tree/serialize.d.ts +0 -4
  81. package/dist/types/tree/symbols.d.ts +0 -33
  82. package/dist/types/tree/sync.d.ts +0 -3
  83. package/dist/types/tree/web-api.d.ts +0 -6
  84. package/src/context.ts +0 -154
  85. package/src/tree/constants.ts +0 -72
  86. package/src/tree/iterator.ts +0 -14
  87. package/src/tree/symbols.ts +0 -65
  88. /package/src/{assert.ts → core/assert.ts} +0 -0
  89. /package/src/{compat.ts → core/compat.ts} +0 -0
  90. /package/src/{get-identifier.ts → core/get-identifier.ts} +0 -0
  91. /package/src/{string.ts → core/string.ts} +0 -0
@@ -1,40 +1,33 @@
1
1
  /* eslint-disable @typescript-eslint/no-use-before-define */
2
2
  import assert from '../assert';
3
3
  import { Feature } from '../compat';
4
- import type { ParserContext } from '../context';
5
- import { createIndexedValue } from '../context';
4
+ import type { ParserContext } from './context';
5
+ import { createIndexedValue } from './context';
6
6
  import { serializeString } from '../string';
7
- import type { BigIntTypedArrayValue, TypedArrayValue } from '../types';
8
- import UnsupportedTypeError from './UnsupportedTypeError';
7
+ import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types';
8
+ import UnsupportedTypeError from '../UnsupportedTypeError';
9
9
  import {
10
10
  TRUE_NODE,
11
11
  FALSE_NODE,
12
12
  UNDEFINED_NODE,
13
13
  NULL_NODE,
14
- } from './constants';
14
+ } from '../literals';
15
15
  import {
16
- createBigIntNode,
17
16
  createBigIntTypedArrayNode,
18
- createDateNode,
19
- createNumberNode,
20
- createIndexedValueNode,
21
- createRegExpNode,
22
- createStringNode,
23
17
  createTypedArrayNode,
24
- createReferenceNode,
25
- createArrayBufferNode,
26
18
  createDataViewNode,
27
19
  createSymbolNode,
28
20
  createFunctionNode,
29
21
  } from './primitives';
30
22
  import {
31
23
  hasReferenceID,
32
- } from './reference';
24
+ } from '../reference';
33
25
  import {
34
26
  getErrorConstructorName,
35
27
  getErrorOptions,
28
+ getObjectFlag,
36
29
  isIterable,
37
- } from './shared';
30
+ } from '../shared';
38
31
  import type {
39
32
  SerovalAggregateErrorNode,
40
33
  SerovalArrayNode,
@@ -43,25 +36,35 @@ import type {
43
36
  SerovalFormDataNode,
44
37
  SerovalHeadersNode,
45
38
  SerovalMapNode,
46
- SerovalNode,
47
39
  SerovalNullConstructorNode,
48
40
  SerovalObjectNode,
49
41
  SerovalObjectRecordKey,
50
42
  SerovalObjectRecordNode,
51
43
  SerovalPlainRecordNode,
52
44
  SerovalSetNode,
53
- } from './types';
45
+ SerovalSyncNode,
46
+ } from '../types';
54
47
  import {
55
- SerovalNodeType,
56
48
  SerovalObjectRecordSpecialKey,
57
- } from './types';
58
- import { createURLNode, createURLSearchParamsNode } from './web-api';
49
+ } from '../types';
50
+ import { SerovalNodeType } from '../constants';
51
+ import {
52
+ createArrayBufferNode,
53
+ createBigIntNode,
54
+ createDateNode,
55
+ createIndexedValueNode,
56
+ createNumberNode,
57
+ createReferenceNode,
58
+ createRegExpNode,
59
+ createStringNode,
60
+ } from '../base-primitives';
61
+ import { createURLNode, createURLSearchParamsNode } from '../web-api';
59
62
 
60
63
  type ObjectLikeNode = SerovalObjectNode | SerovalNullConstructorNode;
61
64
 
62
- function generateNodeList(ctx: ParserContext, current: unknown[]): SerovalNode[] {
65
+ function generateNodeList(ctx: ParserContext, current: unknown[]): SerovalSyncNode[] {
63
66
  const size = current.length;
64
- const nodes = new Array<SerovalNode>(size);
67
+ const nodes = new Array<SerovalSyncNode>(size);
65
68
  const deferred = new Array<unknown>(size);
66
69
  let item: unknown;
67
70
  for (let i = 0; i < size; i++) {
@@ -94,10 +97,12 @@ function generateArrayNode(
94
97
  l: current.length,
95
98
  c: undefined,
96
99
  m: undefined,
97
- d: undefined,
100
+ p: undefined,
101
+ e: undefined,
98
102
  a: generateNodeList(ctx, current),
99
103
  f: undefined,
100
104
  b: undefined,
105
+ o: getObjectFlag(current),
101
106
  };
102
107
  }
103
108
 
@@ -108,8 +113,8 @@ function generateMapNode(
108
113
  ): SerovalMapNode {
109
114
  assert(ctx.features & Feature.Map, new UnsupportedTypeError(current));
110
115
  const len = current.size;
111
- const keyNodes = new Array<SerovalNode>(len);
112
- const valueNodes = new Array<SerovalNode>(len);
116
+ const keyNodes = new Array<SerovalSyncNode>(len);
117
+ const valueNodes = new Array<SerovalSyncNode>(len);
113
118
  const deferredKey = new Array<unknown>(len);
114
119
  const deferredValue = new Array<unknown>(len);
115
120
  let deferredSize = 0;
@@ -137,10 +142,12 @@ function generateMapNode(
137
142
  l: undefined,
138
143
  c: undefined,
139
144
  m: undefined,
140
- d: { k: keyNodes, v: valueNodes, s: len },
145
+ p: undefined,
146
+ e: { k: keyNodes, v: valueNodes, s: len },
141
147
  a: undefined,
142
148
  f: undefined,
143
149
  b: undefined,
150
+ o: undefined,
144
151
  };
145
152
  }
146
153
 
@@ -151,7 +158,7 @@ function generateSetNode(
151
158
  ): SerovalSetNode {
152
159
  assert(ctx.features & Feature.Set, new UnsupportedTypeError(current));
153
160
  const len = current.size;
154
- const nodes = new Array<SerovalNode>(len);
161
+ const nodes = new Array<SerovalSyncNode>(len);
155
162
  const deferred = new Array<unknown>(len);
156
163
  let deferredSize = 0;
157
164
  let nodeSize = 0;
@@ -174,10 +181,12 @@ function generateSetNode(
174
181
  l: len,
175
182
  c: undefined,
176
183
  m: undefined,
177
- d: undefined,
184
+ p: undefined,
185
+ e: undefined,
178
186
  a: nodes,
179
187
  f: undefined,
180
188
  b: undefined,
189
+ o: undefined,
181
190
  };
182
191
  }
183
192
 
@@ -188,7 +197,7 @@ function generateProperties(
188
197
  const keys = Object.keys(properties);
189
198
  let size = keys.length;
190
199
  const keyNodes = new Array<SerovalObjectRecordKey>(size);
191
- const valueNodes = new Array<SerovalNode>(size);
200
+ const valueNodes = new Array<SerovalSyncNode>(size);
192
201
  const deferredKeys = new Array<SerovalObjectRecordKey>(size);
193
202
  const deferredValues = new Array<unknown>(size);
194
203
  let deferredSize = 0;
@@ -235,7 +244,7 @@ function generatePlainProperties(
235
244
  const keys = Object.keys(properties);
236
245
  const size = keys.length;
237
246
  const keyNodes = new Array<string>(size);
238
- const valueNodes = new Array<SerovalNode>(size);
247
+ const valueNodes = new Array<SerovalSyncNode>(size);
239
248
  const deferredKeys = new Array<string>(size);
240
249
  const deferredValues = new Array<unknown>(size);
241
250
  let deferredSize = 0;
@@ -279,10 +288,12 @@ function generateObjectNode(
279
288
  l: undefined,
280
289
  c: undefined,
281
290
  m: undefined,
282
- d: generateProperties(ctx, current),
291
+ p: generateProperties(ctx, current),
292
+ e: undefined,
283
293
  a: undefined,
284
294
  f: undefined,
285
295
  b: undefined,
296
+ o: getObjectFlag(current),
286
297
  };
287
298
  }
288
299
 
@@ -302,10 +313,12 @@ function generateAggregateErrorNode(
302
313
  l: undefined,
303
314
  c: undefined,
304
315
  m: serializeString(current.message),
305
- d: optionsNode,
316
+ p: optionsNode,
317
+ e: undefined,
306
318
  a: undefined,
307
319
  f: undefined,
308
320
  b: undefined,
321
+ o: undefined,
309
322
  };
310
323
  }
311
324
 
@@ -325,10 +338,12 @@ function generateErrorNode(
325
338
  l: undefined,
326
339
  c: getErrorConstructorName(current),
327
340
  m: serializeString(current.message),
328
- d: optionsNode,
341
+ p: optionsNode,
342
+ e: undefined,
329
343
  a: undefined,
330
344
  f: undefined,
331
345
  b: undefined,
346
+ o: undefined,
332
347
  };
333
348
  }
334
349
 
@@ -350,10 +365,12 @@ function generateHeadersNode(
350
365
  l: undefined,
351
366
  c: undefined,
352
367
  m: undefined,
353
- d: generatePlainProperties(ctx, items),
368
+ p: undefined,
369
+ e: generatePlainProperties(ctx, items),
354
370
  a: undefined,
355
371
  f: undefined,
356
372
  b: undefined,
373
+ o: undefined,
357
374
  };
358
375
  }
359
376
 
@@ -375,10 +392,12 @@ function generateFormDataNode(
375
392
  l: undefined,
376
393
  c: undefined,
377
394
  m: undefined,
378
- d: generatePlainProperties(ctx, items),
395
+ p: undefined,
396
+ e: generatePlainProperties(ctx, items),
379
397
  a: undefined,
380
398
  f: undefined,
381
399
  b: undefined,
400
+ o: undefined,
382
401
  };
383
402
  }
384
403
 
@@ -394,24 +413,26 @@ function generateBoxedNode(
394
413
  l: undefined,
395
414
  c: undefined,
396
415
  m: undefined,
397
- d: undefined,
416
+ p: undefined,
417
+ e: undefined,
398
418
  a: undefined,
399
419
  f: parseSync(ctx, current.valueOf()),
400
420
  b: undefined,
421
+ o: undefined,
401
422
  };
402
423
  }
403
424
 
404
425
  function parseObject(
405
426
  ctx: ParserContext,
406
427
  current: object | null,
407
- ): SerovalNode {
428
+ ): SerovalSyncNode {
408
429
  if (!current) {
409
430
  return NULL_NODE;
410
431
  }
411
432
  // Non-primitive values needs a reference ID
412
433
  // mostly because the values themselves are stateful
413
434
  const id = createIndexedValue(ctx, current);
414
- if (ctx.markedRefs.has(id)) {
435
+ if (ctx.reference.marked.has(id)) {
415
436
  return createIndexedValueNode(id);
416
437
  }
417
438
  if (hasReferenceID(current)) {
@@ -516,7 +537,7 @@ function parseObject(
516
537
  export default function parseSync<T>(
517
538
  ctx: ParserContext,
518
539
  current: T,
519
- ): SerovalNode {
540
+ ): SerovalSyncNode {
520
541
  switch (typeof current) {
521
542
  case 'boolean':
522
543
  return current ? TRUE_NODE : FALSE_NODE;
@@ -1,58 +1,14 @@
1
1
  import assert from '../assert';
2
2
  import { Feature } from '../compat';
3
- import type { ParserContext } from '../context';
3
+ import type { ParserContext } from './context';
4
4
  import { serializeString } from '../string';
5
- import UnsupportedTypeError from './UnsupportedTypeError';
5
+ import UnsupportedTypeError from '../UnsupportedTypeError';
6
6
  import { serializeArrayBuffer } from './primitives';
7
7
  import type {
8
8
  SerovalBlobNode,
9
9
  SerovalFileNode,
10
- SerovalURLNode,
11
- SerovalURLSearchParamsNode,
12
- } from './types';
13
- import {
14
- SerovalNodeType,
15
- } from './types';
16
-
17
- export function createURLNode(
18
- ctx: ParserContext,
19
- id: number,
20
- current: URL,
21
- ): SerovalURLNode {
22
- assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
23
- return {
24
- t: SerovalNodeType.URL,
25
- i: id,
26
- s: serializeString(current.href),
27
- l: undefined,
28
- c: undefined,
29
- m: undefined,
30
- d: undefined,
31
- f: undefined,
32
- a: undefined,
33
- b: undefined,
34
- };
35
- }
36
-
37
- export function createURLSearchParamsNode(
38
- ctx: ParserContext,
39
- id: number,
40
- current: URLSearchParams,
41
- ): SerovalURLSearchParamsNode {
42
- assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
43
- return {
44
- t: SerovalNodeType.URLSearchParams,
45
- i: id,
46
- s: serializeString(current.toString()),
47
- l: undefined,
48
- c: undefined,
49
- m: undefined,
50
- d: undefined,
51
- f: undefined,
52
- a: undefined,
53
- b: undefined,
54
- };
55
- }
10
+ } from '../types';
11
+ import { SerovalNodeType } from '../constants';
56
12
 
57
13
  export async function createBlobNode(
58
14
  ctx: ParserContext,
@@ -67,10 +23,12 @@ export async function createBlobNode(
67
23
  l: undefined,
68
24
  c: serializeString(current.type),
69
25
  m: undefined,
70
- d: undefined,
26
+ p: undefined,
27
+ e: undefined,
71
28
  f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
72
29
  a: undefined,
73
30
  b: undefined,
31
+ o: undefined,
74
32
  };
75
33
  }
76
34
 
@@ -87,9 +45,11 @@ export async function createFileNode(
87
45
  l: undefined,
88
46
  c: serializeString(current.type),
89
47
  m: serializeString(current.name),
90
- d: undefined,
48
+ p: undefined,
49
+ e: undefined,
91
50
  f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
92
51
  a: undefined,
93
52
  b: current.lastModified,
53
+ o: undefined,
94
54
  };
95
55
  }
@@ -1,46 +1,9 @@
1
- import type { Symbols } from './symbols';
2
-
3
- export const enum SerovalConstant {
4
- Null = 0,
5
- Undefined = 1,
6
- True = 2,
7
- False = 3,
8
- NegativeZero = 4,
9
- Infinity = 5,
10
- NegativeInfinity = 6,
11
- NaN = 7,
12
- }
13
-
14
- export const enum SerovalNodeType {
15
- Number = 0,
16
- String = 1,
17
- Constant = 2,
18
- BigInt = 3,
19
- IndexedValue = 4,
20
- Date = 5,
21
- RegExp = 6,
22
- Set = 7,
23
- Map = 8,
24
- Array = 9,
25
- Object = 10,
26
- NullConstructor = 11,
27
- Promise = 12,
28
- Error = 13,
29
- AggregateError = 14,
30
- TypedArray = 15,
31
- BigIntTypedArray = 16,
32
- WKSymbol = 17,
33
- URL = 18,
34
- URLSearchParams = 19,
35
- Reference = 20,
36
- ArrayBuffer = 21,
37
- DataView = 22,
38
- Blob = 23,
39
- File = 24,
40
- Headers = 25,
41
- FormData = 26,
42
- Boxed = 27,
43
- }
1
+ import type {
2
+ SerovalNodeType,
3
+ SerovalObjectFlags,
4
+ SerovalConstant,
5
+ Symbols,
6
+ } from './constants';
44
7
 
45
8
  export interface SerovalBaseNode {
46
9
  // Type of the node
@@ -55,14 +18,18 @@ export interface SerovalBaseNode {
55
18
  c: string | undefined;
56
19
  // message/flags
57
20
  m: string | undefined;
58
- // dictionary
59
- d: SerovalObjectRecordNode | SerovalMapRecordNode | undefined;
21
+ // properties (objects)
22
+ p: SerovalObjectRecordNode | undefined;
23
+ // entries (for Map, Headers, etc.)
24
+ e: SerovalMapRecordNode | SerovalPlainRecordNode | undefined;
60
25
  // array of nodes
61
26
  a: (SerovalNode | undefined)[] | undefined;
62
27
  // fulfilled node
63
28
  f: SerovalNode | undefined;
64
- // byte offset
29
+ // byte offset/object flags
65
30
  b: number | undefined;
31
+ // object flag
32
+ o: SerovalObjectFlags | undefined;
66
33
  }
67
34
 
68
35
  export const enum SerovalObjectRecordSpecialKey {
@@ -197,7 +164,7 @@ export interface SerovalMapNode extends SerovalBaseNode {
197
164
  t: SerovalNodeType.Map;
198
165
  i: number;
199
166
  // key/value pairs
200
- d: SerovalMapRecordNode;
167
+ e: SerovalMapRecordNode;
201
168
  }
202
169
 
203
170
  export interface SerovalArrayNode extends SerovalBaseNode {
@@ -207,24 +174,28 @@ export interface SerovalArrayNode extends SerovalBaseNode {
207
174
  // items
208
175
  a: (SerovalNode | undefined)[];
209
176
  i: number;
177
+ o: SerovalObjectFlags;
210
178
  }
211
179
 
212
180
  export interface SerovalObjectNode extends SerovalBaseNode {
213
181
  t: SerovalNodeType.Object;
214
182
  // key/value pairs
215
- d: SerovalObjectRecordNode;
183
+ p: SerovalObjectRecordNode;
216
184
  i: number;
185
+ o: SerovalObjectFlags;
217
186
  }
218
187
 
219
188
  export interface SerovalNullConstructorNode extends SerovalBaseNode {
220
189
  t: SerovalNodeType.NullConstructor;
221
190
  // key/value pairs
222
- d: SerovalObjectRecordNode;
191
+ p: SerovalObjectRecordNode;
223
192
  i: number;
193
+ o: SerovalObjectFlags;
224
194
  }
225
195
 
226
196
  export interface SerovalPromiseNode extends SerovalBaseNode {
227
197
  t: SerovalNodeType.Promise;
198
+ s: 0 | 1;
228
199
  // resolved value
229
200
  f: SerovalNode;
230
201
  i: number;
@@ -237,7 +208,7 @@ export interface SerovalErrorNode extends SerovalBaseNode {
237
208
  // message
238
209
  m: string;
239
210
  // other properties
240
- d: SerovalObjectRecordNode | undefined;
211
+ p: SerovalObjectRecordNode | undefined;
241
212
  i: number;
242
213
  }
243
214
 
@@ -247,7 +218,7 @@ export interface SerovalAggregateErrorNode extends SerovalBaseNode {
247
218
  // message
248
219
  m: string;
249
220
  // other properties
250
- d: SerovalObjectRecordNode | undefined;
221
+ p: SerovalObjectRecordNode | undefined;
251
222
  }
252
223
 
253
224
  export interface SerovalWKSymbolNode extends SerovalBaseNode {
@@ -313,13 +284,13 @@ export interface SerovalFileNode extends SerovalBaseNode {
313
284
  export interface SerovalHeadersNode extends SerovalBaseNode {
314
285
  t: SerovalNodeType.Headers;
315
286
  i: number;
316
- d: SerovalPlainRecordNode;
287
+ e: SerovalPlainRecordNode;
317
288
  }
318
289
 
319
290
  export interface SerovalFormDataNode extends SerovalBaseNode {
320
291
  t: SerovalNodeType.FormData;
321
292
  i: number;
322
- d: SerovalPlainRecordNode;
293
+ e: SerovalPlainRecordNode;
323
294
  }
324
295
 
325
296
  export interface SerovalBoxedNode extends SerovalBaseNode {
@@ -328,7 +299,48 @@ export interface SerovalBoxedNode extends SerovalBaseNode {
328
299
  f: SerovalNode;
329
300
  }
330
301
 
331
- export type SerovalNode =
302
+ export interface SerovalPromiseConstructorNode extends SerovalBaseNode {
303
+ t: SerovalNodeType.PromiseConstructor;
304
+ i: number;
305
+ }
306
+
307
+ export interface SerovalPromiseResolveNode extends SerovalBaseNode {
308
+ t: SerovalNodeType.PromiseResolve;
309
+ // reference to the resolver
310
+ i: number;
311
+ f: SerovalNode;
312
+ }
313
+
314
+ export interface SerovalPromiseRejectNode extends SerovalBaseNode {
315
+ t: SerovalNodeType.PromiseReject;
316
+ // reference to the resolver
317
+ i: number;
318
+ f: SerovalNode;
319
+ }
320
+
321
+ export interface SerovalReadableStreamConstructorNode extends SerovalBaseNode {
322
+ t: SerovalNodeType.ReadableStreamConstructor;
323
+ i: number;
324
+ }
325
+
326
+ export interface SerovalReadableStreamEnqueueNode extends SerovalBaseNode {
327
+ t: SerovalNodeType.ReadableStreamEnqueue;
328
+ i: number;
329
+ f: SerovalNode;
330
+ }
331
+
332
+ export interface SerovalReadableStreamCloseNode extends SerovalBaseNode {
333
+ t: SerovalNodeType.ReadableStreamClose;
334
+ i: number;
335
+ }
336
+
337
+ export interface SerovalReadableStreamErrorNode extends SerovalBaseNode {
338
+ t: SerovalNodeType.ReadableStreamError;
339
+ i: number;
340
+ f: SerovalNode;
341
+ }
342
+
343
+ export type SerovalSyncNode =
332
344
  | SerovalPrimitiveNode
333
345
  | SerovalIndexedValueNode
334
346
  | SerovalSemiPrimitiveNode
@@ -351,3 +363,19 @@ export type SerovalNode =
351
363
  | SerovalHeadersNode
352
364
  | SerovalFormDataNode
353
365
  | SerovalBoxedNode;
366
+
367
+ export type SerovalAsyncNode =
368
+ | SerovalPromiseNode
369
+ | SerovalBlobNode
370
+ | SerovalFileNode
371
+ | SerovalPromiseConstructorNode
372
+ | SerovalPromiseResolveNode
373
+ | SerovalPromiseRejectNode
374
+ | SerovalReadableStreamConstructorNode
375
+ | SerovalReadableStreamEnqueueNode
376
+ | SerovalReadableStreamCloseNode
377
+ | SerovalReadableStreamErrorNode;
378
+
379
+ export type SerovalNode =
380
+ | SerovalSyncNode
381
+ | SerovalAsyncNode;
@@ -0,0 +1,51 @@
1
+ import UnsupportedTypeError from './UnsupportedTypeError';
2
+ import assert from './assert';
3
+ import { Feature } from './compat';
4
+ import { SerovalNodeType } from './constants';
5
+ import type { BaseParserContext } from './context';
6
+ import { serializeString } from './string';
7
+ import type { SerovalURLNode, SerovalURLSearchParamsNode } from './types';
8
+
9
+ export function createURLNode(
10
+ ctx: BaseParserContext,
11
+ id: number,
12
+ current: URL,
13
+ ): SerovalURLNode {
14
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
15
+ return {
16
+ t: SerovalNodeType.URL,
17
+ i: id,
18
+ s: serializeString(current.href),
19
+ l: undefined,
20
+ c: undefined,
21
+ m: undefined,
22
+ p: undefined,
23
+ e: undefined,
24
+ f: undefined,
25
+ a: undefined,
26
+ b: undefined,
27
+ o: undefined,
28
+ };
29
+ }
30
+
31
+ export function createURLSearchParamsNode(
32
+ ctx: BaseParserContext,
33
+ id: number,
34
+ current: URLSearchParams,
35
+ ): SerovalURLSearchParamsNode {
36
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
37
+ return {
38
+ t: SerovalNodeType.URLSearchParams,
39
+ i: id,
40
+ s: serializeString(current.toString()),
41
+ l: undefined,
42
+ c: undefined,
43
+ m: undefined,
44
+ p: undefined,
45
+ e: undefined,
46
+ f: undefined,
47
+ a: undefined,
48
+ b: undefined,
49
+ o: undefined,
50
+ };
51
+ }