json-as 0.9.28 → 0.9.29
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/.prettierrc.json +3 -1
- package/README.md +1 -1
- package/assembly/__benches__/misc.bench.ts +15 -14
- package/assembly/__tests__/date.spec.ts +12 -0
- package/assembly/__tests__/types.ts +17 -0
- package/assembly/custom/bs.ts +189 -198
- package/assembly/custom/chars.ts +2 -2
- package/assembly/custom/types.ts +1 -0
- package/assembly/custom/util.ts +47 -50
- package/assembly/deserialize/array/array.ts +24 -24
- package/assembly/deserialize/array/bool.ts +1 -1
- package/assembly/deserialize/array/float.ts +16 -16
- package/assembly/deserialize/array/integer.ts +16 -16
- package/assembly/deserialize/array/map.ts +20 -20
- package/assembly/deserialize/array/object.ts +20 -20
- package/assembly/deserialize/array/string.ts +1 -1
- package/assembly/deserialize/array.ts +2 -2
- package/assembly/deserialize/bool.ts +15 -15
- package/assembly/deserialize/date.ts +4 -4
- package/assembly/deserialize/float.ts +15 -15
- package/assembly/deserialize/integer.ts +8 -8
- package/assembly/deserialize/map.ts +111 -161
- package/assembly/deserialize/object.ts +16 -76
- package/assembly/deserialize/string.ts +70 -85
- package/assembly/index.ts +24 -20
- package/assembly/serialize/array.ts +37 -44
- package/assembly/serialize/bool.ts +2 -2
- package/assembly/serialize/date.ts +2 -2
- package/assembly/serialize/float.ts +2 -2
- package/assembly/serialize/integer.ts +3 -3
- package/assembly/serialize/map.ts +16 -16
- package/assembly/serialize/object.ts +4 -4
- package/assembly/serialize/string.ts +60 -63
- package/assembly/test.ts +3 -2
- package/package.json +2 -1
- package/transform/lib/index.js +29 -92
- package/transform/lib/index.js.map +1 -1
- package/transform/package.json +1 -1
- package/transform/src/index.ts +53 -186
- package/logs/test.log.json +0 -1049
package/transform/src/index.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ClassDeclaration,
|
|
3
|
-
FieldDeclaration,
|
|
4
|
-
IdentifierExpression,
|
|
5
|
-
Parser,
|
|
6
|
-
Source,
|
|
7
|
-
NodeKind,
|
|
8
|
-
Expression,
|
|
9
|
-
CommonFlags,
|
|
10
|
-
StringLiteralExpression,
|
|
11
|
-
IntegerLiteralExpression,
|
|
12
|
-
FloatLiteralExpression,
|
|
13
|
-
NullExpression,
|
|
14
|
-
TrueExpression,
|
|
15
|
-
FalseExpression,
|
|
16
|
-
} from "assemblyscript/dist/assemblyscript.js";
|
|
1
|
+
import { ClassDeclaration, FieldDeclaration, IdentifierExpression, Parser, Source, NodeKind, Expression, CommonFlags, StringLiteralExpression, IntegerLiteralExpression, FloatLiteralExpression, NullExpression, TrueExpression, FalseExpression } from "assemblyscript/dist/assemblyscript.js";
|
|
17
2
|
|
|
18
3
|
import { toString, isStdlib } from "visitor-as/dist/utils.js";
|
|
19
4
|
import { BaseVisitor, SimpleParser } from "visitor-as/dist/index.js";
|
|
@@ -24,7 +9,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
24
9
|
public currentClass!: SchemaData;
|
|
25
10
|
public sources = new Set<Source>();
|
|
26
11
|
|
|
27
|
-
visitMethodDeclaration(): void {
|
|
12
|
+
visitMethodDeclaration(): void {}
|
|
28
13
|
visitClassDeclaration(node: ClassDeclaration): void {
|
|
29
14
|
if (!node.decorators?.length) return;
|
|
30
15
|
|
|
@@ -42,20 +27,14 @@ class JSONTransform extends BaseVisitor {
|
|
|
42
27
|
schema.node = node;
|
|
43
28
|
schema.name = node.name.text;
|
|
44
29
|
|
|
45
|
-
const members = [
|
|
46
|
-
...node.members.filter((v) => v.kind === NodeKind.FieldDeclaration),
|
|
47
|
-
];
|
|
30
|
+
const members = [...node.members.filter((v) => v.kind === NodeKind.FieldDeclaration)];
|
|
48
31
|
|
|
49
32
|
if (node.extendsType) {
|
|
50
|
-
schema.parent = this.schemasList.find(
|
|
51
|
-
(v) => v.name == node.extendsType?.name.identifier.text,
|
|
52
|
-
) as SchemaData | null;
|
|
33
|
+
schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text) as SchemaData | null;
|
|
53
34
|
|
|
54
35
|
if (schema.parent?.members) {
|
|
55
36
|
for (let i = schema.parent.members.length - 1; i >= 0; i--) {
|
|
56
|
-
const replace = schema.members.find(
|
|
57
|
-
(v) => v.name == schema.parent?.members[i]?.name,
|
|
58
|
-
);
|
|
37
|
+
const replace = schema.members.find((v) => v.name == schema.parent?.members[i]?.name);
|
|
59
38
|
if (!replace) {
|
|
60
39
|
members.unshift(schema.parent?.members[i]!.node);
|
|
61
40
|
}
|
|
@@ -69,8 +48,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
69
48
|
|
|
70
49
|
let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}";
|
|
71
50
|
|
|
72
|
-
let DESERIALIZE_EMPTY =
|
|
73
|
-
"__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
|
|
51
|
+
let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
|
|
74
52
|
|
|
75
53
|
if (process.env["JSON_DEBUG"]) {
|
|
76
54
|
console.log(SERIALIZE_RAW_EMPTY);
|
|
@@ -79,26 +57,14 @@ class JSONTransform extends BaseVisitor {
|
|
|
79
57
|
console.log(DESERIALIZE_EMPTY);
|
|
80
58
|
}
|
|
81
59
|
|
|
82
|
-
const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(
|
|
83
|
-
SERIALIZE_RAW_EMPTY,
|
|
84
|
-
node,
|
|
85
|
-
);
|
|
60
|
+
const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
|
|
86
61
|
//const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
|
|
87
|
-
const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
node,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
97
|
-
node.members.push(SERIALIZE_RAW_METHOD_EMPTY);
|
|
98
|
-
if (!node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
99
|
-
node.members.push(INITIALIZE_METHOD_EMPTY);
|
|
100
|
-
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
101
|
-
node.members.push(DESERIALIZE_METHOD_EMPTY);
|
|
62
|
+
const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
|
|
63
|
+
const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
|
|
64
|
+
|
|
65
|
+
if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD_EMPTY);
|
|
66
|
+
if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD_EMPTY);
|
|
67
|
+
if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD_EMPTY);
|
|
102
68
|
|
|
103
69
|
this.schemasList.push(schema);
|
|
104
70
|
}
|
|
@@ -107,12 +73,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
107
73
|
const name = member.name;
|
|
108
74
|
if (!(member instanceof FieldDeclaration)) continue;
|
|
109
75
|
if (!member.type) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
"Fields must be strongly typed! Found " +
|
|
112
|
-
toString(member) +
|
|
113
|
-
" at " +
|
|
114
|
-
node.range.source.normalizedPath,
|
|
115
|
-
);
|
|
76
|
+
throw new Error("Fields must be strongly typed! Found " + toString(member) + " at " + node.range.source.normalizedPath);
|
|
116
77
|
}
|
|
117
78
|
const type = toString(member.type!);
|
|
118
79
|
if (type.startsWith("(") && type.includes("=>")) continue;
|
|
@@ -121,6 +82,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
121
82
|
if (member.flags == CommonFlags.Static) continue;
|
|
122
83
|
if (member.flags === CommonFlags.Private) continue;
|
|
123
84
|
if (member.flags === CommonFlags.Protected) continue;
|
|
85
|
+
if (member.decorators && node.decorators.some((v) => (v.name as IdentifierExpression).text == "omit")) continue;
|
|
124
86
|
|
|
125
87
|
const mem = new Property();
|
|
126
88
|
mem.name = name.text;
|
|
@@ -144,11 +106,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
144
106
|
|
|
145
107
|
switch (decoratorName) {
|
|
146
108
|
case "alias": {
|
|
147
|
-
if (!args.length)
|
|
148
|
-
throw new Error(
|
|
149
|
-
"Expected 1 argument but got zero at @alias in " +
|
|
150
|
-
node.range.source.normalizedPath,
|
|
151
|
-
);
|
|
109
|
+
if (!args.length) throw new Error("Expected 1 argument but got zero at @alias in " + node.range.source.normalizedPath);
|
|
152
110
|
mem.alias = args[0]!;
|
|
153
111
|
mem.flags.set(PropertyFlags.Alias, args);
|
|
154
112
|
break;
|
|
@@ -158,11 +116,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
158
116
|
break;
|
|
159
117
|
}
|
|
160
118
|
case "omitif": {
|
|
161
|
-
if (!decorator.args?.length)
|
|
162
|
-
throw new Error(
|
|
163
|
-
"Expected 1 argument but got zero at @omitif in " +
|
|
164
|
-
node.range.source.normalizedPath,
|
|
165
|
-
);
|
|
119
|
+
if (!decorator.args?.length) throw new Error("Expected 1 argument but got zero at @omitif in " + node.range.source.normalizedPath);
|
|
166
120
|
mem.flags.set(PropertyFlags.OmitIf, args);
|
|
167
121
|
break;
|
|
168
122
|
}
|
|
@@ -177,20 +131,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
177
131
|
mem.generate(false);
|
|
178
132
|
|
|
179
133
|
if (this.schemasList.find((v) => v.name == type)) {
|
|
180
|
-
mem.initialize =
|
|
181
|
-
"this." +
|
|
182
|
-
name.text +
|
|
183
|
-
" = changetype<nonnull<" +
|
|
184
|
-
mem.type +
|
|
185
|
-
">>(__new(offsetof<nonnull<" +
|
|
186
|
-
mem.type +
|
|
187
|
-
">>(), idof<nonnull<" +
|
|
188
|
-
mem.type +
|
|
189
|
-
">>()));\n changetype<nonnull<" +
|
|
190
|
-
mem.type +
|
|
191
|
-
">>(this." +
|
|
192
|
-
name.text +
|
|
193
|
-
").__INITIALIZE()";
|
|
134
|
+
mem.initialize = "this." + name.text + " = changetype<nonnull<" + mem.type + ">>(__new(offsetof<nonnull<" + mem.type + ">>(), idof<nonnull<" + mem.type + ">>()));\n changetype<nonnull<" + mem.type + ">>(this." + name.text + ").__INITIALIZE()";
|
|
194
135
|
} else if (mem.value) {
|
|
195
136
|
mem.initialize = "this." + name.text + " = " + mem.value;
|
|
196
137
|
} else if (type === "Map") {
|
|
@@ -198,22 +139,12 @@ class JSONTransform extends BaseVisitor {
|
|
|
198
139
|
} else if (type === "string") {
|
|
199
140
|
mem.initialize = "this." + name.text + ' = ""';
|
|
200
141
|
} else if (type === "Array") {
|
|
201
|
-
mem.initialize =
|
|
202
|
-
"this." + name.text + " = instantiate<" + mem.type + ">()";
|
|
142
|
+
mem.initialize = "this." + name.text + " = instantiate<" + mem.type + ">()";
|
|
203
143
|
} else if (type === "bool" || type === "boolean") {
|
|
204
144
|
mem.initialize = "this." + name.text + " = false";
|
|
205
145
|
} else if (type === "JSON.Raw") {
|
|
206
146
|
mem.initialize = "this." + name.text + ' = ""';
|
|
207
|
-
} else if (
|
|
208
|
-
type === "u8" ||
|
|
209
|
-
type === "u16" ||
|
|
210
|
-
type === "u32" ||
|
|
211
|
-
type === "u64" ||
|
|
212
|
-
type === "i8" ||
|
|
213
|
-
type === "i16" ||
|
|
214
|
-
type === "i32" ||
|
|
215
|
-
type === "i64"
|
|
216
|
-
) {
|
|
147
|
+
} else if (type === "u8" || type === "u16" || type === "u32" || type === "u64" || type === "i8" || type === "i16" || type === "i32" || type === "i64") {
|
|
217
148
|
mem.initialize = "this." + name.text + " = 0";
|
|
218
149
|
} else if (type === "f32" || type === "f64") {
|
|
219
150
|
mem.initialize = "this." + name.text + " = 0.0";
|
|
@@ -227,18 +158,14 @@ class JSONTransform extends BaseVisitor {
|
|
|
227
158
|
|
|
228
159
|
let INITIALIZE = "__INITIALIZE(): this {\n";
|
|
229
160
|
|
|
230
|
-
let DESERIALIZE =
|
|
231
|
-
"__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n";
|
|
161
|
+
let DESERIALIZE = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n";
|
|
232
162
|
let indent = " ";
|
|
233
163
|
|
|
234
164
|
if (!schema.members.length) return;
|
|
235
165
|
|
|
236
166
|
found = false;
|
|
237
167
|
|
|
238
|
-
if (
|
|
239
|
-
schema.members[0]?.flags.has(PropertyFlags.OmitNull) ||
|
|
240
|
-
schema.members[0]?.flags.has(PropertyFlags.OmitIf)
|
|
241
|
-
) {
|
|
168
|
+
if (schema.members[0]?.flags.has(PropertyFlags.OmitNull) || schema.members[0]?.flags.has(PropertyFlags.OmitIf)) {
|
|
242
169
|
SERIALIZE_RAW += schema.members[0]?.serialize;
|
|
243
170
|
SERIALIZE_PRETTY += "\\n" + schema.members[0]?.serialize;
|
|
244
171
|
} else {
|
|
@@ -247,16 +174,12 @@ class JSONTransform extends BaseVisitor {
|
|
|
247
174
|
found = true;
|
|
248
175
|
}
|
|
249
176
|
|
|
250
|
-
if (schema.members[0]?.initialize)
|
|
251
|
-
INITIALIZE += " " + schema.members[0]?.initialize + ";\n";
|
|
177
|
+
if (schema.members[0]?.initialize) INITIALIZE += " " + schema.members[0]?.initialize + ";\n";
|
|
252
178
|
|
|
253
179
|
for (let i = 1; i < schema.members.length; i++) {
|
|
254
180
|
const member = schema.members[i]!;
|
|
255
181
|
if (member.initialize) INITIALIZE += " " + member.initialize + ";\n";
|
|
256
|
-
if (
|
|
257
|
-
member.flags.has(PropertyFlags.OmitNull) ||
|
|
258
|
-
member.flags.has(PropertyFlags.OmitIf)
|
|
259
|
-
) {
|
|
182
|
+
if (member.flags.has(PropertyFlags.OmitNull) || member.flags.has(PropertyFlags.OmitIf)) {
|
|
260
183
|
SERIALIZE_RAW += member.serialize;
|
|
261
184
|
SERIALIZE_PRETTY += member.serialize;
|
|
262
185
|
} else {
|
|
@@ -267,10 +190,8 @@ class JSONTransform extends BaseVisitor {
|
|
|
267
190
|
}
|
|
268
191
|
|
|
269
192
|
if (found) {
|
|
270
|
-
SERIALIZE_RAW +=
|
|
271
|
-
|
|
272
|
-
SERIALIZE_PRETTY +=
|
|
273
|
-
"`;\n store<u32>(changetype<usize>(out) + ((out.length - 2) << 1), 8192010);\n return out;\n}";
|
|
193
|
+
SERIALIZE_RAW += "`;\n store<u16>(changetype<usize>(out) + ((out.length - 1) << 1), 125);\n return out;\n}";
|
|
194
|
+
SERIALIZE_PRETTY += "`;\n store<u32>(changetype<usize>(out) + ((out.length - 2) << 1), 8192010);\n return out;\n}";
|
|
274
195
|
} else {
|
|
275
196
|
SERIALIZE_RAW += "}`;\n return out;\n}";
|
|
276
197
|
SERIALIZE_PRETTY += "}`;\n return out;\n}";
|
|
@@ -279,9 +200,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
279
200
|
INITIALIZE += " return this;\n}";
|
|
280
201
|
|
|
281
202
|
const sortedMembers: Property[][] = [];
|
|
282
|
-
const _sorted = schema.members.sort(
|
|
283
|
-
(a, b) => (a.alias?.length! || a.name.length) - (b.alias?.length! || b.name.length),
|
|
284
|
-
);
|
|
203
|
+
const _sorted = schema.members.sort((a, b) => (a.alias?.length! || a.name.length) - (b.alias?.length! || b.name.length));
|
|
285
204
|
let len = -1;
|
|
286
205
|
let offset = -1;
|
|
287
206
|
for (let i = 0; i < _sorted.length; i++) {
|
|
@@ -302,30 +221,24 @@ class JSONTransform extends BaseVisitor {
|
|
|
302
221
|
const _name = encodeKey(firstMember.alias || firstMember.name);
|
|
303
222
|
if (_name.length === 1) {
|
|
304
223
|
if (first) {
|
|
305
|
-
DESERIALIZE +=
|
|
306
|
-
" if (1 === len) {\n switch (load<u16>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
224
|
+
DESERIALIZE += " if (1 === len) {\n switch (load<u16>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
307
225
|
first = false;
|
|
308
226
|
} else {
|
|
309
|
-
DESERIALIZE +=
|
|
310
|
-
"else if (1 === len) {\n switch (load<u16>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
227
|
+
DESERIALIZE += "else if (1 === len) {\n switch (load<u16>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
311
228
|
}
|
|
312
229
|
} else if (_name.length === 2) {
|
|
313
230
|
if (first) {
|
|
314
|
-
DESERIALIZE +=
|
|
315
|
-
" if (2 === len) {\n switch (load<u32>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
231
|
+
DESERIALIZE += " if (2 === len) {\n switch (load<u32>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
316
232
|
first = false;
|
|
317
233
|
} else {
|
|
318
|
-
DESERIALIZE +=
|
|
319
|
-
"else if (2 === len) {\n switch (load<u32>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
234
|
+
DESERIALIZE += "else if (2 === len) {\n switch (load<u32>(changetype<usize>(data) + (key_start << 1))) {\n";
|
|
320
235
|
}
|
|
321
236
|
} else if (_name.length === 4) {
|
|
322
237
|
if (first) {
|
|
323
|
-
DESERIALIZE +=
|
|
324
|
-
" if (4 === len) {\n const code = load<u64>(changetype<usize>(data) + (key_start << 1));\n";
|
|
238
|
+
DESERIALIZE += " if (4 === len) {\n const code = load<u64>(changetype<usize>(data) + (key_start << 1));\n";
|
|
325
239
|
first = false;
|
|
326
240
|
} else {
|
|
327
|
-
DESERIALIZE +=
|
|
328
|
-
"else if (4 === len) {\n const code = load<u64>(changetype<usize>(data) + (key_start << 1));\n";
|
|
241
|
+
DESERIALIZE += "else if (4 === len) {\n const code = load<u64>(changetype<usize>(data) + (key_start << 1));\n";
|
|
329
242
|
}
|
|
330
243
|
} else {
|
|
331
244
|
if (first) {
|
|
@@ -349,31 +262,23 @@ class JSONTransform extends BaseVisitor {
|
|
|
349
262
|
f = false;
|
|
350
263
|
DESERIALIZE += ` if (${charCodeAt64(_name, 0)} === code) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`;
|
|
351
264
|
} else {
|
|
352
|
-
DESERIALIZE =
|
|
353
|
-
DESERIALIZE.slice(0, DESERIALIZE.length - 1) +
|
|
354
|
-
`else if (${charCodeAt64(_name, 0)} === code) {\n ${member.deserialize}\n return true;\n }\n`;
|
|
265
|
+
DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + `else if (${charCodeAt64(_name, 0)} === code) {\n ${member.deserialize}\n return true;\n }\n`;
|
|
355
266
|
}
|
|
356
267
|
} else {
|
|
357
268
|
if (f) {
|
|
358
269
|
f = false;
|
|
359
270
|
DESERIALIZE += ` if (0 === memory.compare(changetype<usize>("${escapeQuote(escapeSlash(_name))}"), changetype<usize>(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`;
|
|
360
271
|
} else {
|
|
361
|
-
DESERIALIZE =
|
|
362
|
-
DESERIALIZE.slice(0, DESERIALIZE.length - 1) +
|
|
363
|
-
` else if (0 === memory.compare(changetype<usize>("${escapeQuote(escapeSlash(_name))}"), changetype<usize>(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`;
|
|
272
|
+
DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else if (0 === memory.compare(changetype<usize>("${escapeQuote(escapeSlash(_name))}"), changetype<usize>(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`;
|
|
364
273
|
}
|
|
365
274
|
}
|
|
366
275
|
}
|
|
367
276
|
if (_name.length < 3) {
|
|
368
277
|
DESERIALIZE += ` default: {\n return false;\n }\n }\n`;
|
|
369
278
|
} else if (_name.length == 4) {
|
|
370
|
-
DESERIALIZE =
|
|
371
|
-
DESERIALIZE.slice(0, DESERIALIZE.length - 1) +
|
|
372
|
-
` else {\n return false;\n }\n`;
|
|
279
|
+
DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`;
|
|
373
280
|
} else {
|
|
374
|
-
DESERIALIZE =
|
|
375
|
-
DESERIALIZE.slice(0, DESERIALIZE.length - 1) +
|
|
376
|
-
` else {\n return false;\n }\n`;
|
|
281
|
+
DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`;
|
|
377
282
|
}
|
|
378
283
|
DESERIALIZE += " } ";
|
|
379
284
|
}
|
|
@@ -389,25 +294,18 @@ class JSONTransform extends BaseVisitor {
|
|
|
389
294
|
console.log(DESERIALIZE);
|
|
390
295
|
}
|
|
391
296
|
|
|
392
|
-
const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE")
|
|
297
|
+
const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(SERIALIZE_RAW, node);
|
|
298
|
+
|
|
299
|
+
const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE");
|
|
398
300
|
//const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
|
|
399
301
|
const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
|
|
400
302
|
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
|
|
401
303
|
const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node);
|
|
402
304
|
|
|
403
|
-
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
404
|
-
|
|
405
|
-
if (!node.members.find((v) => v.name.text == "
|
|
406
|
-
|
|
407
|
-
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
408
|
-
node.members.push(DESERIALIZE_METHOD);
|
|
409
|
-
if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE"))
|
|
410
|
-
node.members.push(DESERIALIZE_SAFE_METHOD);
|
|
305
|
+
if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD);
|
|
306
|
+
if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD);
|
|
307
|
+
if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD);
|
|
308
|
+
if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE")) node.members.push(DESERIALIZE_SAFE_METHOD);
|
|
411
309
|
|
|
412
310
|
this.schemasList.push(schema);
|
|
413
311
|
}
|
|
@@ -454,10 +352,7 @@ export default class Transformer extends Transform {
|
|
|
454
352
|
for (const schema of schemas) {
|
|
455
353
|
if (schema.parent) {
|
|
456
354
|
const parent = schemas.find((v) => v.name === schema.parent?.name);
|
|
457
|
-
if (!parent)
|
|
458
|
-
throw new Error(
|
|
459
|
-
`Class ${schema.name} extends its parent class ${schema.parent}, but ${schema.parent} does not include a @json or @serializable decorator! Add the decorator and rebuild.`,
|
|
460
|
-
);
|
|
355
|
+
if (!parent) throw new Error(`Class ${schema.name} extends its parent class ${schema.parent}, but ${schema.parent} does not include a @json or @serializable decorator! Add the decorator and rebuild.`);
|
|
461
356
|
}
|
|
462
357
|
}
|
|
463
358
|
}
|
|
@@ -477,10 +372,7 @@ class Property {
|
|
|
477
372
|
public alias: string | null = null;
|
|
478
373
|
public type: string = "";
|
|
479
374
|
public value: string | null = null;
|
|
480
|
-
public flags: Map<PropertyFlags, string[]> = new Map<
|
|
481
|
-
PropertyFlags,
|
|
482
|
-
string[]
|
|
483
|
-
>();
|
|
375
|
+
public flags: Map<PropertyFlags, string[]> = new Map<PropertyFlags, string[]>();
|
|
484
376
|
|
|
485
377
|
public serialize: string | null = null;
|
|
486
378
|
public deserialize: string | null = null;
|
|
@@ -499,7 +391,7 @@ class Property {
|
|
|
499
391
|
|
|
500
392
|
if (this.flags.has(PropertyFlags.JSON_Raw)) {
|
|
501
393
|
if (this.flags.has(PropertyFlags.Null)) {
|
|
502
|
-
this.right_s = "(this." + name +
|
|
394
|
+
this.right_s = "(this." + name + ' || "null")';
|
|
503
395
|
this.right_d = "value_start === value_end - 4 && 30399761348886638 === load<u64>(changetype<usize>(data) + (value_start << 1)) ? null : data.substring(value_start, value_end)";
|
|
504
396
|
} else {
|
|
505
397
|
this.right_s = "this." + name;
|
|
@@ -507,35 +399,16 @@ class Property {
|
|
|
507
399
|
}
|
|
508
400
|
} else {
|
|
509
401
|
this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")";
|
|
510
|
-
this.right_d =
|
|
511
|
-
(safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
|
|
402
|
+
this.right_d = (safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
|
|
512
403
|
}
|
|
513
404
|
|
|
514
405
|
if (this.flags.has(PropertyFlags.OmitIf)) {
|
|
515
406
|
const condition = this.flags.get(PropertyFlags.OmitIf)![0];
|
|
516
|
-
if (!condition)
|
|
517
|
-
|
|
518
|
-
"Could not find condition when using decorator @omitif! Provide at least one condition",
|
|
519
|
-
);
|
|
520
|
-
this.serialize =
|
|
521
|
-
"${" +
|
|
522
|
-
condition +
|
|
523
|
-
' ? "" : \'' +
|
|
524
|
-
escapedName +
|
|
525
|
-
":' + " +
|
|
526
|
-
this.right_s +
|
|
527
|
-
' + ","}';
|
|
407
|
+
if (!condition) throw new Error("Could not find condition when using decorator @omitif! Provide at least one condition");
|
|
408
|
+
this.serialize = "${" + condition + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}';
|
|
528
409
|
this.deserialize = "this." + name + " = " + this.right_d + ";";
|
|
529
410
|
} else if (this.flags.has(PropertyFlags.OmitNull)) {
|
|
530
|
-
this.serialize =
|
|
531
|
-
"${changetype<usize>(this." +
|
|
532
|
-
name +
|
|
533
|
-
") == <usize>0" +
|
|
534
|
-
' ? "" : \'' +
|
|
535
|
-
escapedName +
|
|
536
|
-
":' + " +
|
|
537
|
-
this.right_s +
|
|
538
|
-
' + ","}';
|
|
411
|
+
this.serialize = "${changetype<usize>(this." + name + ") == <usize>0" + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}';
|
|
539
412
|
this.deserialize = "this." + name + " = " + this.right_d + ";";
|
|
540
413
|
} else {
|
|
541
414
|
this.serialize = escapedName + ":${" + this.right_s + "}";
|
|
@@ -557,9 +430,7 @@ function charCodeAt32(data: string, offset: number): number {
|
|
|
557
430
|
|
|
558
431
|
function charCodeAt64(data: string, offset: number): bigint {
|
|
559
432
|
if (offset + 3 >= data.length) {
|
|
560
|
-
throw new Error(
|
|
561
|
-
"The string must have at least 4 characters from the specified offset.",
|
|
562
|
-
);
|
|
433
|
+
throw new Error("The string must have at least 4 characters from the specified offset.");
|
|
563
434
|
}
|
|
564
435
|
|
|
565
436
|
const firstCharCode = BigInt(data.charCodeAt(offset));
|
|
@@ -567,11 +438,7 @@ function charCodeAt64(data: string, offset: number): bigint {
|
|
|
567
438
|
const thirdCharCode = BigInt(data.charCodeAt(offset + 2));
|
|
568
439
|
const fourthCharCode = BigInt(data.charCodeAt(offset + 3));
|
|
569
440
|
|
|
570
|
-
const u64Value =
|
|
571
|
-
(fourthCharCode << 48n) |
|
|
572
|
-
(thirdCharCode << 32n) |
|
|
573
|
-
(secondCharCode << 16n) |
|
|
574
|
-
firstCharCode;
|
|
441
|
+
const u64Value = (fourthCharCode << 48n) | (thirdCharCode << 32n) | (secondCharCode << 16n) | firstCharCode;
|
|
575
442
|
|
|
576
443
|
return u64Value;
|
|
577
444
|
}
|