seroval 0.12.4 → 0.13.1

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 (138) hide show
  1. package/README.md +17 -15
  2. package/dist/cjs/development/index.cjs +1432 -959
  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 +1432 -959
  6. package/dist/esm/development/index.mjs.map +3 -3
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/core/base-primitives.d.ts +12 -1
  9. package/dist/types/core/base-primitives.d.ts.map +1 -1
  10. package/dist/types/core/compat.d.ts +0 -2
  11. package/dist/types/core/compat.d.ts.map +1 -1
  12. package/dist/types/core/constants.d.ts +8 -2
  13. package/dist/types/core/constants.d.ts.map +1 -1
  14. package/dist/types/core/{tree/deserialize.d.ts → context/deserializer.d.ts} +19 -13
  15. package/dist/types/core/context/deserializer.d.ts.map +1 -0
  16. package/dist/types/core/{base → context/parser}/async.d.ts +6 -5
  17. package/dist/types/core/context/parser/async.d.ts.map +1 -0
  18. package/dist/types/core/{base → context/parser}/stream.d.ts +2 -1
  19. package/dist/types/core/context/parser/stream.d.ts.map +1 -0
  20. package/dist/types/core/{base → context/parser}/sync.d.ts +7 -9
  21. package/dist/types/core/context/parser/sync.d.ts.map +1 -0
  22. package/dist/types/core/context/parser.d.ts +27 -0
  23. package/dist/types/core/context/parser.d.ts.map +1 -0
  24. package/dist/types/core/{serializer-context.old.d.ts → context/serializer.d.ts} +21 -22
  25. package/dist/types/core/context/serializer.d.ts.map +1 -0
  26. package/dist/types/core/cross/async.d.ts +2 -2
  27. package/dist/types/core/cross/async.d.ts.map +1 -1
  28. package/dist/types/core/cross/deserializer.d.ts +9 -0
  29. package/dist/types/core/cross/deserializer.d.ts.map +1 -0
  30. package/dist/types/core/cross/index.d.ts +11 -1
  31. package/dist/types/core/cross/index.d.ts.map +1 -1
  32. package/dist/types/core/cross/parser.d.ts +6 -0
  33. package/dist/types/core/cross/parser.d.ts.map +1 -0
  34. package/dist/types/core/cross/{serialize.d.ts → serializer.d.ts} +6 -5
  35. package/dist/types/core/cross/serializer.d.ts.map +1 -0
  36. package/dist/types/core/cross/stream.d.ts +2 -2
  37. package/dist/types/core/cross/stream.d.ts.map +1 -1
  38. package/dist/types/core/cross/sync.d.ts +2 -2
  39. package/dist/types/core/cross/sync.d.ts.map +1 -1
  40. package/dist/types/core/keys.d.ts +3 -1
  41. package/dist/types/core/keys.d.ts.map +1 -1
  42. package/dist/types/core/plugin.d.ts +6 -7
  43. package/dist/types/core/plugin.d.ts.map +1 -1
  44. package/dist/types/core/special-reference.d.ts +6 -0
  45. package/dist/types/core/special-reference.d.ts.map +1 -0
  46. package/dist/types/core/tree/async.d.ts +2 -2
  47. package/dist/types/core/tree/async.d.ts.map +1 -1
  48. package/dist/types/core/tree/deserializer.d.ts +13 -0
  49. package/dist/types/core/tree/deserializer.d.ts.map +1 -0
  50. package/dist/types/core/tree/{serialize.d.ts → serializer.d.ts} +4 -4
  51. package/dist/types/core/tree/serializer.d.ts.map +1 -0
  52. package/dist/types/core/tree/sync.d.ts +2 -2
  53. package/dist/types/core/tree/sync.d.ts.map +1 -1
  54. package/dist/types/core/types.d.ts +47 -6
  55. package/dist/types/core/types.d.ts.map +1 -1
  56. package/dist/types/core/utils/assert.d.ts.map +1 -0
  57. package/dist/types/core/utils/constructors.d.ts.map +1 -0
  58. package/dist/types/core/utils/deferred.d.ts +14 -0
  59. package/dist/types/core/utils/deferred.d.ts.map +1 -0
  60. package/dist/types/core/utils/error.d.ts +5 -0
  61. package/dist/types/core/utils/error.d.ts.map +1 -0
  62. package/dist/types/core/utils/get-identifier.d.ts.map +1 -0
  63. package/dist/types/core/utils/get-object-flag.d.ts +3 -0
  64. package/dist/types/core/utils/get-object-flag.d.ts.map +1 -0
  65. package/dist/types/core/utils/is-valid-identifier.d.ts +2 -0
  66. package/dist/types/core/utils/is-valid-identifier.d.ts.map +1 -0
  67. package/dist/types/core/utils/iterator-to-sequence.d.ts +20 -0
  68. package/dist/types/core/utils/iterator-to-sequence.d.ts.map +1 -0
  69. package/dist/types/core/utils/promise-to-result.d.ts.map +1 -0
  70. package/dist/types/core/utils/typed-array.d.ts +4 -0
  71. package/dist/types/core/utils/typed-array.d.ts.map +1 -0
  72. package/dist/types/core/web-api.d.ts +4 -1
  73. package/dist/types/core/web-api.d.ts.map +1 -1
  74. package/package.json +3 -3
  75. package/src/core/base-primitives.ts +229 -1
  76. package/src/core/compat.ts +0 -2
  77. package/src/core/constants.ts +7 -2
  78. package/src/core/{tree/deserialize.ts → context/deserializer.ts} +159 -66
  79. package/src/core/{base → context/parser}/async.ts +181 -309
  80. package/src/core/{base → context/parser}/stream.ts +89 -14
  81. package/src/core/{base → context/parser}/sync.ts +120 -281
  82. package/src/core/context/parser.ts +259 -0
  83. package/src/core/{serializer-context.old.ts → context/serializer.ts} +241 -166
  84. package/src/core/cross/async.ts +2 -2
  85. package/src/core/cross/deserializer.ts +19 -0
  86. package/src/core/cross/index.ts +68 -47
  87. package/src/core/cross/parser.ts +7 -0
  88. package/src/core/cross/{serialize.ts → serializer.ts} +31 -12
  89. package/src/core/cross/stream.ts +2 -2
  90. package/src/core/cross/sync.ts +2 -2
  91. package/src/core/is-serializable.new.ts +1 -1
  92. package/src/core/keys.ts +8 -2
  93. package/src/core/plugin.ts +7 -7
  94. package/src/core/reference.ts +1 -1
  95. package/src/core/special-reference.ts +9 -0
  96. package/src/core/tree/async.ts +2 -2
  97. package/src/core/tree/deserializer.ts +31 -0
  98. package/src/core/tree/index.ts +2 -2
  99. package/src/core/tree/{serialize.ts → serializer.ts} +5 -16
  100. package/src/core/tree/sync.ts +2 -2
  101. package/src/core/types.ts +60 -7
  102. package/src/core/utils/deferred.ts +49 -0
  103. package/src/core/{shared.ts → utils/error.ts} +3 -60
  104. package/src/core/utils/get-object-flag.ts +14 -0
  105. package/src/core/utils/is-valid-identifier.ts +11 -0
  106. package/src/core/utils/iterator-to-sequence.ts +238 -0
  107. package/src/core/utils/typed-array.ts +30 -0
  108. package/src/core/web-api.ts +75 -1
  109. package/src/example.ts +0 -3
  110. package/dist/types/core/assert.d.ts.map +0 -1
  111. package/dist/types/core/base/async.d.ts.map +0 -1
  112. package/dist/types/core/base/stream.d.ts.map +0 -1
  113. package/dist/types/core/base/sync.d.ts.map +0 -1
  114. package/dist/types/core/constructors.d.ts.map +0 -1
  115. package/dist/types/core/cross/cross-parser.d.ts +0 -8
  116. package/dist/types/core/cross/cross-parser.d.ts.map +0 -1
  117. package/dist/types/core/cross/serialize.d.ts.map +0 -1
  118. package/dist/types/core/get-identifier.d.ts.map +0 -1
  119. package/dist/types/core/parser-context.d.ts +0 -23
  120. package/dist/types/core/parser-context.d.ts.map +0 -1
  121. package/dist/types/core/promise-to-result.d.ts.map +0 -1
  122. package/dist/types/core/serializer-context.old.d.ts.map +0 -1
  123. package/dist/types/core/shared.d.ts +0 -10
  124. package/dist/types/core/shared.d.ts.map +0 -1
  125. package/dist/types/core/tree/deserialize.d.ts.map +0 -1
  126. package/dist/types/core/tree/serialize.d.ts.map +0 -1
  127. package/src/core/cross/cross-parser.ts +0 -9
  128. package/src/core/parser-context.ts +0 -131
  129. package/src/core/serializer-context.new.ts +0 -1168
  130. package/src/core/tree/parser.ts +0 -45
  131. /package/dist/types/core/{assert.d.ts → utils/assert.d.ts} +0 -0
  132. /package/dist/types/core/{constructors.d.ts → utils/constructors.d.ts} +0 -0
  133. /package/dist/types/core/{get-identifier.d.ts → utils/get-identifier.d.ts} +0 -0
  134. /package/dist/types/core/{promise-to-result.d.ts → utils/promise-to-result.d.ts} +0 -0
  135. /package/src/core/{assert.ts → utils/assert.ts} +0 -0
  136. /package/src/core/{constructors.ts → utils/constructors.ts} +0 -0
  137. /package/src/core/{get-identifier.ts → utils/get-identifier.ts} +0 -0
  138. /package/src/core/{promise-to-result.ts → utils/promise-to-result.ts} +0 -0
