seroval 0.6.0 → 0.8.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 (45) hide show
  1. package/README.md +15 -3
  2. package/dist/cjs/development/index.cjs +1431 -991
  3. package/dist/cjs/development/index.cjs.map +4 -4
  4. package/dist/cjs/production/index.cjs +3 -3
  5. package/dist/esm/development/index.mjs +1431 -991
  6. package/dist/esm/development/index.mjs.map +4 -4
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/assert.d.ts +1 -1
  9. package/dist/types/compat.d.ts +1 -1
  10. package/dist/types/context.d.ts +13 -7
  11. package/dist/types/index.d.ts +3 -4
  12. package/dist/types/string.d.ts +3 -0
  13. package/dist/types/tree/UnsupportedTypeError.d.ts +3 -0
  14. package/dist/types/tree/async.d.ts +3 -3
  15. package/dist/types/tree/constants.d.ts +11 -0
  16. package/dist/types/tree/deserialize.d.ts +2 -2
  17. package/dist/types/tree/primitives.d.ts +11 -14
  18. package/dist/types/tree/serialize.d.ts +2 -2
  19. package/dist/types/tree/shared.d.ts +10 -8
  20. package/dist/types/tree/sync.d.ts +3 -3
  21. package/dist/types/tree/types.d.ts +106 -70
  22. package/dist/types/tree/web-api.d.ts +4 -2
  23. package/dist/types/types.d.ts +4 -4
  24. package/package.json +11 -8
  25. package/src/assert.ts +2 -2
  26. package/src/compat.ts +1 -2
  27. package/src/context.ts +24 -13
  28. package/src/get-identifier.ts +1 -1
  29. package/src/index.ts +35 -26
  30. package/src/string.ts +53 -0
  31. package/src/tree/UnsupportedTypeError.ts +8 -0
  32. package/src/tree/async.ts +313 -222
  33. package/src/tree/constants.ts +72 -0
  34. package/src/tree/deserialize.ts +239 -119
  35. package/src/tree/primitives.ts +154 -143
  36. package/src/tree/reference.ts +4 -3
  37. package/src/tree/serialize.ts +394 -170
  38. package/src/tree/shared.ts +31 -22
  39. package/src/tree/symbols.ts +13 -13
  40. package/src/tree/sync.ts +288 -191
  41. package/src/tree/types.ts +173 -91
  42. package/src/tree/web-api.ts +59 -6
  43. package/src/types.ts +7 -3
  44. package/dist/types/quote.d.ts +0 -2
  45. package/src/quote.ts +0 -56
package/src/tree/types.ts CHANGED
@@ -1,34 +1,45 @@
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,
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,
32
43
  }
33
44
 
