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.
Files changed (34) hide show
  1. package/dist/cjs/development/index.cjs +330 -225
  2. package/dist/cjs/development/index.cjs.map +3 -3
  3. package/dist/cjs/production/index.cjs +17 -3
  4. package/dist/esm/development/index.mjs +330 -225
  5. package/dist/esm/development/index.mjs.map +3 -3
  6. package/dist/esm/production/index.mjs +17 -3
  7. package/dist/types/core/base-primitives.d.ts.map +1 -1
  8. package/dist/types/core/context/deserializer.d.ts.map +1 -1
  9. package/dist/types/core/context/parser/async.d.ts.map +1 -1
  10. package/dist/types/core/context/parser/sync.d.ts.map +1 -1
  11. package/dist/types/core/context/parser.d.ts.map +1 -1
  12. package/dist/types/core/context/serializer.d.ts.map +1 -1
  13. package/dist/types/core/errors.d.ts +38 -0
  14. package/dist/types/core/errors.d.ts.map +1 -0
  15. package/dist/types/core/reference.d.ts.map +1 -1
  16. package/dist/types/core/tree/serializer.d.ts.map +1 -1
  17. package/dist/types/core/utils/typed-array.d.ts.map +1 -1
  18. package/dist/types/index.d.ts +1 -0
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/package.json +2 -2
  21. package/src/core/base-primitives.ts +0 -5
  22. package/src/core/context/deserializer.ts +86 -76
  23. package/src/core/context/parser/async.ts +30 -26
  24. package/src/core/context/parser/sync.ts +30 -26
  25. package/src/core/context/parser.ts +3 -10
  26. package/src/core/context/serializer.ts +104 -95
  27. package/src/core/errors.ts +99 -0
  28. package/src/core/reference.ts +6 -2
  29. package/src/core/tree/serializer.ts +4 -3
  30. package/src/core/utils/typed-array.ts +3 -1
  31. package/src/index.ts +1 -0
  32. package/dist/types/core/UnsupportedTypeError.d.ts +0 -5
  33. package/dist/types/core/UnsupportedTypeError.d.ts.map +0 -1
  34. 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 Error('Missing plugin for tag "' + node.c + '".');
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 Error('Missing Promise instance.'));
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 Error('Missing Promise instance.'));
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 Error('Missing Stream instance.'));
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 Error('Missing Stream instance.'));
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 Error('Missing Stream instance.'));
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
- switch (node.t) {
368
- case SerovalNodeType.Constant:
369
- return CONSTANT_VAL[node.s];
370
- case SerovalNodeType.Number:
371
- return node.s;
372
- case SerovalNodeType.String:
373
- return deserializeString(node.s);
374
- case SerovalNodeType.BigInt:
375
- return BigInt(node.s);
376
- case SerovalNodeType.IndexedValue:
377
- return this.refs.get(node.i);
378
- case SerovalNodeType.Reference:
379
- return this.deserializeReference(node);
380
- case SerovalNodeType.Array:
381
- return this.deserializeArray(node);
382
- case SerovalNodeType.Object:
383
- case SerovalNodeType.NullConstructor:
384
- return this.deserializeObject(node);
385
- case SerovalNodeType.Date:
386
- return this.deserializeDate(node);
387
- case SerovalNodeType.RegExp:
388
- return this.deserializeRegExp(node);
389
- case SerovalNodeType.Set:
390
- return this.deserializeSet(node);
391
- case SerovalNodeType.Map:
392
- return this.deserializeMap(node);
393
- case SerovalNodeType.ArrayBuffer:
394
- return this.deserializeArrayBuffer(node);
395
- case SerovalNodeType.BigIntTypedArray:
396
- case SerovalNodeType.TypedArray:
397
- return this.deserializeTypedArray(node);
398
- case SerovalNodeType.DataView:
399
- return this.deserializeDataView(node);
400
- case SerovalNodeType.AggregateError:
401
- return this.deserializeAggregateError(node);
402
- case SerovalNodeType.Error:
403
- return this.deserializeError(node);
404
- case SerovalNodeType.Promise:
405
- return this.deserializePromise(node);
406
- case SerovalNodeType.WKSymbol:
407
- return SYMBOL_REF[node.s];
408
- case SerovalNodeType.Boxed:
409
- return this.deserializeBoxed(node);
410
- case SerovalNodeType.Plugin:
411
- return this.deserializePlugin(node);
412
- case SerovalNodeType.PromiseConstructor:
413
- return this.deserializePromiseConstructor(node);
414
- case SerovalNodeType.PromiseResolve:
415
- return this.deserializePromiseResolve(node);
416
- case SerovalNodeType.PromiseReject:
417
- return this.deserializePromiseReject(node);
418
- case SerovalNodeType.IteratorFactoryInstance:
419
- return this.deserializeIteratorFactoryInstance(node);
420
- case SerovalNodeType.AsyncIteratorFactoryInstance:
421
- return this.deserializeAsyncIteratorFactoryInstance(node);
422
- case SerovalNodeType.StreamConstructor:
423
- return this.deserializeStreamConstructor(node);
424
- case SerovalNodeType.StreamNext:
425
- return this.deserializeStreamNext(node);
426
- case SerovalNodeType.StreamThrow:
427
- return this.deserializeStreamThrow(node);
428
- case SerovalNodeType.StreamReturn:
429
- return this.deserializeStreamReturn(node);
430
- case SerovalNodeType.IteratorFactory:
431
- return this.deserializeIteratorFactory(node);
432
- case SerovalNodeType.AsyncIteratorFactory:
433
- return this.deserializeAsyncIteratorFactory(node);
434
- // case SerovalNodeType.SpecialReference:
435
- default:
436
- throw new Error('invariant');
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 UnsupportedTypeError(current);
432
+ throw new SerovalUnsupportedTypeError(current);
433
433
  }
434
434
 
435
435
  async parse<T>(current: T): Promise<SerovalNode> {
436
- switch (typeof current) {
437
- case 'boolean':
438
- return current ? TRUE_NODE : FALSE_NODE;
439
- case 'undefined':
440
- return UNDEFINED_NODE;
441
- case 'string':
442
- return createStringNode(current as string);
443
- case 'number':
444
- return createNumberNode(current as number);
445
- case 'bigint':
446
- return createBigIntNode(current as bigint);
447
- case 'object': {
448
- if (current) {
449
- const ref = this.getReference(current);
450
- return ref.type === 0
451
- ? await this.parseObject(ref.value, current as object)
452
- : ref.value;
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
- return NULL_NODE;
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
- case 'symbol':
457
- return this.parseWellKnownSymbol(current);
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 UnsupportedTypeError(current);
341
+ throw new SerovalUnsupportedTypeError(current);
342
342
  }
343
343
 
344
344
  parse<T>(current: T): SerovalNode {
345
- switch (typeof current) {
346
- case 'boolean':
347
- return current ? TRUE_NODE : FALSE_NODE;
348
- case 'undefined':
349
- return UNDEFINED_NODE;
350
- case 'string':
351
- return createStringNode(current as string);
352
- case 'number':
353
- return createNumberNode(current as number);
354
- case 'bigint':
355
- return createBigIntNode(current as bigint);
356
- case 'object': {
357
- if (current) {
358
- const ref = this.getReference(current);
359
- return ref.type === 0
360
- ? this.parseObject(ref.value, current as object)
361
- : ref.value;
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
- return NULL_NODE;
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
- case 'symbol':
366
- return this.parseWellKnownSymbol(current);
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