@@ -0,0 +1,259 @@
1
+ import UnsupportedTypeError from '../UnsupportedTypeError';
2
+ import assert from '../utils/assert';
3
+ import {
4
+ createIndexedValueNode,
5
+ createReferenceNode,
6
+ createWKSymbolNode,
7
+ } from '../base-primitives';
8
+ import { ALL_ENABLED, Feature } from '../compat';
9
+ import type { WellKnownSymbols } from '../constants';
10
+ import {
11
+ INV_SYMBOL_REF,
12
+ SerovalNodeType,
13
+ } from '../constants';
14
+ import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin';
15
+ import { hasReferenceID } from '../reference';
16
+ import {
17
+ ASYNC_ITERATOR,
18
+ ITERATOR,
19
+ MAP_SENTINEL,
20
+ READABLE_STREAM,
21
+ } from '../special-reference';
22
+ import type {
23
+ SerovalAsyncIteratorFactoryNode,
24
+ SerovalIndexedValueNode,
25
+ SerovalIteratorFactoryNode,
26
+ SerovalMapNode,
27
+ SerovalMapSentinelNode,
28
+ SerovalNode,
29
+ SerovalNullConstructorNode,
30
+ SerovalObjectNode,
31
+ SerovalObjectRecordNode,
32
+ SerovalReadableStreamFactoryNode,
33
+ SerovalReferenceNode,
34
+ SerovalWKSymbolNode,
35
+ } from '../types';
36
+ import { getObjectFlag } from '../utils/get-object-flag';
37
+
38
+ export interface BaseParserContextOptions extends PluginAccessOptions {
39
+ disabledFeatures?: number;
40
+ refs?: Map<unknown, number>;
41
+ }
42
+
43
+ export abstract class BaseParserContext implements PluginAccessOptions {
44
+ abstract readonly mode: SerovalMode;
45
+
46
+ features: number;
47
+
48
+ marked = new Set<number>();
49
+
50
+ refs: Map<unknown, number>;
51
+
52
+ plugins?: Plugin<any, any>[] | undefined;
53
+
54
+ constructor(options: BaseParserContextOptions) {
55
+ this.plugins = options.plugins;
56
+ this.features = ALL_ENABLED ^ (options.disabledFeatures || 0);
57
+ this.refs = options.refs || new Map<unknown, number>();
58
+ }
59
+
60
+ protected markRef(id: number): void {
61
+ this.marked.add(id);
62
+ }
63
+
64
+ protected isMarked(id: number): boolean {
65
+ return this.marked.has(id);
66
+ }
67
+
68
+ protected getReference<T>(current: T): number | SerovalIndexedValueNode | SerovalReferenceNode {
69
+ const registeredID = this.refs.get(current);
70
+ if (registeredID != null) {
71
+ this.markRef(registeredID);
72
+ return createIndexedValueNode(registeredID);
73
+ }
74
+ const id = this.refs.size;
75
+ this.refs.set(current, id);
76
+ if (hasReferenceID(current)) {
77
+ return createReferenceNode(id, current);
78
+ }
79
+ return id;
80
+ }
81
+
82
+ protected getStrictReference<T>(current: T): SerovalIndexedValueNode | SerovalReferenceNode {
83
+ const registeredID = this.refs.get(current);
84
+ if (registeredID != null) {
85
+ this.markRef(registeredID);
86
+ return createIndexedValueNode(registeredID);
87
+ }
88
+ const id = this.refs.size;
89
+ this.refs.set(current, id);
90
+ return createReferenceNode(id, current);
91
+ }
92
+
93
+ // eslint-disable-next-line @typescript-eslint/ban-types
94
+ protected parseFunction(current: Function): SerovalNode {
95
+ assert(hasReferenceID(current), new Error('Cannot serialize function without reference ID.'));
96
+ return this.getStrictReference(current);
97
+ }
98
+
99
+ protected parseWKSymbol(
100
+ current: symbol,
101
+ ): SerovalIndexedValueNode | SerovalWKSymbolNode | SerovalReferenceNode {
102
+ assert(this.features & Feature.Symbol, new UnsupportedTypeError(current));
103
+ const registeredID = this.refs.get(current);
104
+ if (registeredID != null) {
105
+ this.markRef(registeredID);
106
+ return createIndexedValueNode(registeredID);
107
+ }
108
+ const isValid = current in INV_SYMBOL_REF;
109
+ assert(current in INV_SYMBOL_REF || hasReferenceID(current), new Error('Cannot serialize symbol without reference ID.'));
110
+ const id = this.refs.size;
111
+ this.refs.set(current, id);
112
+ if (isValid) {
113
+ return createWKSymbolNode(id, current as WellKnownSymbols);
114
+ }
115
+ return createReferenceNode(id, current);
116
+ }
117
+
118
+ protected parseMapSentinel(): SerovalIndexedValueNode | SerovalMapSentinelNode {
119
+ const registeredID = this.refs.get(MAP_SENTINEL);
120
+ if (registeredID != null) {
121
+ this.markRef(registeredID);
122
+ return createIndexedValueNode(registeredID);
123
+ }
124
+ const id = this.refs.size;
125
+ this.refs.set(MAP_SENTINEL, id);
126
+ return {
127
+ t: SerovalNodeType.MapSentinel,
128
+ i: id,
129
+ s: undefined,
130
+ l: undefined,
131
+ c: undefined,
132
+ m: undefined,
133
+ p: undefined,
134
+ e: undefined,
135
+ a: undefined,
136
+ f: undefined,
137
+ b: undefined,
138
+ o: undefined,
139
+ };
140
+ }
141
+
142
+ protected parseIteratorFactory(): SerovalIndexedValueNode | SerovalIteratorFactoryNode {
143
+ const registeredID = this.refs.get(ITERATOR);
144
+ if (registeredID != null) {
145
+ this.markRef(registeredID);
146
+ return createIndexedValueNode(registeredID);
147
+ }
148
+ const id = this.refs.size;
149
+ this.refs.set(ITERATOR, id);
150
+ return {
151
+ t: SerovalNodeType.IteratorFactory,
152
+ i: id,
153
+ s: undefined,
154
+ l: undefined,
155
+ c: undefined,
156
+ m: undefined,
157
+ p: undefined,
158
+ e: undefined,
159
+ a: undefined,
160
+ f: this.parseWKSymbol(Symbol.iterator),
161
+ b: undefined,
162
+ o: undefined,
163
+ };
164
+ }
165
+
166
+ protected parseAsyncIteratorFactory(): SerovalIndexedValueNode | SerovalAsyncIteratorFactoryNode {
167
+ const registeredID = this.refs.get(ASYNC_ITERATOR);
168
+ if (registeredID != null) {
169
+ this.markRef(registeredID);
170
+ return createIndexedValueNode(registeredID);
171
+ }
172
+ const id = this.refs.size;
173
+ this.refs.set(ASYNC_ITERATOR, id);
174
+ return {
175
+ t: SerovalNodeType.AsyncIteratorFactory,
176
+ i: id,
177
+ s: undefined,
178
+ l: undefined,
179
+ c: undefined,
180
+ m: undefined,
181
+ p: undefined,
182
+ e: undefined,
183
+ a: undefined,
184
+ f: this.parseWKSymbol(Symbol.asyncIterator),
185
+ b: undefined,
186
+ o: undefined,
187
+ };
188
+ }
189
+
190
+ protected createObjectNode(
191
+ id: number,
192
+ current: Record<string, unknown>,
193
+ empty: boolean,
194
+ record: SerovalObjectRecordNode,
195
+ ): SerovalObjectNode | SerovalNullConstructorNode {
196
+ return {
197
+ t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object,
198
+ i: id,
199
+ s: undefined,
200
+ l: undefined,
201
+ c: undefined,
202
+ m: undefined,
203
+ p: record,
204
+ e: undefined,
205
+ a: undefined,
206
+ f: undefined,
207
+ b: undefined,
208
+ o: getObjectFlag(current),
209
+ };
210
+ }
211
+
212
+ protected createMapNode(
213
+ id: number,
214
+ k: SerovalNode[],
215
+ v: SerovalNode[],
216
+ s: number,
217
+ ): SerovalMapNode {
218
+ return {
219
+ t: SerovalNodeType.Map,
220
+ i: id,
221
+ s: undefined,
222
+ l: undefined,
223
+ c: undefined,
224
+ m: undefined,
225
+ p: undefined,
226
+ e: { k, v, s },
227
+ a: undefined,
228
+ f: this.parseMapSentinel(),
229
+ b: undefined,
230
+ o: undefined,
231
+ };
232
+ }
233
+
234
+ protected parseReadableStreamFactory(): (
235
+ SerovalIndexedValueNode | SerovalReadableStreamFactoryNode
236
+ ) {
237
+ const registeredID = this.refs.get(READABLE_STREAM);
238
+ if (registeredID != null) {
239
+ this.markRef(registeredID);
240
+ return createIndexedValueNode(registeredID);
241
+ }
242
+ const id = this.refs.size;
243
+ this.refs.set(READABLE_STREAM, id);
244
+ return {
245
+ t: SerovalNodeType.ReadableStreamFactory,
246
+ i: id,
247
+ s: undefined,
248
+ l: undefined,
249
+ c: undefined,
250
+ m: undefined,
251
+ p: undefined,
252
+ e: undefined,
253
+ a: undefined,
254
+ f: undefined,
255
+ b: undefined,
256
+ o: undefined,
257
+ };
258
+ }
259
+ }