json-as 1.3.4 → 1.3.5
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/CHANGELOG.md +11 -0
- package/assembly/deserialize/swar/array/shared.ts +3 -17
- package/assembly/index.ts +1 -5
- package/package.json +10 -10
- package/transform/lib/builder.d.ts.map +1 -1
- package/transform/lib/builder.js +17 -16
- package/transform/lib/builder.js.map +1 -1
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +23 -53
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +3 -2
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/types.d.ts +1 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +8 -6
- package/transform/lib/types.js.map +1 -1
- package/transform/lib/util.d.ts.map +1 -1
- package/transform/lib/util.js +2 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/lib/visitor.d.ts.map +1 -1
- package/transform/lib/visitor.js +68 -67
- package/transform/lib/visitor.js.map +1 -1
package/transform/lib/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { readFileSync, writeFileSync } from "fs";
|
|
|
4
4
|
import * as path from "path";
|
|
5
5
|
import { fileURLToPath } from "url";
|
|
6
6
|
import { CustomTransform } from "./linkers/custom.js";
|
|
7
|
+
import { NodeKind } from "./types.js";
|
|
7
8
|
import { Property, PropertyFlags, Schema, SourceSet } from "./types.js";
|
|
8
9
|
import { isStdlib, removeExtension, SimpleParser, toString } from "./util.js";
|
|
9
10
|
import { Visitor } from "./visitor.js";
|
|
@@ -75,9 +76,6 @@ function getSerializeCall(type, realName) {
|
|
|
75
76
|
}
|
|
76
77
|
return needsReferenceLoad(type) ? `JSON.__serialize<${type}>(changetype<${type}>(load<usize>(ptr, offsetof<this>(${JSON.stringify(realName)}))));\n` : `JSON.__serialize<${type}>(load<${type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
|
|
77
78
|
}
|
|
78
|
-
function isRawType(type) {
|
|
79
|
-
return type == "JSON.Raw" || type == "Raw";
|
|
80
|
-
}
|
|
81
79
|
const CUSTOM_JSON_KINDS = new Set(["any", "string", "number", "object", "array", "boolean", "null", "any | null", "string | null", "number | null", "object | null", "array | null", "boolean | null"]);
|
|
82
80
|
function parseCustomJsonKind(method, decoratorName) {
|
|
83
81
|
const decorator = method.decorators?.find((v) => v.name.text.toLowerCase() == decoratorName);
|
|
@@ -86,7 +84,7 @@ function parseCustomJsonKind(method, decoratorName) {
|
|
|
86
84
|
if (decorator.args.length > 1)
|
|
87
85
|
throwError(`@${decoratorName} accepts at most one argument`, decorator.range);
|
|
88
86
|
const arg = decorator.args[0];
|
|
89
|
-
if (arg.kind !=
|
|
87
|
+
if (arg.kind != NodeKind.Literal || arg.literalKind != 2) {
|
|
90
88
|
throwError(`@${decoratorName} argument must be a string literal like @${decoratorName}("string")`, arg.range);
|
|
91
89
|
}
|
|
92
90
|
const kind = arg.value;
|
|
@@ -174,7 +172,7 @@ export class JSONTransform extends Visitor {
|
|
|
174
172
|
if (isDecoratedBase)
|
|
175
173
|
return;
|
|
176
174
|
this.collectInheritedFieldMembers(baseDecl, baseSource, members, visited);
|
|
177
|
-
const inheritedMembers = baseDecl.members.filter((v) => v.kind ===
|
|
175
|
+
const inheritedMembers = baseDecl.members.filter((v) => v.kind === NodeKind.FieldDeclaration && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"));
|
|
178
176
|
for (let i = inheritedMembers.length - 1; i >= 0; i--) {
|
|
179
177
|
const inherited = inheritedMembers[i];
|
|
180
178
|
if (!members.some((member) => member.name.text == inherited.name.text)) {
|
|
@@ -236,9 +234,9 @@ export class JSONTransform extends Visitor {
|
|
|
236
234
|
return;
|
|
237
235
|
if (!this.schemas.has(source.internalPath))
|
|
238
236
|
this.schemas.set(source.internalPath, []);
|
|
239
|
-
const members = [...node.members.filter((v) => v.kind ===
|
|
240
|
-
const serializers = [...node.members.filter((v) => v.kind ===
|
|
241
|
-
const deserializers = [...node.members.filter((v) => v.kind ===
|
|
237
|
+
const members = [...node.members.filter((v) => v.kind === NodeKind.FieldDeclaration && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
|
|
238
|
+
const serializers = [...node.members.filter((v) => v.kind === NodeKind.MethodDeclaration && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
|
|
239
|
+
const deserializers = [...node.members.filter((v) => v.kind === NodeKind.MethodDeclaration && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
|
|
242
240
|
const schema = new Schema();
|
|
243
241
|
schema.node = node;
|
|
244
242
|
schema.name = source.getQualifiedName(node);
|
|
@@ -510,7 +508,7 @@ export class JSONTransform extends Visitor {
|
|
|
510
508
|
switch (decoratorName) {
|
|
511
509
|
case "alias": {
|
|
512
510
|
const arg = decorator.args[0];
|
|
513
|
-
if (!arg || (arg.kind !=
|
|
511
|
+
if (!arg || (arg.kind != NodeKind.Literal && arg.literalKind != 2 && arg.literalKind != 1 && arg.literalKind != 0))
|
|
514
512
|
throwError("@alias must have an argument of type string or number", member.range);
|
|
515
513
|
mem.alias = arg.value.toString();
|
|
516
514
|
break;
|
|
@@ -637,7 +635,7 @@ export class JSONTransform extends Visitor {
|
|
|
637
635
|
SERIALIZE += indent + `}\n`;
|
|
638
636
|
}
|
|
639
637
|
else if (member.flags.has(PropertyFlags.OmitIf)) {
|
|
640
|
-
if (member.flags.get(PropertyFlags.OmitIf).kind ==
|
|
638
|
+
if (member.flags.get(PropertyFlags.OmitIf).kind == NodeKind.Function) {
|
|
641
639
|
const arg = member.flags.get(PropertyFlags.OmitIf);
|
|
642
640
|
arg.declaration.signature.parameters[0].type = Node.createNamedType(Node.createSimpleTypeName("this", node.range), null, false, node.range);
|
|
643
641
|
arg.declaration.signature.returnType.name = Node.createSimpleTypeName("boolean", arg.declaration.signature.returnType.name.range);
|
|
@@ -645,7 +643,7 @@ export class JSONTransform extends Visitor {
|
|
|
645
643
|
}
|
|
646
644
|
else {
|
|
647
645
|
const expression = member.flags.get(PropertyFlags.OmitIf);
|
|
648
|
-
const rendered = expression.kind ==
|
|
646
|
+
const rendered = expression.kind == NodeKind.Literal && expression.literalKind == 2 ? JSON.stringify(expression.value).slice(1, -1) : toString(expression);
|
|
649
647
|
SERIALIZE += indent + `if (!(${rendered})) {\n`;
|
|
650
648
|
}
|
|
651
649
|
indentInc();
|
|
@@ -685,14 +683,8 @@ export class JSONTransform extends Visitor {
|
|
|
685
683
|
sortedMembers.null.push(member);
|
|
686
684
|
if (isString(type) || type == "Date")
|
|
687
685
|
sortedMembers.string.push(member);
|
|
688
|
-
else if (
|
|
689
|
-
sortedMembers.string.push(member);
|
|
690
|
-
sortedMembers.number.push(member);
|
|
691
|
-
sortedMembers.boolean.push(member);
|
|
692
|
-
sortedMembers.null.push(member);
|
|
686
|
+
else if (type == "JSON.Raw")
|
|
693
687
|
sortedMembers.object.push(member);
|
|
694
|
-
sortedMembers.array.push(member);
|
|
695
|
-
}
|
|
696
688
|
else if (isBoolean(type) || type.startsWith("JSON.Box<bool"))
|
|
697
689
|
sortedMembers.boolean.push(member);
|
|
698
690
|
else if (isPrimitive(type) || type.startsWith("JSON.Box<") || isEnum(type, this.sources.get(this.schema.node.range.source), this.parser))
|
|
@@ -772,7 +764,7 @@ export class JSONTransform extends Visitor {
|
|
|
772
764
|
out.push(` if (load<u16>(${valuePtr}) != 0x22) break;`);
|
|
773
765
|
out.push(` let dateEnd = ${valuePtr} + 2;`);
|
|
774
766
|
out.push(` while (dateEnd < srcEnd) {`);
|
|
775
|
-
out.push(" if (load<u16>(dateEnd) == 0x22 &&
|
|
767
|
+
out.push(" if (load<u16>(dateEnd) == 0x22 && load<u16>(dateEnd - 2) != 0x5c) break;");
|
|
776
768
|
out.push(" dateEnd += 2;");
|
|
777
769
|
out.push(" }");
|
|
778
770
|
out.push(" if (dateEnd >= srcEnd) break;");
|
|
@@ -817,7 +809,7 @@ export class JSONTransform extends Visitor {
|
|
|
817
809
|
}
|
|
818
810
|
out.push("}");
|
|
819
811
|
}
|
|
820
|
-
else if (
|
|
812
|
+
else if (resolvedType == "JSON.Raw") {
|
|
821
813
|
out.push("{");
|
|
822
814
|
out.push(` const valueStart = ${srcPtr};`);
|
|
823
815
|
out.push(" let depth: i32 = 0;");
|
|
@@ -825,7 +817,7 @@ export class JSONTransform extends Visitor {
|
|
|
825
817
|
out.push(` while (${srcPtr} < srcEnd) {`);
|
|
826
818
|
out.push(` const code = load<u16>(${srcPtr});`);
|
|
827
819
|
out.push(" if (inString) {");
|
|
828
|
-
out.push(` if (code == 0x22 &&
|
|
820
|
+
out.push(` if (code == 0x22 && load<u16>(${srcPtr} - 2) != 0x5c) inString = false;`);
|
|
829
821
|
out.push(` ${srcPtr} += 2;`);
|
|
830
822
|
out.push(" continue;");
|
|
831
823
|
out.push(" }");
|
|
@@ -1190,7 +1182,7 @@ export class JSONTransform extends Visitor {
|
|
|
1190
1182
|
DESERIALIZE += indent + " let code = load<u16>(srcStart);\n";
|
|
1191
1183
|
DESERIALIZE += indent + " while (JSON.Util.isSpace(code)) code = load<u16>(srcStart += 2);\n";
|
|
1192
1184
|
DESERIALIZE += indent + " if (keyStart == 0) {\n";
|
|
1193
|
-
DESERIALIZE += indent + " if (code == 34 &&
|
|
1185
|
+
DESERIALIZE += indent + " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
1194
1186
|
DESERIALIZE += indent + " if (isKey) {\n";
|
|
1195
1187
|
DESERIALIZE += indent + " keyStart = lastIndex;\n";
|
|
1196
1188
|
DESERIALIZE += indent + " keyEnd = srcStart;\n";
|
|
@@ -1295,7 +1287,7 @@ export class JSONTransform extends Visitor {
|
|
|
1295
1287
|
DESERIALIZE += " srcStart += 2;\n";
|
|
1296
1288
|
DESERIALIZE += " while (srcStart < srcEnd) {\n";
|
|
1297
1289
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
1298
|
-
DESERIALIZE += " if (code == 34 &&
|
|
1290
|
+
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
1299
1291
|
if (DEBUG > 1)
|
|
1300
1292
|
DESERIALIZE += ' console.log("Value (string, ' + ++id + '): " + JSON.Util.ptrToStr(lastIndex, srcStart + 2));';
|
|
1301
1293
|
generateGroups(sortedMembers.string, (group) => {
|
|
@@ -1394,7 +1386,7 @@ export class JSONTransform extends Visitor {
|
|
|
1394
1386
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
1395
1387
|
DESERIALIZE += " if (code == 34) {\n";
|
|
1396
1388
|
DESERIALIZE += " srcStart += 2;\n";
|
|
1397
|
-
DESERIALIZE += " while (!(load<u16>(srcStart) == 34 &&
|
|
1389
|
+
DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;\n";
|
|
1398
1390
|
DESERIALIZE += " } else if (code == 125) {\n";
|
|
1399
1391
|
DESERIALIZE += " if (--depth == 0) {\n";
|
|
1400
1392
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -1448,7 +1440,7 @@ export class JSONTransform extends Visitor {
|
|
|
1448
1440
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
1449
1441
|
DESERIALIZE += " if (code == 34) {\n";
|
|
1450
1442
|
DESERIALIZE += " srcStart += 2;\n";
|
|
1451
|
-
DESERIALIZE += " while (!(load<u16>(srcStart) == 34 &&
|
|
1443
|
+
DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;\n";
|
|
1452
1444
|
DESERIALIZE += " } else if (code == 93) {\n";
|
|
1453
1445
|
DESERIALIZE += " if (--depth == 0) {\n";
|
|
1454
1446
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -1504,10 +1496,7 @@ export class JSONTransform extends Visitor {
|
|
|
1504
1496
|
const first = group[0];
|
|
1505
1497
|
const fName = first.alias || first.name;
|
|
1506
1498
|
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
1507
|
-
if (
|
|
1508
|
-
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1509
|
-
}
|
|
1510
|
-
else if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
|
|
1499
|
+
if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
|
|
1511
1500
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), changetype<" + first.type + ">(JSON.Box.from<bool>(true)), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1512
1501
|
}
|
|
1513
1502
|
else {
|
|
@@ -1521,10 +1510,7 @@ export class JSONTransform extends Visitor {
|
|
|
1521
1510
|
const mem = group[i];
|
|
1522
1511
|
const memName = mem.alias || mem.name;
|
|
1523
1512
|
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
1524
|
-
if (
|
|
1525
|
-
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1526
|
-
}
|
|
1527
|
-
else if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
|
|
1513
|
+
if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
|
|
1528
1514
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), changetype<" + mem.type + ">(JSON.Box.from<bool>(true)), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1529
1515
|
}
|
|
1530
1516
|
else {
|
|
@@ -1564,10 +1550,7 @@ export class JSONTransform extends Visitor {
|
|
|
1564
1550
|
const first = group[0];
|
|
1565
1551
|
const fName = first.alias || first.name;
|
|
1566
1552
|
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
1567
|
-
if (
|
|
1568
|
-
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 10, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1569
|
-
}
|
|
1570
|
-
else if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
|
|
1553
|
+
if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
|
|
1571
1554
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), changetype<" + first.type + ">(JSON.Box.from<bool>(false)), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1572
1555
|
}
|
|
1573
1556
|
else {
|
|
@@ -1581,10 +1564,7 @@ export class JSONTransform extends Visitor {
|
|
|
1581
1564
|
const mem = group[i];
|
|
1582
1565
|
const memName = mem.alias || mem.name;
|
|
1583
1566
|
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
1584
|
-
if (
|
|
1585
|
-
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 10, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1586
|
-
}
|
|
1587
|
-
else if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
|
|
1567
|
+
if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
|
|
1588
1568
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), changetype<" + mem.type + ">(JSON.Box.from<bool>(false)), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1589
1569
|
}
|
|
1590
1570
|
else {
|
|
@@ -1623,12 +1603,7 @@ export class JSONTransform extends Visitor {
|
|
|
1623
1603
|
const first = group[0];
|
|
1624
1604
|
const fName = first.alias || first.name;
|
|
1625
1605
|
DESERIALIZE += indent + " if (" + (first.generic ? "isNullable<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
1626
|
-
|
|
1627
|
-
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1628
|
-
}
|
|
1629
|
-
else {
|
|
1630
|
-
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1631
|
-
}
|
|
1606
|
+
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
1632
1607
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
1633
1608
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
1634
1609
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -1637,12 +1612,7 @@ export class JSONTransform extends Visitor {
|
|
|
1637
1612
|
const mem = group[i];
|
|
1638
1613
|
const memName = mem.alias || mem.name;
|
|
1639
1614
|
DESERIALIZE += indent + " else if (" + (mem.generic ? "isNullable<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
1640
|
-
|
|
1641
|
-
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1642
|
-
}
|
|
1643
|
-
else {
|
|
1644
|
-
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1645
|
-
}
|
|
1615
|
+
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
1646
1616
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
1647
1617
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
1648
1618
|
DESERIALIZE += indent + " break;\n";
|