seroval 0.4.0-alpha.8 → 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/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
- ): SerovalDictionaryNode {
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 [keyNodes, valueNodes, size];
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 [SerovalNodeType.Set, nodes, id];
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 [SerovalNodeType.Map, [keyNodes, valueNodes, len], id];
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 [SerovalNodeType.Array, generateNodeList(ctx, current), id];
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
- const errorsNode = generateTreeSync(ctx, current.errors as ServerValue);
157
- return [SerovalNodeType.AggregateError, [current.message, optionsNode, errorsNode], id];
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
- [getErrorConstructor(current), current.message, optionsNode],
172
- id,
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 [SerovalNodeType.Iterable, [
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
- ], id];
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 [SerovalNodeType.Primitive, serializePrimitive(current)];
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 (Array.isArray(id)) {
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
- serializePropertiesSync(ctx, current as Record<string, unknown>),
230
- id,
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[0] === SerovalNodeType.Object] as const;
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 type SerovalPrimitiveNode = [
23
- type: SerovalNodeType.Primitive,
24
- value: PrimitiveValue,
25
- ];
26
- export type SerovalReferenceNode = [type: SerovalNodeType.Reference, value: number];
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
- | [type: SerovalNodeType.BigInt, value: string]
29
- | [type: SerovalNodeType.Date, value: string, id: number]
30
- | [type: SerovalNodeType.RegExp, value: string, id: number]
31
- | [
32
- type: SerovalNodeType.TypedArray,
33
- value: [constructor: string, array: string, byteOffset: number],
34
- id: number
35
- ]
36
- | [
37
- type: SerovalNodeType.BigIntTypedArray,
38
- value: [constructor: string, array: string, byteOffset: number],
39
- id: number
40
- ];
41
-
42
- export type SerovalDictionaryNode = [key: string[], value: SerovalNode[], size: number];
43
- export type SerovalSetNode = [type: SerovalNodeType.Set, value: SerovalNode[], id: number];
44
- export type SerovalMapNode = [
45
- type: SerovalNodeType.Map,
46
- value: [key: SerovalNode[], value: SerovalNode[], size: number],
47
- id: number
48
- ];
49
- export type SerovalArrayNode = [type: SerovalNodeType.Array, value: SerovalNode[], id: number];
50
- export type SerovalObjectNode = [
51
- type: SerovalNodeType.Object,
52
- value: SerovalDictionaryNode,
53
- id: number
54
- ];
55
- export type SerovalNullConstructorNode = [
56
- type: SerovalNodeType.NullConstructor,
57
- value: SerovalDictionaryNode,
58
- id: number,
59
- ];
60
- export type SerovalPromiseNode = [type: SerovalNodeType.Promise, value: SerovalNode, id: number];
61
- export type SerovalErrorNode = [
62
- type: SerovalNodeType.Error,
63
- value: [
64
- constructor: string,
65
- message: string,
66
- options?: SerovalDictionaryNode,
67
- ],
68
- id: number
69
- ];
70
- export type SerovalAggregateErrorNode = [
71
- type: SerovalNodeType.AggregateError,
72
- value: [
73
- message: string,
74
- options: SerovalDictionaryNode | undefined,
75
- errors: SerovalNode,
76
- ],
77
- id: number
78
- ];
79
-
80
- export type SerovalIterableNode = [
81
- type: SerovalNodeType.Iterable,
82
- value: [
83
- options: SerovalDictionaryNode | undefined,
84
- items: SerovalNode[],
85
- ],
86
- id: number,
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