seroval 0.15.1 → 1.0.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 (114) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/development/index.cjs +1287 -1945
  3. package/dist/cjs/development/index.cjs.map +3 -3
  4. package/dist/cjs/production/index.cjs +3 -3
  5. package/dist/esm/development/index.mjs +1288 -1946
  6. package/dist/esm/development/index.mjs.map +3 -3
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/core/Serializer.d.ts +2 -1
  9. package/dist/types/core/Serializer.d.ts.map +1 -1
  10. package/dist/types/core/UnsupportedTypeError.d.ts.map +1 -1
  11. package/dist/types/core/base-primitives.d.ts +6 -2
  12. package/dist/types/core/base-primitives.d.ts.map +1 -1
  13. package/dist/types/core/compat.d.ts +5 -13
  14. package/dist/types/core/compat.d.ts.map +1 -1
  15. package/dist/types/core/constants.d.ts +17 -29
  16. package/dist/types/core/constants.d.ts.map +1 -1
  17. package/dist/types/core/context/deserializer.d.ts +6 -16
  18. package/dist/types/core/context/deserializer.d.ts.map +1 -1
  19. package/dist/types/core/context/parser/async.d.ts +2 -11
  20. package/dist/types/core/context/parser/async.d.ts.map +1 -1
  21. package/dist/types/core/context/parser/stream.d.ts +10 -10
  22. package/dist/types/core/context/parser/stream.d.ts.map +1 -1
  23. package/dist/types/core/context/parser/sync.d.ts +5 -7
  24. package/dist/types/core/context/parser/sync.d.ts.map +1 -1
  25. package/dist/types/core/context/parser.d.ts +26 -5
  26. package/dist/types/core/context/parser.d.ts.map +1 -1
  27. package/dist/types/core/context/serializer.d.ts +21 -30
  28. package/dist/types/core/context/serializer.d.ts.map +1 -1
  29. package/dist/types/core/cross/async.d.ts.map +1 -1
  30. package/dist/types/core/cross/deserializer.d.ts.map +1 -1
  31. package/dist/types/core/cross/index.d.ts.map +1 -1
  32. package/dist/types/core/cross/parser.d.ts.map +1 -1
  33. package/dist/types/core/cross/serializer.d.ts +1 -1
  34. package/dist/types/core/cross/serializer.d.ts.map +1 -1
  35. package/dist/types/core/cross/stream.d.ts.map +1 -1
  36. package/dist/types/core/cross/sync.d.ts.map +1 -1
  37. package/dist/types/core/keys.d.ts.map +1 -1
  38. package/dist/types/core/literals.d.ts.map +1 -1
  39. package/dist/types/core/plugin.d.ts +21 -0
  40. package/dist/types/core/plugin.d.ts.map +1 -1
  41. package/dist/types/core/reference.d.ts.map +1 -1
  42. package/dist/types/core/special-reference.d.ts +4 -9
  43. package/dist/types/core/special-reference.d.ts.map +1 -1
  44. package/dist/types/core/stream.d.ts +18 -0
  45. package/dist/types/core/stream.d.ts.map +1 -0
  46. package/dist/types/core/string.d.ts.map +1 -1
  47. package/dist/types/core/tree/async.d.ts.map +1 -1
  48. package/dist/types/core/tree/deserializer.d.ts.map +1 -1
  49. package/dist/types/core/tree/index.d.ts +1 -1
  50. package/dist/types/core/tree/index.d.ts.map +1 -1
  51. package/dist/types/core/tree/serializer.d.ts +3 -11
  52. package/dist/types/core/tree/serializer.d.ts.map +1 -1
  53. package/dist/types/core/types.d.ts +28 -122
  54. package/dist/types/core/types.d.ts.map +1 -1
  55. package/dist/types/core/utils/deferred.d.ts +0 -7
  56. package/dist/types/core/utils/deferred.d.ts.map +1 -1
  57. package/dist/types/core/utils/error.d.ts +2 -1
  58. package/dist/types/core/utils/error.d.ts.map +1 -1
  59. package/dist/types/core/utils/get-identifier.d.ts.map +1 -1
  60. package/dist/types/core/utils/is-valid-identifier.d.ts.map +1 -1
  61. package/dist/types/core/utils/iterator-to-sequence.d.ts +0 -12
  62. package/dist/types/core/utils/iterator-to-sequence.d.ts.map +1 -1
  63. package/dist/types/core/utils/typed-array.d.ts +2 -0
  64. package/dist/types/core/utils/typed-array.d.ts.map +1 -1
  65. package/dist/types/index.d.ts +2 -3
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/package.json +7 -7
  68. package/src/core/Serializer.ts +44 -28
  69. package/src/core/UnsupportedTypeError.ts +2 -3
  70. package/src/core/base-primitives.ts +124 -38
  71. package/src/core/compat.ts +5 -14
  72. package/src/core/constants.ts +28 -39
  73. package/src/core/context/deserializer.ts +122 -308
  74. package/src/core/context/parser/async.ts +163 -375
  75. package/src/core/context/parser/stream.ts +110 -381
  76. package/src/core/context/parser/sync.ts +125 -266
  77. package/src/core/context/parser.ts +119 -68
  78. package/src/core/context/serializer.ts +396 -473
  79. package/src/core/cross/async.ts +1 -1
  80. package/src/core/cross/deserializer.ts +1 -4
  81. package/src/core/cross/index.ts +26 -20
  82. package/src/core/cross/parser.ts +1 -1
  83. package/src/core/cross/serializer.ts +30 -20
  84. package/src/core/cross/stream.ts +1 -1
  85. package/src/core/cross/sync.ts +1 -1
  86. package/src/core/keys.ts +3 -1
  87. package/src/core/literals.ts +22 -8
  88. package/src/core/plugin.ts +48 -10
  89. package/src/core/reference.ts +4 -5
  90. package/src/core/special-reference.ts +5 -15
  91. package/src/core/stream.ts +205 -0
  92. package/src/core/string.ts +53 -22
  93. package/src/core/tree/async.ts +1 -1
  94. package/src/core/tree/deserializer.ts +4 -9
  95. package/src/core/tree/index.ts +15 -10
  96. package/src/core/tree/serializer.ts +6 -50
  97. package/src/core/types.ts +39 -179
  98. package/src/core/utils/deferred.ts +0 -27
  99. package/src/core/utils/error.ts +26 -15
  100. package/src/core/utils/get-identifier.ts +5 -4
  101. package/src/core/utils/is-valid-identifier.ts +6 -5
  102. package/src/core/utils/iterator-to-sequence.ts +0 -174
  103. package/src/core/utils/typed-array.ts +35 -11
  104. package/src/index.ts +3 -12
  105. package/dist/types/core/utils/constructors.d.ts +0 -5
  106. package/dist/types/core/utils/constructors.d.ts.map +0 -1
  107. package/dist/types/core/web-api.d.ts +0 -8
  108. package/dist/types/core/web-api.d.ts.map +0 -1
  109. package/dist/types/types.d.ts +0 -21
  110. package/dist/types/types.d.ts.map +0 -1
  111. package/src/core/utils/constructors.ts +0 -49
  112. package/src/core/web-api.ts +0 -138
  113. package/src/example.ts +0 -25
  114. package/src/types.ts +0 -84
