seroval 0.7.0 → 0.9.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.
Files changed (42) hide show
  1. package/dist/cjs/development/index.cjs +1247 -1069
  2. package/dist/cjs/development/index.cjs.map +4 -4
  3. package/dist/cjs/production/index.cjs +3 -3
  4. package/dist/esm/development/index.mjs +1247 -1069
  5. package/dist/esm/development/index.mjs.map +4 -4
  6. package/dist/esm/production/index.mjs +3 -3
  7. package/dist/types/assert.d.ts +1 -1
  8. package/dist/types/context.d.ts +8 -2
  9. package/dist/types/index.d.ts +3 -4
  10. package/dist/types/string.d.ts +1 -1
  11. package/dist/types/tree/UnsupportedTypeError.d.ts +3 -0
  12. package/dist/types/tree/async.d.ts +3 -3
  13. package/dist/types/tree/constants.d.ts +11 -0
  14. package/dist/types/tree/deserialize.d.ts +2 -2
  15. package/dist/types/tree/primitives.d.ts +9 -15
  16. package/dist/types/tree/serialize.d.ts +2 -2
  17. package/dist/types/tree/shared.d.ts +12 -8
  18. package/dist/types/tree/sync.d.ts +3 -3
  19. package/dist/types/tree/types.d.ts +74 -71
  20. package/dist/types/tree/web-api.d.ts +2 -2
  21. package/dist/types/types.d.ts +4 -4
  22. package/package.json +11 -9
  23. package/src/assert.ts +2 -2
  24. package/src/compat.ts +0 -1
  25. package/src/context.ts +20 -7
  26. package/src/get-identifier.ts +1 -1
  27. package/src/index.ts +35 -26
  28. package/src/string.ts +2 -2
  29. package/src/tree/UnsupportedTypeError.ts +8 -0
  30. package/src/tree/async.ts +256 -233
  31. package/src/tree/constants.ts +73 -0
  32. package/src/tree/deserialize.ts +112 -93
  33. package/src/tree/primitives.ts +93 -134
  34. package/src/tree/reference.ts +3 -3
  35. package/src/tree/serialize.ts +307 -201
  36. package/src/tree/shared.ts +45 -22
  37. package/src/tree/symbols.ts +13 -13
  38. package/src/tree/sync.ts +236 -198
  39. package/src/tree/types.ts +87 -94
  40. package/src/tree/web-api.ts +14 -7
  41. package/src/types.ts +7 -3
  42. package/src/tree/iterator.ts +0 -14
package/src/tree/types.ts CHANGED
@@ -1,40 +1,52 @@
1
- import { Symbols } from './symbols';
1
+ import type { Symbols } from './symbols';
2
+
3
+ export const enum SerovalConstant {
4
+ Null = 0,
5
+ Undefined = 1,
6
+ True = 2,
7
+ False = 3,
8
+ NegativeZero = 4,
9
+ Infinity = 5,
10
+ NegativeInfinity = 6,
11
+ NaN = 7,
12
+ }
2
13
 
3
14
  export const enum SerovalNodeType {
4
- Number,
5
- String,
6
- Boolean,
7
- Null,
8
- Undefined,
9
- NegativeZero,
10
- Infinity,
11
- NegativeInfinity,
12
- NaN,
13
- BigInt,
14
- IndexedValue,
15
- Date,
16
- RegExp,
17
- Set,
18
- Map,
19
- Array,
20
- Object,
21
- NullConstructor,
22
- Promise,
23
- Error,
24
- AggregateError,
25
- Iterable,
26
- TypedArray,
27
- BigIntTypedArray,
28
- WKSymbol,
29
- URL,
30
- URLSearchParams,
31
- Reference,
32
- ArrayBuffer,
33
- DataView,
34
- Blob,
35
- File,
36
- Headers,
37
- FormData,
15
+ Number = 0,
16
+ String = 1,
17
+ Constant = 2,
18
+ BigInt = 3,
19
+ IndexedValue = 4,
20
+ Date = 5,
21
+ RegExp = 6,
22
+ Set = 7,
23
+ Map = 8,
24
+ Array = 9,
25
+ Object = 10,
26
+ NullConstructor = 11,
27
+ Promise = 12,
28
+ Error = 13,
29
+ AggregateError = 14,
30
+ TypedArray = 15,
31
+ BigIntTypedArray = 16,
32
+ WKSymbol = 17,
33
+ URL = 18,
34
+ URLSearchParams = 19,
35
+ Reference = 20,
36
+ ArrayBuffer = 21,
37
+ DataView = 22,
38
+ Blob = 23,
39
+ File = 24,
40
+ Headers = 25,
41
+ FormData = 26,
42
+ Boxed = 27,
43
+ }
44
+
45
+ export const enum SerovalObjectFlags {
46
+ None = 0,
47
+ NonExtensible = 1,
48
+ Sealed = 2,
49
+ Frozen = 3,
38
50
  }
