seroval 1.4.0 → 1.4.2

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 (48) hide show
  1. package/dist/cjs/development/index.cjs +553 -350
  2. package/dist/cjs/development/index.cjs.map +3 -3
  3. package/dist/cjs/production/index.cjs +3 -3
  4. package/dist/esm/development/index.mjs +553 -350
  5. package/dist/esm/development/index.mjs.map +3 -3
  6. package/dist/esm/production/index.mjs +3 -3
  7. package/dist/types/core/base-primitives.d.ts +2 -2
  8. package/dist/types/core/base-primitives.d.ts.map +1 -1
  9. package/dist/types/core/compat.d.ts +2 -1
  10. package/dist/types/core/compat.d.ts.map +1 -1
  11. package/dist/types/core/constants.d.ts +2 -2
  12. package/dist/types/core/constants.d.ts.map +1 -1
  13. package/dist/types/core/constructors.d.ts +1 -1
  14. package/dist/types/core/constructors.d.ts.map +1 -1
  15. package/dist/types/core/context/async-parser.d.ts +5 -4
  16. package/dist/types/core/context/async-parser.d.ts.map +1 -1
  17. package/dist/types/core/context/deserializer.d.ts +7 -2
  18. package/dist/types/core/context/deserializer.d.ts.map +1 -1
  19. package/dist/types/core/context/parser.d.ts +3 -1
  20. package/dist/types/core/context/parser.d.ts.map +1 -1
  21. package/dist/types/core/context/serializer.d.ts.map +1 -1
  22. package/dist/types/core/context/sync-parser.d.ts +5 -5
  23. package/dist/types/core/context/sync-parser.d.ts.map +1 -1
  24. package/dist/types/core/cross/index.d.ts.map +1 -1
  25. package/dist/types/core/errors.d.ts +9 -0
  26. package/dist/types/core/errors.d.ts.map +1 -1
  27. package/dist/types/core/node.d.ts +1 -1
  28. package/dist/types/core/string.d.ts.map +1 -1
  29. package/dist/types/core/tree/index.d.ts +4 -1
  30. package/dist/types/core/tree/index.d.ts.map +1 -1
  31. package/dist/types/core/types.d.ts +6 -11
  32. package/dist/types/core/types.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/core/base-primitives.ts +17 -18
  35. package/src/core/compat.ts +3 -1
  36. package/src/core/constants.ts +18 -4
  37. package/src/core/constructors.ts +2 -1
  38. package/src/core/context/async-parser.ts +102 -50
  39. package/src/core/context/deserializer.ts +269 -105
  40. package/src/core/context/parser.ts +12 -10
  41. package/src/core/context/serializer.ts +31 -36
  42. package/src/core/context/sync-parser.ts +149 -75
  43. package/src/core/cross/index.ts +2 -0
  44. package/src/core/errors.ts +33 -0
  45. package/src/core/node.ts +2 -2
  46. package/src/core/string.ts +3 -1
  47. package/src/core/tree/index.ts +10 -1
  48. package/src/core/types.ts +10 -19
@@ -78,6 +78,9 @@ const enum SpecificErrorCodes {
78
78
  MissingReference = 5,
79
79
  MissingReferenceForId = 6,
80
80
  UnknownTypedArray = 7,
81
+ MalformedNode = 8,
82
+ ConflictedNodeId = 9,
83
+ DepthLimit = 10,
81
84
  }
82
85
 
83
86
  function getSpecificErrorMessage(code: SpecificErrorCodes): string {
@@ -161,3 +164,33 @@ export class SerovalUnknownTypedArrayError extends Error {
161
164
  );
162
165
  }
163
166
  }
