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.
- package/README.md +3 -3
- package/dist/cjs/development/index.cjs +1287 -1945
- package/dist/cjs/development/index.cjs.map +3 -3
- package/dist/cjs/production/index.cjs +3 -3
- package/dist/esm/development/index.mjs +1288 -1946
- package/dist/esm/development/index.mjs.map +3 -3
- package/dist/esm/production/index.mjs +3 -3
- package/dist/types/core/Serializer.d.ts +2 -1
- package/dist/types/core/Serializer.d.ts.map +1 -1
- package/dist/types/core/UnsupportedTypeError.d.ts.map +1 -1
- package/dist/types/core/base-primitives.d.ts +6 -2
- package/dist/types/core/base-primitives.d.ts.map +1 -1
- package/dist/types/core/compat.d.ts +5 -13
- package/dist/types/core/compat.d.ts.map +1 -1
- package/dist/types/core/constants.d.ts +17 -29
- package/dist/types/core/constants.d.ts.map +1 -1
- package/dist/types/core/context/deserializer.d.ts +6 -16
- package/dist/types/core/context/deserializer.d.ts.map +1 -1
- package/dist/types/core/context/parser/async.d.ts +2 -11
- package/dist/types/core/context/parser/async.d.ts.map +1 -1
- package/dist/types/core/context/parser/stream.d.ts +10 -10
- package/dist/types/core/context/parser/stream.d.ts.map +1 -1
- package/dist/types/core/context/parser/sync.d.ts +5 -7
- package/dist/types/core/context/parser/sync.d.ts.map +1 -1
- package/dist/types/core/context/parser.d.ts +26 -5
- package/dist/types/core/context/parser.d.ts.map +1 -1
- package/dist/types/core/context/serializer.d.ts +21 -30
- package/dist/types/core/context/serializer.d.ts.map +1 -1
- package/dist/types/core/cross/async.d.ts.map +1 -1
- package/dist/types/core/cross/deserializer.d.ts.map +1 -1
- package/dist/types/core/cross/index.d.ts.map +1 -1
- package/dist/types/core/cross/parser.d.ts.map +1 -1
- package/dist/types/core/cross/serializer.d.ts +1 -1
- package/dist/types/core/cross/serializer.d.ts.map +1 -1
- package/dist/types/core/cross/stream.d.ts.map +1 -1
- package/dist/types/core/cross/sync.d.ts.map +1 -1
- package/dist/types/core/keys.d.ts.map +1 -1
- package/dist/types/core/literals.d.ts.map +1 -1
- package/dist/types/core/plugin.d.ts +21 -0
- package/dist/types/core/plugin.d.ts.map +1 -1
- package/dist/types/core/reference.d.ts.map +1 -1
- package/dist/types/core/special-reference.d.ts +4 -9
- package/dist/types/core/special-reference.d.ts.map +1 -1
- package/dist/types/core/stream.d.ts +18 -0
- package/dist/types/core/stream.d.ts.map +1 -0
- package/dist/types/core/string.d.ts.map +1 -1
- package/dist/types/core/tree/async.d.ts.map +1 -1
- package/dist/types/core/tree/deserializer.d.ts.map +1 -1
- package/dist/types/core/tree/index.d.ts +1 -1
- package/dist/types/core/tree/index.d.ts.map +1 -1
- package/dist/types/core/tree/serializer.d.ts +3 -11
- package/dist/types/core/tree/serializer.d.ts.map +1 -1
- package/dist/types/core/types.d.ts +28 -122
- package/dist/types/core/types.d.ts.map +1 -1
- package/dist/types/core/utils/deferred.d.ts +0 -7
- package/dist/types/core/utils/deferred.d.ts.map +1 -1
- package/dist/types/core/utils/error.d.ts +2 -1
- package/dist/types/core/utils/error.d.ts.map +1 -1
- package/dist/types/core/utils/get-identifier.d.ts.map +1 -1
- package/dist/types/core/utils/is-valid-identifier.d.ts.map +1 -1
- package/dist/types/core/utils/iterator-to-sequence.d.ts +0 -12
- package/dist/types/core/utils/iterator-to-sequence.d.ts.map +1 -1
- package/dist/types/core/utils/typed-array.d.ts +2 -0
- package/dist/types/core/utils/typed-array.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/core/Serializer.ts +44 -28
- package/src/core/UnsupportedTypeError.ts +2 -3
- package/src/core/base-primitives.ts +124 -38
- package/src/core/compat.ts +5 -14
- package/src/core/constants.ts +28 -39
- package/src/core/context/deserializer.ts +122 -308
- package/src/core/context/parser/async.ts +163 -375
- package/src/core/context/parser/stream.ts +110 -381
- package/src/core/context/parser/sync.ts +125 -266
- package/src/core/context/parser.ts +119 -68
- package/src/core/context/serializer.ts +396 -473
- package/src/core/cross/async.ts +1 -1
- package/src/core/cross/deserializer.ts +1 -4
- package/src/core/cross/index.ts +26 -20
- package/src/core/cross/parser.ts +1 -1
- package/src/core/cross/serializer.ts +30 -20
- package/src/core/cross/stream.ts +1 -1
- package/src/core/cross/sync.ts +1 -1
- package/src/core/keys.ts +3 -1
- package/src/core/literals.ts +22 -8
- package/src/core/plugin.ts +48 -10
- package/src/core/reference.ts +4 -5
- package/src/core/special-reference.ts +5 -15
- package/src/core/stream.ts +205 -0
- package/src/core/string.ts +53 -22
- package/src/core/tree/async.ts +1 -1
- package/src/core/tree/deserializer.ts +4 -9
- package/src/core/tree/index.ts +15 -10
- package/src/core/tree/serializer.ts +6 -50
- package/src/core/types.ts +39 -179
- package/src/core/utils/deferred.ts +0 -27
- package/src/core/utils/error.ts +26 -15
- package/src/core/utils/get-identifier.ts +5 -4
- package/src/core/utils/is-valid-identifier.ts +6 -5
- package/src/core/utils/iterator-to-sequence.ts +0 -174
- package/src/core/utils/typed-array.ts +35 -11
- package/src/index.ts +3 -12
- package/dist/types/core/utils/constructors.d.ts +0 -5
- package/dist/types/core/utils/constructors.d.ts.map +0 -1
- package/dist/types/core/web-api.d.ts +0 -8
- package/dist/types/core/web-api.d.ts.map +0 -1
- package/dist/types/types.d.ts +0 -21
- package/dist/types/types.d.ts.map +0 -1
- package/src/core/utils/constructors.ts +0 -49
- package/src/core/web-api.ts +0 -138
- package/src/example.ts +0 -25
- 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
|
|
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
|
|
68
|
-
const
|
|
69
|
-
if (
|
|
70
|
-
this.markRef(
|
|
71
|
-
return
|
|
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
|
|
110
|
+
return {
|
|
111
|
+
type: NodeType.Referenced,
|
|
112
|
+
value: createReferenceNode(indexed.value, current),
|
|
113
|
+
};
|
|
77
114
|
}
|
|
78
|
-
return
|
|
115
|
+
return indexed;
|
|
79
116
|
}
|
|
80
117
|
|
|
81
|
-
protected getStrictReference<T>(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
88
|
-
this.refs.set(current, id);
|
|
89
|
-
return createReferenceNode(id, current);
|
|
131
|
+
return createReferenceNode(result.value, current);
|
|
90
132
|
}
|
|
91
133
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
134
|
+
protected parseFunction(
|
|
135
|
+
current: (...args: unknown[]) => unknown,
|
|
136
|
+
): SerovalNode {
|
|
95
137
|
return this.getStrictReference(current);
|
|
96
138
|
}
|
|
97
139
|
|
|
98
|
-
protected
|
|
140
|
+
protected parseWellKnownSymbol(
|
|
99
141
|
current: symbol,
|
|
100
142
|
): SerovalIndexedValueNode | SerovalWKSymbolNode | SerovalReferenceNode {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
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:
|
|
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():
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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:
|
|
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.
|
|
194
|
+
f: this.parseWellKnownSymbol(Symbol.iterator),
|
|
163
195
|
b: undefined,
|
|
164
196
|
o: undefined,
|
|
165
197
|
};
|
|
166
198
|
}
|
|
167
199
|
|
|
168
|
-
protected parseAsyncIteratorFactory(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
if (
|
|
173
|
-
|
|
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:
|
|
181
|
-
s:
|
|
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:
|
|
188
|
-
|
|
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
|
}
|