seroval 0.11.6 → 0.12.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 (122) hide show
  1. package/README.md +29 -16
  2. package/dist/cjs/development/index.cjs +3072 -4875
  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 +3069 -4874
  6. package/dist/esm/development/index.mjs.map +4 -4
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/core/Serializer.d.ts +2 -0
  9. package/dist/types/core/Serializer.d.ts.map +1 -0
  10. package/dist/types/core/UnsupportedTypeError.d.ts +1 -0
  11. package/dist/types/core/UnsupportedTypeError.d.ts.map +1 -0
  12. package/dist/types/core/assert.d.ts +1 -0
  13. package/dist/types/core/assert.d.ts.map +1 -0
  14. package/dist/types/core/base/async.d.ts +30 -0
  15. package/dist/types/core/base/async.d.ts.map +1 -0
  16. package/dist/types/core/base/stream.d.ts +40 -0
  17. package/dist/types/core/base/stream.d.ts.map +1 -0
  18. package/dist/types/core/base/sync.d.ts +32 -0
  19. package/dist/types/core/base/sync.d.ts.map +1 -0
  20. package/dist/types/core/base-primitives.d.ts +3 -1
  21. package/dist/types/core/base-primitives.d.ts.map +1 -0
  22. package/dist/types/core/compat.d.ts +1 -0
  23. package/dist/types/core/compat.d.ts.map +1 -0
  24. package/dist/types/core/constants.d.ts +19 -4
  25. package/dist/types/core/constants.d.ts.map +1 -0
  26. package/dist/types/core/constructors.d.ts +1 -0
  27. package/dist/types/core/constructors.d.ts.map +1 -0
  28. package/dist/types/core/cross/async.d.ts +8 -3
  29. package/dist/types/core/cross/async.d.ts.map +1 -0
  30. package/dist/types/core/cross/cross-parser.d.ts +8 -0
  31. package/dist/types/core/cross/cross-parser.d.ts.map +1 -0
  32. package/dist/types/core/cross/index.d.ts +12 -5
  33. package/dist/types/core/cross/index.d.ts.map +1 -0
  34. package/dist/types/core/cross/serialize.d.ts +23 -5
  35. package/dist/types/core/cross/serialize.d.ts.map +1 -0
  36. package/dist/types/core/cross/stream.d.ts +8 -3
  37. package/dist/types/core/cross/stream.d.ts.map +1 -0
  38. package/dist/types/core/cross/sync.d.ts +8 -3
  39. package/dist/types/core/cross/sync.d.ts.map +1 -0
  40. package/dist/types/core/get-identifier.d.ts +1 -0
  41. package/dist/types/core/get-identifier.d.ts.map +1 -0
  42. package/dist/types/core/keys.d.ts +1 -0
  43. package/dist/types/core/keys.d.ts.map +1 -0
  44. package/dist/types/core/literals.d.ts +1 -0
  45. package/dist/types/core/literals.d.ts.map +1 -0
  46. package/dist/types/core/parser-context.d.ts +23 -0
  47. package/dist/types/core/parser-context.d.ts.map +1 -0
  48. package/dist/types/core/plugin.d.ts +26 -0
  49. package/dist/types/core/plugin.d.ts.map +1 -0
  50. package/dist/types/core/promise-to-result.d.ts +1 -0
  51. package/dist/types/core/promise-to-result.d.ts.map +1 -0
  52. package/dist/types/core/reference.d.ts +1 -0
  53. package/dist/types/core/reference.d.ts.map +1 -0
  54. package/dist/types/core/serializer-context.old.d.ts +165 -0
  55. package/dist/types/core/serializer-context.old.d.ts.map +1 -0
  56. package/dist/types/core/shared.d.ts +4 -7
  57. package/dist/types/core/shared.d.ts.map +1 -0
  58. package/dist/types/core/string.d.ts +1 -0
  59. package/dist/types/core/string.d.ts.map +1 -0
  60. package/dist/types/core/tree/async.d.ts +8 -3
  61. package/dist/types/core/tree/async.d.ts.map +1 -0
  62. package/dist/types/core/tree/deserialize.d.ts +49 -2
  63. package/dist/types/core/tree/deserialize.d.ts.map +1 -0
  64. package/dist/types/core/tree/index.d.ts +10 -7
  65. package/dist/types/core/tree/index.d.ts.map +1 -0
  66. package/dist/types/core/tree/serialize.d.ts +37 -4
  67. package/dist/types/core/tree/serialize.d.ts.map +1 -0
  68. package/dist/types/core/tree/sync.d.ts +8 -3
  69. package/dist/types/core/tree/sync.d.ts.map +1 -0
  70. package/dist/types/core/types.d.ts +10 -3
  71. package/dist/types/core/types.d.ts.map +1 -0
  72. package/dist/types/core/web-api.d.ts +1 -0
  73. package/dist/types/core/web-api.d.ts.map +1 -0
  74. package/dist/types/index.d.ts +3 -0
  75. package/dist/types/index.d.ts.map +1 -0
  76. package/dist/types/types.d.ts +1 -0
  77. package/dist/types/types.d.ts.map +1 -0
  78. package/package.json +2 -2
  79. package/src/core/Serializer.ts +2 -0
  80. package/src/core/base/async.ts +804 -0
  81. package/src/core/base/stream.ts +496 -0
  82. package/src/core/base/sync.ts +675 -0
  83. package/src/core/base-primitives.ts +22 -0
  84. package/src/core/constants.ts +61 -45
  85. package/src/core/cross/async.ts +6 -751
  86. package/src/core/cross/cross-parser.ts +9 -0
  87. package/src/core/cross/index.ts +62 -84
  88. package/src/core/cross/serialize.ts +71 -862
  89. package/src/core/cross/stream.ts +6 -873
  90. package/src/core/cross/sync.ts +6 -624
  91. package/src/core/is-serializable.new.ts +208 -0
  92. package/src/core/keys.ts +1 -1
  93. package/src/core/parser-context.ts +131 -0
  94. package/src/core/plugin.ts +55 -0
  95. package/src/core/serializer-context.new.ts +1168 -0
  96. package/src/core/serializer-context.old.ts +1126 -0
  97. package/src/core/shared.ts +46 -123
  98. package/src/core/tree/async.ts +6 -750
  99. package/src/core/tree/deserialize.ts +423 -420
  100. package/src/core/tree/index.ts +49 -91
  101. package/src/core/tree/parser.ts +45 -0
  102. package/src/core/tree/serialize.ts +122 -828
  103. package/src/core/tree/sync.ts +6 -624
  104. package/src/core/types.ts +13 -2
  105. package/src/example.ts +28 -0
  106. package/src/index.ts +3 -0
  107. package/dist/types/core/assignments.d.ts +0 -33
  108. package/dist/types/core/context.d.ts +0 -9
  109. package/dist/types/core/cross/context.d.ts +0 -37
  110. package/dist/types/core/cross/primitives.d.ts +0 -9
  111. package/dist/types/core/cross/web-api.d.ts +0 -4
  112. package/dist/types/core/tree/context.d.ts +0 -44
  113. package/dist/types/core/tree/primitives.d.ts +0 -9
  114. package/dist/types/core/tree/web-api.d.ts +0 -4
  115. package/src/core/assignments.ts +0 -159
  116. package/src/core/context.ts +0 -15
  117. package/src/core/cross/context.ts +0 -102
  118. package/src/core/cross/primitives.ts +0 -128
  119. package/src/core/cross/web-api.ts +0 -50
  120. package/src/core/tree/context.ts +0 -125
  121. package/src/core/tree/primitives.ts +0 -123
  122. package/src/core/tree/web-api.ts +0 -50