167
+
168
+ export class SerovalMalformedNodeError extends Error {
169
+ constructor(node: SerovalNode) {
170
+ super(
171
+ import.meta.env.PROD
172
+ ? getSpecificErrorMessage(SpecificErrorCodes.MalformedNode)
173
+ : 'Malformed node type "' + node.t + '".',
174
+ );
175
+ }
176
+ }
177
+
178
+ export class SerovalConflictedNodeIdError extends Error {
179
+ constructor(node: SerovalNode) {
180
+ super(
181
+ import.meta.env.PROD
182
+ ? getSpecificErrorMessage(SpecificErrorCodes.ConflictedNodeId)
183
+ : 'Conflicted node id "' + node.i + '".',
184
+ );
185
+ }
186
+ }
187
+
188
+ export class SerovalDepthLimitError extends Error {
189
+ constructor(limit: number) {
190
+ super(
191
+ import.meta.env.PROD
192
+ ? getSpecificErrorMessage(SpecificErrorCodes.ConflictedNodeId)
193
+ : 'Depth limit of ' + limit + ' reached',
194
+ );
195
+ }
196
+ }
package/src/core/node.ts CHANGED
@@ -13,7 +13,6 @@ export function createSerovalNode<
13
13
  t: T,
14
14
  i: N['i'],
15
15
  s: N['s'],
16
- l: N['l'],
17
16
  c: N['c'],
18
17
  m: N['m'],
19
18
  p: N['p'],
@@ -22,12 +21,12 @@ export function createSerovalNode<
22
21
  f: N['f'],
23
22
  b: N['b'],
24
23
  o: N['o'],
24
+ l: N['l'],
25
25
  ): N {
26
26
  return {
27
27
  t,
28
28
  i,
29
29
  s,
30
- l,
31
30
  c,
32
31
  m,
33
32
  p,
@@ -36,5 +35,6 @@ export function createSerovalNode<
36
35
  f,
37
36
  b,
38
37
  o,
38
+ l,
39
39
  } as N;
40
40
  }
