json-as 1.1.2 → 1.1.3
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/.github/workflows/tests.yml +3 -1
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/assembly/__tests__/array.spec.ts +156 -90
- package/assembly/deserialize/simple/arbitrary.ts +1 -1
- package/assembly/index.ts +1 -2
- package/assembly/test.ts +164 -127
- package/index.ts +26 -1
- package/package.json +2 -1
- package/transform/lib/index.js +146 -115
- package/transform/lib/index.js.map +1 -1
- package/transform/src/index.ts +160 -117
package/assembly/test.ts
CHANGED
|
@@ -1,173 +1,173 @@
|
|
|
1
1
|
import { JSON } from ".";
|
|
2
2
|
import { bytes } from "./util";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
// @json
|
|
12
|
-
// class Vec3 {
|
|
13
|
-
// x: f32 = 0.0;
|
|
14
|
-
// y: f32 = 0.0;
|
|
15
|
-
// z: f32 = 0.0;
|
|
16
|
-
// }
|
|
17
|
-
|
|
18
|
-
// @json
|
|
19
|
-
// class Player {
|
|
20
|
-
// @alias("first name")
|
|
21
|
-
// firstName!: string;
|
|
22
|
-
// lastName!: string;
|
|
23
|
-
// lastActive!: i32[];
|
|
24
|
-
// // Drop in a code block, function, or expression that evaluates to a boolean
|
|
25
|
-
// @omitif((self: Player) => self.age < 18)
|
|
26
|
-
// age!: i32;
|
|
27
|
-
|
|
28
|
-
// @omitnull()
|
|
29
|
-
// pos!: Vec3 | null;
|
|
30
|
-
// isVerified!: boolean;
|
|
31
|
-
// }
|
|
32
|
-
|
|
33
|
-
// @json
|
|
34
|
-
// class Point {}
|
|
35
|
-
|
|
36
|
-
// @json
|
|
37
|
-
// class NewPoint {
|
|
38
|
-
// x: f64 = 0.0;
|
|
39
|
-
// y: f64 = 0.0;
|
|
40
|
-
// constructor(x: f64, y: f64) {
|
|
41
|
-
// this.x = x;
|
|
42
|
-
// this.y = y;
|
|
43
|
-
// }
|
|
4
|
+
@json
|
|
5
|
+
class Obj {
|
|
6
|
+
public a: string = "hello";
|
|
7
|
+
public b: string = "world";
|
|
8
|
+
public c: string = '"\t\f\u0000\u0001';
|
|
9
|
+
}
|
|
44
10
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
11
|
+
@json
|
|
12
|
+
class Vec3 {
|
|
13
|
+
x: f32 = 0.0;
|
|
14
|
+
y: f32 = 0.0;
|
|
15
|
+
z: f32 = 0.0;
|
|
16
|
+
}
|
|
49
17
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
18
|
+
@json
|
|
19
|
+
class Player {
|
|
20
|
+
@alias("first name")
|
|
21
|
+
firstName!: string;
|
|
22
|
+
lastName!: string;
|
|
23
|
+
lastActive!: i32[];
|
|
24
|
+
// Drop in a code block, function, or expression that evaluates to a boolean
|
|
25
|
+
@omitif((self: Player) => self.age < 18)
|
|
26
|
+
age!: i32;
|
|
27
|
+
|
|
28
|
+
@omitnull()
|
|
29
|
+
pos!: Vec3 | null;
|
|
30
|
+
isVerified!: boolean;
|
|
31
|
+
}
|
|
53
32
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// const y = data.slice(c + 3);
|
|
33
|
+
@json
|
|
34
|
+
class Point {}
|
|
57
35
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
36
|
+
@json
|
|
37
|
+
class NewPoint {
|
|
38
|
+
x: f64 = 0.0;
|
|
39
|
+
y: f64 = 0.0;
|
|
40
|
+
constructor(x: f64, y: f64) {
|
|
41
|
+
this.x = x;
|
|
42
|
+
this.y = y;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@serializer
|
|
46
|
+
serializer(self: NewPoint): string {
|
|
47
|
+
return `x=${self.x},y=${self.y}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@deserializer
|
|
51
|
+
deserializer(data: string): NewPoint {
|
|
52
|
+
const dataSize = bytes(data);
|
|
53
|
+
|
|
54
|
+
const c = data.indexOf(",");
|
|
55
|
+
const x = data.slice(2, c);
|
|
56
|
+
const y = data.slice(c + 3);
|
|
57
|
+
|
|
58
|
+
return new NewPoint(f64.parse(x), f64.parse(y));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
@json
|
|
63
|
+
class InnerObj<T> {
|
|
64
|
+
obj: T = instantiate<T>();
|
|
65
|
+
}
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
@json
|
|
68
|
+
class ObjWithBracketString {
|
|
69
|
+
data: string = "";
|
|
70
|
+
}
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
72
|
+
const player: Player = {
|
|
73
|
+
firstName: "Jairus",
|
|
74
|
+
lastName: "Tanaka",
|
|
75
|
+
lastActive: [2, 7, 2025],
|
|
76
|
+
age: 18,
|
|
77
|
+
pos: {
|
|
78
|
+
x: 3.4,
|
|
79
|
+
y: 1.2,
|
|
80
|
+
z: 8.3,
|
|
81
|
+
},
|
|
82
|
+
isVerified: true,
|
|
83
|
+
};
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
|
|
85
|
+
const a1 = JSON.stringify("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f\u000f\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f");
|
|
86
|
+
// console.log("Bytes " + bytes(a1).toString());
|
|
87
|
+
console.log("a1: " + a1);
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
|
|
89
|
+
const obj = new Obj();
|
|
90
|
+
const a2 = JSON.stringify(obj);
|
|
91
|
+
// console.log("Bytes " + bytes(a2).toString());
|
|
92
|
+
console.log("a2: " + a2);
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
//
|
|
96
|
-
|
|
94
|
+
const a3 = JSON.stringify(player);
|
|
95
|
+
// console.log("Bytes " + bytes(a3).toString());
|
|
96
|
+
console.log("a3: " + a3);
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
const a4 = new JSON.Obj();
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
a4.set("x", 1.5);
|
|
101
|
+
a4.set("y", 5.4);
|
|
102
|
+
a4.set("z", 9.8);
|
|
103
|
+
a4.set("obj", obj);
|
|
104
|
+
a4.set<boolean>("bool", false);
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
console.log("a4: " + JSON.stringify(a4));
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}');
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
console.log("a5: " + JSON.stringify(a5));
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}');
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
console.log("a6: " + JSON.stringify(a6));
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
const a7 = JSON.parse<JSON.Value[]>('["string",true,3.14,{"x":1.0,"y":2.0,"z":3.0},[1,2,3,true]]');
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
console.log("a7: " + JSON.stringify(a7));
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]);
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
console.log("a8: " + a8);
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"'));
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
console.log("a9: " + a9);
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
const m10 = new Map<string, JSON.Raw>();
|
|
129
|
+
m10.set("hello", new JSON.Raw('"world"'));
|
|
130
|
+
m10.set("pos", new JSON.Raw('{"x":1.0,"y":2.0,"z":3.0}'));
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
const a10 = JSON.stringify(m10);
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
console.log("a10: " + a10);
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } ');
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
console.log("a11: " + JSON.stringify(a11));
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}');
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
console.log("a12: " + JSON.stringify(a12));
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj());
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
console.log("a13: " + a13);
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
const a14 = JSON.stringify(new Point());
|
|
149
|
+
console.log("a14: " + a14);
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
const a15 = JSON.parse<Point>(a14);
|
|
152
|
+
console.log("a15: " + JSON.stringify(a15));
|
|
153
153
|
|
|
154
|
-
|
|
155
|
-
|
|
154
|
+
const a16 = JSON.stringify(new NewPoint(1.0, 2.0));
|
|
155
|
+
console.log("a16: " + a16);
|
|
156
156
|
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
const a17 = JSON.parse<NewPoint>(a16);
|
|
158
|
+
console.log("a17: " + JSON.stringify(a17));
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
const a18 = JSON.parse<JSON.Obj[]>('[{"x":1.0,"y":2.0,"z":3.0},{"x":4.0,"y":5.0,"z":6.0},{"x":7.0,"y":8.0,"z":9.0}]');
|
|
161
|
+
console.log("a18: " + JSON.stringify(a18));
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
const a19 = JSON.stringify<JSON.Obj[]>(a18);
|
|
164
|
+
console.log("a19: " + a19);
|
|
165
165
|
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]");
|
|
167
|
+
console.log("a20: " + JSON.stringify(a20));
|
|
168
168
|
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
const a21 = JSON.stringify<JSON.Box<f64>[]>(a20);
|
|
170
|
+
console.log("a21: " + a21);
|
|
171
171
|
|
|
172
172
|
const a22 = JSON.parse<Foo>('{"id":"0xb8","firstName":"Jairus","lastName":"Tanaka"}');
|
|
173
173
|
console.log("a22: " + JSON.stringify(a22));
|
|
@@ -179,3 +179,40 @@ class Foo {
|
|
|
179
179
|
firstName: string = "";
|
|
180
180
|
lastName: string = "";
|
|
181
181
|
}
|
|
182
|
+
|
|
183
|
+
@json
|
|
184
|
+
class SrvInfo {
|
|
185
|
+
accessUrl: string = "https://example.com";
|
|
186
|
+
cardTypes: i32[] = [1, 2, 3];
|
|
187
|
+
customService: string = "Contact us at support@example.com";
|
|
188
|
+
invoiceApplicationStatus: i32 = 1;
|
|
189
|
+
isCertification: bool = true;
|
|
190
|
+
isOnlineRecharge: bool = false;
|
|
191
|
+
loginTypes: i32[] = [0, 1]; // e.g. 0 = password, 1 = OTP
|
|
192
|
+
record: string = "ICP 12345678";
|
|
193
|
+
regCompanyAudit: i32 = 2;
|
|
194
|
+
regCompanyPipeline: i32[] = [101, 102, 103];
|
|
195
|
+
regPwdLimit: i32 = 8; // min password length
|
|
196
|
+
serverTime: i64 = 1650000000000; // dummy timestamp
|
|
197
|
+
srvDescription: string = "A demo service for handling customer operations.";
|
|
198
|
+
srvHiddenMenu: string[] = ["admin", "beta"];
|
|
199
|
+
srvHost: string = "srv.example.com";
|
|
200
|
+
srvId: i32 = 999;
|
|
201
|
+
srvKeywords: string[] = ["finance", "payments", "online"];
|
|
202
|
+
srvLogoImgUrl: string = "https://example.com/logo.png";
|
|
203
|
+
srvName: string = "ExampleService";
|
|
204
|
+
srvPageId: i32 = 5;
|
|
205
|
+
thirdAuthUrl: string = "https://auth.example.com";
|
|
206
|
+
userCenterStyle: i32 = 1; // e.g. 1 = modern, 0 = legacy
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const a23 = JSON.stringify(new SrvInfo());
|
|
210
|
+
console.log("a23: " + a23);
|
|
211
|
+
|
|
212
|
+
const a24 = '{"accessUrl":"https://example.com","cardTypes":[1,2,3],"customService":"Contact us at support@example.com","invoiceApplicationStatus":1,"isCertification":true,"isOnlineRecharge":false,"loginTypes":[0,1],"record":"ICP 12345678","regCompanyAudit":2,"regCompanyPipeline":[101,102,103],"regPwdLimit":8,"serverTime":1650000000000,"srvDescription":"A demo service for handling customer operations.","srvHiddenMenu":["admin","beta"],"srvHost":"srv.example.com","srvId":999,"srvKeywords":["finance","payments","online"],"srvLogoImgUrl":"https://example.com/logo.png","srvName":"ExampleService","srvPageId":5,"thirdAuthUrl":"https://auth.example.com","userCenterStyle":1}';
|
|
213
|
+
console.log("a25: " + (a24 == a23).toString());
|
|
214
|
+
|
|
215
|
+
const a26 = JSON.parse<SrvInfo>(a23);
|
|
216
|
+
console.log("a26: " + JSON.stringify(a26));
|
|
217
|
+
|
|
218
|
+
console.log("a27: " + (JSON.stringify(a26) == a23).toString())
|
package/index.ts
CHANGED
|
@@ -1 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
class SrvInfo {
|
|
2
|
+
accessUrl: string = "https://example.com";
|
|
3
|
+
cardTypes: number[] = [1, 2, 3];
|
|
4
|
+
customService: string = "Contact us at support@example.com";
|
|
5
|
+
invoiceApplicationStatus: number = 1;
|
|
6
|
+
isCertification: bool = true;
|
|
7
|
+
isOnlineRecharge: bool = false;
|
|
8
|
+
loginTypes: number[] = [0, 1]; // e.g. 0 = password, 1 = OTP
|
|
9
|
+
record: string = "ICP 12345678";
|
|
10
|
+
regCompanyAudit: number = 2;
|
|
11
|
+
regCompanyPipeline: number[] = [101, 102, 103];
|
|
12
|
+
regPwdLimit: number = 8; // min password length
|
|
13
|
+
serverTime: i64 = 1650000000000; // dummy timestamp
|
|
14
|
+
srvDescription: string = "A demo service for handling customer operations.";
|
|
15
|
+
srvHiddenMenu: string[] = ["admin", "beta"];
|
|
16
|
+
srvHost: string = "srv.example.com";
|
|
17
|
+
srvId: number = 999;
|
|
18
|
+
srvKeywords: string[] = ["finance", "payments", "online"];
|
|
19
|
+
srvLogoImgUrl: string = "https://example.com/logo.png";
|
|
20
|
+
srvName: string = "ExampleService";
|
|
21
|
+
srvPageId: number = 5;
|
|
22
|
+
thirdAuthUrl: string = "https://auth.example.com";
|
|
23
|
+
userCenterStyle: number = 1; // e.g. 1 = modern, 0 = legacy
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log(JSON.stringify(new SrvInfo()))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"author": "Jairus Tanaka",
|
|
5
5
|
"description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
|
|
6
6
|
"types": "assembly/index.ts",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"url": "https://github.com/JairusSW/json-as/issues"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
+
"ci": "act",
|
|
18
19
|
"test": "bash ./run-tests.sh",
|
|
19
20
|
"bench:as": "bash ./run-bench.as.sh",
|
|
20
21
|
"bench:js": "bash ./run-bench.js.sh",
|