json-as 1.1.21 → 1.1.23
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 +8 -0
- package/README.md +38 -18
- package/assembly/deserialize/simple/map.ts +13 -8
- package/assembly/index.ts +1 -1
- package/assembly/serialize/simple/map.ts +31 -8
- package/assembly/test.tmp.ts +287 -15
- package/assembly/test.ts +19 -38
- package/package.json +4 -3
- package/transform/lib/index.js +48 -17
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/types.js +1 -1
- package/transform/lib/types.js.map +1 -1
- package/transform/src/index.ts +56 -18
- package/transform/src/types.ts +1 -1
package/transform/src/index.ts
CHANGED
|
@@ -44,6 +44,44 @@ export class JSONTransform extends Visitor {
|
|
|
44
44
|
this.visitClassDeclaration(node);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
resolveType(type: string, source: Src, visited = new Set<string>()): string {
|
|
48
|
+
const stripped = stripNull(type);
|
|
49
|
+
|
|
50
|
+
if (visited.has(stripped)) {
|
|
51
|
+
return stripped;
|
|
52
|
+
}
|
|
53
|
+
visited.add(stripped);
|
|
54
|
+
|
|
55
|
+
const resolvedType = source.aliases.find((v) => stripNull(v.name) === stripped)?.getBaseType();
|
|
56
|
+
|
|
57
|
+
if (resolvedType) {
|
|
58
|
+
return this.resolveType(resolvedType, source, visited);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
for (const imp of source.imports) {
|
|
62
|
+
if (!imp.declarations) continue;
|
|
63
|
+
|
|
64
|
+
for (const decl of imp.declarations) {
|
|
65
|
+
if (decl.name.text === stripped) {
|
|
66
|
+
const externalSource = this.parser.sources.find((s) => s.internalPath === imp.internalPath);
|
|
67
|
+
if (externalSource) {
|
|
68
|
+
const externalSrc = this.sources.get(externalSource);
|
|
69
|
+
if (!externalSrc) continue;
|
|
70
|
+
|
|
71
|
+
const externalAlias = externalSrc.aliases.find((a) => a.name === decl.foreignName.text);
|
|
72
|
+
|
|
73
|
+
if (externalAlias) {
|
|
74
|
+
const externalType = externalAlias.getBaseType();
|
|
75
|
+
return this.resolveType(externalType, externalSrc, visited);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return type;
|
|
83
|
+
}
|
|
84
|
+
|
|
47
85
|
visitClassDeclaration(node: ClassDeclaration): void {
|
|
48
86
|
if (!node.decorators?.length) return;
|
|
49
87
|
|
|
@@ -124,7 +162,7 @@ export class JSONTransform extends Visitor {
|
|
|
124
162
|
|
|
125
163
|
const getUnknownTypes = (type: string, types: string[] = []): string[] => {
|
|
126
164
|
type = stripNull(type);
|
|
127
|
-
type =
|
|
165
|
+
type = this.resolveType(type, source);
|
|
128
166
|
if (type.startsWith("Array<")) {
|
|
129
167
|
return getUnknownTypes(type.slice(6, -1));
|
|
130
168
|
} else if (type.startsWith("Map<")) {
|
|
@@ -256,7 +294,7 @@ export class JSONTransform extends Visitor {
|
|
|
256
294
|
for (const member of members) {
|
|
257
295
|
if (!member.type) throwError("Fields must be strongly typed", node.range);
|
|
258
296
|
let type = toString(member.type!);
|
|
259
|
-
type =
|
|
297
|
+
type = this.resolveType(type, source);
|
|
260
298
|
|
|
261
299
|
const name = member.name;
|
|
262
300
|
const value = member.initializer ? toString(member.initializer!) : null;
|
|
@@ -620,7 +658,7 @@ export class JSONTransform extends Visitor {
|
|
|
620
658
|
|
|
621
659
|
let mbElse = " ";
|
|
622
660
|
if (!STRICT || sortedMembers.string.length) {
|
|
623
|
-
// generateGroups(sortedMembers.string,
|
|
661
|
+
// generateGroups(sortedMembers.string, generateComparisons)
|
|
624
662
|
DESERIALIZE += mbElse + "if (code == 34) {\n";
|
|
625
663
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
626
664
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -634,7 +672,7 @@ export class JSONTransform extends Visitor {
|
|
|
634
672
|
generateConsts(group);
|
|
635
673
|
const first = group[0];
|
|
636
674
|
const fName = first.alias || first.name;
|
|
637
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isString<" + first.type + ">() && " : "") +
|
|
675
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isString<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
638
676
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart + 2), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
639
677
|
DESERIALIZE += indent + " srcStart += 4;\n";
|
|
640
678
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -644,7 +682,7 @@ export class JSONTransform extends Visitor {
|
|
|
644
682
|
for (let i = 1; i < group.length; i++) {
|
|
645
683
|
const mem = group[i];
|
|
646
684
|
const memName = mem.alias || mem.name;
|
|
647
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isString<" + mem.type + ">() && " : "") +
|
|
685
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isString<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
648
686
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart + 2), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
649
687
|
DESERIALIZE += indent + " srcStart += 4;\n";
|
|
650
688
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -689,7 +727,7 @@ export class JSONTransform extends Visitor {
|
|
|
689
727
|
generateConsts(group);
|
|
690
728
|
const first = group[0];
|
|
691
729
|
const fName = first.alias || first.name;
|
|
692
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "(isInteger<" + first.type + ">() || isFloat<" + first.type + ">()) && " : "") +
|
|
730
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "(isInteger<" + first.type + ">() || isFloat<" + first.type + ">()) && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
693
731
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
694
732
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
695
733
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -699,7 +737,7 @@ export class JSONTransform extends Visitor {
|
|
|
699
737
|
for (let i = 1; i < group.length; i++) {
|
|
700
738
|
const mem = group[i];
|
|
701
739
|
const memName = mem.alias || mem.name;
|
|
702
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "(isInteger<" + mem.type + ">() || isFloat<" + mem.type + ">()) && " : "") +
|
|
740
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "(isInteger<" + mem.type + ">() || isFloat<" + mem.type + ">()) && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
703
741
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
704
742
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
705
743
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -750,7 +788,7 @@ export class JSONTransform extends Visitor {
|
|
|
750
788
|
generateConsts(group);
|
|
751
789
|
const first = group[0];
|
|
752
790
|
const fName = first.alias || first.name;
|
|
753
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isDefined(out.__DESERIALIZE) &&" : "") +
|
|
791
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isDefined(out.__DESERIALIZE) &&" : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
754
792
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
755
793
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
756
794
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -759,7 +797,7 @@ export class JSONTransform extends Visitor {
|
|
|
759
797
|
for (let i = 1; i < group.length; i++) {
|
|
760
798
|
const mem = group[i];
|
|
761
799
|
const memName = mem.alias || mem.name;
|
|
762
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isDefined(out.__DESERIALIZE) &&" : "") +
|
|
800
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isDefined(out.__DESERIALIZE) &&" : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
763
801
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
764
802
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
765
803
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -810,7 +848,7 @@ export class JSONTransform extends Visitor {
|
|
|
810
848
|
generateConsts(group);
|
|
811
849
|
const first = group[0];
|
|
812
850
|
const fName = first.alias || first.name;
|
|
813
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isArray<" + first.type + ">() && " : "") +
|
|
851
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isArray<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
814
852
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
815
853
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
816
854
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -819,7 +857,7 @@ export class JSONTransform extends Visitor {
|
|
|
819
857
|
for (let i = 1; i < group.length; i++) {
|
|
820
858
|
const mem = group[i];
|
|
821
859
|
const memName = mem.alias || mem.name;
|
|
822
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isArray" + mem.type + ">() && " : "") +
|
|
860
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isArray" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
823
861
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
824
862
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
825
863
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -862,7 +900,7 @@ export class JSONTransform extends Visitor {
|
|
|
862
900
|
generateConsts(group);
|
|
863
901
|
const first = group[0];
|
|
864
902
|
const fName = first.alias || first.name;
|
|
865
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") +
|
|
903
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
866
904
|
DESERIALIZE += indent + " store<boolean>(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
867
905
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
868
906
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -872,7 +910,7 @@ export class JSONTransform extends Visitor {
|
|
|
872
910
|
for (let i = 1; i < group.length; i++) {
|
|
873
911
|
const mem = group[i];
|
|
874
912
|
const memName = mem.alias || mem.name;
|
|
875
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") +
|
|
913
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
876
914
|
DESERIALIZE += indent + " store<boolean>(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
877
915
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
878
916
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -916,7 +954,7 @@ export class JSONTransform extends Visitor {
|
|
|
916
954
|
|
|
917
955
|
const first = group[0];
|
|
918
956
|
const fName = first.alias || first.name;
|
|
919
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") +
|
|
957
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
920
958
|
DESERIALIZE += indent + " store<boolean>(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
921
959
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
922
960
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -926,7 +964,7 @@ export class JSONTransform extends Visitor {
|
|
|
926
964
|
for (let i = 1; i < group.length; i++) {
|
|
927
965
|
const mem = group[i];
|
|
928
966
|
const memName = mem.alias || mem.name;
|
|
929
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") +
|
|
967
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
930
968
|
DESERIALIZE += indent + " store<boolean>(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
931
969
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
932
970
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -971,7 +1009,7 @@ export class JSONTransform extends Visitor {
|
|
|
971
1009
|
|
|
972
1010
|
const first = group[0];
|
|
973
1011
|
const fName = first.alias || first.name;
|
|
974
|
-
DESERIALIZE += indent + " if (" + (first.generic ? "isNullable<" + first.type + ">() && " : "") +
|
|
1012
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isNullable<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
|
|
975
1013
|
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
976
1014
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
977
1015
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -981,7 +1019,7 @@ export class JSONTransform extends Visitor {
|
|
|
981
1019
|
for (let i = 1; i < group.length; i++) {
|
|
982
1020
|
const mem = group[i];
|
|
983
1021
|
const memName = mem.alias || mem.name;
|
|
984
|
-
DESERIALIZE += indent + " else if (" + (mem.generic ? "isNullable<" + mem.type + ">() && " : "") +
|
|
1022
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isNullable<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
|
|
985
1023
|
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
986
1024
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
987
1025
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -1427,7 +1465,7 @@ export function stripNull(type: string): string {
|
|
|
1427
1465
|
return type;
|
|
1428
1466
|
}
|
|
1429
1467
|
|
|
1430
|
-
function
|
|
1468
|
+
function getComparison(data: string) {
|
|
1431
1469
|
switch (data.length << 1) {
|
|
1432
1470
|
case 2: {
|
|
1433
1471
|
return "code16 == " + data.charCodeAt(0);
|
package/transform/src/types.ts
CHANGED
|
@@ -100,10 +100,10 @@ export class Src {
|
|
|
100
100
|
public schemas: Schema[];
|
|
101
101
|
public aliases: TypeAlias[];
|
|
102
102
|
public exports: Schema[];
|
|
103
|
+
public imports: ImportStatement[] = [];
|
|
103
104
|
private nodeMap: Map<Node, NamespaceDeclaration[]> = new Map<Node, NamespaceDeclaration[]>();
|
|
104
105
|
private classes: Record<string, ClassDeclaration> = {};
|
|
105
106
|
private enums: Record<string, EnumDeclaration> = {};
|
|
106
|
-
private imports: ImportStatement[] = [];
|
|
107
107
|
|
|
108
108
|
constructor(
|
|
109
109
|
source: Source,
|