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.
- package/README.md +15 -3
- package/dist/cjs/development/index.cjs +1431 -991
- package/dist/cjs/development/index.cjs.map +4 -4
- package/dist/cjs/production/index.cjs +3 -3
- package/dist/esm/development/index.mjs +1431 -991
- package/dist/esm/development/index.mjs.map +4 -4
- package/dist/esm/production/index.mjs +3 -3
- package/dist/types/assert.d.ts +1 -1
- package/dist/types/compat.d.ts +1 -1
- package/dist/types/context.d.ts +13 -7
- package/dist/types/index.d.ts +3 -4
- package/dist/types/string.d.ts +3 -0
- package/dist/types/tree/UnsupportedTypeError.d.ts +3 -0
- package/dist/types/tree/async.d.ts +3 -3
- package/dist/types/tree/constants.d.ts +11 -0
- package/dist/types/tree/deserialize.d.ts +2 -2
- package/dist/types/tree/primitives.d.ts +11 -14
- package/dist/types/tree/serialize.d.ts +2 -2
- package/dist/types/tree/shared.d.ts +10 -8
- package/dist/types/tree/sync.d.ts +3 -3
- package/dist/types/tree/types.d.ts +106 -70
- package/dist/types/tree/web-api.d.ts +4 -2
- package/dist/types/types.d.ts +4 -4
- package/package.json +11 -8
- package/src/assert.ts +2 -2
- package/src/compat.ts +1 -2
- package/src/context.ts +24 -13
- package/src/get-identifier.ts +1 -1
- package/src/index.ts +35 -26
- package/src/string.ts +53 -0
- package/src/tree/UnsupportedTypeError.ts +8 -0
- package/src/tree/async.ts +313 -222
- package/src/tree/constants.ts +72 -0
- package/src/tree/deserialize.ts +239 -119
- package/src/tree/primitives.ts +154 -143
- package/src/tree/reference.ts +4 -3
- package/src/tree/serialize.ts +394 -170
- package/src/tree/shared.ts +31 -22
- package/src/tree/symbols.ts +13 -13
- package/src/tree/sync.ts +288 -191
- package/src/tree/types.ts +173 -91
- package/src/tree/web-api.ts +59 -6
- package/src/types.ts +7 -3
- package/dist/types/quote.d.ts +0 -2
- 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
|
+
}
|
package/src/tree/deserialize.ts
CHANGED
|
@@ -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 {
|
|
6
|
-
import {
|
|
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
|
-
|
|
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.
|
|
33
|
-
|
|
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
|
|
52
|
+
return value;
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
function deserializeArray(
|
|
52
56
|
ctx: SerializationContext,
|
|
53
57
|
node: SerovalArrayNode,
|
|
54
|
-
) {
|
|
55
|
-
const
|
|
58
|
+
): unknown[] {
|
|
59
|
+
const len = node.l;
|
|
60
|
+
const result: unknown[] = assignIndexedValue(
|
|
56
61
|
ctx,
|
|
57
62
|
node.i,
|
|
58
|
-
new Array<
|
|
63
|
+
new Array<unknown>(len),
|
|
59
64
|
);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
for (let i = 0, len = node.
|
|
113
|
-
result.add(deserializeTree(ctx,
|
|
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
|
-
|
|
129
|
-
|
|
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,
|
|
132
|
-
deserializeTree(ctx,
|
|
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<
|
|
140
|
-
type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode
|
|
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(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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(
|
|
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
|
|
232
|
+
const source = deserializeTree(ctx, node.f) as ArrayBuffer;
|
|
213
233
|
const result = assignIndexedValue(ctx, node.i, new TypedArray(
|
|
214
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
330
|
+
function deserializeFormData(
|
|
226
331
|
ctx: SerializationContext,
|
|
227
|
-
node:
|
|
228
|
-
) {
|
|
229
|
-
const
|
|
230
|
-
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
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
|
|
376
|
+
return deserializeObject(ctx, node);
|
|
269
377
|
case SerovalNodeType.Date:
|
|
270
|
-
return
|
|
378
|
+
return deserializeDate(ctx, node);
|
|
271
379
|
case SerovalNodeType.RegExp:
|
|
272
|
-
return
|
|
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
|
|
401
|
+
return deserializeURL(ctx, node);
|
|
292
402
|
case SerovalNodeType.URLSearchParams:
|
|
293
|
-
return
|
|
403
|
+
return deserializeURLSearchParams(ctx, node);
|
|
294
404
|
case SerovalNodeType.Reference:
|
|
295
|
-
return
|
|
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('
|
|
417
|
+
throw new Error('invariant');
|
|
298
418
|
}
|
|
299
419
|
}
|