seroval 1.0.3 → 1.0.4
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/dist/cjs/development/index.cjs +330 -225
- package/dist/cjs/development/index.cjs.map +3 -3
- package/dist/cjs/production/index.cjs +17 -3
- package/dist/esm/development/index.mjs +330 -225
- package/dist/esm/development/index.mjs.map +3 -3
- package/dist/esm/production/index.mjs +17 -3
- package/dist/types/core/base-primitives.d.ts.map +1 -1
- package/dist/types/core/context/deserializer.d.ts.map +1 -1
- package/dist/types/core/context/parser/async.d.ts.map +1 -1
- package/dist/types/core/context/parser/sync.d.ts.map +1 -1
- package/dist/types/core/context/parser.d.ts.map +1 -1
- package/dist/types/core/context/serializer.d.ts.map +1 -1
- package/dist/types/core/errors.d.ts +38 -0
- package/dist/types/core/errors.d.ts.map +1 -0
- package/dist/types/core/reference.d.ts.map +1 -1
- package/dist/types/core/tree/serializer.d.ts.map +1 -1
- package/dist/types/core/utils/typed-array.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/core/base-primitives.ts +0 -5
- package/src/core/context/deserializer.ts +86 -76
- package/src/core/context/parser/async.ts +30 -26
- package/src/core/context/parser/sync.ts +30 -26
- package/src/core/context/parser.ts +3 -10
- package/src/core/context/serializer.ts +104 -95
- package/src/core/errors.ts +99 -0
- package/src/core/reference.ts +6 -2
- package/src/core/tree/serializer.ts +4 -3
- package/src/core/utils/typed-array.ts +3 -1
- package/src/index.ts +1 -0
- package/dist/types/core/UnsupportedTypeError.d.ts +0 -5
- package/dist/types/core/UnsupportedTypeError.d.ts.map +0 -1
- package/src/core/UnsupportedTypeError.ts +0 -7
|
@@ -53,6 +53,12 @@ import { createDeferred } from '../utils/deferred';
|
|
|
53
53
|
import assert from '../utils/assert';
|
|
54
54
|
import type { Stream } from '../stream';
|
|
55
55
|
import { createStream, streamToAsyncIterable } from '../stream';
|
|
56
|
+
import {
|
|
57
|
+
SerovalMissingInstanceError,
|
|
58
|
+
SerovalMissingPluginError,
|
|
59
|
+
SerovalDeserializationError,
|
|
60
|
+
SerovalUnsupportedNodeError,
|
|
61
|
+
} from '../errors';
|
|
56
62
|
|
|
57
63
|
function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
|
|
58
64
|
switch (flag) {
|
|
@@ -276,7 +282,7 @@ export default abstract class BaseDeserializerContext
|
|
|
276
282
|
}
|
|
277
283
|
}
|
|
278
284
|
}
|
|
279
|
-
throw new
|
|
285
|
+
throw new SerovalMissingPluginError(node.c);
|
|
280
286
|
}
|
|
281
287
|
|
|
282
288
|
private deserializePromiseConstructor(
|
|
@@ -287,14 +293,14 @@ export default abstract class BaseDeserializerContext
|
|
|
287
293
|
|
|
288
294
|
private deserializePromiseResolve(node: SerovalPromiseResolveNode): unknown {
|
|
289
295
|
const deferred = this.refs.get(node.i) as Deferred | undefined;
|
|
290
|
-
assert(deferred, new
|
|
296
|
+
assert(deferred, new SerovalMissingInstanceError('Promise'));
|
|
291
297
|
deferred.resolve(this.deserialize(node.a[1]));
|
|
292
298
|
return undefined;
|
|
293
299
|
}
|
|
294
300
|
|
|
295
301
|
private deserializePromiseReject(node: SerovalPromiseRejectNode): unknown {
|
|
296
302
|
const deferred = this.refs.get(node.i) as Deferred | undefined;
|
|
297
|
-
assert(deferred, new
|
|
303
|
+
assert(deferred, new SerovalMissingInstanceError('Promise'));
|
|
298
304
|
deferred.reject(this.deserialize(node.a[1]));
|
|
299
305
|
return undefined;
|
|
300
306
|
}
|
|
@@ -330,21 +336,21 @@ export default abstract class BaseDeserializerContext
|
|
|
330
336
|
|
|
331
337
|
private deserializeStreamNext(node: SerovalStreamNextNode): unknown {
|
|
332
338
|
const deferred = this.refs.get(node.i) as Stream<unknown> | undefined;
|
|
333
|
-
assert(deferred, new
|
|
339
|
+
assert(deferred, new SerovalMissingInstanceError('Stream'));
|
|
334
340
|
deferred.next(this.deserialize(node.f));
|
|
335
341
|
return undefined;
|
|
336
342
|
}
|
|
337
343
|
|
|
338
344
|
private deserializeStreamThrow(node: SerovalStreamThrowNode): unknown {
|
|
339
345
|
const deferred = this.refs.get(node.i) as Stream<unknown> | undefined;
|
|
340
|
-
assert(deferred, new
|
|
346
|
+
assert(deferred, new SerovalMissingInstanceError('Stream'));
|
|
341
347
|
deferred.throw(this.deserialize(node.f));
|
|
342
348
|
return undefined;
|
|
343
349
|
}
|
|
344
350
|
|
|
345
351
|
private deserializeStreamReturn(node: SerovalStreamReturnNode): unknown {
|
|
346
352
|
const deferred = this.refs.get(node.i) as Stream<unknown> | undefined;
|
|
347
|
-
assert(deferred, new
|
|
353
|
+
assert(deferred, new SerovalMissingInstanceError('Stream'));
|
|
348
354
|
deferred.return(this.deserialize(node.f));
|
|
349
355
|
return undefined;
|
|
350
356
|
}
|
|
@@ -364,76 +370,80 @@ export default abstract class BaseDeserializerContext
|
|
|
364
370
|
}
|
|
365
371
|
|
|
366
372
|
deserialize(node: SerovalNode): unknown {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
373
|
+
try {
|
|
374
|
+
switch (node.t) {
|
|
375
|
+
case SerovalNodeType.Constant:
|
|
376
|
+
return CONSTANT_VAL[node.s];
|
|
377
|
+
case SerovalNodeType.Number:
|
|
378
|
+
return node.s;
|
|
379
|
+
case SerovalNodeType.String:
|
|
380
|
+
return deserializeString(node.s);
|
|
381
|
+
case SerovalNodeType.BigInt:
|
|
382
|
+
return BigInt(node.s);
|
|
383
|
+
case SerovalNodeType.IndexedValue:
|
|
384
|
+
return this.refs.get(node.i);
|
|
385
|
+
case SerovalNodeType.Reference:
|
|
386
|
+
return this.deserializeReference(node);
|
|
387
|
+
case SerovalNodeType.Array:
|
|
388
|
+
return this.deserializeArray(node);
|
|
389
|
+
case SerovalNodeType.Object:
|
|
390
|
+
case SerovalNodeType.NullConstructor:
|
|
391
|
+
return this.deserializeObject(node);
|
|
392
|
+
case SerovalNodeType.Date:
|
|
393
|
+
return this.deserializeDate(node);
|
|
394
|
+
case SerovalNodeType.RegExp:
|
|
395
|
+
return this.deserializeRegExp(node);
|
|
396
|
+
case SerovalNodeType.Set:
|
|
397
|
+
return this.deserializeSet(node);
|
|
398
|
+
case SerovalNodeType.Map:
|
|
399
|
+
return this.deserializeMap(node);
|
|
400
|
+
case SerovalNodeType.ArrayBuffer:
|
|
401
|
+
return this.deserializeArrayBuffer(node);
|
|
402
|
+
case SerovalNodeType.BigIntTypedArray:
|
|
403
|
+
case SerovalNodeType.TypedArray:
|
|
404
|
+
return this.deserializeTypedArray(node);
|
|
405
|
+
case SerovalNodeType.DataView:
|
|
406
|
+
return this.deserializeDataView(node);
|
|
407
|
+
case SerovalNodeType.AggregateError:
|
|
408
|
+
return this.deserializeAggregateError(node);
|
|
409
|
+
case SerovalNodeType.Error:
|
|
410
|
+
return this.deserializeError(node);
|
|
411
|
+
case SerovalNodeType.Promise:
|
|
412
|
+
return this.deserializePromise(node);
|
|
413
|
+
case SerovalNodeType.WKSymbol:
|
|
414
|
+
return SYMBOL_REF[node.s];
|
|
415
|
+
case SerovalNodeType.Boxed:
|
|
416
|
+
return this.deserializeBoxed(node);
|
|
417
|
+
case SerovalNodeType.Plugin:
|
|
418
|
+
return this.deserializePlugin(node);
|
|
419
|
+
case SerovalNodeType.PromiseConstructor:
|
|
420
|
+
return this.deserializePromiseConstructor(node);
|
|
421
|
+
case SerovalNodeType.PromiseResolve:
|
|
422
|
+
return this.deserializePromiseResolve(node);
|
|
423
|
+
case SerovalNodeType.PromiseReject:
|
|
424
|
+
return this.deserializePromiseReject(node);
|
|
425
|
+
case SerovalNodeType.IteratorFactoryInstance:
|
|
426
|
+
return this.deserializeIteratorFactoryInstance(node);
|
|
427
|
+
case SerovalNodeType.AsyncIteratorFactoryInstance:
|
|
428
|
+
return this.deserializeAsyncIteratorFactoryInstance(node);
|
|
429
|
+
case SerovalNodeType.StreamConstructor:
|
|
430
|
+
return this.deserializeStreamConstructor(node);
|
|
431
|
+
case SerovalNodeType.StreamNext:
|
|
432
|
+
return this.deserializeStreamNext(node);
|
|
433
|
+
case SerovalNodeType.StreamThrow:
|
|
434
|
+
return this.deserializeStreamThrow(node);
|
|
435
|
+
case SerovalNodeType.StreamReturn:
|
|
436
|
+
return this.deserializeStreamReturn(node);
|
|
437
|
+
case SerovalNodeType.IteratorFactory:
|
|
438
|
+
return this.deserializeIteratorFactory(node);
|
|
439
|
+
case SerovalNodeType.AsyncIteratorFactory:
|
|
440
|
+
return this.deserializeAsyncIteratorFactory(node);
|
|
441
|
+
// case SerovalNodeType.SpecialReference:
|
|
442
|
+
default:
|
|
443
|
+
throw new SerovalUnsupportedNodeError(node);
|
|
444
|
+
}
|
|
445
|
+
} catch (error) {
|
|
446
|
+
throw new SerovalDeserializationError(error);
|
|
437
447
|
}
|
|
438
448
|
}
|
|
439
449
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import UnsupportedTypeError from '../../UnsupportedTypeError';
|
|
2
1
|
import {
|
|
3
2
|
createPluginNode,
|
|
4
3
|
createDateNode,
|
|
@@ -61,6 +60,7 @@ import type {
|
|
|
61
60
|
BigIntTypedArrayValue,
|
|
62
61
|
TypedArrayValue,
|
|
63
62
|
} from '../../utils/typed-array';
|
|
63
|
+
import { SerovalParserError, SerovalUnsupportedTypeError } from '../../errors';
|
|
64
64
|
|
|
65
65
|
type ObjectLikeNode =
|
|
66
66
|
| SerovalObjectNode
|
|
@@ -429,36 +429,40 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext {
|
|
|
429
429
|
if (Symbol.iterator in current || Symbol.asyncIterator in current) {
|
|
430
430
|
return this.parsePlainObject(id, current, !!currentClass);
|
|
431
431
|
}
|
|
432
|
-
throw new
|
|
432
|
+
throw new SerovalUnsupportedTypeError(current);
|
|
433
433
|
}
|
|
434
434
|
|
|
435
435
|
async parse<T>(current: T): Promise<SerovalNode> {
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
436
|
+
try {
|
|
437
|
+
switch (typeof current) {
|
|
438
|
+
case 'boolean':
|
|
439
|
+
return current ? TRUE_NODE : FALSE_NODE;
|
|
440
|
+
case 'undefined':
|
|
441
|
+
return UNDEFINED_NODE;
|
|
442
|
+
case 'string':
|
|
443
|
+
return createStringNode(current as string);
|
|
444
|
+
case 'number':
|
|
445
|
+
return createNumberNode(current as number);
|
|
446
|
+
case 'bigint':
|
|
447
|
+
return createBigIntNode(current as bigint);
|
|
448
|
+
case 'object': {
|
|
449
|
+
if (current) {
|
|
450
|
+
const ref = this.getReference(current);
|
|
451
|
+
return ref.type === 0
|
|
452
|
+
? await this.parseObject(ref.value, current as object)
|
|
453
|
+
: ref.value;
|
|
454
|
+
}
|
|
455
|
+
return NULL_NODE;
|
|
453
456
|
}
|
|
454
|
-
|
|
457
|
+
case 'symbol':
|
|
458
|
+
return this.parseWellKnownSymbol(current);
|
|
459
|
+
case 'function':
|
|
460
|
+
return this.parseFunction(current as (...args: unknown[]) => unknown);
|
|
461
|
+
default:
|
|
462
|
+
throw new SerovalUnsupportedTypeError(current);
|
|
455
463
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
case 'function':
|
|
459
|
-
return this.parseFunction(current as (...args: unknown[]) => unknown);
|
|
460
|
-
default:
|
|
461
|
-
throw new UnsupportedTypeError(current);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
throw new SerovalParserError(error);
|
|
462
466
|
}
|
|
463
467
|
}
|
|
464
468
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import UnsupportedTypeError from '../../UnsupportedTypeError';
|
|
2
1
|
import {
|
|
3
2
|
createAggregateErrorNode,
|
|
4
3
|
createArrayBufferNode,
|
|
@@ -56,6 +55,7 @@ import type {
|
|
|
56
55
|
BigIntTypedArrayValue,
|
|
57
56
|
TypedArrayValue,
|
|
58
57
|
} from '../../utils/typed-array';
|
|
58
|
+
import { SerovalParserError, SerovalUnsupportedTypeError } from '../../errors';
|
|
59
59
|
|
|
60
60
|
type ObjectLikeNode = SerovalObjectNode | SerovalNullConstructorNode;
|
|
61
61
|
|
|
@@ -338,36 +338,40 @@ export default abstract class BaseSyncParserContext extends BaseParserContext {
|
|
|
338
338
|
if (Symbol.iterator in current || Symbol.asyncIterator in current) {
|
|
339
339
|
return this.parsePlainObject(id, current, !!currentClass);
|
|
340
340
|
}
|
|
341
|
-
throw new
|
|
341
|
+
throw new SerovalUnsupportedTypeError(current);
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
parse<T>(current: T): SerovalNode {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
345
|
+
try {
|
|
346
|
+
switch (typeof current) {
|
|
347
|
+
case 'boolean':
|
|
348
|
+
return current ? TRUE_NODE : FALSE_NODE;
|
|
349
|
+
case 'undefined':
|
|
350
|
+
return UNDEFINED_NODE;
|
|
351
|
+
case 'string':
|
|
352
|
+
return createStringNode(current as string);
|
|
353
|
+
case 'number':
|
|
354
|
+
return createNumberNode(current as number);
|
|
355
|
+
case 'bigint':
|
|
356
|
+
return createBigIntNode(current as bigint);
|
|
357
|
+
case 'object': {
|
|
358
|
+
if (current) {
|
|
359
|
+
const ref = this.getReference(current);
|
|
360
|
+
return ref.type === 0
|
|
361
|
+
? this.parseObject(ref.value, current as object)
|
|
362
|
+
: ref.value;
|
|
363
|
+
}
|
|
364
|
+
return NULL_NODE;
|
|
362
365
|
}
|
|
363
|
-
|
|
366
|
+
case 'symbol':
|
|
367
|
+
return this.parseWellKnownSymbol(current);
|
|
368
|
+
case 'function':
|
|
369
|
+
return this.parseFunction(current as (...args: unknown[]) => unknown);
|
|
370
|
+
default:
|
|
371
|
+
throw new SerovalUnsupportedTypeError(current);
|
|
364
372
|
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
case 'function':
|
|
368
|
-
return this.parseFunction(current as (...args: unknown[]) => unknown);
|
|
369
|
-
default:
|
|
370
|
-
throw new UnsupportedTypeError(current);
|
|
373
|
+
} catch (error) {
|
|
374
|
+
throw new SerovalParserError(error);
|
|
371
375
|
}
|
|
372
376
|
}
|
|
373
377
|
}
|
|
@@ -30,6 +30,7 @@ import type {
|
|
|
30
30
|
SerovalWKSymbolNode,
|
|
31
31
|
} from '../types';
|
|
32
32
|
import { getObjectFlag } from '../utils/get-object-flag';
|
|
33
|
+
import { SerovalUnsupportedTypeError } from '../errors';
|
|
33
34
|
|
|
34
35
|
export interface BaseParserContextOptions extends PluginAccessOptions {
|
|
35
36
|
disabledFeatures?: number;
|
|
@@ -118,12 +119,7 @@ export abstract class BaseParserContext implements PluginAccessOptions {
|
|
|
118
119
|
protected getStrictReference<T>(
|
|
119
120
|
current: T,
|
|
120
121
|
): SerovalIndexedValueNode | SerovalReferenceNode {
|
|
121
|
-
assert(
|
|
122
|
-
hasReferenceID(current),
|
|
123
|
-
new Error(
|
|
124
|
-
'Cannot serialize ' + typeof current + ' without reference ID.',
|
|
125
|
-
),
|
|
126
|
-
);
|
|
122
|
+
assert(hasReferenceID(current), new SerovalUnsupportedTypeError(current));
|
|
127
123
|
const result = this.getIndexedValue(current);
|
|
128
124
|
if (result.type === NodeType.Indexed) {
|
|
129
125
|
return result.value;
|
|
@@ -144,10 +140,7 @@ export abstract class BaseParserContext implements PluginAccessOptions {
|
|
|
144
140
|
if (ref.type !== NodeType.Fresh) {
|
|
145
141
|
return ref.value;
|
|
146
142
|
}
|
|
147
|
-
assert(
|
|
148
|
-
current in INV_SYMBOL_REF,
|
|
149
|
-
new Error('Cannot serialized unsupported symbol.'),
|
|
150
|
-
);
|
|
143
|
+
assert(current in INV_SYMBOL_REF, new SerovalUnsupportedTypeError(current));
|
|
151
144
|
return createWKSymbolNode(ref.value, current as WellKnownSymbols);
|
|
152
145
|
}
|
|
153
146
|
|