seroval 1.0.3 → 1.0.5

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 (71) hide show
  1. package/dist/cjs/development/index.cjs +556 -451
  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 +556 -451
  5. package/dist/esm/development/index.mjs.map +3 -3
  6. package/dist/esm/production/index.mjs +17 -3
  7. package/dist/types/core/Serializer.d.ts.map +1 -1
  8. package/dist/types/core/base-primitives.d.ts.map +1 -1
  9. package/dist/types/core/constants.d.ts +4 -4
  10. package/dist/types/core/constants.d.ts.map +1 -1
  11. package/dist/types/core/context/deserializer.d.ts +1 -1
  12. package/dist/types/core/context/deserializer.d.ts.map +1 -1
  13. package/dist/types/core/context/parser/async.d.ts +1 -1
  14. package/dist/types/core/context/parser/async.d.ts.map +1 -1
  15. package/dist/types/core/context/parser/stream.d.ts +2 -2
  16. package/dist/types/core/context/parser/stream.d.ts.map +1 -1
  17. package/dist/types/core/context/parser/sync.d.ts +3 -3
  18. package/dist/types/core/context/parser/sync.d.ts.map +1 -1
  19. package/dist/types/core/context/parser.d.ts.map +1 -1
  20. package/dist/types/core/context/serializer.d.ts +1 -1
  21. package/dist/types/core/context/serializer.d.ts.map +1 -1
  22. package/dist/types/core/cross/async.d.ts +1 -1
  23. package/dist/types/core/cross/async.d.ts.map +1 -1
  24. package/dist/types/core/cross/deserializer.d.ts +1 -1
  25. package/dist/types/core/cross/deserializer.d.ts.map +1 -1
  26. package/dist/types/core/cross/serializer.d.ts +1 -1
  27. package/dist/types/core/cross/serializer.d.ts.map +1 -1
  28. package/dist/types/core/errors.d.ts +38 -0
  29. package/dist/types/core/errors.d.ts.map +1 -0
  30. package/dist/types/core/plugin.d.ts +1 -1
  31. package/dist/types/core/plugin.d.ts.map +1 -1
  32. package/dist/types/core/reference.d.ts.map +1 -1
  33. package/dist/types/core/tree/async.d.ts +1 -1
  34. package/dist/types/core/tree/async.d.ts.map +1 -1
  35. package/dist/types/core/tree/deserializer.d.ts +1 -1
  36. package/dist/types/core/tree/deserializer.d.ts.map +1 -1
  37. package/dist/types/core/tree/index.d.ts.map +1 -1
  38. package/dist/types/core/tree/serializer.d.ts +1 -1
  39. package/dist/types/core/tree/serializer.d.ts.map +1 -1
  40. package/dist/types/core/types.d.ts +1 -1
  41. package/dist/types/core/types.d.ts.map +1 -1
  42. package/dist/types/core/utils/typed-array.d.ts.map +1 -1
  43. package/dist/types/index.d.ts +1 -0
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/package.json +4 -5
  46. package/src/core/Serializer.ts +5 -5
  47. package/src/core/base-primitives.ts +4 -9
  48. package/src/core/constants.ts +12 -12
  49. package/src/core/context/deserializer.ts +100 -90
  50. package/src/core/context/parser/async.ts +56 -52
  51. package/src/core/context/parser/stream.ts +5 -5
  52. package/src/core/context/parser/sync.ts +45 -41
  53. package/src/core/context/parser.ts +5 -12
  54. package/src/core/context/serializer.ts +127 -118
  55. package/src/core/cross/async.ts +1 -1
  56. package/src/core/cross/deserializer.ts +1 -1
  57. package/src/core/cross/serializer.ts +2 -2
  58. package/src/core/errors.ts +102 -0
  59. package/src/core/literals.ts +4 -4
  60. package/src/core/plugin.ts +1 -1
  61. package/src/core/reference.ts +7 -3
  62. package/src/core/tree/async.ts +1 -1
  63. package/src/core/tree/deserializer.ts +1 -1
  64. package/src/core/tree/index.ts +8 -2
  65. package/src/core/tree/serializer.ts +8 -7
  66. package/src/core/types.ts +2 -2
  67. package/src/core/utils/typed-array.ts +3 -1
  68. package/src/index.ts +1 -0
  69. package/dist/types/core/UnsupportedTypeError.d.ts +0 -5
  70. package/dist/types/core/UnsupportedTypeError.d.ts.map +0 -1
  71. package/src/core/UnsupportedTypeError.ts +0 -7
@@ -22,6 +22,17 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  Feature: () => Feature,
24
24
  Serializer: () => Serializer,
25
+ SerovalDeserializationError: () => SerovalDeserializationError,
26
+ SerovalError: () => SerovalError,
27
+ SerovalMissingInstanceError: () => SerovalMissingInstanceError,
28
+ SerovalMissingPluginError: () => SerovalMissingPluginError,
29
+ SerovalMissingReferenceError: () => SerovalMissingReferenceError,
30
+ SerovalMissingReferenceForIdError: () => SerovalMissingReferenceForIdError,
31
+ SerovalParserError: () => SerovalParserError,
32
+ SerovalSerializationError: () => SerovalSerializationError,
33
+ SerovalUnknownTypedArrayError: () => SerovalUnknownTypedArrayError,
34
+ SerovalUnsupportedNodeError: () => SerovalUnsupportedNodeError,
35
+ SerovalUnsupportedTypeError: () => SerovalUnsupportedTypeError,
25
36
  compileJSON: () => compileJSON,
26
37
  createPlugin: () => createPlugin,
27
38
  createReference: () => createReference,
@@ -55,13 +66,6 @@ var Feature = /* @__PURE__ */ ((Feature2) => {
55
66
  })(Feature || {});
56
67
  var ALL_ENABLED = 31;
57
68
 
58
- // src/core/utils/assert.ts
59
- function assert(cond, error) {
60
- if (!cond) {
61
- throw error;
62
- }
63
- }
64
-
65
69
  // src/core/string.ts
66
70
  function serializeChar(str) {
67
71
  switch (str) {
@@ -153,6 +157,13 @@ function getCrossReferenceHeader(id) {
153
157
  )}"]=[]`;
154
158
  }
155
159
 
160
+ // src/core/utils/assert.ts
161
+ function assert(cond, error) {
162
+ if (!cond) {
163
+ throw error;
164
+ }
165
+ }
166
+
156
167
  // src/core/reference.ts
157
168
  var REFERENCE = /* @__PURE__ */ new Map();
158
169
  var INV_REFERENCE = /* @__PURE__ */ new Map();
@@ -168,11 +179,11 @@ function hasReference(id) {
168
179
  return INV_REFERENCE.has(id);
169
180
  }
