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
|
@@ -17,63 +17,112 @@ export declare const enum SerovalNodeType {
|
|
|
17
17
|
TypedArray = 14,
|
|
18
18
|
BigIntTypedArray = 15
|
|
19
19
|
}
|
|
20
|
-
export
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
] |
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
export
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
export type
|
|
42
|
-
export
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
export
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
20
|
+
export interface SerovalBaseNode {
|
|
21
|
+
t: SerovalNodeType;
|
|
22
|
+
s: PrimitiveValue | undefined;
|
|
23
|
+
i: number | undefined;
|
|
24
|
+
l: number | undefined;
|
|
25
|
+
c: string | undefined;
|
|
26
|
+
d: SerovalDictionaryNode | undefined;
|
|
27
|
+
m: string | undefined;
|
|
28
|
+
n: SerovalNode | undefined;
|
|
29
|
+
a: SerovalNode[] | undefined;
|
|
30
|
+
}
|
|
31
|
+
export interface SerovalObjectRecordNode {
|
|
32
|
+
k: string[];
|
|
33
|
+
v: SerovalNode[];
|
|
34
|
+
s: number;
|
|
35
|
+
}
|
|
36
|
+
export interface SerovalMapRecordNode {
|
|
37
|
+
k: SerovalNode[];
|
|
38
|
+
v: SerovalNode[];
|
|
39
|
+
s: number;
|
|
40
|
+
}
|
|
41
|
+
export type SerovalDictionaryNode = SerovalObjectRecordNode | SerovalMapRecordNode;
|
|
42
|
+
export interface SerovalPrimitiveNode extends SerovalBaseNode {
|
|
43
|
+
t: SerovalNodeType.Primitive;
|
|
44
|
+
}
|
|
45
|
+
export interface SerovalReferenceNode extends SerovalBaseNode {
|
|
46
|
+
t: SerovalNodeType.Reference;
|
|
47
|
+
i: number;
|
|
48
|
+
}
|
|
49
|
+
export interface SerovalBigIntNode extends SerovalBaseNode {
|
|
50
|
+
t: SerovalNodeType.BigInt;
|
|
51
|
+
s: string;
|
|
52
|
+
}
|
|
53
|
+
export interface SerovalDateNode extends SerovalBaseNode {
|
|
54
|
+
t: SerovalNodeType.Date;
|
|
55
|
+
i: number;
|
|
56
|
+
s: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SerovalRegExpNode extends SerovalBaseNode {
|
|
59
|
+
t: SerovalNodeType.RegExp;
|
|
60
|
+
i: number;
|
|
61
|
+
s: string;
|
|
62
|
+
}
|
|
63
|
+
export interface SerovalTypedArrayNode extends SerovalBaseNode {
|
|
64
|
+
t: SerovalNodeType.TypedArray;
|
|
65
|
+
i: number;
|
|
66
|
+
s: string;
|
|
67
|
+
l: number;
|
|
68
|
+
c: string;
|
|
69
|
+
}
|
|
70
|
+
export interface SerovalBigIntTypedArrayNode extends SerovalBaseNode {
|
|
71
|
+
t: SerovalNodeType.BigIntTypedArray;
|
|
72
|
+
i: number;
|
|
73
|
+
s: string;
|
|
74
|
+
l: number;
|
|
75
|
+
c: string;
|
|
76
|
+
}
|
|
77
|
+
export type SerovalSemiPrimitiveNode = SerovalBigIntNode | SerovalDateNode | SerovalRegExpNode | SerovalTypedArrayNode | SerovalBigIntTypedArrayNode;
|
|
78
|
+
export interface SerovalSetNode extends SerovalBaseNode {
|
|
79
|
+
t: SerovalNodeType.Set;
|
|
80
|
+
a: SerovalNode[];
|
|
81
|
+
i: number;
|
|
82
|
+
}
|
|
83
|
+
export interface SerovalMapNode extends SerovalBaseNode {
|
|
84
|
+
t: SerovalNodeType.Map;
|
|
85
|
+
d: SerovalMapRecordNode;
|
|
86
|
+
i: number;
|
|
87
|
+
}
|
|
88
|
+
export interface SerovalArrayNode extends SerovalBaseNode {
|
|
89
|
+
t: SerovalNodeType.Array;
|
|
90
|
+
a: SerovalNode[];
|
|
91
|
+
i: number;
|
|
92
|
+
}
|
|
93
|
+
export interface SerovalObjectNode extends SerovalBaseNode {
|
|
94
|
+
t: SerovalNodeType.Object;
|
|
95
|
+
d: SerovalObjectRecordNode;
|
|
96
|
+
i: number;
|
|
97
|
+
}
|
|
98
|
+
export interface SerovalNullConstructorNode extends SerovalBaseNode {
|
|
99
|
+
t: SerovalNodeType.NullConstructor;
|
|
100
|
+
d: SerovalObjectRecordNode;
|
|
101
|
+
i: number;
|
|
102
|
+
}
|
|
103
|
+
export interface SerovalPromiseNode extends SerovalBaseNode {
|
|
104
|
+
t: SerovalNodeType.Promise;
|
|
105
|
+
n: SerovalNode;
|
|
106
|
+
i: number;
|
|
107
|
+
}
|
|
108
|
+
export interface SerovalErrorNode extends SerovalBaseNode {
|
|
109
|
+
t: SerovalNodeType.Error;
|
|
110
|
+
c: string;
|
|
111
|
+
m: string;
|
|
112
|
+
d: SerovalObjectRecordNode | undefined;
|
|
113
|
+
i: number;
|
|
114
|
+
}
|
|
115
|
+
export interface SerovalAggregateErrorNode extends SerovalBaseNode {
|
|
116
|
+
t: SerovalNodeType.AggregateError;
|
|
117
|
+
m: string;
|
|
118
|
+
d: SerovalObjectRecordNode | undefined;
|
|
119
|
+
n: SerovalNode;
|
|
120
|
+
i: number;
|
|
121
|
+
}
|
|
122
|
+
export interface SerovalIterableNode extends SerovalBaseNode {
|
|
123
|
+
t: SerovalNodeType.Iterable;
|
|
124
|
+
d: SerovalObjectRecordNode | undefined;
|
|
125
|
+
a: SerovalNode[];
|
|
126
|
+
i: number;
|
|
127
|
+
}
|
|
79
128
|
export type SerovalNode = SerovalPrimitiveNode | SerovalReferenceNode | SerovalSemiPrimitiveNode | SerovalSetNode | SerovalMapNode | SerovalArrayNode | SerovalObjectNode | SerovalNullConstructorNode | SerovalPromiseNode | SerovalErrorNode | SerovalAggregateErrorNode | SerovalIterableNode;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "seroval",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.4.0-alpha.
|
|
4
|
+
"version": "0.4.0-alpha.9",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
7
|
"src"
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"typesVersions": {
|
|
65
65
|
"*": {}
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "27ff8d23e589e5968ebe968b14d050cd468ca49f"
|
|
68
68
|
}
|
package/src/context.ts
CHANGED
|
@@ -28,16 +28,17 @@ export type Assignment =
|
|
|
28
28
|
|
|
29
29
|
export interface ParserContext {
|
|
30
30
|
refs: Map<unknown, number>;
|
|
31
|
-
markedRefs:
|
|
31
|
+
markedRefs: Record<number, number>;
|
|
32
32
|
features: number;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export interface SerializationContext {
|
|
36
36
|
stack: number[];
|
|
37
37
|
// Map tree refs to actual refs
|
|
38
|
-
validRefs:
|
|
38
|
+
validRefs: number[];
|
|
39
|
+
refSize: number;
|
|
39
40
|
// Refs that are...referenced
|
|
40
|
-
markedRefs:
|
|
41
|
+
markedRefs: Record<number, number>;
|
|
41
42
|
// Variables
|
|
42
43
|
vars: string[];
|
|
43
44
|
// Array of assignments to be done (used for recursion)
|
|
@@ -58,14 +59,14 @@ export function createParserContext(options: Partial<Options> = {}): ParserConte
|
|
|
58
59
|
// eslint-disable-next-line prefer-object-spread
|
|
59
60
|
const result = Object.assign({}, DEFAULT_OPTIONS, options || {});
|
|
60
61
|
return {
|
|
61
|
-
markedRefs:
|
|
62
|
+
markedRefs: {},
|
|
62
63
|
refs: new Map(),
|
|
63
64
|
features: parseTargets(result.target),
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
export interface SerializationOptions {
|
|
68
|
-
markedRefs: number
|
|
69
|
+
markedRefs: Record<number, number>;
|
|
69
70
|
features: number;
|
|
70
71
|
}
|
|
71
72
|
|
|
@@ -74,9 +75,10 @@ export function createSerializationContext(options: SerializationOptions): Seria
|
|
|
74
75
|
stack: [],
|
|
75
76
|
vars: [],
|
|
76
77
|
assignments: [],
|
|
77
|
-
validRefs:
|
|
78
|
+
validRefs: [],
|
|
79
|
+
refSize: 0,
|
|
78
80
|
features: options.features,
|
|
79
|
-
markedRefs:
|
|
81
|
+
markedRefs: options.markedRefs,
|
|
80
82
|
};
|
|
81
83
|
}
|
|
82
84
|
|
|
@@ -84,7 +86,7 @@ export function createSerializationContext(options: SerializationOptions): Seria
|
|
|
84
86
|
* Increments the number of references the referenced value has
|
|
85
87
|
*/
|
|
86
88
|
export function markRef(ctx: ParserContext | SerializationContext, current: number) {
|
|
87
|
-
ctx.markedRefs
|
|
89
|
+
ctx.markedRefs[current] = 1;
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
/**
|
|
@@ -97,13 +99,13 @@ function createValidRef(
|
|
|
97
99
|
ctx: SerializationContext,
|
|
98
100
|
index: number,
|
|
99
101
|
) {
|
|
100
|
-
const current = ctx.validRefs
|
|
101
|
-
if (current
|
|
102
|
-
|
|
102
|
+
const current = ctx.validRefs[index];
|
|
103
|
+
if (current == null) {
|
|
104
|
+
const value = ctx.refSize++;
|
|
105
|
+
ctx.validRefs[index] = value;
|
|
106
|
+
return value;
|
|
103
107
|
}
|
|
104
|
-
|
|
105
|
-
ctx.validRefs.set(index, id);
|
|
106
|
-
return id;
|
|
108
|
+
return current;
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
/**
|
package/src/index.ts
CHANGED
|
@@ -106,7 +106,7 @@ type SerovalJSON = [
|
|
|
106
106
|
root: number,
|
|
107
107
|
isObject: boolean,
|
|
108
108
|
feature: number,
|
|
109
|
-
markedRefs: number
|
|
109
|
+
markedRefs: Record<number, number>,
|
|
110
110
|
];
|
|
111
111
|
|
|
112
112
|
export function toJSON<T extends ServerValue>(
|
|
@@ -120,7 +120,7 @@ export function toJSON<T extends ServerValue>(
|
|
|
120
120
|
root,
|
|
121
121
|
isObject,
|
|
122
122
|
ctx.features,
|
|
123
|
-
|
|
123
|
+
ctx.markedRefs,
|
|
124
124
|
]);
|
|
125
125
|
}
|
|
126
126
|
|
|
@@ -135,7 +135,7 @@ export async function toJSONAsync<T extends AsyncServerValue>(
|
|
|
135
135
|
root,
|
|
136
136
|
isObject,
|
|
137
137
|
ctx.features,
|
|
138
|
-
|
|
138
|
+
ctx.markedRefs,
|
|
139
139
|
]);
|
|
140
140
|
}
|
|
141
141
|
|
package/src/tree/async.ts
CHANGED
|
@@ -21,19 +21,19 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
SerovalAggregateErrorNode,
|
|
23
23
|
SerovalArrayNode,
|
|
24
|
-
SerovalDictionaryNode,
|
|
25
24
|
SerovalErrorNode,
|
|
26
25
|
SerovalIterableNode,
|
|
27
26
|
SerovalMapNode,
|
|
28
27
|
SerovalNode,
|
|
29
28
|
SerovalNodeType,
|
|
29
|
+
SerovalObjectRecordNode,
|
|
30
30
|
SerovalSetNode,
|
|
31
31
|
} from './types';
|
|
32
32
|
|
|
33
33
|
async function serializePropertiesAsync(
|
|
34
34
|
ctx: ParserContext,
|
|
35
35
|
properties: Record<string, unknown>,
|
|
36
|
-
): Promise<
|
|
36
|
+
): Promise<SerovalObjectRecordNode> {
|
|
37
37
|
const keys = Object.keys(properties);
|
|
38
38
|
const size = keys.length;
|
|
39
39
|
const keyNodes = new Array<string>(size);
|
|
@@ -57,7 +57,11 @@ async function serializePropertiesAsync(
|
|
|
57
57
|
keyNodes[nodesSize + i] = deferredKeys[i];
|
|
58
58
|
valueNodes[nodesSize + i] = await generateTreeAsync(ctx, deferredValues[i]);
|
|
59
59
|
}
|
|
60
|
-
return
|
|
60
|
+
return {
|
|
61
|
+
k: keyNodes,
|
|
62
|
+
v: valueNodes,
|
|
63
|
+
s: size,
|
|
64
|
+
};
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
async function generateSetNode(
|
|
@@ -83,7 +87,17 @@ async function generateSetNode(
|
|
|
83
87
|
for (let i = 0; i < deferredSize; i++) {
|
|
84
88
|
nodes[nodeSize + i] = await generateTreeAsync(ctx, deferred[i]);
|
|
85
89
|
}
|
|
86
|
-
return
|
|
90
|
+
return {
|
|
91
|
+
t: SerovalNodeType.Set,
|
|
92
|
+
i: id,
|
|
93
|
+
a: nodes,
|
|
94
|
+
s: undefined,
|
|
95
|
+
l: undefined,
|
|
96
|
+
m: undefined,
|
|
97
|
+
c: undefined,
|
|
98
|
+
d: undefined,
|
|
99
|
+
n: undefined,
|
|
100
|
+
};
|
|
87
101
|
}
|
|
88
102
|
|
|
89
103
|
async function generateMapNode(
|
|
@@ -115,7 +129,17 @@ async function generateMapNode(
|
|
|
115
129
|
keyNodes[nodeSize + i] = await generateTreeAsync(ctx, deferredKey[i]);
|
|
116
130
|
valueNodes[nodeSize + i] = await generateTreeAsync(ctx, deferredValue[i]);
|
|
117
131
|
}
|
|
118
|
-
return
|
|
132
|
+
return {
|
|
133
|
+
t: SerovalNodeType.Map,
|
|
134
|
+
i: id,
|
|
135
|
+
a: undefined,
|
|
136
|
+
s: undefined,
|
|
137
|
+
l: undefined,
|
|
138
|
+
m: undefined,
|
|
139
|
+
c: undefined,
|
|
140
|
+
d: { k: keyNodes, v: valueNodes, s: len },
|
|
141
|
+
n: undefined,
|
|
142
|
+
};
|
|
119
143
|
}
|
|
120
144
|
|
|
121
145
|
async function generateNodeList(
|
|
@@ -147,7 +171,17 @@ async function generateArrayNode(
|
|
|
147
171
|
current: AsyncServerValue[],
|
|
148
172
|
id: number,
|
|
149
173
|
): Promise<SerovalArrayNode> {
|
|
150
|
-
return
|
|
174
|
+
return {
|
|
175
|
+
t: SerovalNodeType.Array,
|
|
176
|
+
i: id,
|
|
177
|
+
a: await generateNodeList(ctx, current),
|
|
178
|
+
s: undefined,
|
|
179
|
+
l: undefined,
|
|
180
|
+
m: undefined,
|
|
181
|
+
c: undefined,
|
|
182
|
+
d: undefined,
|
|
183
|
+
n: undefined,
|
|
184
|
+
};
|
|
151
185
|
}
|
|
152
186
|
|
|
153
187
|
async function generateAggregateErrorNode(
|
|
@@ -159,12 +193,17 @@ async function generateAggregateErrorNode(
|
|
|
159
193
|
const optionsNode = options
|
|
160
194
|
? await serializePropertiesAsync(ctx, options)
|
|
161
195
|
: undefined;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
196
|
+
return {
|
|
197
|
+
t: SerovalNodeType.AggregateError,
|
|
198
|
+
i: id,
|
|
199
|
+
a: undefined,
|
|
200
|
+
s: undefined,
|
|
201
|
+
l: undefined,
|
|
202
|
+
m: current.message,
|
|
203
|
+
c: undefined,
|
|
204
|
+
d: optionsNode,
|
|
205
|
+
n: await generateTreeAsync(ctx, current.errors as AsyncServerValue),
|
|
206
|
+
};
|
|
168
207
|
}
|
|
169
208
|
|
|
170
209
|
async function generateErrorNode(
|
|
@@ -176,11 +215,17 @@ async function generateErrorNode(
|
|
|
176
215
|
const optionsNode = options
|
|
177
216
|
? await serializePropertiesAsync(ctx, options)
|
|
178
217
|
: undefined;
|
|
179
|
-
return
|
|
180
|
-
SerovalNodeType.Error,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
218
|
+
return {
|
|
219
|
+
t: SerovalNodeType.Error,
|
|
220
|
+
i: id,
|
|
221
|
+
a: undefined,
|
|
222
|
+
s: undefined,
|
|
223
|
+
l: undefined,
|
|
224
|
+
m: current.message,
|
|
225
|
+
c: getErrorConstructor(current),
|
|
226
|
+
d: optionsNode,
|
|
227
|
+
n: undefined,
|
|
228
|
+
};
|
|
184
229
|
}
|
|
185
230
|
|
|
186
231
|
async function generateIterableNode(
|
|
@@ -190,11 +235,18 @@ async function generateIterableNode(
|
|
|
190
235
|
): Promise<SerovalIterableNode> {
|
|
191
236
|
assert(ctx.features & Feature.SymbolIterator, 'Unsupported type "Iterable"');
|
|
192
237
|
const options = getIterableOptions(current);
|
|
193
|
-
return
|
|
238
|
+
return {
|
|
239
|
+
t: SerovalNodeType.Iterable,
|
|
240
|
+
i: id,
|
|
241
|
+
s: undefined,
|
|
242
|
+
l: undefined,
|
|
243
|
+
m: undefined,
|
|
244
|
+
c: undefined,
|
|
194
245
|
// Parse options first before the items
|
|
195
|
-
options ? await serializePropertiesAsync(ctx, options) : undefined,
|
|
196
|
-
await generateNodeList(ctx, Array.from(current)),
|
|
197
|
-
|
|
246
|
+
d: options ? await serializePropertiesAsync(ctx, options) : undefined,
|
|
247
|
+
a: await generateNodeList(ctx, Array.from(current)),
|
|
248
|
+
n: undefined,
|
|
249
|
+
};
|
|
198
250
|
}
|
|
199
251
|
|
|
200
252
|
async function generateTreeAsync(
|
|
@@ -202,12 +254,23 @@ async function generateTreeAsync(
|
|
|
202
254
|
current: AsyncServerValue,
|
|
203
255
|
): Promise<SerovalNode> {
|
|
204
256
|
if (isPrimitive(current)) {
|
|
205
|
-
return
|
|
257
|
+
return {
|
|
258
|
+
t: SerovalNodeType.Primitive,
|
|
259
|
+
i: undefined,
|
|
260
|
+
s: serializePrimitive(current),
|
|
261
|
+
l: undefined,
|
|
262
|
+
m: undefined,
|
|
263
|
+
c: undefined,
|
|
264
|
+
// Parse options first before the items
|
|
265
|
+
d: undefined,
|
|
266
|
+
a: undefined,
|
|
267
|
+
n: undefined,
|
|
268
|
+
};
|
|
206
269
|
}
|
|
207
270
|
// Non-primitive values needs a reference ID
|
|
208
271
|
// mostly because the values themselves are stateful
|
|
209
272
|
const id = generateRef(ctx, current);
|
|
210
|
-
if (
|
|
273
|
+
if (typeof id !== 'number') {
|
|
211
274
|
return id;
|
|
212
275
|
}
|
|
213
276
|
const semiPrimitive = generateSemiPrimitiveValue(ctx, current, id);
|
|
@@ -216,11 +279,18 @@ async function generateTreeAsync(
|
|
|
216
279
|
}
|
|
217
280
|
if (isPromise(current)) {
|
|
218
281
|
assert(ctx.features & Feature.Promise, 'Unsupported type "Promise"');
|
|
219
|
-
return current.then(async (value) =>
|
|
220
|
-
SerovalNodeType.Promise,
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
282
|
+
return current.then(async (value) => ({
|
|
283
|
+
t: SerovalNodeType.Promise,
|
|
284
|
+
i: id,
|
|
285
|
+
s: undefined,
|
|
286
|
+
l: undefined,
|
|
287
|
+
m: undefined,
|
|
288
|
+
c: undefined,
|
|
289
|
+
// Parse options first before the items
|
|
290
|
+
d: undefined,
|
|
291
|
+
a: undefined,
|
|
292
|
+
n: await generateTreeAsync(ctx, value),
|
|
293
|
+
}));
|
|
224
294
|
}
|
|
225
295
|
if (constructorCheck<Set<AsyncServerValue>>(current, Set)) {
|
|
226
296
|
return generateSetNode(ctx, current, id);
|
|
@@ -242,11 +312,18 @@ async function generateTreeAsync(
|
|
|
242
312
|
}
|
|
243
313
|
const empty = current.constructor == null;
|
|
244
314
|
if (current.constructor === Object || empty) {
|
|
245
|
-
return
|
|
246
|
-
empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
315
|
+
return {
|
|
316
|
+
t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
|
|
317
|
+
i: id,
|
|
318
|
+
s: undefined,
|
|
319
|
+
l: undefined,
|
|
320
|
+
m: undefined,
|
|
321
|
+
c: undefined,
|
|
322
|
+
// Parse options first before the items
|
|
323
|
+
d: await serializePropertiesAsync(ctx, current as Record<string, unknown>),
|
|
324
|
+
a: undefined,
|
|
325
|
+
n: undefined,
|
|
326
|
+
};
|
|
250
327
|
}
|
|
251
328
|
throw new Error('Unsupported value');
|
|
252
329
|
}
|
|
@@ -256,5 +333,5 @@ export default async function parseAsync(
|
|
|
256
333
|
current: AsyncServerValue,
|
|
257
334
|
) {
|
|
258
335
|
const result = await generateTreeAsync(ctx, current);
|
|
259
|
-
return [result, createRef(ctx, current), result
|
|
336
|
+
return [result, createRef(ctx, current), result.t === SerovalNodeType.Object] as const;
|
|
260
337
|
}
|