@@ -1,754 +1,9 @@
1
- /* eslint-disable no-await-in-loop */
2
- /* eslint-disable @typescript-eslint/no-use-before-define */
3
- import { BIGINT_FLAG, Feature } from '../compat';
4
- import type { CrossParserContext } from './context';
5
- import {
6
- createCrossIndexedValue,
7
- } from './context';
8
- import { serializeString } from '../string';
9
- import type {
10
- BigIntTypedArrayValue,
11
- TypedArrayValue,
12
- } from '../../types';
13
- import UnsupportedTypeError from '../UnsupportedTypeError';
14
- import {
15
- TRUE_NODE,
16
- FALSE_NODE,
17
- UNDEFINED_NODE,
18
- NULL_NODE,
19
- } from '../literals';
20
- import {
21
- createBigIntTypedArrayNode,
22
- createTypedArrayNode,
23
- createDataViewNode,
24
- createSymbolNode,
25
- createFunctionNode,
26
- serializeArrayBuffer,
27
- } from './primitives';
28
- import { hasReferenceID } from '../reference';
29
- import {
30
- getErrorConstructorName,
31
- getErrorOptions,
32
- getObjectFlag,
33
- isIterable,
34
- } from '../shared';
35
- import type {
36
- SerovalAggregateErrorNode,
37
- SerovalArrayNode,
38
- SerovalBoxedNode,
39
- SerovalCustomEventNode,
40
- SerovalErrorNode,
41
- SerovalEventNode,
42
- SerovalFormDataNode,
43
- SerovalHeadersNode,
44
- SerovalMapNode,
45
- SerovalNode,
46
- SerovalNullConstructorNode,
47
- SerovalObjectNode,
48
- SerovalObjectRecordKey,
49
- SerovalObjectRecordNode,
50
- SerovalPlainRecordNode,
51
- SerovalPromiseNode,
52
- SerovalRequestNode,
53
- SerovalResponseNode,
54
- SerovalSetNode,
55
- } from '../types';
56
- import {
57
- SerovalObjectRecordSpecialKey,
58
- } from '../types';
59
- import {
60
- createBlobNode,
61
- createFileNode,
62
- } from './web-api';
63
- import { SerovalNodeType } from '../constants';
64
- import {
65
- createArrayBufferNode,
66
- createBigIntNode,
67
- createDateNode,
68
- createIndexedValueNode,
69
- createNumberNode,
70
- createReferenceNode,
71
- createRegExpNode,
72
- createStringNode,
73
- } from '../base-primitives';
74
- import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api';
75
- import promiseToResult from '../promise-to-result';
76
- import {
77
- createCustomEventOptions,
78
- createEventOptions,
79
- createRequestOptions,
80
- createResponseOptions,
81
- } from '../constructors';
1
+ import BaseAsyncParserContext from '../base/async';
2
+ import type { CrossParserContextOptions } from './cross-parser';
3
+ import type { SerovalMode } from '../plugin';
82
4
 
