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.
- package/README.md +4 -287
- package/dist/cjs/development/index.cjs +3858 -1385
- package/dist/cjs/development/index.cjs.map +4 -4
- package/dist/cjs/production/index.cjs +12 -3
- package/dist/esm/development/index.mjs +3611 -1136
- package/dist/esm/development/index.mjs.map +4 -4
- package/dist/esm/production/index.mjs +12 -3
- package/dist/types/core/Serializer.d.ts +14 -0
- package/dist/types/{tree → core}/UnsupportedTypeError.d.ts +4 -3
- package/dist/types/{assert.d.ts → core/assert.d.ts} +1 -1
- package/dist/types/core/assignments.d.ts +33 -0
- package/dist/types/core/base-primitives.d.ts +12 -0
- package/dist/types/{compat.d.ts → core/compat.d.ts} +22 -22
- package/dist/types/core/constants.d.ts +89 -0
- package/dist/types/core/context.d.ts +9 -0
- package/dist/types/core/cross/async.d.ts +3 -0
- package/dist/types/core/cross/context.d.ts +30 -0
- package/dist/types/core/cross/index.d.ts +7 -0
- package/dist/types/core/cross/primitives.d.ts +9 -0
- package/dist/types/core/cross/serialize.d.ts +5 -0
- package/dist/types/core/cross/stream.d.ts +3 -0
- package/dist/types/core/cross/sync.d.ts +3 -0
- package/dist/types/core/cross/web-api.d.ts +4 -0
- package/dist/types/{get-identifier.d.ts → core/get-identifier.d.ts} +1 -1
- package/dist/types/core/keys.d.ts +12 -0
- package/dist/types/{tree/constants.d.ts → core/literals.d.ts} +9 -11
- package/dist/types/core/promise-to-result.d.ts +1 -0
- package/dist/types/{tree → core}/reference.d.ts +5 -6
- package/dist/types/{tree → core}/shared.d.ts +13 -11
- package/dist/types/{string.d.ts → core/string.d.ts} +3 -3
- package/dist/types/core/tree/async.d.ts +3 -0
- package/dist/types/core/tree/context.d.ts +45 -0
- package/dist/types/core/tree/deserialize.d.ts +3 -0
- package/dist/types/core/tree/index.d.ts +15 -0
- package/dist/types/core/tree/primitives.d.ts +9 -0
- package/dist/types/core/tree/serialize.d.ts +4 -0
- package/dist/types/core/tree/sync.d.ts +3 -0
- package/dist/types/core/tree/web-api.d.ts +4 -0
- package/dist/types/{tree → core}/types.d.ts +228 -228
- package/dist/types/core/web-api.d.ts +4 -0
- package/dist/types/index.d.ts +9 -19
- package/dist/types/types.d.ts +20 -20
- package/package.json +7 -7
- package/src/core/Serializer.ts +46 -0
- package/src/{tree → core}/UnsupportedTypeError.ts +1 -1
- package/src/core/assignments.ts +159 -0
- package/src/{tree/primitives.ts → core/base-primitives.ts} +42 -133
- package/src/core/constants.ts +169 -0
- package/src/core/context.ts +15 -0
- package/src/core/cross/async.ts +614 -0
- package/src/core/cross/context.ts +79 -0
- package/src/core/cross/index.ts +154 -0
- package/src/core/cross/primitives.ts +137 -0
- package/src/core/cross/serialize.ts +846 -0
- package/src/core/cross/stream.ts +740 -0
- package/src/core/cross/sync.ts +561 -0
- package/src/core/cross/web-api.ts +55 -0
- package/src/core/header.js +65 -0
- package/src/core/keys.ts +33 -0
- package/src/core/literals.ts +28 -0
- package/src/core/promise-to-result.ts +9 -0
- package/src/{tree → core}/reference.ts +6 -8
- package/src/{tree → core}/shared.ts +17 -3
- package/src/{tree → core/tree}/async.ts +57 -34
- package/src/core/tree/context.ts +136 -0
- package/src/{tree → core/tree}/deserialize.ts +83 -54
- package/src/core/tree/index.ts +146 -0
- package/src/core/tree/primitives.ts +132 -0
- package/src/{tree → core/tree}/serialize.ts +124 -178
- package/src/{tree → core/tree}/sync.ts +60 -39
- package/src/{tree → core/tree}/web-api.ts +10 -50
- package/src/{tree → core}/types.ts +82 -54
- package/src/core/web-api.ts +51 -0
- package/src/index.ts +7 -141
- package/src/types.ts +1 -1
- package/dist/types/context.d.ts +0 -61
- package/dist/types/tree/async.d.ts +0 -3
- package/dist/types/tree/deserialize.d.ts +0 -3
- package/dist/types/tree/primitives.d.ts +0 -19
- package/dist/types/tree/serialize.d.ts +0 -4
- package/dist/types/tree/symbols.d.ts +0 -33
- package/dist/types/tree/sync.d.ts +0 -3
- package/dist/types/tree/web-api.d.ts +0 -6
- package/src/context.ts +0 -154
- package/src/tree/constants.ts +0 -72
- package/src/tree/iterator.ts +0 -14
- package/src/tree/symbols.ts +0 -65
- /package/src/{assert.ts → core/assert.ts} +0 -0
- /package/src/{compat.ts → core/compat.ts} +0 -0
- /package/src/{get-identifier.ts → core/get-identifier.ts} +0 -0
- /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 '
|
|
5
|
-
import { createIndexedValue } from '
|
|
4
|
+
import type { ParserContext } from './context';
|
|
5
|
+
import { createIndexedValue } from './context';
|
|
6
6
|
import { serializeString } from '../string';
|
|
7
|
-
import type { BigIntTypedArrayValue, TypedArrayValue } from '
|
|
8
|
-
import UnsupportedTypeError from '
|
|
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 '
|
|
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 '
|
|
24
|
+
} from '../reference';
|
|
33
25
|
import {
|
|
34
26
|
getErrorConstructorName,
|
|
35
27
|
getErrorOptions,
|
|
28
|
+
getObjectFlag,
|
|
36
29
|
isIterable,
|
|
37
|
-
} from '
|
|
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
|
-
|
|
45
|
+
SerovalSyncNode,
|
|
46
|
+
} from '../types';
|
|
54
47
|
import {
|
|
55
|
-
SerovalNodeType,
|
|
56
48
|
SerovalObjectRecordSpecialKey,
|
|
57
|
-
} from '
|
|
58
|
-
import {
|
|
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[]):
|
|
65
|
+
function generateNodeList(ctx: ParserContext, current: unknown[]): SerovalSyncNode[] {
|
|
63
66
|
const size = current.length;
|
|
64
|
-
const nodes = new Array<
|
|
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
|
-
|
|
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<
|
|
112
|
-
const valueNodes = new Array<
|
|
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
|
-
|
|
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<
|
|
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
|
-
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
):
|
|
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.
|
|
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
|
-
):
|
|
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 '
|
|
3
|
+
import type { ParserContext } from './context';
|
|
4
4
|
import { serializeString } from '../string';
|
|
5
|
-
import UnsupportedTypeError from '
|
|
5
|
+
import UnsupportedTypeError from '../UnsupportedTypeError';
|
|
6
6
|
import { serializeArrayBuffer } from './primitives';
|
|
7
7
|
import type {
|
|
8
8
|
SerovalBlobNode,
|
|
9
9
|
SerovalFileNode,
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
//
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
+
e: SerovalPlainRecordNode;
|
|
317
288
|
}
|
|
318
289
|
|
|
319
290
|
export interface SerovalFormDataNode extends SerovalBaseNode {
|
|
320
291
|
t: SerovalNodeType.FormData;
|
|
321
292
|
i: number;
|
|
322
|
-
|
|
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
|
|
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
|
+
}
|