170
181
  function getReferenceID(value) {
171
- assert(hasReferenceID(value), new Error("Missing reference id"));
182
+ assert(hasReferenceID(value), new SerovalMissingReferenceError(value));
172
183
  return REFERENCE.get(value);
173
184
  }
174
185
  function getReference(id) {
175
- assert(hasReference(id), new Error("Missing reference for id:" + id));
186
+ assert(hasReference(id), new SerovalMissingReferenceForIdError(id));
176
187
  return INV_REFERENCE.get(id);
177
188
  }
178
189
  if (typeof globalThis !== "undefined") {
@@ -229,15 +240,6 @@ function resolvePlugins(plugins) {
229
240
  return void 0;
230
241
  }
231
242
 
232
- // src/core/UnsupportedTypeError.ts
233
- var { toString: objectToString } = Object.prototype;
234
- var UnsupportedTypeError = class extends Error {
235
- constructor(value) {
236
- super('Unsupported type "' + objectToString.call(value) + '"');
237
- this.value = value;
238
- }
239
- };
240
-
241
243
  // src/core/constants.ts
242
244
  var SYMBOL_STRING = {
243
245
  [0 /* AsyncIterator */]: "Symbol.asyncIterator",
@@ -289,20 +291,20 @@ var CONSTANT_STRING = {
289
291
  [3 /* False */]: "!1",
290
292
  [1 /* Undefined */]: "void 0",
291
293
  [0 /* Null */]: "null",
292
- [4 /* NegativeZero */]: "-0",
293
- [5 /* Infinity */]: "1/0",
294
- [6 /* NegativeInfinity */]: "-1/0",
295
- [7 /* NaN */]: "0/0"
294
+ [4 /* NegZero */]: "-0",
295
+ [5 /* Inf */]: "1/0",
296
+ [6 /* NegInf */]: "-1/0",
297
+ [7 /* Nan */]: "0/0"
296
298
  };
297
299
  var CONSTANT_VAL = {
298
300
  [2 /* True */]: true,
299
301
  [3 /* False */]: false,
300
302
  [1 /* Undefined */]: void 0,
301
303
  [0 /* Null */]: null,
302
- [4 /* NegativeZero */]: -0,
303
- [5 /* Infinity */]: Infinity,
304
- [6 /* NegativeInfinity */]: -Infinity,
305
- [7 /* NaN */]: NaN
304
+ [4 /* NegZero */]: -0,
305
+ [5 /* Inf */]: Number.POSITIVE_INFINITY,
306
+ [6 /* NegInf */]: Number.NEGATIVE_INFINITY,
307
+ [7 /* Nan */]: Number.NaN
306
308
  };
307
309
  var ERROR_CONSTRUCTOR_STRING = {
308
310
  [0 /* Error */]: "Error",
@@ -353,15 +355,15 @@ var NULL_NODE = /* @__PURE__ */ createConstantNode(
353
355
  0 /* Null */
354
356
  );
355
357
  var NEG_ZERO_NODE = /* @__PURE__ */ createConstantNode(
356
- 4 /* NegativeZero */
358
+ 4 /* NegZero */
357
359
  );
358
360
  var INFINITY_NODE = /* @__PURE__ */ createConstantNode(
359
- 5 /* Infinity */
361
+ 5 /* Inf */
360
362
  );
361
363
  var NEG_INFINITY_NODE = /* @__PURE__ */ createConstantNode(
362
- 6 /* NegativeInfinity */
364
+ 6 /* NegInf */
363
365
  );
364
- var NAN_NODE = /* @__PURE__ */ createConstantNode(7 /* NaN */);
366
+ var NAN_NODE = /* @__PURE__ */ createConstantNode(7 /* Nan */);
365
367
 
366
368
  // src/core/utils/error.ts
367
369
  function getErrorConstructor(error) {
@@ -432,9 +434,9 @@ function getObjectFlag(obj) {
432
434
  // src/core/base-primitives.ts
433
435
  function createNumberNode(value) {
434
436
  switch (value) {
435
- case Infinity:
437
+ case Number.POSITIVE_INFINITY:
436
438
  return INFINITY_NODE;
437
- case -Infinity:
439
+ case Number.NEGATIVE_INFINITY:
438
440
  return NEG_INFINITY_NODE;
439
441
  }
440
442
  if (value !== value) {
@@ -561,10 +563,6 @@ function createArrayBufferNode(id, current) {
561
563
  };
562
564
  }
563
565
  function createWKSymbolNode(id, current) {
564
- assert(
565
- current in INV_SYMBOL_REF,
566
- new Error("Only well-known symbols are supported.")
567
- );
568
566
  return {
569
567
  t: 17 /* WKSymbol */,
570
568
  i: id,
@@ -837,6 +835,288 @@ function createStreamReturnNode(id, parsed) {
837
835
  };
838
836
  }
839
837
 
838
+ // src/core/errors.ts
839
+ var { toString: objectToString } = Object.prototype;
840
+ function getErrorMessage(type, cause) {
841
+ if (cause instanceof Error) {
842
+ return `Seroval caught an error during the ${type} process.
843
+
844
+ ${cause.name}
845
+ ${cause.message}
846
+
847
+ - For more information, please check the "cause" property of this error.
848
+ - If you believe this is an error in Seroval, please submit an issue at https://github.com/lxsmnsyc/seroval/issues/new`;
849
+ }
850
+ return `Seroval caught an error during the ${type} process.
851
+
852
+ "${objectToString.call(cause)}"
853
+
854
+ For more information, please check the "cause" property of this error.`;
855
+ }
856
+ var SerovalError = class extends Error {
857
+ constructor(type, cause) {
858
+ super(getErrorMessage(type, cause));
859
+ this.cause = cause;
860
+ }
861
+ };
862
+ var SerovalParserError = class extends SerovalError {
863
+ constructor(cause) {
864
+ super("parsing", cause);
865
+ }
866
+ };
867
+ var SerovalSerializationError = class extends SerovalError {
868
+ constructor(cause) {
869
+ super("serialization", cause);
870
+ }
871
+ };
872
+ var SerovalDeserializationError = class extends SerovalError {
873
+ constructor(cause) {
874
+ super("deserialization", cause);
875
+ }
876
+ };
877
+ var SerovalUnsupportedTypeError = class extends Error {
878
+ constructor(value) {
879
+ super(
880
+ `The value ${objectToString.call(value)} of type "${typeof value}" cannot be parsed/serialized.
881
+
882
+ There are few workarounds for this problem:
883
+ - Transform the value in a way that it can be serialized.
884
+ - If the reference is present on multiple runtimes (isomorphic), you can use the Reference API to map the references.`
885
+ );
886
+ this.value = value;
887
+ }
888
+ };
889
+ var SerovalUnsupportedNodeError = class extends Error {
890
+ constructor(node) {
891
+ super('Unsupported node type "' + node.t + '".');
892
+ }
893
+ };
894
+ var SerovalMissingPluginError = class extends Error {
895
+ constructor(tag) {
896
+ super('Missing plugin for tag "' + tag + '".');
897
+ }
898
+ };
899
+ var SerovalMissingInstanceError = class extends Error {
900
+ constructor(tag) {
901
+ super('Missing "' + tag + '" instance.');
902
+ }
903
+ };
904
+ var SerovalMissingReferenceError = class extends Error {
905
+ constructor(value) {
906
+ super(
907
+ 'Missing reference for the value "' + objectToString.call(value) + '" of type "' + typeof value + '"'
908
+ );
909
+ this.value = value;
910
+ }
911
+ };
912
+ var SerovalMissingReferenceForIdError = class extends Error {
913
+ constructor(id) {
914
+ super('Missing reference for id "' + serializeString(id) + '"');
915
+ }
916
+ };
917
+ var SerovalUnknownTypedArrayError = class extends Error {
918
+ constructor(name) {
919
+ super('Unknown TypedArray "' + name + '"');
920
+ }
921
+ };
922
+
923
+ // src/core/special-reference.ts
924
+ var ITERATOR = {};
925
+ var ASYNC_ITERATOR = {};
926
+ var SPECIAL_REFS = {
927
+ [0 /* MapSentinel */]: {},
928
+ [1 /* PromiseConstructor */]: {},
929
+ [2 /* PromiseResolve */]: {},
930
+ [3 /* PromiseReject */]: {},
931
+ [4 /* StreamConstructor */]: {}
932
+ };
933
+
934
+ // src/core/utils/deferred.ts
935
+ function createDeferred() {
936
+ let resolve;
937
+ let reject;
938
+ return {
939
+ promise: new Promise((res, rej) => {
940
+ resolve = res;
941
+ reject = rej;
942
+ }),
943
+ resolve(value) {
944
+ resolve(value);
945
+ },
946
+ reject(value) {
947
+ reject(value);
948
+ }
949
+ };
950
+ }
951
+
952
+ // src/core/stream.ts
953
+ function isStream(value) {
954
+ return "__SEROVAL_STREAM__" in value;
955
+ }
956
+ function createStream() {
957
+ const listeners = /* @__PURE__ */ new Set();
958
+ const buffer = [];
959
+ let alive = true;
960
+ let success = false;
961
+ function flushNext(value) {
962
+ for (const listener of listeners.keys()) {
963
+ listener.next(value);
964
+ }
965
+ }
966
+ function flushThrow(value) {
967
+ for (const listener of listeners.keys()) {
968
+ listener.throw(value);
969
+ }
970
+ }
971
+ function flushReturn(value) {
972
+ for (const listener of listeners.keys()) {
973
+ listener.return(value);
974
+ }
975
+ }
976
+ return {
977
+ __SEROVAL_STREAM__: true,
978
+ on(listener) {
979
+ if (alive) {
980
+ listeners.add(listener);
981
+ }
982
+ for (let i = 0, len = buffer.length; i < len; i++) {
983
+ const value = buffer[i];
984
+ if (i === len - 1) {
985
+ if (success) {
986
+ listener.return(value);
987
+ } else {
988
+ listener.throw(value);
989
+ }
990
+ } else {
991
+ listener.next(value);
992
+ }
993
+ }
994
+ return () => {
995
+ if (alive) {
996
+ listeners.delete(listener);
997
+ }
998
+ };
999
+ },
1000
+ next(value) {
1001
+ if (alive) {
1002
+ buffer.push(value);
1003
+ flushNext(value);
1004
+ }
1005
+ },
1006
+ throw(value) {
1007
+ if (alive) {
1008
+ buffer.push(value);
1009
+ flushThrow(value);
1010
+ alive = false;
1011
+ success = false;
1012
+ listeners.clear();
1013
+ }
1014
+ },
1015
+ return(value) {
1016
+ if (alive) {
1017
+ buffer.push(value);
1018
+ flushReturn(value);
1019
+ alive = false;
1020
+ success = true;
1021
+ listeners.clear();
1022
+ }
1023
+ }
1024
+ };
1025
+ }
1026
+ function createStreamFromAsyncIterable(iterable) {
1027
+ const stream = createStream();
1028
+ const iterator = iterable[Symbol.asyncIterator]();
1029
+ async function push() {
1030
+ try {
1031
+ const value = await iterator.next();
1032
+ if (value.done) {
1033
+ stream.return(value.value);
1034
+ } else {
1035
+ stream.next(value.value);
1036
+ await push();
1037
+ }
1038
+ } catch (error) {
1039
+ stream.throw(error);
1040
+ }
1041
+ }
1042
+ push().catch(() => {
1043
+ });
1044
+ return stream;
1045
+ }
1046
+ function streamToAsyncIterable(stream) {
1047
+ return () => {
1048
+ const buffer = [];
1049
+ const pending = [];
1050
+ let count = 0;
1051
+ let doneAt = -1;
1052
+ let isThrow = false;
1053
+ function resolveAll() {
1054
+ for (let i = 0, len = pending.length; i < len; i++) {
1055
+ pending[i].resolve({ done: true, value: void 0 });
1056
+ }
1057
+ }
1058
+ stream.on({
1059
+ next(value) {
1060
+ const current = pending.shift();
1061
+ if (current) {
1062
+ current.resolve({ done: false, value });
1063
+ }
1064
+ buffer.push(value);
1065
+ },
1066
+ throw(value) {
1067
+ const current = pending.shift();
1068
+ if (current) {
1069
+ current.reject(value);
1070
+ }
1071
+ resolveAll();
1072
+ doneAt = buffer.length;
1073
+ buffer.push(value);
1074
+ isThrow = true;
1075
+ },
1076
+ return(value) {
1077
+ const current = pending.shift();
1078
+ if (current) {
1079
+ current.resolve({ done: true, value });
1080
+ }
1081
+ resolveAll();
1082
+ doneAt = buffer.length;
1083
+ buffer.push(value);
1084
+ }
1085
+ });
1086
+ function finalize() {
1087
+ const current = count++;
1088
+ const value = buffer[current];
1089
+ if (current !== doneAt) {
1090
+ return { done: false, value };
1091
+ }
1092
+ if (isThrow) {
1093
+ throw value;
1094
+ }
1095
+ return { done: true, value };
1096
+ }
1097
+ return {
1098
+ [Symbol.asyncIterator]() {
1099
+ return this;
1100
+ },
1101
+ async next() {
1102
+ if (doneAt === -1) {
1103
+ const current = count++;
1104
+ if (current >= buffer.length) {
1105
+ const deferred = createDeferred();
1106
+ pending.push(deferred);
1107
+ return await deferred.promise;
1108
+ }
1109
+ return { done: false, value: buffer[current] };
1110
+ }
1111
+ if (count > doneAt) {
1112
+ return { done: true, value: void 0 };
1113
+ }
1114
+ return finalize();
1115
+ }
1116
+ };
1117
+ };
1118
+ }
1119
+
840
1120
  // src/core/utils/iterator-to-sequence.ts
841
1121
  function iteratorToSequence(source) {
842
1122
  const values = [];
@@ -890,16 +1170,14 @@ function sequenceToIterator(sequence) {
890
1170
  };
891
1171
  }
892
1172
 
893
- // src/core/special-reference.ts
894
- var ITERATOR = {};
895
- var ASYNC_ITERATOR = {};
896
- var SPECIAL_REFS = {
897
- [0 /* MapSentinel */]: {},
898
- [1 /* PromiseConstructor */]: {},
899
- [2 /* PromiseResolve */]: {},
900
- [3 /* PromiseReject */]: {},
901
- [4 /* StreamConstructor */]: {}
902
- };
1173
+ // src/core/utils/promise-to-result.ts
1174
+ async function promiseToResult(current) {
1175
+ try {
1176
+ return [1, await current];
1177
+ } catch (e) {
1178
+ return [0, e];
1179
+ }
1180
+ }
903
1181
 
904
1182
  // src/core/context/parser.ts
905
1183
  var BaseParserContext = class {
@@ -945,12 +1223,7 @@ var BaseParserContext = class {
945
1223
  return indexed;
946
1224
  }
947
1225
  getStrictReference(current) {
948
- assert(
949
- hasReferenceID(current),
950
- new Error(
951
- "Cannot serialize " + typeof current + " without reference ID."
952
- )
953
- );
1226
+ assert(hasReferenceID(current), new SerovalUnsupportedTypeError(current));
954
1227
  const result = this.getIndexedValue(current);
955
1228
  if (result.type === 1 /* Indexed */) {
956
1229
  return result.value;
@@ -965,10 +1238,7 @@ var BaseParserContext = class {
965
1238
  if (ref.type !== 0 /* Fresh */) {
966
1239
  return ref.value;
967
1240
  }
968
- assert(
969
- current in INV_SYMBOL_REF,
970
- new Error("Cannot serialized unsupported symbol.")
971
- );
1241
+ assert(current in INV_SYMBOL_REF, new SerovalUnsupportedTypeError(current));
972
1242
  return createWKSymbolNode(ref.value, current);
973
1243
  }
974
1244
  parseSpecialReference(ref) {
@@ -1084,201 +1354,6 @@ var BaseParserContext = class {
1084
1354
  }
1085
1355
  };
1086
1356
 
1087
- // src/core/utils/promise-to-result.ts
1088
- async function promiseToResult(current) {
1089
- try {
1090
- return [1, await current];
1091
- } catch (e) {
1092
- return [0, e];
1093
- }
1094
- }
1095
-
1096
- // src/core/utils/deferred.ts
1097
- function createDeferred() {
1098
- let resolve;
1099
- let reject;
1100
- return {
1101
- promise: new Promise((res, rej) => {
1102
- resolve = res;
1103
- reject = rej;
1104
- }),
1105
- resolve(value) {
1106
- resolve(value);
1107
- },
1108
- reject(value) {
1109
- reject(value);
1110
- }
1111
- };
1112
- }
1113
-
1114
- // src/core/stream.ts
1115
- function isStream(value) {
1116
- return "__SEROVAL_STREAM__" in value;
1117
- }
1118
- function createStream() {
1119
- const listeners = /* @__PURE__ */ new Set();
1120
- const buffer = [];
1121
- let alive = true;
1122
- let success = false;
1123
- function flushNext(value) {
1124
- for (const listener of listeners.keys()) {
1125
- listener.next(value);
1126
- }
1127
- }
1128
- function flushThrow(value) {
1129
- for (const listener of listeners.keys()) {
1130
- listener.throw(value);
1131
- }
1132
- }
1133
- function flushReturn(value) {
1134
- for (const listener of listeners.keys()) {
1135
- listener.return(value);
1136
- }
1137
- }
1138
- return {
1139
- __SEROVAL_STREAM__: true,
1140
- on(listener) {
1141
- if (alive) {
1142
- listeners.add(listener);
1143
- }
1144
- for (let i = 0, len = buffer.length; i < len; i++) {
1145
- const value = buffer[i];
1146
- if (i === len - 1) {
1147
- if (success) {
1148
- listener.return(value);
1149
- } else {
1150
- listener.throw(value);
1151
- }
1152
- } else {
1153
- listener.next(value);
1154
- }
1155
- }
1156
- return () => {
1157
- if (alive) {
1158
- listeners.delete(listener);
1159
- }
1160
- };
1161
- },
1162
- next(value) {
1163
- if (alive) {
1164
- buffer.push(value);
1165
- flushNext(value);
1166
- }
1167
- },
1168
- throw(value) {
1169
- if (alive) {
1170
- buffer.push(value);
1171
- flushThrow(value);
1172
- alive = false;
1173
- success = false;
1174
- listeners.clear();
1175
- }
1176
- },
1177
- return(value) {
1178
- if (alive) {
1179
- buffer.push(value);
1180
- flushReturn(value);
1181
- alive = false;
1182
- success = true;
1183
- listeners.clear();
1184
- }
1185
- }
1186
- };
1187
- }
1188
- function createStreamFromAsyncIterable(iterable) {
1189
- const stream = createStream();
1190
- const iterator = iterable[Symbol.asyncIterator]();
1191
- async function push() {
1192
- try {
1193
- const value = await iterator.next();
1194
- if (value.done) {
1195
- stream.return(value.value);
1196
- } else {
1197
- stream.next(value.value);
1198
- await push();
1199
- }
1200
- } catch (error) {
1201
- stream.throw(error);
1202
- }
1203
- }
1204
- push().catch(() => {
1205
- });
1206
- return stream;
1207
- }
1208
- function streamToAsyncIterable(stream) {
1209
- return () => {
1210
- const buffer = [];
1211
- const pending = [];
1212
- let count = 0;
1213
- let doneAt = -1;
1214
- let isThrow = false;
1215
- function resolveAll() {
1216
- for (let i = 0, len = pending.length; i < len; i++) {
1217
- pending[i].resolve({ done: true, value: void 0 });
1218
- }
1219
- }
1220
- stream.on({
1221
- next(value) {
1222
- const current = pending.shift();
1223
- if (current) {
1224
- current.resolve({ done: false, value });
1225
- }
1226
- buffer.push(value);
1227
- },
1228
- throw(value) {
1229
- const current = pending.shift();
1230
- if (current) {
1231
- current.reject(value);
1232
- }
1233
- resolveAll();
1234
- doneAt = buffer.length;
1235
- buffer.push(value);
1236
- isThrow = true;
1237
- },
1238
- return(value) {
1239
- const current = pending.shift();
1240
- if (current) {
1241
- current.resolve({ done: true, value });
1242
- }
1243
- resolveAll();
1244
- doneAt = buffer.length;
1245
- buffer.push(value);
1246
- }
1247
- });
1248
- function finalize() {
1249
- const current = count++;
1250
- const value = buffer[current];
1251
- if (current !== doneAt) {
1252
- return { done: false, value };
1253
- }
1254
- if (isThrow) {
1255
- throw value;
1256
- }
1257
- return { done: true, value };
1258
- }
1259
- return {
1260
- [Symbol.asyncIterator]() {
1261
- return this;
1262
- },
1263
- async next() {
1264
- if (doneAt === -1) {
1265
- const current = count++;
1266
- if (current >= buffer.length) {
1267
- const deferred = createDeferred();
1268
- pending.push(deferred);
1269
- return await deferred.promise;
1270
- }
1271
- return { done: false, value: buffer[current] };
1272
- }
1273
- if (count > doneAt) {
1274
- return { done: true, value: void 0 };
1275
- }
1276
- return finalize();
1277
- }
1278
- };
1279
- };
1280
- }
1281
-
1282
1357
  // src/core/context/parser/async.ts
1283
1358
  var BaseAsyncParserContext = class extends BaseParserContext {
1284
1359
  async parseItems(current) {
@@ -1573,33 +1648,37 @@ var BaseAsyncParserContext = class extends BaseParserContext {
1573
1648
  if (Symbol.iterator in current || Symbol.asyncIterator in current) {
1574
1649
  return this.parsePlainObject(id, current, !!currentClass);
1575
1650
  }
1576
- throw new UnsupportedTypeError(current);
1651
+ throw new SerovalUnsupportedTypeError(current);
1577
1652
  }
1578
1653
  async parse(current) {
1579
- switch (typeof current) {
1580
- case "boolean":
1581
- return current ? TRUE_NODE : FALSE_NODE;
1582
- case "undefined":
1583
- return UNDEFINED_NODE;
1584
- case "string":
1585
- return createStringNode(current);
1586
- case "number":
1587
- return createNumberNode(current);
1588
- case "bigint":
1589
- return createBigIntNode(current);
1590
- case "object": {
1591
- if (current) {
1592
- const ref = this.getReference(current);
1593
- return ref.type === 0 ? await this.parseObject(ref.value, current) : ref.value;
1654
+ try {
1655
+ switch (typeof current) {
1656
+ case "boolean":
1657
+ return current ? TRUE_NODE : FALSE_NODE;
1658
+ case "undefined":
1659
+ return UNDEFINED_NODE;
1660
+ case "string":
1661
+ return createStringNode(current);
1662
+ case "number":
1663
+ return createNumberNode(current);
1664
+ case "bigint":
1665
+ return createBigIntNode(current);
1666
+ case "object": {
1667
+ if (current) {
1668
+ const ref = this.getReference(current);
1669
+ return ref.type === 0 ? await this.parseObject(ref.value, current) : ref.value;
1670
+ }
1671
+ return NULL_NODE;
1594
1672
  }
1595
- return NULL_NODE;
1673
+ case "symbol":
1674
+ return this.parseWellKnownSymbol(current);
1675
+ case "function":
1676
+ return this.parseFunction(current);
1677
+ default:
1678
+ throw new SerovalUnsupportedTypeError(current);
1596
1679
  }
1597
- case "symbol":
1598
- return this.parseWellKnownSymbol(current);
1599
- case "function":
1600
- return this.parseFunction(current);
1601
- default:
1602
- throw new UnsupportedTypeError(current);
1680
+ } catch (error) {
1681
+ throw new SerovalParserError(error);
1603
1682
  }
1604
1683
  }
1605
1684
  };
@@ -1638,7 +1717,7 @@ function getTypedArrayConstructor(name) {
1638
1717
  case "BigUint64Array":
1639
1718
  return BigUint64Array;
1640
1719
  default:
1641
- throw new Error(`Unknown TypedArray "${name}"`);
1720
+ throw new SerovalUnknownTypedArrayError(name);
1642
1721
  }
1643
1722
  }
1644
1723
 
@@ -1807,20 +1886,20 @@ var BaseDeserializerContext = class {
1807
1886
  }
1808
1887
  }
1809
1888
  }
1810
- throw new Error('Missing plugin for tag "' + node.c + '".');
1889
+ throw new SerovalMissingPluginError(node.c);
1811
1890
  }
1812
1891
  deserializePromiseConstructor(node) {
1813
1892
  return this.assignIndexedValue(node.i, createDeferred()).promise;
1814
1893
  }
1815
1894
  deserializePromiseResolve(node) {
1816
1895
  const deferred = this.refs.get(node.i);
1817
- assert(deferred, new Error("Missing Promise instance."));
1896
+ assert(deferred, new SerovalMissingInstanceError("Promise"));
1818
1897
  deferred.resolve(this.deserialize(node.a[1]));
1819
1898
  return void 0;
1820
1899
  }
1821
1900
  deserializePromiseReject(node) {
1822
1901
  const deferred = this.refs.get(node.i);
1823
- assert(deferred, new Error("Missing Promise instance."));
1902
+ assert(deferred, new SerovalMissingInstanceError("Promise"));
1824
1903
  deferred.reject(this.deserialize(node.a[1]));
1825
1904
  return void 0;
1826
1905
  }
@@ -1846,19 +1925,19 @@ var BaseDeserializerContext = class {
1846
1925
  }
1847
1926
  deserializeStreamNext(node) {
1848
1927
  const deferred = this.refs.get(node.i);
1849
- assert(deferred, new Error("Missing Stream instance."));
1928
+ assert(deferred, new SerovalMissingInstanceError("Stream"));
1850
1929
  deferred.next(this.deserialize(node.f));
1851
1930
  return void 0;
1852
1931
  }
1853
1932
  deserializeStreamThrow(node) {
1854
1933
  const deferred = this.refs.get(node.i);
1855
- assert(deferred, new Error("Missing Stream instance."));
1934
+ assert(deferred, new SerovalMissingInstanceError("Stream"));
1856
1935
  deferred.throw(this.deserialize(node.f));
1857
1936
  return void 0;
1858
1937
  }
1859
1938
  deserializeStreamReturn(node) {
1860
1939
  const deferred = this.refs.get(node.i);
1861
- assert(deferred, new Error("Missing Stream instance."));
1940
+ assert(deferred, new SerovalMissingInstanceError("Stream"));
1862
1941
  deferred.return(this.deserialize(node.f));
1863
1942
  return void 0;
1864
1943
  }
@@ -1871,75 +1950,79 @@ var BaseDeserializerContext = class {
1871
1950
  return void 0;
1872
1951
  }
1873
1952
  deserialize(node) {
1874
- switch (node.t) {
1875
- case 2 /* Constant */:
1876
- return CONSTANT_VAL[node.s];
1877
- case 0 /* Number */:
1878
- return node.s;
1879
- case 1 /* String */:
1880
- return deserializeString(node.s);
1881
- case 3 /* BigInt */:
1882
- return BigInt(node.s);
1883
- case 4 /* IndexedValue */:
1884
- return this.refs.get(node.i);
1885
- case 18 /* Reference */:
1886
- return this.deserializeReference(node);
1887
- case 9 /* Array */:
1888
- return this.deserializeArray(node);
1889
- case 10 /* Object */:
1890
- case 11 /* NullConstructor */:
1891
- return this.deserializeObject(node);
1892
- case 5 /* Date */:
1893
- return this.deserializeDate(node);
1894
- case 6 /* RegExp */:
1895
- return this.deserializeRegExp(node);
1896
- case 7 /* Set */:
1897
- return this.deserializeSet(node);
1898
- case 8 /* Map */:
1899
- return this.deserializeMap(node);
1900
- case 19 /* ArrayBuffer */:
1901
- return this.deserializeArrayBuffer(node);
1902
- case 16 /* BigIntTypedArray */:
1903
- case 15 /* TypedArray */:
1904
- return this.deserializeTypedArray(node);
1905
- case 20 /* DataView */:
1906
- return this.deserializeDataView(node);
1907
- case 14 /* AggregateError */:
1908
- return this.deserializeAggregateError(node);
1909
- case 13 /* Error */:
1910
- return this.deserializeError(node);
1911
- case 12 /* Promise */:
1912
- return this.deserializePromise(node);
1913
- case 17 /* WKSymbol */:
1914
- return SYMBOL_REF[node.s];
1915
- case 21 /* Boxed */:
1916
- return this.deserializeBoxed(node);
1917
- case 25 /* Plugin */:
1918
- return this.deserializePlugin(node);
1919
- case 22 /* PromiseConstructor */:
1920
- return this.deserializePromiseConstructor(node);
1921
- case 23 /* PromiseResolve */:
1922
- return this.deserializePromiseResolve(node);
1923
- case 24 /* PromiseReject */:
1924
- return this.deserializePromiseReject(node);
1925
- case 28 /* IteratorFactoryInstance */:
1926
- return this.deserializeIteratorFactoryInstance(node);
1927
- case 30 /* AsyncIteratorFactoryInstance */:
1928
- return this.deserializeAsyncIteratorFactoryInstance(node);
1929
- case 31 /* StreamConstructor */:
1930
- return this.deserializeStreamConstructor(node);
1931
- case 32 /* StreamNext */:
1932
- return this.deserializeStreamNext(node);
1933
- case 33 /* StreamThrow */:
1934
- return this.deserializeStreamThrow(node);
1935
- case 34 /* StreamReturn */:
1936
- return this.deserializeStreamReturn(node);
1937
- case 27 /* IteratorFactory */:
1938
- return this.deserializeIteratorFactory(node);
1939
- case 29 /* AsyncIteratorFactory */:
1940
- return this.deserializeAsyncIteratorFactory(node);
1941
- default:
1942
- throw new Error("invariant");
1953
+ try {
1954
+ switch (node.t) {
1955
+ case 2 /* Constant */:
1956
+ return CONSTANT_VAL[node.s];
1957
+ case 0 /* Number */:
1958
+ return node.s;
1959
+ case 1 /* String */:
1960
+ return deserializeString(node.s);
1961
+ case 3 /* BigInt */:
1962
+ return BigInt(node.s);
1963
+ case 4 /* IndexedValue */:
1964
+ return this.refs.get(node.i);
1965
+ case 18 /* Reference */:
1966
+ return this.deserializeReference(node);
1967
+ case 9 /* Array */:
1968
+ return this.deserializeArray(node);
1969
+ case 10 /* Object */:
1970
+ case 11 /* NullConstructor */:
1971
+ return this.deserializeObject(node);
1972
+ case 5 /* Date */:
1973
+ return this.deserializeDate(node);
1974
+ case 6 /* RegExp */:
1975
+ return this.deserializeRegExp(node);
1976
+ case 7 /* Set */:
1977
+ return this.deserializeSet(node);
1978
+ case 8 /* Map */:
1979
+ return this.deserializeMap(node);
1980
+ case 19 /* ArrayBuffer */:
1981
+ return this.deserializeArrayBuffer(node);
1982
+ case 16 /* BigIntTypedArray */:
1983
+ case 15 /* TypedArray */:
1984
+ return this.deserializeTypedArray(node);
1985
+ case 20 /* DataView */:
1986
+ return this.deserializeDataView(node);
1987
+ case 14 /* AggregateError */:
1988
+ return this.deserializeAggregateError(node);
1989
+ case 13 /* Error */:
1990
+ return this.deserializeError(node);
1991
+ case 12 /* Promise */:
1992
+ return this.deserializePromise(node);
1993
+ case 17 /* WKSymbol */:
1994
+ return SYMBOL_REF[node.s];
1995
+ case 21 /* Boxed */:
1996
+ return this.deserializeBoxed(node);
1997
+ case 25 /* Plugin */:
1998
+ return this.deserializePlugin(node);
1999
+ case 22 /* PromiseConstructor */:
2000
+ return this.deserializePromiseConstructor(node);
2001
+ case 23 /* PromiseResolve */:
2002
+ return this.deserializePromiseResolve(node);
2003
+ case 24 /* PromiseReject */:
2004
+ return this.deserializePromiseReject(node);
2005
+ case 28 /* IteratorFactoryInstance */:
2006
+ return this.deserializeIteratorFactoryInstance(node);
2007
+ case 30 /* AsyncIteratorFactoryInstance */:
2008
+ return this.deserializeAsyncIteratorFactoryInstance(node);
2009
+ case 31 /* StreamConstructor */:
2010
+ return this.deserializeStreamConstructor(node);
2011
+ case 32 /* StreamNext */:
2012
+ return this.deserializeStreamNext(node);
2013
+ case 33 /* StreamThrow */:
2014
+ return this.deserializeStreamThrow(node);
2015
+ case 34 /* StreamReturn */:
2016
+ return this.deserializeStreamReturn(node);
2017
+ case 27 /* IteratorFactory */:
2018
+ return this.deserializeIteratorFactory(node);
2019
+ case 29 /* AsyncIteratorFactory */:
2020
+ return this.deserializeAsyncIteratorFactory(node);
2021
+ default:
2022
+ throw new SerovalUnsupportedNodeError(node);
2023
+ }
2024
+ } catch (error) {
2025
+ throw new SerovalDeserializationError(error);
1943
2026
  }
1944
2027
  }
1945
2028
  };
@@ -2213,7 +2296,14 @@ var BaseSerializerContext = class {
2213
2296
  const isIdentifier = (
2214
2297
  // Test if key is a valid positive number or JS identifier
2215
2298
  // so that we don't have to serialize the key and wrap with brackets
2216
- check >= 0 && check.toString() === key || isValidIdentifier(key)
2299
+ check >= 0 && // It's also important to consider that if the key is
2300
+ // indeed numeric, we need to make sure that when
2301
+ // converted back into a string, it's still the same
2302
+ // to the original key. This allows us to differentiate
2303
+ // keys that has numeric formats but in a different
2304
+ // format, which can cause unintentional key declaration
2305
+ // Example: { 0x1: 1 } vs { '0x1': 1 }
2306
+ check.toString() === key || isValidIdentifier(key)
2217
2307
  );
2218
2308
  if (this.isIndexedValueInStack(val)) {
2219
2309
  const refParam = this.getRefParam(val.i);
@@ -2269,7 +2359,14 @@ var BaseSerializerContext = class {
2269
2359
  const isIdentifier = (
2270
2360
  // Test if key is a valid positive number or JS identifier
2271
2361
  // so that we don't have to serialize the key and wrap with brackets
2272
- check >= 0 && check.toString() === key || isValidIdentifier(key)
2362
+ check >= 0 && // It's also important to consider that if the key is
2363
+ // indeed numeric, we need to make sure that when
2364
+ // converted back into a string, it's still the same
2365
+ // to the original key. This allows us to differentiate
2366
+ // keys that has numeric formats but in a different
2367
+ // format, which can cause unintentional key declaration
2368
+ // Example: { 0x1: 1 } vs { '0x1': 1 }
2369
+ check.toString() === key || isValidIdentifier(key)
2273
2370
  );
2274
2371
  if (this.isIndexedValueInStack(value)) {
2275
2372
  if (isIdentifier && check !== check) {
@@ -2524,7 +2621,7 @@ var BaseSerializerContext = class {
2524
2621
  }
2525
2622
  }
2526
2623
  }
2527
- throw new Error('Missing plugin for tag "' + node.c + '".');
2624
+ throw new SerovalMissingPluginError(node.c);
2528
2625
  }
2529
2626
  getConstructor(node) {
2530
2627
  const current = this.serialize(node);
@@ -2690,78 +2787,82 @@ var BaseSerializerContext = class {
2690
2787
  return this.getRefParam(node.i) + ".return(" + this.serialize(node.f) + ")";
2691
2788
  }
2692
2789
  serialize(node) {
2693
- switch (node.t) {
2694
- case 2 /* Constant */:
2695
- return CONSTANT_STRING[node.s];
2696
- case 0 /* Number */:
2697
- return "" + node.s;
2698
- case 1 /* String */:
2699
- return '"' + node.s + '"';
2700
- case 3 /* BigInt */:
2701
- return node.s + "n";
2702
- case 4 /* IndexedValue */:
2703
- return this.getRefParam(node.i);
2704
- case 18 /* Reference */:
2705
- return this.serializeReference(node);
2706
- case 9 /* Array */:
2707
- return this.serializeArray(node);
2708
- case 10 /* Object */:
2709
- return this.serializeObject(node);
2710
- case 11 /* NullConstructor */:
2711
- return this.serializeNullConstructor(node);
2712
- case 5 /* Date */:
2713
- return this.serializeDate(node);
2714
- case 6 /* RegExp */:
2715
- return this.serializeRegExp(node);
2716
- case 7 /* Set */:
2717
- return this.serializeSet(node);
2718
- case 8 /* Map */:
2719
- return this.serializeMap(node);
2720
- case 19 /* ArrayBuffer */:
2721
- return this.serializeArrayBuffer(node);
2722
- case 16 /* BigIntTypedArray */:
2723
- case 15 /* TypedArray */:
2724
- return this.serializeTypedArray(node);
2725
- case 20 /* DataView */:
2726
- return this.serializeDataView(node);
2727
- case 14 /* AggregateError */:
2728
- return this.serializeAggregateError(node);
2729
- case 13 /* Error */:
2730
- return this.serializeError(node);
2731
- case 12 /* Promise */:
2732
- return this.serializePromise(node);
2733
- case 17 /* WKSymbol */:
2734
- return this.serializeWellKnownSymbol(node);
2735
- case 21 /* Boxed */:
2736
- return this.serializeBoxed(node);
2737
- case 22 /* PromiseConstructor */:
2738
- return this.serializePromiseConstructor(node);
2739
- case 23 /* PromiseResolve */:
2740
- return this.serializePromiseResolve(node);
2741
- case 24 /* PromiseReject */:
2742
- return this.serializePromiseReject(node);
2743
- case 25 /* Plugin */:
2744
- return this.serializePlugin(node);
2745
- case 26 /* SpecialReference */:
2746
- return this.serializeSpecialReference(node);
2747
- case 27 /* IteratorFactory */:
2748
- return this.serializeIteratorFactory(node);
2749
- case 28 /* IteratorFactoryInstance */:
2750
- return this.serializeIteratorFactoryInstance(node);
2751
- case 29 /* AsyncIteratorFactory */:
2752
- return this.serializeAsyncIteratorFactory(node);
2753
- case 30 /* AsyncIteratorFactoryInstance */:
2754
- return this.serializeAsyncIteratorFactoryInstance(node);
2755
- case 31 /* StreamConstructor */:
2756
- return this.serializeStreamConstructor(node);
2757
- case 32 /* StreamNext */:
2758
- return this.serializeStreamNext(node);
2759
- case 33 /* StreamThrow */:
2760
- return this.serializeStreamThrow(node);
2761
- case 34 /* StreamReturn */:
2762
- return this.serializeStreamReturn(node);
2763
- default:
2764
- throw new Error("invariant");
2790
+ try {
2791
+ switch (node.t) {
2792
+ case 2 /* Constant */:
2793
+ return CONSTANT_STRING[node.s];
2794
+ case 0 /* Number */:
2795
+ return "" + node.s;
2796
+ case 1 /* String */:
2797
+ return '"' + node.s + '"';
2798
+ case 3 /* BigInt */:
2799
+ return node.s + "n";
2800
+ case 4 /* IndexedValue */:
2801
+ return this.getRefParam(node.i);
2802
+ case 18 /* Reference */:
2803
+ return this.serializeReference(node);
2804
+ case 9 /* Array */:
2805
+ return this.serializeArray(node);
2806
+ case 10 /* Object */:
2807
+ return this.serializeObject(node);
2808
+ case 11 /* NullConstructor */:
2809
+ return this.serializeNullConstructor(node);
2810
+ case 5 /* Date */:
2811
+ return this.serializeDate(node);
2812
+ case 6 /* RegExp */:
2813
+ return this.serializeRegExp(node);
2814
+ case 7 /* Set */:
2815
+ return this.serializeSet(node);
2816
+ case 8 /* Map */:
2817
+ return this.serializeMap(node);
2818
+ case 19 /* ArrayBuffer */:
2819
+ return this.serializeArrayBuffer(node);
2820
+ case 16 /* BigIntTypedArray */:
2821
+ case 15 /* TypedArray */:
2822
+ return this.serializeTypedArray(node);
2823
+ case 20 /* DataView */:
2824
+ return this.serializeDataView(node);
2825
+ case 14 /* AggregateError */:
2826
+ return this.serializeAggregateError(node);
2827
+ case 13 /* Error */:
2828
+ return this.serializeError(node);
2829
+ case 12 /* Promise */:
2830
+ return this.serializePromise(node);
2831
+ case 17 /* WKSymbol */:
2832
+ return this.serializeWellKnownSymbol(node);
2833
+ case 21 /* Boxed */:
2834
+ return this.serializeBoxed(node);
2835
+ case 22 /* PromiseConstructor */:
2836
+ return this.serializePromiseConstructor(node);
2837
+ case 23 /* PromiseResolve */:
2838
+ return this.serializePromiseResolve(node);
2839
+ case 24 /* PromiseReject */:
2840
+ return this.serializePromiseReject(node);
2841
+ case 25 /* Plugin */:
2842
+ return this.serializePlugin(node);
2843
+ case 26 /* SpecialReference */:
2844
+ return this.serializeSpecialReference(node);
2845
+ case 27 /* IteratorFactory */:
2846
+ return this.serializeIteratorFactory(node);
2847
+ case 28 /* IteratorFactoryInstance */:
2848
+ return this.serializeIteratorFactoryInstance(node);
2849
+ case 29 /* AsyncIteratorFactory */:
2850
+ return this.serializeAsyncIteratorFactory(node);
2851
+ case 30 /* AsyncIteratorFactoryInstance */:
2852
+ return this.serializeAsyncIteratorFactoryInstance(node);
2853
+ case 31 /* StreamConstructor */:
2854
+ return this.serializeStreamConstructor(node);
2855
+ case 32 /* StreamNext */:
2856
+ return this.serializeStreamNext(node);
2857
+ case 33 /* StreamThrow */:
2858
+ return this.serializeStreamThrow(node);
2859
+ case 34 /* StreamReturn */:
2860
+ return this.serializeStreamReturn(node);
2861
+ default:
2862
+ throw new SerovalUnsupportedNodeError(node);
2863
+ }
2864
+ } catch (error) {
2865
+ throw new SerovalSerializationError(error);
2765
2866
  }
2766
2867
  }
2767
2868
  };
@@ -2823,13 +2924,13 @@ var VanillaSerializerContext = class extends BaseSerializerContext {
2823
2924
  return value;
2824
2925
  }
2825
2926
  serializePromiseConstructor(node) {
2826
- throw new Error('Unsupported node type "' + node.t + '".');
2927
+ throw new SerovalUnsupportedNodeError(node);
2827
2928
  }
2828
2929
  serializePromiseResolve(node) {
2829
- throw new Error('Unsupported node type "' + node.t + '".');
2930
+ throw new SerovalUnsupportedNodeError(node);
2830
2931
  }
2831
2932
  serializePromiseReject(node) {
2832
- throw new Error('Unsupported node type "' + node.t + '".');
2933
+ throw new SerovalUnsupportedNodeError(node);
2833
2934
  }
2834
2935
  serializeTop(tree) {
2835
2936
  const result = this.serialize(tree);
@@ -3080,33 +3181,37 @@ var BaseSyncParserContext = class extends BaseParserContext {
3080
3181
  if (Symbol.iterator in current || Symbol.asyncIterator in current) {
3081
3182
  return this.parsePlainObject(id, current, !!currentClass);
3082
3183
  }
3083
- throw new UnsupportedTypeError(current);
3184
+ throw new SerovalUnsupportedTypeError(current);
3084
3185
  }
3085
3186
  parse(current) {
3086
- switch (typeof current) {
3087
- case "boolean":
3088
- return current ? TRUE_NODE : FALSE_NODE;
3089
- case "undefined":
3090
- return UNDEFINED_NODE;
3091
- case "string":
3092
- return createStringNode(current);
3093
- case "number":
3094
- return createNumberNode(current);
3095
- case "bigint":
3096
- return createBigIntNode(current);
3097
- case "object": {
3098
- if (current) {
3099
- const ref = this.getReference(current);
3100
- return ref.type === 0 ? this.parseObject(ref.value, current) : ref.value;
3187
+ try {
3188
+ switch (typeof current) {
3189
+ case "boolean":
3190
+ return current ? TRUE_NODE : FALSE_NODE;
3191
+ case "undefined":
3192
+ return UNDEFINED_NODE;
3193
+ case "string":
3194
+ return createStringNode(current);
3195
+ case "number":
3196
+ return createNumberNode(current);
3197
+ case "bigint":
3198
+ return createBigIntNode(current);
3199
+ case "object": {
3200
+ if (current) {
3201
+ const ref = this.getReference(current);
3202
+ return ref.type === 0 ? this.parseObject(ref.value, current) : ref.value;
3203
+ }
3204
+ return NULL_NODE;
3101
3205
  }
3102
- return NULL_NODE;
3206
+ case "symbol":
3207
+ return this.parseWellKnownSymbol(current);
3208
+ case "function":
3209
+ return this.parseFunction(current);
3210
+ default:
3211
+ throw new SerovalUnsupportedTypeError(current);
3103
3212
  }
3104
- case "symbol":
3105
- return this.parseWellKnownSymbol(current);
3106
- case "function":
3107
- return this.parseFunction(current);
3108
- default:
3109
- throw new UnsupportedTypeError(current);
3213
+ } catch (error) {
3214
+ throw new SerovalParserError(error);
3110
3215
  }
3111
3216
  }
3112
3217
  };