@@ -1,3 +1,5 @@
1
+ import { NIL } from './constants';
2
+
1
3
  export function serializeChar(str: string): string | undefined {
2
4
  switch (str) {
3
5
  case '"':
@@ -21,7 +23,7 @@ export function serializeChar(str: string): string | undefined {
21
23
  case '\u2029':
22
24
  return '\\u2029';
23
25
  default:
24
- return undefined;
26
+ return NIL;
25
27
  }
26
28
  }
27
29
 
@@ -18,6 +18,7 @@ import {
18
18
  SerovalMode,
19
19
  } from '../plugin';
20
20
  import type { SerovalNode } from '../types';
21
+ import { ALL_ENABLED } from '../compat';
21
22
  export type SyncParserContextOptions = Omit<BaseParserContextOptions, 'refs'>;
22
23
  export type AsyncParserContextOptions = Omit<BaseParserContextOptions, 'refs'>;
23
24
 
@@ -67,6 +68,10 @@ export interface SerovalJSON {
67
68
  m: number[];
68
69
  }
69
70
 
71
+ export interface FromJSONOptions extends PluginAccessOptions {
72
+ disabledFeatures?: number;
73
+ }
74
+
70
75
  export function toJSON<T>(
71
76
  source: T,
72
77
  options: SyncParserContextOptions = {},
@@ -114,12 +119,16 @@ export function compileJSON(
114
119
 
115
120
  export function fromJSON<T>(
116
121
  source: SerovalJSON,
117
- options: PluginAccessOptions = {},
122
+ options: FromJSONOptions = {},
118
123
  ): T {
119
124
  const plugins = resolvePlugins(options.plugins);
125
+ const disabledFeatures = options.disabledFeatures || 0;
126
+ const sourceFeatures = source.f ?? ALL_ENABLED;
120
127
  const ctx = createVanillaDeserializerContext({
121
128
  plugins,
122
129
  markedRefs: source.m,
130
+ features: sourceFeatures & ~disabledFeatures,
131
+ disabledFeatures,
123
132
  });
124
133
  return deserializeTop(ctx, source.t) as T;
125
134
  }
package/src/core/types.ts CHANGED
@@ -14,8 +14,6 @@ export interface SerovalBaseNode {
14
14
  i: number | undefined;
15
15
  // Serialized value
16
16
  s: unknown;
17
- // size/length
18
- l: number | undefined;
19
17
  // Constructor name / RegExp source
20
18
  c: string | undefined;
21
19
  // message/flags
@@ -25,13 +23,15 @@ export interface SerovalBaseNode {
25
23
  // entries (for Map, etc.)
26
24
  e: SerovalMapRecordNode | undefined;
27
25
  // array of nodes
28
- a: (SerovalNode | undefined)[] | undefined;
26
+ a: (SerovalNode | 0)[] | undefined;
29
27
  // fulfilled node
30
28
  f: SerovalNode | undefined;
31
29
  // byte offset/object flags
32
30
  b: number | undefined;
33
31
  // object flag
34
32
  o: SerovalObjectFlags | undefined;
33
+ // length
34
+ l: number | undefined;
35
35
  }
36
36
 
37
37
  export type SerovalObjectRecordKey = string | SerovalNode;
@@ -39,13 +39,11 @@ export type SerovalObjectRecordKey = string | SerovalNode;
39
39
  export interface SerovalObjectRecordNode {
40
40
  k: SerovalObjectRecordKey[];
41
41
  v: SerovalNode[];
42
- s: number;
43
42
  }
44
43
 
45
44
  export interface SerovalMapRecordNode {
46
45
  k: SerovalNode[];
47
46
  v: SerovalNode[];
48
- s: number;
49
47
  }
50
48
 
51
49
  export interface SerovalNumberNode extends SerovalBaseNode {
@@ -104,38 +102,35 @@ export interface SerovalArrayBufferNode extends SerovalBaseNode {
104
102
  i: number;
105
103
  // byte string
106
104
  s: string;
107
- // length
108
- l: number;
109
105
  // array buffer constructor
110
106
  f: SerovalNodeWithID;
111
107
  }
112
108
 
113
-
114
109
  export interface SerovalTypedArrayNode extends SerovalBaseNode {
115
110
  t: SerovalNodeType.TypedArray;
116
111
  // id
117
112
  i: number;
118
- // length
119
- l: number;
120
113
  // TypedArray Constructor
121
114
  c: string;
122
115
  // ArrayBuffer reference
123
116
  f: SerovalNode;
124
117
  // Byte Offset
125
118
  b: number;
119
+ // length
120
+ l: number;
126
121
  }
127
122
 
128
123
  export interface SerovalBigIntTypedArrayNode extends SerovalBaseNode {
129
124
  t: SerovalNodeType.BigIntTypedArray;
130
125
  i: number;
131
- // length
132
- l: number;
133
126
  // TypedArray Constructor
134
127
  c: string;
135
128
  // ArrayBuffer reference
136
129
  f: SerovalNode;
137
130
  // Byte Offset
138
131
  b: number;
132
+ // length
133
+ l: number;
139
134
  }
140
135
 
141
136
  export type SerovalSemiPrimitiveNode =
@@ -149,8 +144,6 @@ export interface SerovalSetNode extends SerovalBaseNode {
149
144
  t: SerovalNodeType.Set;
150
145
  // id
151
146
  i: number;
152
- // Size of Set
153
- l: number;
154
147
  // Items in Set (as array)
155
148
  a: SerovalNode[];
156
149
  }
@@ -165,10 +158,8 @@ export interface SerovalMapNode extends SerovalBaseNode {
165
158
 
166
159
  export interface SerovalArrayNode extends SerovalBaseNode {
167
160
  t: SerovalNodeType.Array;
168
- // size of array
169
- l: number;
170
161
  // items
171
- a: (SerovalNode | undefined)[];
162
+ a: (SerovalNode | 0)[];
172
163
  i: number;
173
164
  o: SerovalObjectFlags;
174
165
  }
@@ -233,12 +224,12 @@ export interface SerovalReferenceNode extends SerovalBaseNode {
233
224
  export interface SerovalDataViewNode extends SerovalBaseNode {
234
225
  t: SerovalNodeType.DataView;
235
226
  i: number;
236
- // byte length
237
- l: number;
238
227
  // reference to array buffer
239
228
  f: SerovalNode;
240
229
  // byte offset
241
230
  b: number;
231
+ // byte length
232
+ l: number;
242
233
  }
243
234
 
244
235
  export interface SerovalBoxedNode extends SerovalBaseNode {