39
51
 
40
52
  export interface SerovalBaseNode {
@@ -43,7 +55,7 @@ export interface SerovalBaseNode {
43
55
  // Reference ID
44
56
  i: number | undefined;
45
57
  // Serialized value
46
- s: any;
58
+ s: unknown;
47
59
  // size/length
48
60
  l: number | undefined;
49
61
  // Constructor name / RegExp source
@@ -51,31 +63,43 @@ export interface SerovalBaseNode {
51
63
  // message/flags
52
64
  m: string | undefined;
53
65
  // dictionary
54
- d: SerovalDictionaryNode | undefined;
66
+ d: SerovalObjectRecordNode | SerovalMapRecordNode | undefined;
55
67
  // array of nodes
56
- a: SerovalNode[] | undefined;
68
+ a: (SerovalNode | undefined)[] | undefined;
57
69
  // fulfilled node
58
70
  f: SerovalNode | undefined;
59
- // byte offset
71
+ // byte offset/object flags
60
72
  b: number | undefined;
73
+ // object flag
74
+ o: SerovalObjectFlags | undefined;
61
75
  }
62
76
 
63
- export interface SerovalObjectRecordNode {
77
+ export const enum SerovalObjectRecordSpecialKey {
78
+ SymbolIterator = 0,
79
+ }
80
+
81
+ export type SerovalObjectRecordKey =
82
+ | string
83
+ | SerovalObjectRecordSpecialKey;
84
+
85
+ export interface SerovalPlainRecordNode {
64
86
  k: string[];
65
87
  v: SerovalNode[];
66
88
  s: number;
67
89
  }
68
90
 
91
+ export interface SerovalObjectRecordNode {
92
+ k: SerovalObjectRecordKey[];
93
+ v: SerovalNode[];
94
+ s: number;
95
+ }
96
+
69
97
  export interface SerovalMapRecordNode {
70
98
  k: SerovalNode[];
71
99
  v: SerovalNode[];
72
100
  s: number;
73
101
  }
74
102
 
75
- export type SerovalDictionaryNode =
76
- | SerovalObjectRecordNode
77
- | SerovalMapRecordNode;
78
-
79
103
  export interface SerovalNumberNode extends SerovalBaseNode {
80
104
  t: SerovalNodeType.Number;
81
105
  s: number;
@@ -86,45 +110,15 @@ export interface SerovalStringNode extends SerovalBaseNode {
86
110
  s: string;
87
111
  }
88
112
 
89
- export interface SerovalBooleanNode extends SerovalBaseNode {
90
- t: SerovalNodeType.Boolean;
91
- s: boolean;
92
- }
93
-
94
- export interface SerovalNullNode extends SerovalBaseNode {
95
- t: SerovalNodeType.Null;
96
- }
97
-
98
- export interface SerovalUndefinedNode extends SerovalBaseNode {
99
- t: SerovalNodeType.Undefined;
100
- }
101
-
102
- export interface SerovalNegativeZeroNode extends SerovalBaseNode {
103
- t: SerovalNodeType.NegativeZero;
104
- }
105
-
106
- export interface SerovalInfinityNode extends SerovalBaseNode {
107
- t: SerovalNodeType.Infinity;
108
- }
109
-
110
- export interface SerovalNegativeInfinityNode extends SerovalBaseNode {
111
- t: SerovalNodeType.NegativeInfinity;
112
- }
113
-
114
- export interface SerovalNaNNode extends SerovalBaseNode {
115
- t: SerovalNodeType.NaN;
113
+ export interface SerovalConstantNode extends SerovalBaseNode {
114
+ t: SerovalNodeType.Constant;
115
+ s: SerovalConstant;
116
116
  }
117
117
 
118
118
  export type SerovalPrimitiveNode =
119
119
  | SerovalNumberNode
120
120
  | SerovalStringNode
121
- | SerovalBooleanNode
122
- | SerovalNullNode
123
- | SerovalUndefinedNode
124
- | SerovalNegativeZeroNode
125
- | SerovalNegativeInfinityNode
126
- | SerovalInfinityNode
127
- | SerovalNaNNode;
121
+ | SerovalConstantNode;
128
122
 
129
123
  export interface SerovalIndexedValueNode extends SerovalBaseNode {
130
124
  t: SerovalNodeType.IndexedValue;
@@ -220,8 +214,9 @@ export interface SerovalArrayNode extends SerovalBaseNode {
220
214
  // size of array
221
215
  l: number;
222
216
  // items
223
- a: SerovalNode[];
217
+ a: (SerovalNode | undefined)[];
224
218
  i: number;
219
+ o: SerovalObjectFlags;
225
220
  }
226
221
 
227
222
  export interface SerovalObjectNode extends SerovalBaseNode {
@@ -229,6 +224,7 @@ export interface SerovalObjectNode extends SerovalBaseNode {
229
224
  // key/value pairs
230
225
  d: SerovalObjectRecordNode;
231
226
  i: number;
227
+ o: SerovalObjectFlags;
232
228
  }
233
229
 
234
230
  export interface SerovalNullConstructorNode extends SerovalBaseNode {
@@ -236,6 +232,7 @@ export interface SerovalNullConstructorNode extends SerovalBaseNode {
236
232
  // key/value pairs
237
233
  d: SerovalObjectRecordNode;
238
234
  i: number;
235
+ o: SerovalObjectFlags;
239
236
  }
240
237
 
241
238
  export interface SerovalPromiseNode extends SerovalBaseNode {
@@ -265,19 +262,9 @@ export interface SerovalAggregateErrorNode extends SerovalBaseNode {
265
262
  d: SerovalObjectRecordNode | undefined;
266
263
  }
267
264
 
268
- export interface SerovalIterableNode extends SerovalBaseNode {
269
- t: SerovalNodeType.Iterable;
270
- // other properties
271
- d: SerovalObjectRecordNode | undefined;
272
- // number of emitted items
273
- l: number;
274
- // array of items
275
- a: SerovalNode[];
276
- i: number;
277
- }
278
-
279
265
  export interface SerovalWKSymbolNode extends SerovalBaseNode {
280
266
  t: SerovalNodeType.WKSymbol;
267
+ i: number;
281
268
  s: Symbols;
282
269
  }
283
270
 
@@ -338,13 +325,19 @@ export interface SerovalFileNode extends SerovalBaseNode {
338
325
  export interface SerovalHeadersNode extends SerovalBaseNode {
339
326
  t: SerovalNodeType.Headers;
340
327
  i: number;
341
- d: SerovalObjectRecordNode;
328
+ d: SerovalPlainRecordNode;
342
329
  }
343
330
 
344
331
  export interface SerovalFormDataNode extends SerovalBaseNode {
345
332
  t: SerovalNodeType.FormData;
346
333
  i: number;
347
- d: SerovalObjectRecordNode;
334
+ d: SerovalPlainRecordNode;
335
+ }
336
+
337
+ export interface SerovalBoxedNode extends SerovalBaseNode {
338
+ t: SerovalNodeType.Boxed;
339
+ i: number;
340
+ f: SerovalNode;
348
341
  }
349
342
 
350
343
  export type SerovalNode =
@@ -359,7 +352,6 @@ export type SerovalNode =
359
352
  | SerovalPromiseNode
360
353
  | SerovalErrorNode
361
354
  | SerovalAggregateErrorNode
362
- | SerovalIterableNode
363
355
  | SerovalWKSymbolNode
364
356
  | SerovalURLNode
365
357
  | SerovalURLSearchParamsNode
@@ -369,4 +361,5 @@ export type SerovalNode =
369
361
  | SerovalBlobNode
370
362
  | SerovalFileNode
371
363
  | SerovalHeadersNode
372
- | SerovalFormDataNode;
364
+ | SerovalFormDataNode
365
+ | SerovalBoxedNode;
@@ -1,22 +1,25 @@
1
1
  import assert from '../assert';
2
2
  import { Feature } from '../compat';
3
- import { ParserContext } from '../context';
3
+ import type { ParserContext } from '../context';
4
4
  import { serializeString } from '../string';
5
+ import UnsupportedTypeError from './UnsupportedTypeError';
5
6
  import { serializeArrayBuffer } from './primitives';
6
- import {
7
+ import type {
7
8
  SerovalBlobNode,
8
9
  SerovalFileNode,
9
- SerovalNodeType,
10
10
  SerovalURLNode,
11
11
  SerovalURLSearchParamsNode,
12
12
  } from './types';
13
+ import {
14
+ SerovalNodeType,
15
+ } from './types';
13
16
 
14
17
  export function createURLNode(
15
18
  ctx: ParserContext,
16
19
  id: number,
17
20
  current: URL,
18
21
  ): SerovalURLNode {
19
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "URL"');
22
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
20
23
  return {
21
24
  t: SerovalNodeType.URL,
22
25
  i: id,
@@ -28,6 +31,7 @@ export function createURLNode(
28
31
  f: undefined,
29
32
  a: undefined,
30
33
  b: undefined,
34
+ o: undefined,
31
35
  };
32
36
  }
33
37
 
@@ -36,7 +40,7 @@ export function createURLSearchParamsNode(
36
40
  id: number,
37
41
  current: URLSearchParams,
38
42
  ): SerovalURLSearchParamsNode {
39
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "URLSearchParams"');
43
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
40
44
  return {
41
45
  t: SerovalNodeType.URLSearchParams,
42
46
  i: id,
@@ -48,6 +52,7 @@ export function createURLSearchParamsNode(
48
52
  f: undefined,
49
53
  a: undefined,
50
54
  b: undefined,
55
+ o: undefined,
51
56
  };
52
57
  }
53
58
 
@@ -56,7 +61,7 @@ export async function createBlobNode(
56
61
  id: number,
57
62
  current: Blob,
58
63
  ): Promise<SerovalBlobNode> {
59
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "Blob"');
64
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
60
65
  return {
61
66
  t: SerovalNodeType.Blob,
62
67
  i: id,
@@ -68,6 +73,7 @@ export async function createBlobNode(
68
73
  f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
69
74
  a: undefined,
70
75
  b: undefined,
76
+ o: undefined,
71
77
  };
72
78
  }
73
79
 
@@ -76,7 +82,7 @@ export async function createFileNode(
76
82
  id: number,
77
83
  current: File,
78
84
  ): Promise<SerovalFileNode> {
79
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "File"');
85
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
80
86
  return {
81
87
  t: SerovalNodeType.File,
82
88
  i: id,
@@ -88,5 +94,6 @@ export async function createFileNode(
88
94
  f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
89
95
  a: undefined,
90
96
  b: current.lastModified,
97
+ o: undefined,
91
98
  };
92
99
  }
package/src/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { WellKnownSymbols } from './tree/symbols';
1
+ import type { WellKnownSymbols } from './tree/symbols';
2
2
 
3
3
  // Values that are non-recursive
4
4
  export type PrimitiveValue =
@@ -36,11 +36,15 @@ export type BigIntTypedArrayValue =
36
36
 
37
37
  export type WebAPIValue =
38
38
  | URL
39
- | URLSearchParams;
39
+ | URLSearchParams
40
+ | Blob
41
+ | File;
40
42
 
41
43
  export type SemiPrimitiveValue =
42
44
  | RegExp
43
45
  | Date
46
+ | ArrayBuffer
47
+ | DataView
44
48
  | TypedArrayValue
45
49
  | BigIntTypedArrayValue
46
50
  | bigint
@@ -70,7 +74,7 @@ export type AsyncServerValue =
70
74
  | { readonly [key: string | number]: AsyncServerValue }
71
75
  | Set<AsyncServerValue>
72
76
  | Map<AsyncServerValue, AsyncServerValue>
73
- | PromiseLike<AsyncServerValue>;
77
+ | Promise<AsyncServerValue>;
74
78
 
75
79
  export type NonPrimitiveServerValue<T> =
76
80
  T extends PrimitiveValue
@@ -1,14 +0,0 @@
1
- export default function createIterator<T>(
2
- values: Array<T>,
3
- ): Iterator<T> {
4
- let index = 0;
5
- const len = values.length;
6
- return {
7
- next() {
8
- return {
9
- value: values[index++],
10
- done: index >= len,
11
- };
12
- },
13
- };
14
- }