83
- type ObjectLikeNode =
84
- | SerovalObjectNode
85
- | SerovalNullConstructorNode
86
- | SerovalPromiseNode;
5
+ export type CrossAsyncParserContextOptions = CrossParserContextOptions
87
6
 
88
- async function generateNodeList(
89
- ctx: CrossParserContext,
90
- current: unknown[],
91
- ): Promise<SerovalNode[]> {
92
- const size = current.length;
93
- const nodes = new Array<SerovalNode>(size);
94
- const deferred = new Array<unknown>(size);
95
- let item: unknown;
96
- for (let i = 0; i < size; i++) {
97
- if (i in current) {
98
- item = current[i];
99
- if (isIterable(ctx, item)) {
100
- deferred[i] = item;
101
- } else {
102
- nodes[i] = await crossParseAsync(ctx, item);
103
- }
104
- }
105
- }
106
- for (let i = 0; i < size; i++) {
107
- if (i in deferred) {
108
- nodes[i] = await crossParseAsync(ctx, deferred[i]);
109
- }
110
- }
111
- return nodes;
112
- }
113
-
114
- async function generateArrayNode(
115
- ctx: CrossParserContext,
116
- id: number,
117
- current: unknown[],
118
- ): Promise<SerovalArrayNode> {
119
- return {
120
- t: SerovalNodeType.Array,
121
- i: id,
122
- s: undefined,
123
- l: current.length,
124
- c: undefined,
125
- m: undefined,
126
- p: undefined,
127
- e: undefined,
128
- a: await generateNodeList(ctx, current),
129
- f: undefined,
130
- b: undefined,
131
- o: getObjectFlag(current),
132
- };
133
- }
134
-
135
- async function generateMapNode(
136
- ctx: CrossParserContext,
137
- id: number,
138
- current: Map<unknown, unknown>,
139
- ): Promise<SerovalMapNode> {
140
- const len = current.size;
141
- const keyNodes = new Array<SerovalNode>(len);
142
- const valueNodes = new Array<SerovalNode>(len);
143
- const deferredKey = new Array<unknown>(len);
144
- const deferredValue = new Array<unknown>(len);
145
- let deferredSize = 0;
146
- let nodeSize = 0;
147
- for (const [key, value] of current.entries()) {
148
- // Either key or value might be an iterable
149
- if (isIterable(ctx, key) || isIterable(ctx, value)) {
150
- deferredKey[deferredSize] = key;
151
- deferredValue[deferredSize] = value;
152
- deferredSize++;
153
- } else {
154
- keyNodes[nodeSize] = await crossParseAsync(ctx, key);
155
- valueNodes[nodeSize] = await crossParseAsync(ctx, value);
156
- nodeSize++;
157
- }
158
- }
159
- for (let i = 0; i < deferredSize; i++) {
160
- keyNodes[nodeSize + i] = await crossParseAsync(ctx, deferredKey[i]);
161
- valueNodes[nodeSize + i] = await crossParseAsync(ctx, deferredValue[i]);
162
- }
163
- return {
164
- t: SerovalNodeType.Map,
165
- i: id,
166
- s: undefined,
167
- l: undefined,
168
- c: undefined,
169
- m: undefined,
170
- p: undefined,
171
- e: { k: keyNodes, v: valueNodes, s: len },
172
- a: undefined,
173
- f: undefined,
174
- b: undefined,
175
- o: undefined,
176
- };
177
- }
178
-
179
- async function generateSetNode(
180
- ctx: CrossParserContext,
181
- id: number,
182
- current: Set<unknown>,
183
- ): Promise<SerovalSetNode> {
184
- const len = current.size;
185
- const nodes = new Array<SerovalNode>(len);
186
- const deferred = new Array<unknown>(len);
187
- let deferredSize = 0;
188
- let nodeSize = 0;
189
- for (const item of current.keys()) {
190
- // Iterables are lazy, so the evaluation must be deferred
191
- if (isIterable(ctx, item)) {
192
- deferred[deferredSize++] = item;
193
- } else {
194
- nodes[nodeSize++] = await crossParseAsync(ctx, item);
195
- }
196
- }
197
- // Parse deferred items
198
- for (let i = 0; i < deferredSize; i++) {
199
- nodes[nodeSize + i] = await crossParseAsync(ctx, deferred[i]);
200
- }
201
- return {
202
- t: SerovalNodeType.Set,
203
- i: id,
204
- s: undefined,
205
- l: len,
206
- c: undefined,
207
- m: undefined,
208
- p: undefined,
209
- e: undefined,
210
- a: nodes,
211
- f: undefined,
212
- b: undefined,
213
- o: undefined,
214
- };
215
- }
216
-
217
- async function generateProperties(
218
- ctx: CrossParserContext,
219
- properties: Record<string, unknown>,
220
- ): Promise<SerovalObjectRecordNode> {
221
- const keys = Object.keys(properties);
222
- let size = keys.length;
223
- const keyNodes = new Array<SerovalObjectRecordKey>(size);
224
- const valueNodes = new Array<SerovalNode>(size);
225
- const deferredKeys = new Array<SerovalObjectRecordKey>(size);
226
- const deferredValues = new Array<unknown>(size);
227
- let deferredSize = 0;
228
- let nodesSize = 0;
229
- let item: unknown;
230
- let escaped: SerovalObjectRecordKey;
231
- for (const key of keys) {
232
- item = properties[key];
233
- escaped = serializeString(key);
234
- if (isIterable(ctx, item)) {
235
- deferredKeys[deferredSize] = escaped;
236
- deferredValues[deferredSize] = item;
237
- deferredSize++;
238
- } else {
239
- keyNodes[nodesSize] = escaped;
240
- valueNodes[nodesSize] = await crossParseAsync(ctx, item);
241
- nodesSize++;
242
- }
243
- }
244
- for (let i = 0; i < deferredSize; i++) {
245
- keyNodes[nodesSize + i] = deferredKeys[i];
246
- valueNodes[nodesSize + i] = await crossParseAsync(ctx, deferredValues[i]);
247
- }
248
- if (ctx.features & Feature.Symbol) {
249
- if (Symbol.iterator in properties) {
250
- keyNodes[size] = SerovalObjectRecordSpecialKey.SymbolIterator;
251
- const items = Array.from(properties as Iterable<unknown>);
252
- valueNodes[size] = await generateArrayNode(
253
- ctx,
254
- createCrossIndexedValue(ctx, items),
255
- items,
256
- );
257
- size++;
258
- }
259
- }
260
- return {
261
- k: keyNodes,
262
- v: valueNodes,
263
- s: size,
264
- };
265
- }
266
-
267
- async function generatePlainProperties(
268
- ctx: CrossParserContext,
269
- properties: Record<string, unknown>,
270
- ): Promise<SerovalPlainRecordNode> {
271
- const keys = Object.keys(properties);
272
- const size = keys.length;
273
- const keyNodes = new Array<string>(size);
274
- const valueNodes = new Array<SerovalNode>(size);
275
- const deferredKeys = new Array<string>(size);
276
- const deferredValues = new Array<unknown>(size);
277
- let deferredSize = 0;
278
- let nodesSize = 0;
279
- let item: unknown;
280
- let escaped: string;
281
- for (const key of keys) {
282
- item = properties[key];
283
- escaped = serializeString(key);
284
- if (isIterable(ctx, item)) {
285
- deferredKeys[deferredSize] = escaped;
286
- deferredValues[deferredSize] = item;
287
- deferredSize++;
288
- } else {
289
- keyNodes[nodesSize] = escaped;
290
- valueNodes[nodesSize] = await crossParseAsync(ctx, item);
291
- nodesSize++;
292
- }
293
- }
294
- for (let i = 0; i < deferredSize; i++) {
295
- keyNodes[nodesSize + i] = deferredKeys[i];
296
- valueNodes[nodesSize + i] = await crossParseAsync(ctx, deferredValues[i]);
297
- }
298
- return {
299
- k: keyNodes,
300
- v: valueNodes,
301
- s: size,
302
- };
303
- }
304
-
305
- async function generatePromiseNode(
306
- ctx: CrossParserContext,
307
- id: number,
308
- current: Promise<unknown>,
309
- ): Promise<SerovalPromiseNode> {
310
- const [status, result] = await promiseToResult(current);
311
- return {
312
- t: SerovalNodeType.Promise,
313
- i: id,
314
- s: status,
315
- l: undefined,
316
- c: undefined,
317
- m: undefined,
318
- p: undefined,
319
- e: undefined,
320
- a: undefined,
321
- f: await crossParseAsync(ctx, result),
322
- b: undefined,
323
- o: undefined,
324
- };
325
- }
326
-
327
- async function generateObjectNode(
328
- ctx: CrossParserContext,
329
- id: number,
330
- current: Record<string, unknown>,
331
- empty: boolean,
332
- ): Promise<ObjectLikeNode> {
333
- return {
334
- t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
335
- i: id,
336
- s: undefined,
337
- l: undefined,
338
- c: undefined,
339
- m: undefined,
340
- p: await generateProperties(ctx, current),
341
- e: undefined,
342
- a: undefined,
343
- f: undefined,
344
- b: undefined,
345
- o: getObjectFlag(current),
346
- };
347
- }
348
-
349
- async function generateAggregateErrorNode(
350
- ctx: CrossParserContext,
351
- id: number,
352
- current: AggregateError,
353
- ): Promise<SerovalAggregateErrorNode> {
354
- const options = getErrorOptions(ctx, current);
355
- const optionsNode = options
356
- ? await generateProperties(ctx, options)
357
- : undefined;
358
- return {
359
- t: SerovalNodeType.AggregateError,
360
- i: id,
361
- s: undefined,
362
- l: undefined,
363
- c: undefined,
364
- m: serializeString(current.message),
365
- p: optionsNode,
366
- e: undefined,
367
- a: undefined,
368
- f: undefined,
369
- b: undefined,
370
- o: undefined,
371
- };
372
- }
373
-
374
- async function generateErrorNode(
375
- ctx: CrossParserContext,
376
- id: number,
377
- current: Error,
378
- ): Promise<SerovalErrorNode> {
379
- const options = getErrorOptions(ctx, current);
380
- const optionsNode = options
381
- ? await generateProperties(ctx, options)
382
- : undefined;
383
- return {
384
- t: SerovalNodeType.Error,
385
- i: id,
386
- s: undefined,
387
- l: undefined,
388
- c: getErrorConstructorName(current),
389
- m: serializeString(current.message),
390
- p: optionsNode,
391
- e: undefined,
392
- a: undefined,
393
- f: undefined,
394
- b: undefined,
395
- o: undefined,
396
- };
397
- }
398
-
399
- async function generateHeadersNode(
400
- ctx: CrossParserContext,
401
- id: number,
402
- current: Headers,
403
- ): Promise<SerovalHeadersNode> {
404
- const items: Record<string, string> = {};
405
- current.forEach((value, key) => {
406
- items[key] = value;
407
- });
408
- return {
409
- t: SerovalNodeType.Headers,
410
- i: id,
411
- s: undefined,
412
- l: undefined,
413
- c: undefined,
414
- m: undefined,
415
- p: undefined,
416
- e: await generatePlainProperties(ctx, items),
417
- a: undefined,
418
- f: undefined,
419
- b: undefined,
420
- o: undefined,
421
- };
422
- }
423
-
424
- async function generateFormDataNode(
425
- ctx: CrossParserContext,
426
- id: number,
427
- current: FormData,
428
- ): Promise<SerovalFormDataNode> {
429
- const items: Record<string, FormDataEntryValue> = {};
430
- current.forEach((value, key) => {
431
- items[key] = value;
432
- });
433
- return {
434
- t: SerovalNodeType.FormData,
435
- i: id,
436
- s: undefined,
437
- l: undefined,
438
- c: undefined,
439
- m: undefined,
440
- p: undefined,
441
- e: await generatePlainProperties(ctx, items),
442
- a: undefined,
443
- f: undefined,
444
- b: undefined,
445
- o: undefined,
446
- };
447
- }
448
-
449
- async function generateBoxedNode(
450
- ctx: CrossParserContext,
451
- id: number,
452
- current: object,
453
- ): Promise<SerovalBoxedNode> {
454
- return {
455
- t: SerovalNodeType.Boxed,
456
- i: id,
457
- s: undefined,
458
- l: undefined,
459
- c: undefined,
460
- m: undefined,
461
- p: undefined,
462
- e: undefined,
463
- a: undefined,
464
- f: await crossParseAsync(ctx, current.valueOf()),
465
- b: undefined,
466
- o: undefined,
467
- };
468
- }
469
-
470
- async function generateRequestNode(
471
- ctx: CrossParserContext,
472
- id: number,
473
- current: Request,
474
- ): Promise<SerovalRequestNode> {
475
- return {
476
- t: SerovalNodeType.Request,
477
- i: id,
478
- s: serializeString(current.url),
479
- l: undefined,
480
- c: undefined,
481
- m: undefined,
482
- p: undefined,
483
- e: undefined,
484
- f: await parseObject(
485
- ctx,
486
- createRequestOptions(current, current.body ? await current.clone().arrayBuffer() : null),
487
- ),
488
- a: undefined,
489
- b: undefined,
490
- o: undefined,
491
- };
492
- }
493
- async function generateResponseNode(
494
- ctx: CrossParserContext,
495
- id: number,
496
- current: Response,
497
- ): Promise<SerovalResponseNode> {
498
- return {
499
- t: SerovalNodeType.Response,
500
- i: id,
501
- s: undefined,
502
- l: undefined,
503
- c: undefined,
504
- m: undefined,
505
- p: undefined,
506
- e: undefined,
507
- f: undefined,
508
- a: [
509
- current.body
510
- ? serializeArrayBuffer(ctx, await current.clone().arrayBuffer())
511
- : NULL_NODE,
512
- await parseObject(ctx, createResponseOptions(current)),
513
- ],
514
- b: undefined,
515
- o: undefined,
516
- };
517
- }
518
-
519
- async function generateEventNode(
520
- ctx: CrossParserContext,
521
- id: number,
522
- current: Event,
523
- ): Promise<SerovalEventNode> {
524
- return {
525
- t: SerovalNodeType.Event,
526
- i: id,
527
- s: serializeString(current.type),
528
- l: undefined,
529
- c: undefined,
530
- m: undefined,
531
- p: undefined,
532
- e: undefined,
533
- a: undefined,
534
- f: await parseObject(ctx, createEventOptions(current)),
535
- b: undefined,
536
- o: undefined,
537
- };
538
- }
539
-
540
- async function generateCustomEventNode(
541
- ctx: CrossParserContext,
542
- id: number,
543
- current: CustomEvent,
544
- ): Promise<SerovalCustomEventNode> {
545
- return {
546
- t: SerovalNodeType.CustomEvent,
547
- i: id,
548
- s: serializeString(current.type),
549
- l: undefined,
550
- c: undefined,
551
- m: undefined,
552
- p: undefined,
553
- e: undefined,
554
- a: undefined,
555
- f: await parseObject(ctx, createCustomEventOptions(current)),
556
- b: undefined,
557
- o: undefined,
558
- };
559
- }
560
-
561
- async function parseObject(
562
- ctx: CrossParserContext,
563
- current: object | null,
564
- ): Promise<SerovalNode> {
565
- if (!current) {
566
- return NULL_NODE;
567
- }
568
- // Non-primitive values needs a reference ID
569
- // mostly because the values themselves are stateful
570
- const registeredID = ctx.refs.get(current);
571
- if (registeredID != null) {
572
- return createIndexedValueNode(registeredID);
573
- }
574
- const id = ctx.refs.size;
575
- ctx.refs.set(current, id);
576
- if (hasReferenceID(current)) {
577
- return createReferenceNode(id, current);
578
- }
579
- if (Array.isArray(current)) {
580
- return generateArrayNode(ctx, id, current);
581
- }
582
- const currentClass = current.constructor;
583
- switch (currentClass) {
584
- case Number:
585
- case Boolean:
586
- case String:
587
- case BigInt:
588
- return generateBoxedNode(ctx, id, current);
589
- case Date:
590
- return createDateNode(id, current as unknown as Date);
591
- case RegExp:
592
- return createRegExpNode(id, current as unknown as RegExp);
593
- case Object:
594
- return generateObjectNode(
595
- ctx,
596
- id,
597
- current as Record<string, unknown>,
598
- false,
599
- );
600
- case undefined:
601
- return generateObjectNode(
602
- ctx,
603
- id,
604
- current as Record<string, unknown>,
605
- true,
606
- );
607
- case Error:
608
- case EvalError:
609
- case RangeError:
610
- case ReferenceError:
611
- case SyntaxError:
612
- case TypeError:
613
- case URIError:
614
- return generateErrorNode(ctx, id, current as unknown as Error);
615
- default:
616
- break;
617
- }
618
- // Typed Arrays
619
- if (ctx.features & Feature.TypedArray) {
620
- switch (currentClass) {
621
- case ArrayBuffer:
622
- return createArrayBufferNode(id, current as unknown as ArrayBuffer);
623
- case Int8Array:
624
- case Int16Array:
625
- case Int32Array:
626
- case Uint8Array:
627
- case Uint16Array:
628
- case Uint32Array:
629
- case Uint8ClampedArray:
630
- case Float32Array:
631
- case Float64Array:
632
- return createTypedArrayNode(ctx, id, current as unknown as TypedArrayValue);
633
- case DataView:
634
- return createDataViewNode(ctx, id, current as unknown as DataView);
635
- default:
636
- break;
637
- }
638
- }
639
- // BigInt Typed Arrays
640
- if ((ctx.features & BIGINT_FLAG) === BIGINT_FLAG) {
641
- switch (currentClass) {
642
- case BigInt64Array:
643
- case BigUint64Array:
644
- return createBigIntTypedArrayNode(ctx, id, current as unknown as BigIntTypedArrayValue);
645
- default:
646
- break;
647
- }
648
- }
649
- // ES Collection
650
- if (ctx.features & Feature.Map && currentClass === Map) {
651
- return generateMapNode(
652
- ctx,
653
- id,
654
- current as unknown as Map<unknown, unknown>,
655
- );
656
- }
657
- if (ctx.features & Feature.Set && currentClass === Set) {
658
- return generateSetNode(
659
- ctx,
660
- id,
661
- current as unknown as Set<unknown>,
662
- );
663
- }
664
- // Promises
665
- if (
666
- (ctx.features & Feature.Promise)
667
- && (currentClass === Promise || current instanceof Promise)
668
- ) {
669
- return generatePromiseNode(ctx, id, current as unknown as Promise<unknown>);
670
- }
671
- // Web APIs
672
- if (ctx.features & Feature.WebAPI) {
673
- if (typeof URL !== 'undefined' && currentClass === URL) {
674
- return createURLNode(id, current as unknown as URL);
675
- }
676
- if (typeof URLSearchParams !== 'undefined' && currentClass === URLSearchParams) {
677
- return createURLSearchParamsNode(id, current as unknown as URLSearchParams);
678
- }
679
- if (typeof Blob !== 'undefined' && currentClass === Blob) {
680
- return createBlobNode(ctx, id, current as unknown as Blob);
681
- }
682
- if (typeof File !== 'undefined' && currentClass === File) {
683
- return createFileNode(ctx, id, current as unknown as File);
684
- }
685
- if (typeof Headers !== 'undefined' && currentClass === Headers) {
686
- return generateHeadersNode(ctx, id, current as unknown as Headers);
687
- }
688
- if (typeof FormData !== 'undefined' && currentClass === FormData) {
689
- return generateFormDataNode(ctx, id, current as unknown as FormData);
690
- }
691
- if (typeof Request !== 'undefined' && currentClass === Request) {
692
- return generateRequestNode(ctx, id, current as unknown as Request);
693
- }
694
- if (typeof Response !== 'undefined' && currentClass === Response) {
695
- return generateResponseNode(ctx, id, current as unknown as Response);
696
- }
697
- if (typeof Event !== 'undefined' && currentClass === Event) {
698
- return generateEventNode(ctx, id, current as unknown as Event);
699
- }
700
- if (typeof CustomEvent !== 'undefined' && currentClass === CustomEvent) {
701
- return generateCustomEventNode(ctx, id, current as unknown as CustomEvent);
702
- }
703
- if (typeof DOMException !== 'undefined' && currentClass === DOMException) {
704
- return createDOMExceptionNode(id, current as unknown as DOMException);
705
- }
706
- }
707
- if (
708
- (ctx.features & Feature.AggregateError)
709
- && typeof AggregateError !== 'undefined'
710
- && (currentClass === AggregateError || current instanceof AggregateError)
711
- ) {
712
- return generateAggregateErrorNode(ctx, id, current as unknown as AggregateError);
713
- }
714
- // Slow path. We only need to handle Errors and Iterators
715
- // since they have very broad implementations.
716
- if (current instanceof Error) {
717
- return generateErrorNode(ctx, id, current);
718
- }
719
- // Generator functions don't have a global constructor
720
- // despite existing
721
- if (ctx.features & Feature.Symbol && Symbol.iterator in current) {
722
- return generateObjectNode(ctx, id, current, !!currentClass);
723
- }
724
- throw new UnsupportedTypeError(current);
725
- }
726
-
727
- export default async function crossParseAsync<T>(
728
- ctx: CrossParserContext,
729
- current: T,
730
- ): Promise<SerovalNode> {
731
- const t = typeof current;
732
- if (ctx.features & Feature.BigInt && t === 'bigint') {
733
- return createBigIntNode(current as bigint);
734
- }
735
- switch (t) {
736
- case 'boolean':
737
- return current ? TRUE_NODE : FALSE_NODE;
738
- case 'undefined':
739
- return UNDEFINED_NODE;
740
- case 'string':
741
- return createStringNode(current as string);
742
- case 'number':
743
- return createNumberNode(current as number);
744
- case 'object':
745
- return parseObject(ctx, current as object);
746
- case 'symbol':
747
- return createSymbolNode(ctx, current as symbol);
748
- case 'function':
749
- // eslint-disable-next-line @typescript-eslint/ban-types
750
- return createFunctionNode(ctx, current as Function);
751
- default:
752
- throw new UnsupportedTypeError(current);
753
- }
7
+ export default class CrossAsyncParserContext extends BaseAsyncParserContext {
8
+ readonly mode: SerovalMode = 'cross';
754
9
  }