seroval 0.4.0-alpha.7 → 0.4.0-alpha.9
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/dist/cjs/development/index.cjs +387 -179
- package/dist/cjs/development/index.cjs.map +2 -2
- package/dist/cjs/production/index.cjs +2 -2
- package/dist/esm/development/index.mjs +387 -179
- package/dist/esm/development/index.mjs.map +2 -2
- package/dist/esm/production/index.mjs +2 -2
- package/dist/types/context.d.ts +5 -4
- package/dist/types/tree/serialize.d.ts +1 -1
- package/dist/types/tree/types.d.ts +108 -59
- package/package.json +2 -2
- package/src/context.ts +16 -14
- package/src/index.ts +3 -3
- package/src/tree/async.ts +111 -34
- package/src/tree/serialize.ts +117 -122
- package/src/tree/shared.ts +67 -11
- package/src/tree/sync.ts +99 -25
- package/src/tree/types.ts +143 -65
package/src/tree/sync.ts
CHANGED
|
@@ -15,19 +15,19 @@ import {
|
|
|
15
15
|
import {
|
|
16
16
|
SerovalAggregateErrorNode,
|
|
17
17
|
SerovalArrayNode,
|
|
18
|
-
SerovalDictionaryNode,
|
|
19
18
|
SerovalErrorNode,
|
|
20
19
|
SerovalIterableNode,
|
|
21
20
|
SerovalMapNode,
|
|
22
21
|
SerovalNode,
|
|
23
22
|
SerovalNodeType,
|
|
23
|
+
SerovalObjectRecordNode,
|
|
24
24
|
SerovalSetNode,
|
|
25
25
|
} from './types';
|
|
26
26
|
|
|
27
27
|
function serializePropertiesSync(
|
|
28
28
|
ctx: ParserContext,
|
|
29
29
|
properties: Record<string, unknown>,
|
|
30
|
-
):
|
|
30
|
+
): SerovalObjectRecordNode {
|
|
31
31
|
const keys = Object.keys(properties);
|
|
32
32
|
const size = keys.length;
|
|
33
33
|
const keyNodes = new Array<string>(size);
|
|
@@ -51,7 +51,11 @@ function serializePropertiesSync(
|
|
|
51
51
|
keyNodes[nodesSize + i] = deferredKeys[i];
|
|
52
52
|
valueNodes[nodesSize + i] = generateTreeSync(ctx, deferredValues[i]);
|
|
53
53
|
}
|
|
54
|
-
return
|
|
54
|
+
return {
|
|
55
|
+
k: keyNodes,
|
|
56
|
+
v: valueNodes,
|
|
57
|
+
s: size,
|
|
58
|
+
};
|
|
55
59
|
}
|
|
56
60
|
|
|
57
61
|
function generateSetNode(
|
|
@@ -77,7 +81,17 @@ function generateSetNode(
|
|
|
77
81
|
for (let i = 0; i < deferredSize; i++) {
|
|
78
82
|
nodes[nodeSize + i] = generateTreeSync(ctx, deferred[i]);
|
|
79
83
|
}
|
|
80
|
-
return
|
|
84
|
+
return {
|
|
85
|
+
t: SerovalNodeType.Set,
|
|
86
|
+
i: id,
|
|
87
|
+
a: nodes,
|
|
88
|
+
s: undefined,
|
|
89
|
+
l: undefined,
|
|
90
|
+
m: undefined,
|
|
91
|
+
c: undefined,
|
|
92
|
+
d: undefined,
|
|
93
|
+
n: undefined,
|
|
94
|
+
};
|
|
81
95
|
}
|
|
82
96
|
|
|
83
97
|
function generateMapNode(
|
|
@@ -109,7 +123,17 @@ function generateMapNode(
|
|
|
109
123
|
keyNodes[nodeSize + i] = generateTreeSync(ctx, deferredKey[i]);
|
|
110
124
|
valueNodes[nodeSize + i] = generateTreeSync(ctx, deferredValue[i]);
|
|
111
125
|
}
|
|
112
|
-
return
|
|
126
|
+
return {
|
|
127
|
+
t: SerovalNodeType.Map,
|
|
128
|
+
i: id,
|
|
129
|
+
a: undefined,
|
|
130
|
+
s: undefined,
|
|
131
|
+
l: undefined,
|
|
132
|
+
m: undefined,
|
|
133
|
+
c: undefined,
|
|
134
|
+
d: { k: keyNodes, v: valueNodes, s: len },
|
|
135
|
+
n: undefined,
|
|
136
|
+
};
|
|
113
137
|
}
|
|
114
138
|
|
|
115
139
|
function generateNodeList(
|
|
@@ -141,7 +165,17 @@ function generateArrayNode(
|
|
|
141
165
|
current: ServerValue[],
|
|
142
166
|
id: number,
|
|
143
167
|
): SerovalArrayNode {
|
|
144
|
-
return
|
|
168
|
+
return {
|
|
169
|
+
t: SerovalNodeType.Array,
|
|
170
|
+
i: id,
|
|
171
|
+
a: generateNodeList(ctx, current),
|
|
172
|
+
s: undefined,
|
|
173
|
+
l: undefined,
|
|
174
|
+
m: undefined,
|
|
175
|
+
c: undefined,
|
|
176
|
+
d: undefined,
|
|
177
|
+
n: undefined,
|
|
178
|
+
};
|
|
145
179
|
}
|
|
146
180
|
|
|
147
181
|
function generateAggregateErrorNode(
|
|
@@ -153,8 +187,17 @@ function generateAggregateErrorNode(
|
|
|
153
187
|
const optionsNode = options
|
|
154
188
|
? serializePropertiesSync(ctx, options)
|
|
155
189
|
: undefined;
|
|
156
|
-
|
|
157
|
-
|
|
190
|
+
return {
|
|
191
|
+
t: SerovalNodeType.AggregateError,
|
|
192
|
+
i: id,
|
|
193
|
+
a: undefined,
|
|
194
|
+
s: undefined,
|
|
195
|
+
l: undefined,
|
|
196
|
+
m: current.message,
|
|
197
|
+
c: undefined,
|
|
198
|
+
d: optionsNode,
|
|
199
|
+
n: generateTreeSync(ctx, current.errors as ServerValue),
|
|
200
|
+
};
|
|
158
201
|
}
|
|
159
202
|
|
|
160
203
|
function generateErrorNode(
|
|
@@ -166,11 +209,17 @@ function generateErrorNode(
|
|
|
166
209
|
const optionsNode = options
|
|
167
210
|
? serializePropertiesSync(ctx, options)
|
|
168
211
|
: undefined;
|
|
169
|
-
return
|
|
170
|
-
SerovalNodeType.Error,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
212
|
+
return {
|
|
213
|
+
t: SerovalNodeType.Error,
|
|
214
|
+
i: id,
|
|
215
|
+
a: undefined,
|
|
216
|
+
s: undefined,
|
|
217
|
+
l: undefined,
|
|
218
|
+
m: current.message,
|
|
219
|
+
c: getErrorConstructor(current),
|
|
220
|
+
d: optionsNode,
|
|
221
|
+
n: undefined,
|
|
222
|
+
};
|
|
174
223
|
}
|
|
175
224
|
|
|
176
225
|
function generateIterableNode(
|
|
@@ -180,11 +229,18 @@ function generateIterableNode(
|
|
|
180
229
|
): SerovalIterableNode {
|
|
181
230
|
assert(ctx.features & Feature.SymbolIterator, 'Unsupported type "Iterable"');
|
|
182
231
|
const options = getIterableOptions(current);
|
|
183
|
-
return
|
|
232
|
+
return {
|
|
233
|
+
t: SerovalNodeType.Iterable,
|
|
234
|
+
i: id,
|
|
235
|
+
s: undefined,
|
|
236
|
+
l: undefined,
|
|
237
|
+
m: undefined,
|
|
238
|
+
c: undefined,
|
|
184
239
|
// Parse options first before the items
|
|
185
|
-
options ? serializePropertiesSync(ctx, options) : undefined,
|
|
186
|
-
generateNodeList(ctx, Array.from(current)),
|
|
187
|
-
|
|
240
|
+
d: options ? serializePropertiesSync(ctx, options) : undefined,
|
|
241
|
+
a: generateNodeList(ctx, Array.from(current)),
|
|
242
|
+
n: undefined,
|
|
243
|
+
};
|
|
188
244
|
}
|
|
189
245
|
|
|
190
246
|
function generateTreeSync(
|
|
@@ -192,12 +248,23 @@ function generateTreeSync(
|
|
|
192
248
|
current: ServerValue,
|
|
193
249
|
): SerovalNode {
|
|
194
250
|
if (isPrimitive(current)) {
|
|
195
|
-
return
|
|
251
|
+
return {
|
|
252
|
+
t: SerovalNodeType.Primitive,
|
|
253
|
+
i: undefined,
|
|
254
|
+
s: serializePrimitive(current),
|
|
255
|
+
l: undefined,
|
|
256
|
+
m: undefined,
|
|
257
|
+
c: undefined,
|
|
258
|
+
// Parse options first before the items
|
|
259
|
+
d: undefined,
|
|
260
|
+
a: undefined,
|
|
261
|
+
n: undefined,
|
|
262
|
+
};
|
|
196
263
|
}
|
|
197
264
|
// Non-primitive values needs a reference ID
|
|
198
265
|
// mostly because the values themselves are stateful
|
|
199
266
|
const id = generateRef(ctx, current);
|
|
200
|
-
if (
|
|
267
|
+
if (typeof id !== 'number') {
|
|
201
268
|
return id;
|
|
202
269
|
}
|
|
203
270
|
const semiPrimitive = generateSemiPrimitiveValue(ctx, current, id);
|
|
@@ -224,11 +291,18 @@ function generateTreeSync(
|
|
|
224
291
|
}
|
|
225
292
|
const empty = current.constructor == null;
|
|
226
293
|
if (current.constructor === Object || empty) {
|
|
227
|
-
return
|
|
228
|
-
empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
294
|
+
return {
|
|
295
|
+
t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
|
|
296
|
+
i: id,
|
|
297
|
+
s: undefined,
|
|
298
|
+
l: undefined,
|
|
299
|
+
m: undefined,
|
|
300
|
+
c: undefined,
|
|
301
|
+
// Parse options first before the items
|
|
302
|
+
d: serializePropertiesSync(ctx, current as Record<string, unknown>),
|
|
303
|
+
a: undefined,
|
|
304
|
+
n: undefined,
|
|
305
|
+
};
|
|
232
306
|
}
|
|
233
307
|
throw new Error('Unsupported value');
|
|
234
308
|
}
|
|
@@ -238,5 +312,5 @@ export default function parseSync(
|
|
|
238
312
|
current: ServerValue,
|
|
239
313
|
) {
|
|
240
314
|
const result = generateTreeSync(ctx, current);
|
|
241
|
-
return [result, createRef(ctx, current), result
|
|
315
|
+
return [result, createRef(ctx, current), result.t === SerovalNodeType.Object] as const;
|
|
242
316
|
}
|
package/src/tree/types.ts
CHANGED
|
@@ -19,72 +19,150 @@ export const enum SerovalNodeType {
|
|
|
19
19
|
BigIntTypedArray,
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
export interface SerovalBaseNode {
|
|
23
|
+
// Type of the node
|
|
24
|
+
t: SerovalNodeType;
|
|
25
|
+
// Serialized value
|
|
26
|
+
s: PrimitiveValue | undefined;
|
|
27
|
+
// Reference ID
|
|
28
|
+
i: number | undefined;
|
|
29
|
+
// Size/Byte offset
|
|
30
|
+
l: number | undefined;
|
|
31
|
+
// Constructor name
|
|
32
|
+
c: string | undefined;
|
|
33
|
+
// dictionary
|
|
34
|
+
d: SerovalDictionaryNode | undefined;
|
|
35
|
+
// message
|
|
36
|
+
m: string | undefined;
|
|
37
|
+
// next node
|
|
38
|
+
n: SerovalNode | undefined;
|
|
39
|
+
// array of nodes
|
|
40
|
+
a: SerovalNode[] | undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface SerovalObjectRecordNode {
|
|
44
|
+
k: string[];
|
|
45
|
+
v: SerovalNode[];
|
|
46
|
+
s: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface SerovalMapRecordNode {
|
|
50
|
+
k: SerovalNode[];
|
|
51
|
+
v: SerovalNode[];
|
|
52
|
+
s: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type SerovalDictionaryNode =
|
|
56
|
+
| SerovalObjectRecordNode
|
|
57
|
+
| SerovalMapRecordNode;
|
|
58
|
+
|
|
59
|
+
export interface SerovalPrimitiveNode extends SerovalBaseNode {
|
|
60
|
+
t: SerovalNodeType.Primitive;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface SerovalReferenceNode extends SerovalBaseNode {
|
|
64
|
+
t: SerovalNodeType.Reference;
|
|
65
|
+
i: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface SerovalBigIntNode extends SerovalBaseNode {
|
|
69
|
+
t: SerovalNodeType.BigInt;
|
|
70
|
+
s: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface SerovalDateNode extends SerovalBaseNode {
|
|
74
|
+
t: SerovalNodeType.Date;
|
|
75
|
+
i: number;
|
|
76
|
+
s: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface SerovalRegExpNode extends SerovalBaseNode {
|
|
80
|
+
t: SerovalNodeType.RegExp;
|
|
81
|
+
i: number;
|
|
82
|
+
s: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface SerovalTypedArrayNode extends SerovalBaseNode {
|
|
86
|
+
t: SerovalNodeType.TypedArray;
|
|
87
|
+
i: number;
|
|
88
|
+
s: string;
|
|
89
|
+
l: number;
|
|
90
|
+
c: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface SerovalBigIntTypedArrayNode extends SerovalBaseNode {
|
|
94
|
+
t: SerovalNodeType.BigIntTypedArray;
|
|
95
|
+
i: number;
|
|
96
|
+
s: string;
|
|
97
|
+
l: number;
|
|
98
|
+
c: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
27
101
|
export type SerovalSemiPrimitiveNode =
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
];
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
102
|
+
| SerovalBigIntNode
|
|
103
|
+
| SerovalDateNode
|
|
104
|
+
| SerovalRegExpNode
|
|
105
|
+
| SerovalTypedArrayNode
|
|
106
|
+
| SerovalBigIntTypedArrayNode;
|
|
107
|
+
|
|
108
|
+
export interface SerovalSetNode extends SerovalBaseNode {
|
|
109
|
+
t: SerovalNodeType.Set;
|
|
110
|
+
a: SerovalNode[];
|
|
111
|
+
i: number;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface SerovalMapNode extends SerovalBaseNode {
|
|
115
|
+
t: SerovalNodeType.Map;
|
|
116
|
+
d: SerovalMapRecordNode;
|
|
117
|
+
i: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface SerovalArrayNode extends SerovalBaseNode {
|
|
121
|
+
t: SerovalNodeType.Array;
|
|
122
|
+
a: SerovalNode[];
|
|
123
|
+
i: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface SerovalObjectNode extends SerovalBaseNode {
|
|
127
|
+
t: SerovalNodeType.Object;
|
|
128
|
+
d: SerovalObjectRecordNode;
|
|
129
|
+
i: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface SerovalNullConstructorNode extends SerovalBaseNode {
|
|
133
|
+
t: SerovalNodeType.NullConstructor;
|
|
134
|
+
d: SerovalObjectRecordNode;
|
|
135
|
+
i: number;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface SerovalPromiseNode extends SerovalBaseNode {
|
|
139
|
+
t: SerovalNodeType.Promise;
|
|
140
|
+
n: SerovalNode;
|
|
141
|
+
i: number;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface SerovalErrorNode extends SerovalBaseNode {
|
|
145
|
+
t: SerovalNodeType.Error;
|
|
146
|
+
c: string;
|
|
147
|
+
m: string;
|
|
148
|
+
d: SerovalObjectRecordNode | undefined;
|
|
149
|
+
i: number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface SerovalAggregateErrorNode extends SerovalBaseNode {
|
|
153
|
+
t: SerovalNodeType.AggregateError;
|
|
154
|
+
m: string;
|
|
155
|
+
d: SerovalObjectRecordNode | undefined;
|
|
156
|
+
n: SerovalNode;
|
|
157
|
+
i: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface SerovalIterableNode extends SerovalBaseNode {
|
|
161
|
+
t: SerovalNodeType.Iterable;
|
|
162
|
+
d: SerovalObjectRecordNode | undefined;
|
|
163
|
+
a: SerovalNode[];
|
|
164
|
+
i: number;
|
|
165
|
+
}
|
|
88
166
|
|
|
89
167
|
export type SerovalNode =
|
|
90
168
|
| SerovalPrimitiveNode
|