@@ -1,16 +1,12 @@
1
- import UnsupportedTypeError from '../UnsupportedTypeError';
2
1
  import assert from '../utils/assert';
3
2
  import {
4
3
  createIndexedValueNode,
5
4
  createReferenceNode,
6
5
  createWKSymbolNode,
7
6
  } from '../base-primitives';
8
- import { ALL_ENABLED, Feature } from '../compat';
7
+ import { ALL_ENABLED } from '../compat';
9
8
  import type { WellKnownSymbols } from '../constants';
10
- import {
11
- INV_SYMBOL_REF,
12
- SerovalNodeType,
13
- } from '../constants';
9
+ import { INV_SYMBOL_REF, SerovalNodeType } from '../constants';
14
10
  import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin';
15
11
  import { hasReferenceID } from '../reference';
16
12
  import {
@@ -28,6 +24,7 @@ import type {
28
24
  SerovalNullConstructorNode,
29
25
  SerovalObjectNode,
30
26
  SerovalObjectRecordNode,
27
+ SerovalPromiseConstructorNode,
31
28
  SerovalReferenceNode,
32
29
  SerovalSpecialReferenceNode,
33
30
  SerovalWKSymbolNode,
@@ -39,6 +36,29 @@ export interface BaseParserContextOptions extends PluginAccessOptions {
39
36
  refs?: Map<unknown, number>;
40
37
  }
41
38
 
39
+ const enum NodeType {
40
+ Fresh = 0,
41
+ Indexed = 1,
42
+ Referenced = 2,
43
+ }
44
+
45
+ interface FreshNode {
46
+ type: NodeType.Fresh;
47
+ value: number;
48
+ }
49
+
50
+ interface IndexedNode {
51
+ type: NodeType.Indexed;
52
+ value: SerovalIndexedValueNode;
53
+ }
54
+
55
+ interface ReferencedNode {
56
+ type: NodeType.Referenced;
57
+ value: SerovalReferenceNode;
58
+ }
59
+
60
+ type ObjectNode = FreshNode | IndexedNode | ReferencedNode;
61
+
42
62
  export abstract class BaseParserContext implements PluginAccessOptions {
43
63
  abstract readonly mode: SerovalMode;
44
64
 
@@ -64,70 +84,83 @@ export abstract class BaseParserContext implements PluginAccessOptions {
64
84
  return this.marked.has(id);
65
85
  }
66
86
 
67
- protected getReference<T>(current: T): number | SerovalIndexedValueNode | SerovalReferenceNode {
68
- const registeredID = this.refs.get(current);
69
- if (registeredID != null) {
70
- this.markRef(registeredID);
71
- return createIndexedValueNode(registeredID);
87
+ protected getIndexedValue<T>(current: T): FreshNode | IndexedNode {
88
+ const registeredId = this.refs.get(current);
89
+ if (registeredId != null) {
90
+ this.markRef(registeredId);
91
+ return {
92
+ type: NodeType.Indexed,
93
+ value: createIndexedValueNode(registeredId),
94
+ };
72
95
  }
73
96
  const id = this.refs.size;
74
97
  this.refs.set(current, id);
98
+ return {
99
+ type: NodeType.Fresh,
100
+ value: id,
101
+ };
102
+ }
103
+
104
+ protected getReference<T>(current: T): ObjectNode {
105
+ const indexed = this.getIndexedValue(current);
106
+ if (indexed.type === NodeType.Indexed) {
107
+ return indexed;
108
+ }
75
109
  if (hasReferenceID(current)) {
76
- return createReferenceNode(id, current);
110
+ return {
111
+ type: NodeType.Referenced,
112
+ value: createReferenceNode(indexed.value, current),
113
+ };
77
114
  }
78
- return id;
115
+ return indexed;
79
116
  }
80
117
 
81
- protected getStrictReference<T>(current: T): SerovalIndexedValueNode | SerovalReferenceNode {
82
- const registeredID = this.refs.get(current);
83
- if (registeredID != null) {
84
- this.markRef(registeredID);
85
- return createIndexedValueNode(registeredID);
118
+ protected getStrictReference<T>(
119
+ current: T,
120
+ ): SerovalIndexedValueNode | SerovalReferenceNode {
121
+ assert(
122
+ hasReferenceID(current),
123
+ new Error(
124
+ 'Cannot serialize ' + typeof current + ' without reference ID.',
125
+ ),
126
+ );
127
+ const result = this.getIndexedValue(current);
128
+ if (result.type === NodeType.Indexed) {
129
+ return result.value;
86
130
  }
87
- const id = this.refs.size;
88
- this.refs.set(current, id);
89
- return createReferenceNode(id, current);
131
+ return createReferenceNode(result.value, current);
90
132
  }
91
133
 
92
- // eslint-disable-next-line @typescript-eslint/ban-types
93
- protected parseFunction(current: Function): SerovalNode {
94
- assert(hasReferenceID(current), new Error('Cannot serialize function without reference ID.'));
134
+ protected parseFunction(
135
+ current: (...args: unknown[]) => unknown,
136
+ ): SerovalNode {
95
137
  return this.getStrictReference(current);
96
138
  }
97
139
 
98
- protected parseWKSymbol(
140
+ protected parseWellKnownSymbol(
99
141
  current: symbol,
100
142
  ): SerovalIndexedValueNode | SerovalWKSymbolNode | SerovalReferenceNode {
101
- assert(this.features & Feature.Symbol, new UnsupportedTypeError(current));
102
- const registeredID = this.refs.get(current);
103
- if (registeredID != null) {
104
- this.markRef(registeredID);
105
- return createIndexedValueNode(registeredID);
143
+ const ref = this.getReference(current);
144
+ if (ref.type !== NodeType.Fresh) {
145
+ return ref.value;
106
146
  }
107
- const isValid = current in INV_SYMBOL_REF;
108
- assert(current in INV_SYMBOL_REF || hasReferenceID(current), new Error('Cannot serialize symbol without reference ID.'));
109
- const id = this.refs.size;
110
- this.refs.set(current, id);
111
- if (isValid) {
112
- return createWKSymbolNode(id, current as WellKnownSymbols);
113
- }
114
- return createReferenceNode(id, current);
147
+ assert(
148
+ current in INV_SYMBOL_REF,
149
+ new Error('Cannot serialized unsupported symbol.'),
150
+ );
151
+ return createWKSymbolNode(ref.value, current as WellKnownSymbols);
115
152
  }
116
153
 
117
154
  protected parseSpecialReference(
118
155
  ref: SpecialReference,
119
156
  ): SerovalIndexedValueNode | SerovalSpecialReferenceNode {
120
- const specialRef = SPECIAL_REFS[ref];
121
- const registeredID = this.refs.get(specialRef);
122
- if (registeredID != null) {
123
- this.markRef(registeredID);
124
- return createIndexedValueNode(registeredID);
157
+ const result = this.getIndexedValue(SPECIAL_REFS[ref]);
158
+ if (result.type === NodeType.Indexed) {
159
+ return result.value;
125
160
  }
126
- const id = this.refs.size;
127
- this.refs.set(specialRef, id);
128
161
  return {
129
162
  t: SerovalNodeType.SpecialReference,
130
- i: id,
163
+ i: result.value,
131
164
  s: ref,
132
165
  l: undefined,
133
166
  c: undefined,
@@ -141,17 +174,16 @@ export abstract class BaseParserContext implements PluginAccessOptions {
141
174
  };
142
175
  }
143
176
 
144
- protected parseIteratorFactory(): SerovalIndexedValueNode | SerovalIteratorFactoryNode {
145
- const registeredID = this.refs.get(ITERATOR);
146
- if (registeredID != null) {
147
- this.markRef(registeredID);
148
- return createIndexedValueNode(registeredID);
177
+ protected parseIteratorFactory():
178
+ | SerovalIndexedValueNode
179
+ | SerovalIteratorFactoryNode {
180
+ const result = this.getIndexedValue(ITERATOR);
181
+ if (result.type === NodeType.Indexed) {
182
+ return result.value;
149
183
  }
150
- const id = this.refs.size;
151
- this.refs.set(ITERATOR, id);
152
184
  return {
153
185
  t: SerovalNodeType.IteratorFactory,
154
- i: id,
186
+ i: result.value,
155
187
  s: undefined,
156
188
  l: undefined,
157
189
  c: undefined,
@@ -159,33 +191,33 @@ export abstract class BaseParserContext implements PluginAccessOptions {
159
191
  p: undefined,
160
192
  e: undefined,
161
193
  a: undefined,
162
- f: this.parseWKSymbol(Symbol.iterator),
194
+ f: this.parseWellKnownSymbol(Symbol.iterator),
163
195
  b: undefined,
164
196
  o: undefined,
165
197
  };
166
198
  }
167
199
 
168
- protected parseAsyncIteratorFactory(
169
- streaming: 0 | 1,
170
- ): SerovalIndexedValueNode | SerovalAsyncIteratorFactoryNode {
171
- const registeredID = this.refs.get(ASYNC_ITERATOR);
172
- if (registeredID != null) {
173
- this.markRef(registeredID);
174
- return createIndexedValueNode(registeredID);
200
+ protected parseAsyncIteratorFactory():
201
+ | SerovalIndexedValueNode
202
+ | SerovalAsyncIteratorFactoryNode {
203
+ const result = this.getIndexedValue(ASYNC_ITERATOR);
204
+ if (result.type === NodeType.Indexed) {
205
+ return result.value;
175
206
  }
176
- const id = this.refs.size;
177
- this.refs.set(ASYNC_ITERATOR, id);
178
207
  return {
179
208
  t: SerovalNodeType.AsyncIteratorFactory,
180
- i: id,
181
- s: streaming,
209
+ i: result.value,
210
+ s: undefined,
182
211
  l: undefined,
183
212
  c: undefined,
184
213
  m: undefined,
185
214
  p: undefined,
186
215
  e: undefined,
187
- a: undefined,
188
- f: this.parseWKSymbol(Symbol.asyncIterator),
216
+ a: [
217
+ this.parseSpecialReference(SpecialReference.PromiseConstructor),
218
+ this.parseWellKnownSymbol(Symbol.asyncIterator),
219
+ ],
220
+ f: undefined,
189
221
  b: undefined,
190
222
  o: undefined,
191
223
  };
@@ -234,4 +266,23 @@ export abstract class BaseParserContext implements PluginAccessOptions {
234
266
  o: undefined,
235
267
  };
236
268
  }
269
+
270
+ protected createPromiseConstructorNode(
271
+ id: number,
272
+ ): SerovalPromiseConstructorNode {
273
+ return {
274
+ t: SerovalNodeType.PromiseConstructor,
275
+ i: id,
276
+ s: undefined,
277
+ l: undefined,
278
+ c: undefined,
279
+ m: undefined,
280
+ p: undefined,
281
+ e: undefined,
282
+ a: undefined,
283
+ f: this.parseSpecialReference(SpecialReference.PromiseConstructor),
284
+ b: undefined,
285
+ o: undefined,
286
+ };
287
+ }
237
288
  }