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.
@@ -17,63 +17,112 @@ export declare const enum SerovalNodeType {
17
17
  TypedArray = 14,
18
18
  BigIntTypedArray = 15
19
19
  }
20
- export type SerovalPrimitiveNode = [
21
- type: SerovalNodeType.Primitive,
22
- value: PrimitiveValue
23
- ];
24
- export type SerovalReferenceNode = [type: SerovalNodeType.Reference, value: number];
25
- export type SerovalSemiPrimitiveNode = [type: SerovalNodeType.BigInt, value: string] | [type: SerovalNodeType.Date, value: string, id: number] | [type: SerovalNodeType.RegExp, value: string, id: number] | [
26
- type: SerovalNodeType.TypedArray,
27
- value: [constructor: string, array: string, byteOffset: number],
28
- id: number
29
- ] | [
30
- type: SerovalNodeType.BigIntTypedArray,
31
- value: [constructor: string, array: string, byteOffset: number],
32
- id: number
33
- ];
34
- export type SerovalDictionaryNode = [key: string[], value: SerovalNode[], size: number];
35
- export type SerovalSetNode = [type: SerovalNodeType.Set, value: SerovalNode[], id: number];
36
- export type SerovalMapNode = [
37
- type: SerovalNodeType.Map,
38
- value: [key: SerovalNode[], value: SerovalNode[], size: number],
39
- id: number
40
- ];
41
- export type SerovalArrayNode = [type: SerovalNodeType.Array, value: SerovalNode[], id: number];
42
- export type SerovalObjectNode = [
43
- type: SerovalNodeType.Object,
44
- value: SerovalDictionaryNode,
45
- id: number
46
- ];
47
- export type SerovalNullConstructorNode = [
48
- type: SerovalNodeType.NullConstructor,
49
- value: SerovalDictionaryNode,
50
- id: number
51
- ];
52
- export type SerovalPromiseNode = [type: SerovalNodeType.Promise, value: SerovalNode, id: number];
53
- export type SerovalErrorNode = [
54
- type: SerovalNodeType.Error,
55
- value: [
56
- constructor: string,
57
- message: string,
58
- options?: SerovalDictionaryNode
59
- ],
60
- id: number
61
- ];
62
- export type SerovalAggregateErrorNode = [
63
- type: SerovalNodeType.AggregateError,
64
- value: [
65
- message: string,
66
- options: SerovalDictionaryNode | undefined,
67
- errors: SerovalNode
68
- ],
69
- id: number
70
- ];
71
- export type SerovalIterableNode = [
72
- type: SerovalNodeType.Iterable,
73
- value: [
74
- options: SerovalDictionaryNode | undefined,
75
- items: SerovalNode[]
76
- ],
77
- id: number
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.7",
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": "30e67c013299a4e75136a9a2b41945ee54d8b6b8"
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: Set<number>;
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: Map<number, number>;
38
+ validRefs: number[];
39
+ refSize: number;
39
40
  // Refs that are...referenced
40
- markedRefs: Set<number>;
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: new Set(),
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[] | Set<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: new Map(),
78
+ validRefs: [],
79
+ refSize: 0,
78
80
  features: options.features,
79
- markedRefs: new Set(options.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.add(current);
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.get(index);
101
- if (current != null) {
102
- return current;
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
- const id = ctx.validRefs.size;
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
- [...ctx.markedRefs],
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
- [...ctx.markedRefs],
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<SerovalDictionaryNode> {
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 [keyNodes, valueNodes, size];
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 [SerovalNodeType.Set, nodes, id];
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 [SerovalNodeType.Map, [keyNodes, valueNodes, len], id];
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 [SerovalNodeType.Array, await generateNodeList(ctx, current), id];
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
- const errorsNode = await generateTreeAsync(ctx, current.errors as AsyncServerValue);
163
- return [
164
- SerovalNodeType.AggregateError,
165
- [current.message, optionsNode, errorsNode],
166
- id,
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
- [getErrorConstructor(current), current.message, optionsNode],
182
- id,
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 [SerovalNodeType.Iterable, [
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
- ], id];
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 [SerovalNodeType.Primitive, serializePrimitive(current)];
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 (Array.isArray(id)) {
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
- await generateTreeAsync(ctx, value),
222
- id,
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
- await serializePropertiesAsync(ctx, current as Record<string, unknown>),
248
- id,
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[0] === SerovalNodeType.Object] as const;
336
+ return [result, createRef(ctx, current), result.t === SerovalNodeType.Object] as const;
260
337
  }