seroval 0.5.1 → 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.
- package/README.md +51 -1
- package/dist/cjs/development/index.cjs +762 -228
- package/dist/cjs/development/index.cjs.map +4 -4
- package/dist/cjs/production/index.cjs +3 -3
- package/dist/esm/development/index.mjs +762 -228
- package/dist/esm/development/index.mjs.map +4 -4
- package/dist/esm/production/index.mjs +3 -3
- package/dist/types/compat.d.ts +3 -2
- package/dist/types/context.d.ts +14 -9
- package/dist/types/index.d.ts +9 -9
- package/dist/types/string.d.ts +3 -0
- package/dist/types/tree/async.d.ts +1 -2
- package/dist/types/tree/deserialize.d.ts +1 -2
- package/dist/types/tree/primitives.d.ts +7 -3
- package/dist/types/tree/reference.d.ts +6 -0
- package/dist/types/tree/sync.d.ts +1 -2
- package/dist/types/tree/types.d.ts +73 -12
- package/dist/types/tree/web-api.d.ts +6 -0
- package/dist/types/types.d.ts +2 -1
- package/package.json +4 -3
- package/src/compat.ts +2 -1
- package/src/context.ts +19 -12
- package/src/index.ts +10 -16
- package/src/{quote.ts → string.ts} +27 -30
- package/src/tree/async.ts +164 -62
- package/src/tree/deserialize.ts +195 -67
- package/src/tree/primitives.ts +108 -22
- package/src/tree/reference.ts +61 -0
- package/src/tree/serialize.ts +236 -59
- package/src/tree/sync.ts +160 -55
- package/src/tree/types.ts +139 -14
- package/src/tree/web-api.ts +92 -0
- package/src/types.ts +6 -1
- package/dist/types/quote.d.ts +0 -2
package/src/tree/primitives.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import assert from '../assert';
|
|
2
2
|
import { Feature } from '../compat';
|
|
3
|
-
import { ParserContext } from '../context';
|
|
4
|
-
import
|
|
3
|
+
import { ParserContext, createIndexedValue } from '../context';
|
|
4
|
+
import { serializeString } from '../string';
|
|
5
5
|
import { BigIntTypedArrayValue, TypedArrayValue } from '../types';
|
|
6
|
+
import { getReferenceID } from './reference';
|
|
6
7
|
import { INV_SYMBOL_REF, WellKnownSymbols } from './symbols';
|
|
7
8
|
import {
|
|
8
9
|
SerovalBigIntNode,
|
|
@@ -16,12 +17,15 @@ import {
|
|
|
16
17
|
SerovalNodeType,
|
|
17
18
|
SerovalNullNode,
|
|
18
19
|
SerovalNumberNode,
|
|
19
|
-
|
|
20
|
+
SerovalIndexedValueNode,
|
|
20
21
|
SerovalRegExpNode,
|
|
21
22
|
SerovalStringNode,
|
|
22
23
|
SerovalTypedArrayNode,
|
|
23
24
|
SerovalUndefinedNode,
|
|
24
25
|
SerovalWKSymbolNode,
|
|
26
|
+
SerovalReferenceNode,
|
|
27
|
+
SerovalArrayBufferNode,
|
|
28
|
+
SerovalDataViewNode,
|
|
25
29
|
} from './types';
|
|
26
30
|
|
|
27
31
|
export const TRUE_NODE: SerovalBooleanNode = {
|
|
@@ -34,6 +38,7 @@ export const TRUE_NODE: SerovalBooleanNode = {
|
|
|
34
38
|
d: undefined,
|
|
35
39
|
a: undefined,
|
|
36
40
|
f: undefined,
|
|
41
|
+
b: undefined,
|
|
37
42
|
};
|
|
38
43
|
export const FALSE_NODE: SerovalBooleanNode = {
|
|
39
44
|
t: SerovalNodeType.Boolean,
|
|
@@ -45,6 +50,7 @@ export const FALSE_NODE: SerovalBooleanNode = {
|
|
|
45
50
|
d: undefined,
|
|
46
51
|
a: undefined,
|
|
47
52
|
f: undefined,
|
|
53
|
+
b: undefined,
|
|
48
54
|
};
|
|
49
55
|
export const UNDEFINED_NODE: SerovalUndefinedNode = {
|
|
50
56
|
t: SerovalNodeType.Undefined,
|
|
@@ -56,6 +62,7 @@ export const UNDEFINED_NODE: SerovalUndefinedNode = {
|
|
|
56
62
|
d: undefined,
|
|
57
63
|
a: undefined,
|
|
58
64
|
f: undefined,
|
|
65
|
+
b: undefined,
|
|
59
66
|
};
|
|
60
67
|
export const NULL_NODE: SerovalNullNode = {
|
|
61
68
|
t: SerovalNodeType.Null,
|
|
@@ -67,6 +74,7 @@ export const NULL_NODE: SerovalNullNode = {
|
|
|
67
74
|
d: undefined,
|
|
68
75
|
a: undefined,
|
|
69
76
|
f: undefined,
|
|
77
|
+
b: undefined,
|
|
70
78
|
};
|
|
71
79
|
export const NEG_ZERO_NODE: SerovalNegativeZeroNode = {
|
|
72
80
|
t: SerovalNodeType.NegativeZero,
|
|
@@ -78,6 +86,7 @@ export const NEG_ZERO_NODE: SerovalNegativeZeroNode = {
|
|
|
78
86
|
d: undefined,
|
|
79
87
|
a: undefined,
|
|
80
88
|
f: undefined,
|
|
89
|
+
b: undefined,
|
|
81
90
|
};
|
|
82
91
|
export const INFINITY_NODE: SerovalInfinityNode = {
|
|
83
92
|
t: SerovalNodeType.Infinity,
|
|
@@ -89,6 +98,7 @@ export const INFINITY_NODE: SerovalInfinityNode = {
|
|
|
89
98
|
d: undefined,
|
|
90
99
|
a: undefined,
|
|
91
100
|
f: undefined,
|
|
101
|
+
b: undefined,
|
|
92
102
|
};
|
|
93
103
|
export const NEG_INFINITY_NODE: SerovalNegativeInfinityNode = {
|
|
94
104
|
t: SerovalNodeType.NegativeInfinity,
|
|
@@ -100,6 +110,7 @@ export const NEG_INFINITY_NODE: SerovalNegativeInfinityNode = {
|
|
|
100
110
|
d: undefined,
|
|
101
111
|
a: undefined,
|
|
102
112
|
f: undefined,
|
|
113
|
+
b: undefined,
|
|
103
114
|
};
|
|
104
115
|
export const NAN_NODE: SerovalNaNNode = {
|
|
105
116
|
t: SerovalNodeType.NaN,
|
|
@@ -111,6 +122,7 @@ export const NAN_NODE: SerovalNaNNode = {
|
|
|
111
122
|
d: undefined,
|
|
112
123
|
a: undefined,
|
|
113
124
|
f: undefined,
|
|
125
|
+
b: undefined,
|
|
114
126
|
};
|
|
115
127
|
|
|
116
128
|
export function createNumberNode(value: number): SerovalNumberNode {
|
|
@@ -124,6 +136,7 @@ export function createNumberNode(value: number): SerovalNumberNode {
|
|
|
124
136
|
d: undefined,
|
|
125
137
|
a: undefined,
|
|
126
138
|
f: undefined,
|
|
139
|
+
b: undefined,
|
|
127
140
|
};
|
|
128
141
|
}
|
|
129
142
|
|
|
@@ -131,13 +144,14 @@ export function createStringNode(value: string): SerovalStringNode {
|
|
|
131
144
|
return {
|
|
132
145
|
t: SerovalNodeType.String,
|
|
133
146
|
i: undefined,
|
|
134
|
-
s:
|
|
147
|
+
s: serializeString(value),
|
|
135
148
|
l: undefined,
|
|
136
149
|
c: undefined,
|
|
137
150
|
m: undefined,
|
|
138
151
|
d: undefined,
|
|
139
152
|
a: undefined,
|
|
140
153
|
f: undefined,
|
|
154
|
+
b: undefined,
|
|
141
155
|
};
|
|
142
156
|
}
|
|
143
157
|
|
|
@@ -156,12 +170,13 @@ export function createBigIntNode(
|
|
|
156
170
|
d: undefined,
|
|
157
171
|
a: undefined,
|
|
158
172
|
f: undefined,
|
|
173
|
+
b: undefined,
|
|
159
174
|
};
|
|
160
175
|
}
|
|
161
176
|
|
|
162
|
-
export function
|
|
177
|
+
export function createIndexedValueNode(id: number): SerovalIndexedValueNode {
|
|
163
178
|
return {
|
|
164
|
-
t: SerovalNodeType.
|
|
179
|
+
t: SerovalNodeType.IndexedValue,
|
|
165
180
|
i: id,
|
|
166
181
|
s: undefined,
|
|
167
182
|
l: undefined,
|
|
@@ -170,6 +185,7 @@ export function createReferenceNode(id: number): SerovalReferenceNode {
|
|
|
170
185
|
d: undefined,
|
|
171
186
|
a: undefined,
|
|
172
187
|
f: undefined,
|
|
188
|
+
b: undefined,
|
|
173
189
|
};
|
|
174
190
|
}
|
|
175
191
|
|
|
@@ -184,6 +200,7 @@ export function createDateNode(id: number, current: Date): SerovalDateNode {
|
|
|
184
200
|
d: undefined,
|
|
185
201
|
f: undefined,
|
|
186
202
|
a: undefined,
|
|
203
|
+
b: undefined,
|
|
187
204
|
};
|
|
188
205
|
}
|
|
189
206
|
|
|
@@ -198,9 +215,45 @@ export function createRegExpNode(id: number, current: RegExp): SerovalRegExpNode
|
|
|
198
215
|
d: undefined,
|
|
199
216
|
a: undefined,
|
|
200
217
|
f: undefined,
|
|
218
|
+
b: undefined,
|
|
201
219
|
};
|
|
202
220
|
}
|
|
203
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
|
+
|
|
204
257
|
export function createTypedArrayNode(
|
|
205
258
|
ctx: ParserContext,
|
|
206
259
|
id: number,
|
|
@@ -208,21 +261,17 @@ export function createTypedArrayNode(
|
|
|
208
261
|
): SerovalTypedArrayNode {
|
|
209
262
|
const constructor = current.constructor.name;
|
|
210
263
|
assert(ctx.features & Feature.TypedArray, `Unsupported value type "${constructor}"`);
|
|
211
|
-
const len = current.length;
|
|
212
|
-
const values = new Array<string>(len);
|
|
213
|
-
for (let i = 0; i < len; i++) {
|
|
214
|
-
values[i] = '' + current[i];
|
|
215
|
-
}
|
|
216
264
|
return {
|
|
217
265
|
t: SerovalNodeType.TypedArray,
|
|
218
266
|
i: id,
|
|
219
|
-
s:
|
|
220
|
-
l: current.
|
|
267
|
+
s: undefined,
|
|
268
|
+
l: current.length,
|
|
221
269
|
c: constructor,
|
|
222
270
|
m: undefined,
|
|
223
271
|
d: undefined,
|
|
224
272
|
a: undefined,
|
|
225
|
-
f:
|
|
273
|
+
f: serializeArrayBuffer(ctx, current.buffer),
|
|
274
|
+
b: current.byteOffset,
|
|
226
275
|
};
|
|
227
276
|
}
|
|
228
277
|
|
|
@@ -238,27 +287,26 @@ export function createBigIntTypedArrayNode(
|
|
|
238
287
|
(ctx.features & BIGINT_FLAG) === BIGINT_FLAG,
|
|
239
288
|
`Unsupported value type "${constructor}"`,
|
|
240
289
|
);
|
|
241
|
-
const len = current.length;
|
|
242
|
-
const values = new Array<string>(len);
|
|
243
|
-
for (let i = 0; i < len; i++) {
|
|
244
|
-
values[i] = '' + current[i];
|
|
245
|
-
}
|
|
246
290
|
return {
|
|
247
291
|
t: SerovalNodeType.BigIntTypedArray,
|
|
248
292
|
i: id,
|
|
249
|
-
s:
|
|
250
|
-
l: current.
|
|
293
|
+
s: undefined,
|
|
294
|
+
l: current.length,
|
|
251
295
|
c: constructor,
|
|
252
296
|
m: undefined,
|
|
253
297
|
d: undefined,
|
|
254
298
|
a: undefined,
|
|
255
|
-
f:
|
|
299
|
+
f: serializeArrayBuffer(ctx, current.buffer),
|
|
300
|
+
b: current.byteOffset,
|
|
256
301
|
};
|
|
257
302
|
}
|
|
258
303
|
|
|
259
304
|
export function createWKSymbolNode(
|
|
305
|
+
ctx: ParserContext,
|
|
260
306
|
current: WellKnownSymbols,
|
|
261
307
|
): SerovalWKSymbolNode {
|
|
308
|
+
assert(ctx.features & Feature.Symbol, 'Unsupported type "symbol"');
|
|
309
|
+
assert(current in INV_SYMBOL_REF, 'seroval only supports well-known symbols');
|
|
262
310
|
return {
|
|
263
311
|
t: SerovalNodeType.WKSymbol,
|
|
264
312
|
i: undefined,
|
|
@@ -269,5 +317,43 @@ export function createWKSymbolNode(
|
|
|
269
317
|
d: undefined,
|
|
270
318
|
a: undefined,
|
|
271
319
|
f: undefined,
|
|
320
|
+
b: undefined,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export function createReferenceNode<T>(
|
|
325
|
+
id: number,
|
|
326
|
+
ref: T,
|
|
327
|
+
): SerovalReferenceNode {
|
|
328
|
+
return {
|
|
329
|
+
t: SerovalNodeType.Reference,
|
|
330
|
+
i: id,
|
|
331
|
+
s: serializeString(getReferenceID(ref)),
|
|
332
|
+
l: undefined,
|
|
333
|
+
c: undefined,
|
|
334
|
+
m: undefined,
|
|
335
|
+
d: undefined,
|
|
336
|
+
a: undefined,
|
|
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,
|
|
272
358
|
};
|
|
273
359
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-globals */
|
|
2
|
+
import assert from '../assert';
|
|
3
|
+
|
|
4
|
+
const REFERENCE = new Map<unknown, string>();
|
|
5
|
+
const INV_REFERENCE = new Map<string, unknown>();
|
|
6
|
+
|
|
7
|
+
export function createReference<T>(id: string, value: T): T {
|
|
8
|
+
REFERENCE.set(value, id);
|
|
9
|
+
INV_REFERENCE.set(id, value);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function hasReferenceID<T>(value: T): boolean {
|
|
14
|
+
return REFERENCE.has(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function hasReference(id: string): boolean {
|
|
18
|
+
return INV_REFERENCE.has(id);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getReferenceID<T>(value: T): string {
|
|
22
|
+
assert(hasReferenceID(value), 'Missing reference id');
|
|
23
|
+
return REFERENCE.get(value) as string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getReference<T>(id: string): T {
|
|
27
|
+
assert(hasReference(id), 'Missing reference for id:' + id);
|
|
28
|
+
return INV_REFERENCE.get(id) as T;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const GLOBAL_KEY = '__SEROVAL__';
|
|
32
|
+
|
|
33
|
+
if (typeof globalThis !== undefined) {
|
|
34
|
+
Object.defineProperty(globalThis, GLOBAL_KEY, {
|
|
35
|
+
value: INV_REFERENCE,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: false,
|
|
38
|
+
enumerable: false,
|
|
39
|
+
});
|
|
40
|
+
} else if (typeof window !== undefined) {
|
|
41
|
+
Object.defineProperty(window, GLOBAL_KEY, {
|
|
42
|
+
value: INV_REFERENCE,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: false,
|
|
45
|
+
enumerable: false,
|
|
46
|
+
});
|
|
47
|
+
} else if (typeof self !== undefined) {
|
|
48
|
+
Object.defineProperty(self, GLOBAL_KEY, {
|
|
49
|
+
value: INV_REFERENCE,
|
|
50
|
+
configurable: true,
|
|
51
|
+
writable: false,
|
|
52
|
+
enumerable: false,
|
|
53
|
+
});
|
|
54
|
+
} else if (typeof global !== undefined) {
|
|
55
|
+
Object.defineProperty(global, GLOBAL_KEY, {
|
|
56
|
+
value: INV_REFERENCE,
|
|
57
|
+
configurable: true,
|
|
58
|
+
writable: false,
|
|
59
|
+
enumerable: false,
|
|
60
|
+
});
|
|
61
|
+
}
|