seroval 0.6.0 → 0.7.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.
@@ -1,7 +1,7 @@
1
1
  import assert from '../assert';
2
2
  import { Feature } from '../compat';
3
- import { ParserContext } from '../context';
4
- import quote from '../quote';
3
+ import { ParserContext, createIndexedValue } from '../context';
4
+ import { serializeString } from '../string';
5
5
  import { BigIntTypedArrayValue, TypedArrayValue } from '../types';
6
6
  import { getReferenceID } from './reference';
7
7
  import { INV_SYMBOL_REF, WellKnownSymbols } from './symbols';
@@ -24,6 +24,8 @@ import {
24
24
  SerovalUndefinedNode,
25
25
  SerovalWKSymbolNode,
26
26
  SerovalReferenceNode,
27
+ SerovalArrayBufferNode,
28
+ SerovalDataViewNode,
27
29
  } from './types';
28
30
 
29
31
  export const TRUE_NODE: SerovalBooleanNode = {
@@ -36,6 +38,7 @@ export const TRUE_NODE: SerovalBooleanNode = {
36
38
  d: undefined,
37
39
  a: undefined,
38
40
  f: undefined,
41
+ b: undefined,
39
42
  };
40
43
  export const FALSE_NODE: SerovalBooleanNode = {
41
44
  t: SerovalNodeType.Boolean,
@@ -47,6 +50,7 @@ export const FALSE_NODE: SerovalBooleanNode = {
47
50
  d: undefined,
48
51
  a: undefined,
49
52
  f: undefined,
53
+ b: undefined,
50
54
  };
51
55
  export const UNDEFINED_NODE: SerovalUndefinedNode = {
52
56
  t: SerovalNodeType.Undefined,
@@ -58,6 +62,7 @@ export const UNDEFINED_NODE: SerovalUndefinedNode = {
58
62
  d: undefined,
59
63
  a: undefined,
60
64
  f: undefined,
65
+ b: undefined,
61
66
  };
62
67
  export const NULL_NODE: SerovalNullNode = {
63
68
  t: SerovalNodeType.Null,
@@ -69,6 +74,7 @@ export const NULL_NODE: SerovalNullNode = {
69
74
  d: undefined,
70
75
  a: undefined,
71
76
  f: undefined,
77
+ b: undefined,
72
78
  };
73
79
  export const NEG_ZERO_NODE: SerovalNegativeZeroNode = {
74
80
  t: SerovalNodeType.NegativeZero,
@@ -80,6 +86,7 @@ export const NEG_ZERO_NODE: SerovalNegativeZeroNode = {
80
86
  d: undefined,
81
87
  a: undefined,
82
88
  f: undefined,
89
+ b: undefined,
83
90
  };
84
91
  export const INFINITY_NODE: SerovalInfinityNode = {
85
92
  t: SerovalNodeType.Infinity,
@@ -91,6 +98,7 @@ export const INFINITY_NODE: SerovalInfinityNode = {
91
98
  d: undefined,
92
99
  a: undefined,
93
100
  f: undefined,
101
+ b: undefined,
94
102
  };
95
103
  export const NEG_INFINITY_NODE: SerovalNegativeInfinityNode = {
96
104
  t: SerovalNodeType.NegativeInfinity,
@@ -102,6 +110,7 @@ export const NEG_INFINITY_NODE: SerovalNegativeInfinityNode = {
102
110
  d: undefined,
103
111
  a: undefined,
104
112
  f: undefined,
113
+ b: undefined,
105
114
  };
106
115
  export const NAN_NODE: SerovalNaNNode = {
107
116
  t: SerovalNodeType.NaN,
@@ -113,6 +122,7 @@ export const NAN_NODE: SerovalNaNNode = {
113
122
  d: undefined,
114
123
  a: undefined,
115
124
  f: undefined,
125
+ b: undefined,
116
126
  };
117
127
 
118
128
  export function createNumberNode(value: number): SerovalNumberNode {
@@ -126,6 +136,7 @@ export function createNumberNode(value: number): SerovalNumberNode {
126
136
  d: undefined,
127
137
  a: undefined,
128
138
  f: undefined,
139
+ b: undefined,
129
140
  };
130
141
  }
131
142
 
@@ -133,13 +144,14 @@ export function createStringNode(value: string): SerovalStringNode {
133
144
  return {
134
145
  t: SerovalNodeType.String,
135
146
  i: undefined,
136
- s: quote(value),
147
+ s: serializeString(value),
137
148
  l: undefined,
138
149
  c: undefined,
139
150
  m: undefined,
140
151
  d: undefined,
141
152
  a: undefined,
142
153
  f: undefined,
154
+ b: undefined,
143
155
  };
144
156
  }
145
157
 
@@ -158,6 +170,7 @@ export function createBigIntNode(
158
170
  d: undefined,
159
171
  a: undefined,
160
172
  f: undefined,
173
+ b: undefined,
161
174
  };
162
175
  }
163
176
 
@@ -172,6 +185,7 @@ export function createIndexedValueNode(id: number): SerovalIndexedValueNode {
172
185
  d: undefined,
173
186
  a: undefined,
174
187
  f: undefined,
188
+ b: undefined,
175
189
  };
176
190
  }
177
191
 
@@ -186,6 +200,7 @@ export function createDateNode(id: number, current: Date): SerovalDateNode {
186
200
  d: undefined,
187
201
  f: undefined,
188
202
  a: undefined,
203
+ b: undefined,
189
204
  };
190
205
  }
191
206
 
@@ -200,9 +215,45 @@ export function createRegExpNode(id: number, current: RegExp): SerovalRegExpNode
200
215
  d: undefined,
201
216
  a: undefined,
202
217
  f: undefined,
218
+ b: undefined,
203
219
  };
204
220
  }
205
221
 
222
+ export function createArrayBufferNode(
223
+ id: number,
224
+ current: ArrayBuffer,
225
+ ): SerovalArrayBufferNode {
226
+ const bytes = new Uint8Array(current);
227
+ const len = bytes.length;
228
+ const values = new Array<number>(len);
229
+ for (let i = 0; i < len; i++) {
230
+ values[i] = bytes[i];
231
+ }
232
+ return {
233
+ t: SerovalNodeType.ArrayBuffer,
234
+ i: id,
235
+ s: values,
236
+ l: undefined,
237
+ c: undefined,
238
+ m: undefined,
239
+ d: undefined,
240
+ a: undefined,
241
+ f: undefined,
242
+ b: undefined,
243
+ };
244
+ }
245
+
246
+ export function serializeArrayBuffer(
247
+ ctx: ParserContext,
248
+ current: ArrayBuffer,
249
+ ) {
250
+ const id = createIndexedValue(ctx, current);
251
+ if (ctx.markedRefs.has(id)) {
252
+ return createIndexedValueNode(id);
253
+ }
254
+ return createArrayBufferNode(id, current);
255
+ }
256
+
206
257
  export function createTypedArrayNode(
207
258
  ctx: ParserContext,
208
259
  id: number,
@@ -210,21 +261,17 @@ export function createTypedArrayNode(
210
261
  ): SerovalTypedArrayNode {
211
262
  const constructor = current.constructor.name;
212
263
  assert(ctx.features & Feature.TypedArray, `Unsupported value type "${constructor}"`);
213
- const len = current.length;
214
- const values = new Array<string>(len);
215
- for (let i = 0; i < len; i++) {
216
- values[i] = '' + current[i];
217
- }
218
264
  return {
219
265
  t: SerovalNodeType.TypedArray,
220
266
  i: id,
221
- s: values,
222
- l: current.byteOffset,
267
+ s: undefined,
268
+ l: current.length,
223
269
  c: constructor,
224
270
  m: undefined,
225
271
  d: undefined,
226
272
  a: undefined,
227
- f: undefined,
273
+ f: serializeArrayBuffer(ctx, current.buffer),
274
+ b: current.byteOffset,
228
275
  };
229
276
  }
230
277
 
@@ -240,21 +287,17 @@ export function createBigIntTypedArrayNode(
240
287
  (ctx.features & BIGINT_FLAG) === BIGINT_FLAG,
241
288
  `Unsupported value type "${constructor}"`,
242
289
  );
243
- const len = current.length;
244
- const values = new Array<string>(len);
245
- for (let i = 0; i < len; i++) {
246
- values[i] = '' + current[i];
247
- }
248
290
  return {
249
291
  t: SerovalNodeType.BigIntTypedArray,
250
292
  i: id,
251
- s: values,
252
- l: current.byteOffset,
293
+ s: undefined,
294
+ l: current.length,
253
295
  c: constructor,
254
296
  m: undefined,
255
297
  d: undefined,
256
298
  a: undefined,
257
- f: undefined,
299
+ f: serializeArrayBuffer(ctx, current.buffer),
300
+ b: current.byteOffset,
258
301
  };
259
302
  }
260
303
 
@@ -274,6 +317,7 @@ export function createWKSymbolNode(
274
317
  d: undefined,
275
318
  a: undefined,
276
319
  f: undefined,
320
+ b: undefined,
277
321
  };
278
322
  }
279
323
 
@@ -284,12 +328,32 @@ export function createReferenceNode<T>(
284
328
  return {
285
329
  t: SerovalNodeType.Reference,
286
330
  i: id,
287
- s: quote(getReferenceID(ref)),
331
+ s: serializeString(getReferenceID(ref)),
288
332
  l: undefined,
289
333
  c: undefined,
290
334
  m: undefined,
291
335
  d: undefined,
292
336
  a: undefined,
293
337
  f: undefined,
338
+ b: undefined,
339
+ };
340
+ }
341
+
342
+ export function createDataViewNode(
343
+ ctx: ParserContext,
344
+ id: number,
345
+ current: DataView,
346
+ ): SerovalDataViewNode {
347
+ return {
348
+ t: SerovalNodeType.DataView,
349
+ i: id,
350
+ s: undefined,
351
+ l: current.byteLength,
352
+ c: undefined,
353
+ m: undefined,
354
+ d: undefined,
355
+ a: undefined,
356
+ f: serializeArrayBuffer(ctx, current.buffer),
357
+ b: current.byteOffset,
294
358
  };
295
359
  }