34
45
  export interface SerovalBaseNode {
@@ -37,37 +48,49 @@ export interface SerovalBaseNode {
37
48
  // Reference ID
38
49
  i: number | undefined;
39
50
  // Serialized value
40
- s: any;
41
- // Size/Byte offset
51
+ s: unknown;
52
+ // size/length
42
53
  l: number | undefined;
43
54
  // Constructor name / RegExp source
44
55
  c: string | undefined;
45
- // message /flags
56
+ // message/flags
46
57
  m: string | undefined;
47
58
  // dictionary
48
- d: SerovalDictionaryNode | undefined;
59
+ d: SerovalObjectRecordNode | SerovalMapRecordNode | undefined;
49
60
  // array of nodes
50
- a: SerovalNode[] | undefined;
61
+ a: (SerovalNode | undefined)[] | undefined;
51
62
  // fulfilled node
52
63
  f: SerovalNode | undefined;
64
+ // byte offset
65
+ b: number | undefined;
53
66
  }
54
67
 
55
- export interface SerovalObjectRecordNode {
68
+ export const enum SerovalObjectRecordSpecialKey {
69
+ SymbolIterator = 0,
70
+ }
71
+
72
+ export type SerovalObjectRecordKey =
73
+ | string
74
+ | SerovalObjectRecordSpecialKey;
75
+
76
+ export interface SerovalPlainRecordNode {
56
77
  k: string[];
57
78
  v: SerovalNode[];
58
79
  s: number;
59
80
  }
60
81
 
82
+ export interface SerovalObjectRecordNode {
83
+ k: SerovalObjectRecordKey[];
84
+ v: SerovalNode[];
85
+ s: number;
86
+ }
87
+
61
88
  export interface SerovalMapRecordNode {
62
89
  k: SerovalNode[];
63
90
  v: SerovalNode[];
64
91
  s: number;
65
92
  }
66
93
 
67
- export type SerovalDictionaryNode =
68
- | SerovalObjectRecordNode
69
- | SerovalMapRecordNode;
70
-
71
94
  export interface SerovalNumberNode extends SerovalBaseNode {
72
95
  t: SerovalNodeType.Number;
73
96
  s: number;
@@ -78,64 +101,39 @@ export interface SerovalStringNode extends SerovalBaseNode {
78
101
  s: string;
79
102
  }
80
103
 
81
- export interface SerovalBooleanNode extends SerovalBaseNode {
82
- t: SerovalNodeType.Boolean;
83
- s: boolean;
84
- }
85
-
86
- export interface SerovalNullNode extends SerovalBaseNode {
87
- t: SerovalNodeType.Null;
88
- }
89
-
90
- export interface SerovalUndefinedNode extends SerovalBaseNode {
91
- t: SerovalNodeType.Undefined;
92
- }
93
-
94
- export interface SerovalNegativeZeroNode extends SerovalBaseNode {
95
- t: SerovalNodeType.NegativeZero;
96
- }
97
-
98
- export interface SerovalInfinityNode extends SerovalBaseNode {
99
- t: SerovalNodeType.Infinity;
100
- }
101
-
102
- export interface SerovalNegativeInfinityNode extends SerovalBaseNode {
103
- t: SerovalNodeType.NegativeInfinity;
104
- }
105
-
106
- export interface SerovalNaNNode extends SerovalBaseNode {
107
- t: SerovalNodeType.NaN;
104
+ export interface SerovalConstantNode extends SerovalBaseNode {
105
+ t: SerovalNodeType.Constant;
106
+ s: SerovalConstant;
108
107
  }
109
108
 
110
109
  export type SerovalPrimitiveNode =
111
110
  | SerovalNumberNode
112
111
  | SerovalStringNode
113
- | SerovalBooleanNode
114
- | SerovalNullNode
115
- | SerovalUndefinedNode
116
- | SerovalNegativeZeroNode
117
- | SerovalNegativeInfinityNode
118
- | SerovalInfinityNode
119
- | SerovalNaNNode;
112
+ | SerovalConstantNode;
120
113
 
121
114
  export interface SerovalIndexedValueNode extends SerovalBaseNode {
122
115
  t: SerovalNodeType.IndexedValue;
116
+ // id
123
117
  i: number;
124
118
  }
125
119
 
126
120
  export interface SerovalBigIntNode extends SerovalBaseNode {
127
121
  t: SerovalNodeType.BigInt;
122
+ // value in string
128
123
  s: string;
129
124
  }
130
125
 
131
126
  export interface SerovalDateNode extends SerovalBaseNode {
132
127
  t: SerovalNodeType.Date;
128
+ // id (Dates are stateful)
133
129
  i: number;
130
+ // value in ISO string
134
131
  s: string;
135
132
  }
136
133
 
137
134
  export interface SerovalRegExpNode extends SerovalBaseNode {
138
135
  t: SerovalNodeType.RegExp;
136
+ // id (RegExp are stateful)
139
137
  i: number;
140
138
  // source
141
139
  c: string;
@@ -143,20 +141,39 @@ export interface SerovalRegExpNode extends SerovalBaseNode {
143
141
  m: string;
144
142
  }
145
143
 
144
+ export interface SerovalArrayBufferNode extends SerovalBaseNode {
145
+ t: SerovalNodeType.ArrayBuffer;
146
+ // id
147
+ i: number;
148
+ // sequence in bytes
149
+ s: number[];
150
+ }
151
+
146
152
  export interface SerovalTypedArrayNode extends SerovalBaseNode {
147
153
  t: SerovalNodeType.TypedArray;
154
+ // id
148
155
  i: number;
149
- s: string[];
156
+ // length
150
157
  l: number;
158
+ // TypedArray Constructor
151
159
  c: string;
160
+ // ArrayBuffer reference
161
+ f: SerovalNode;
162
+ // Byte Offset
163
+ b: number;
152
164
  }
153
165
 
154
166
  export interface SerovalBigIntTypedArrayNode extends SerovalBaseNode {
155
167
  t: SerovalNodeType.BigIntTypedArray;
156
168
  i: number;
157
- s: string[];
169
+ // length
158
170
  l: number;
171
+ // TypedArray Constructor
159
172
  c: string;
173
+ // ArrayBuffer reference
174
+ f: SerovalNode;
175
+ // Byte Offset
176
+ b: number;
160
177
  }
161
178
 
162
179
  export type SerovalSemiPrimitiveNode =
@@ -168,90 +185,149 @@ export type SerovalSemiPrimitiveNode =
168
185
 
169
186
  export interface SerovalSetNode extends SerovalBaseNode {
170
187
  t: SerovalNodeType.Set;
188
+ // id
189
+ i: number;
190
+ // Size of Set
171
191
  l: number;
192
+ // Items in Set (as array)
172
193
  a: SerovalNode[];
173
- i: number;
174
194
  }
175
195
 
176
196
  export interface SerovalMapNode extends SerovalBaseNode {
177
197
  t: SerovalNodeType.Map;
178
- d: SerovalMapRecordNode;
179
198
  i: number;
199
+ // key/value pairs
200
+ d: SerovalMapRecordNode;
180
201
  }
181
202
 
182
203
  export interface SerovalArrayNode extends SerovalBaseNode {
183
204
  t: SerovalNodeType.Array;
205
+ // size of array
184
206
  l: number;
185
- a: SerovalNode[];
207
+ // items
208
+ a: (SerovalNode | undefined)[];
186
209
  i: number;
187
210
  }
188
211
 
189
212
  export interface SerovalObjectNode extends SerovalBaseNode {
190
213
  t: SerovalNodeType.Object;
214
+ // key/value pairs
191
215
  d: SerovalObjectRecordNode;
192
216
  i: number;
193
217
  }
194
218
 
195
219
  export interface SerovalNullConstructorNode extends SerovalBaseNode {
196
220
  t: SerovalNodeType.NullConstructor;
221
+ // key/value pairs
197
222
  d: SerovalObjectRecordNode;
198
223
  i: number;
199
224
  }
200
225
 
201
226
  export interface SerovalPromiseNode extends SerovalBaseNode {
202
227
  t: SerovalNodeType.Promise;
228
+ // resolved value
203
229
  f: SerovalNode;
204
230
  i: number;
205
231
  }
206
232
 
207
233
  export interface SerovalErrorNode extends SerovalBaseNode {
208
234
  t: SerovalNodeType.Error;
235
+ // constructor name
209
236
  c: string;
237
+ // message
210
238
  m: string;
239
+ // other properties
211
240
  d: SerovalObjectRecordNode | undefined;
212
241
  i: number;
213
242
  }
214
243
 
215
244
  export interface SerovalAggregateErrorNode extends SerovalBaseNode {
216
245
  t: SerovalNodeType.AggregateError;
217
- m: string;
218
- d: SerovalObjectRecordNode | undefined;
219
- l: number;
220
- a: SerovalNode[];
221
246
  i: number;
222
- }
223
-
224
- export interface SerovalIterableNode extends SerovalBaseNode {
225
- t: SerovalNodeType.Iterable;
247
+ // message
248
+ m: string;
249
+ // other properties
226
250
  d: SerovalObjectRecordNode | undefined;
227
- l: number;
228
- a: SerovalNode[];
229
- i: number;
230
251
  }
231
252
 
232
253
  export interface SerovalWKSymbolNode extends SerovalBaseNode {
233
254
  t: SerovalNodeType.WKSymbol;
255
+ i: number;
234
256
  s: Symbols;
235
257
  }
236
258
 
237
259
  export interface SerovalURLNode extends SerovalBaseNode {
238
260
  t: SerovalNodeType.URL;
239
261
  i: number;
262
+ // raw URL
240
263
  s: string;
241
264
  }
242
265
 
243
266
  export interface SerovalURLSearchParamsNode extends SerovalBaseNode {
244
267
  t: SerovalNodeType.URLSearchParams;
245
268
  i: number;
269
+ // raw URL search params
246
270
  s: string;
247
271
  }
248
272
 
249
273
  export interface SerovalReferenceNode extends SerovalBaseNode {
250
274
  t: SerovalNodeType.Reference;
251
275
  i: number;
276
+ // id of the reference in the map
252
277
  s: string;
253
278
  }
254
279
 
280
+ export interface SerovalDataViewNode extends SerovalBaseNode {
281
+ t: SerovalNodeType.DataView;
282
+ i: number;
283
+ // byte length
284
+ l: number;
285
+ // reference to array buffer
286
+ f: SerovalNode;
287
+ // byte offset
288
+ b: number;
289
+ }
290
+
291
+ export interface SerovalBlobNode extends SerovalBaseNode {
292
+ t: SerovalNodeType.Blob;
293
+ i: number;
294
+ // file type
295
+ c: string;
296
+ // reference to array buffer
297
+ f: SerovalNode;
298
+ }
299
+
300
+ export interface SerovalFileNode extends SerovalBaseNode {
301
+ t: SerovalNodeType.File;
302
+ i: number;
303
+ // file type
304
+ c: string;
305
+ // file name
306
+ m: string;
307
+ // reference to array buffer
308
+ f: SerovalNode;
309
+ // last modified
310
+ b: number;
311
+ }
312
+
313
+ export interface SerovalHeadersNode extends SerovalBaseNode {
314
+ t: SerovalNodeType.Headers;
315
+ i: number;
316
+ d: SerovalPlainRecordNode;
317
+ }
318
+
319
+ export interface SerovalFormDataNode extends SerovalBaseNode {
320
+ t: SerovalNodeType.FormData;
321
+ i: number;
322
+ d: SerovalPlainRecordNode;
323
+ }
324
+
325
+ export interface SerovalBoxedNode extends SerovalBaseNode {
326
+ t: SerovalNodeType.Boxed;
327
+ i: number;
328
+ f: SerovalNode;
329
+ }
330
+
255
331
  export type SerovalNode =
256
332
  | SerovalPrimitiveNode
257
333
  | SerovalIndexedValueNode
@@ -264,8 +340,14 @@ export type SerovalNode =
264
340
  | SerovalPromiseNode
265
341
  | SerovalErrorNode
266
342
  | SerovalAggregateErrorNode
267
- | SerovalIterableNode
268
343
  | SerovalWKSymbolNode
269
344
  | SerovalURLNode
270
345
  | SerovalURLSearchParamsNode
271
- | SerovalReferenceNode;
346
+ | SerovalReferenceNode
347
+ | SerovalArrayBufferNode
348
+ | SerovalDataViewNode
349
+ | SerovalBlobNode
350
+ | SerovalFileNode
351
+ | SerovalHeadersNode
352
+ | SerovalFormDataNode
353
+ | SerovalBoxedNode;
@@ -1,24 +1,36 @@
1
1
  import assert from '../assert';
2
2
  import { Feature } from '../compat';
3
- import { ParserContext } from '../context';
4
- import { SerovalNodeType, SerovalURLNode, SerovalURLSearchParamsNode } from './types';
3
+ import type { ParserContext } from '../context';
4
+ import { serializeString } from '../string';
5
+ import UnsupportedTypeError from './UnsupportedTypeError';
6
+ import { serializeArrayBuffer } from './primitives';
7
+ import type {
8
+ SerovalBlobNode,
9
+ SerovalFileNode,
10
+ SerovalURLNode,
11
+ SerovalURLSearchParamsNode,
12
+ } from './types';
13
+ import {
14
+ SerovalNodeType,
15
+ } from './types';
5
16
 
6
17
  export function createURLNode(
7
18
  ctx: ParserContext,
8
19
  id: number,
9
20
  current: URL,
10
21
  ): SerovalURLNode {
11
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "URL"');
22
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
12
23
  return {
13
24
  t: SerovalNodeType.URL,
14
25
  i: id,
15
- s: current.href,
26
+ s: serializeString(current.href),
16
27
  l: undefined,
17
28
  c: undefined,
18
29
  m: undefined,
19
30
  d: undefined,
20
31
  f: undefined,
21
32
  a: undefined,
33
+ b: undefined,
22
34
  };
23
35
  }
24
36
 
@@ -27,16 +39,57 @@ export function createURLSearchParamsNode(
27
39
  id: number,
28
40
  current: URLSearchParams,
29
41
  ): SerovalURLSearchParamsNode {
30
- assert(ctx.features & Feature.WebAPI, 'Unsupported type "URLSearchParams"');
42
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
31
43
  return {
32
44
  t: SerovalNodeType.URLSearchParams,
33
45
  i: id,
34
- s: current.toString(),
46
+ s: serializeString(current.toString()),
35
47
  l: undefined,
36
48
  c: undefined,
37
49
  m: undefined,
38
50
  d: undefined,
39
51
  f: undefined,
40
52
  a: undefined,
53
+ b: undefined,
54
+ };
55
+ }
56
+
57
+ export async function createBlobNode(
58
+ ctx: ParserContext,
59
+ id: number,
60
+ current: Blob,
61
+ ): Promise<SerovalBlobNode> {
62
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
63
+ return {
64
+ t: SerovalNodeType.Blob,
65
+ i: id,
66
+ s: undefined,
67
+ l: undefined,
68
+ c: serializeString(current.type),
69
+ m: undefined,
70
+ d: undefined,
71
+ f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
72
+ a: undefined,
73
+ b: undefined,
74
+ };
75
+ }
76
+
77
+ export async function createFileNode(
78
+ ctx: ParserContext,
79
+ id: number,
80
+ current: File,
81
+ ): Promise<SerovalFileNode> {
82
+ assert(ctx.features & Feature.WebAPI, new UnsupportedTypeError(current));
83
+ return {
84
+ t: SerovalNodeType.File,
85
+ i: id,
86
+ s: undefined,
87
+ l: undefined,
88
+ c: serializeString(current.type),
89
+ m: serializeString(current.name),
90
+ d: undefined,
91
+ f: serializeArrayBuffer(ctx, await current.arrayBuffer()),
92
+ a: undefined,
93
+ b: current.lastModified,
41
94
  };
42
95
  }
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,2 +0,0 @@
1
- export default function quote(str: string): string;
2
- export declare function invQuote(str: string): string;
package/src/quote.ts DELETED
@@ -1,56 +0,0 @@
1
- // Written by https://github.com/DylanPiercey and is distributed under the MIT license.
2
- // Creates a JavaScript double quoted string and escapes all characters
3
- // not listed as DoubleStringCharacters on
4
- // Also includes "<" to escape "</script>" and "\" to avoid invalid escapes in the output.
5
- // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
6
- export default function quote(str: string) {
7
- let result = '';
8
- let lastPos = 0;
9
- for (let i = 0, len = str.length; i < len; i++) {
10
- let replacement;
11
- switch (str[i]) {
12
- case '"':
13
- replacement = '\\"';
14
- break;
15
- case '\\':
16
- replacement = '\\\\';
17
- break;
18
- case '<':
19
- replacement = '\\x3C';
20
- break;
21
- case '\n':
22
- replacement = '\\n';
23
- break;
24
- case '\r':
25
- replacement = '\\r';
26
- break;
27
- case '\u2028':
28
- replacement = '\\u2028';
29
- break;
30
- case '\u2029':
31
- replacement = '\\u2029';
32
- break;
33
- default:
34
- continue;
35
- }
36
- result += str.slice(lastPos, i) + replacement;
37
- lastPos = i + 1;
38
- }
39
- if (lastPos === 0) {
40
- result = str;
41
- } else {
42
- result += str.slice(lastPos);
43
- }
44
- return result;
45
- }
46
-
47
- export function invQuote(str: string): string {
48
- return str
49
- .replace(/\\"/g, '"')
50
- .replace(/\\\\/g, '\\')
51
- .replace(/\\x3C/g, '<')
52
- .replace(/\\n/g, '\n')
53
- .replace(/\\r/g, '\r')
54
- .replace(/\\u2028/g, '\u2028')
55
- .replace(/\\u2029/g, '\u2029');
56
- }