json-as 1.1.8 → 1.1.9
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 +7 -0
- package/README.md +2 -2
- package/assembly/__benches__/large.bench.ts +214 -104
- package/assembly/__tests__/array.spec.ts +8 -5
- package/assembly/__tests__/lib/index.ts +20 -6
- package/assembly/__tests__/struct.spec.ts +2 -0
- package/assembly/__tests__/test.spec.ts +0 -119
- package/assembly/index.ts +2 -2
- package/assembly/test.ts +52 -287
- package/index.ts +1 -1
- package/package.json +1 -1
- package/transform/lib/index.js +113 -44
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/src/index.ts +216 -149
- package/transform/src/types.ts +1 -1
- package/transform/src/util.ts +5 -16
package/assembly/index.ts
CHANGED
|
@@ -424,7 +424,7 @@ export namespace JSON {
|
|
|
424
424
|
// @ts-ignore: type
|
|
425
425
|
private storage: Map<string, JSON.Value> = new Map<string, JSON.Value>();
|
|
426
426
|
|
|
427
|
-
constructor() {
|
|
427
|
+
constructor() {}
|
|
428
428
|
|
|
429
429
|
// @ts-ignore: decorator
|
|
430
430
|
@inline get size(): i32 {
|
|
@@ -626,7 +626,7 @@ export namespace JSON {
|
|
|
626
626
|
}
|
|
627
627
|
throw new Error(`Could not deserialize data '${ptrToStr(srcStart, srcEnd).slice(0, 100)}' to type. Make sure to add the correct decorators to classes.`);
|
|
628
628
|
}
|
|
629
|
-
namespace Util {
|
|
629
|
+
export namespace Util {
|
|
630
630
|
// @ts-ignore: decorator
|
|
631
631
|
@inline export function isSpace(code: u16): boolean {
|
|
632
632
|
return code == 0x20 || code - 9 <= 4;
|
package/assembly/test.ts
CHANGED
|
@@ -1,292 +1,57 @@
|
|
|
1
1
|
import { JSON } from ".";
|
|
2
|
-
import {
|
|
2
|
+
import { expect, it } from "./__tests__/lib";
|
|
3
|
+
|
|
4
|
+
it("should parse", () => {
|
|
5
|
+
const str = `{
|
|
6
|
+
"id": "chatcmpl-BbvlnP0ESWa8OForeEjt7AkoIuh3Q",
|
|
7
|
+
"object": "chat.completion",
|
|
8
|
+
"created": 1748379903,
|
|
9
|
+
"model": "gpt-4o-mini-2024-07-18",
|
|
10
|
+
"choices": [
|
|
11
|
+
{
|
|
12
|
+
"index": 0,
|
|
13
|
+
"message": {
|
|
14
|
+
"role": "assistant",
|
|
15
|
+
"content": "Hello! How can I assist you today?",
|
|
16
|
+
"refusal": null,
|
|
17
|
+
"annotations": []
|
|
18
|
+
},
|
|
19
|
+
"logprobs": null,
|
|
20
|
+
"finish_reason": "stop"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"usage": {
|
|
24
|
+
"prompt_tokens": 15,
|
|
25
|
+
"completion_tokens": 9,
|
|
26
|
+
"total_tokens": 24,
|
|
27
|
+
"prompt_tokens_details": {
|
|
28
|
+
"cached_tokens": 0,
|
|
29
|
+
"audio_tokens": 0
|
|
30
|
+
},
|
|
31
|
+
"completion_tokens_details": {
|
|
32
|
+
"reasoning_tokens": 0,
|
|
33
|
+
"audio_tokens": 0,
|
|
34
|
+
"accepted_prediction_tokens": 0,
|
|
35
|
+
"rejected_prediction_tokens": 0
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"service_tier": "default",
|
|
39
|
+
"system_fingerprint": "fp_34a54ae93c"
|
|
40
|
+
}`;
|
|
41
|
+
|
|
42
|
+
const output = JSON.parse<OpenAIChatOutput>(str);
|
|
43
|
+
|
|
44
|
+
expect(output.id).toBe("chatcmpl-BbvlnP0ESWa8OForeEjt7AkoIuh3Q");
|
|
45
|
+
expect(output.object).toBe("chat.completion");
|
|
46
|
+
expect(output.model).toBe("gpt-4o-mini-2024-07-18");
|
|
47
|
+
expect(output.system_fingerprint).toBe("fp_34a54ae93c"); // fails ("")
|
|
48
|
+
});
|
|
3
49
|
|
|
4
|
-
// @json
|
|
5
|
-
// class Obj {
|
|
6
|
-
// public a: string = "hello";
|
|
7
|
-
// public b: string = "world";
|
|
8
|
-
// public c: string = '"\t\f\u0000\u0001';
|
|
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
|
-
// }
|
|
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
|
-
|
|
62
|
-
// @json
|
|
63
|
-
// class InnerObj<T> {
|
|
64
|
-
// obj: T = instantiate<T>();
|
|
65
|
-
// }
|
|
66
|
-
|
|
67
|
-
// @json
|
|
68
|
-
// class ObjWithBracketString {
|
|
69
|
-
// data: string = "";
|
|
70
|
-
// }
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
// const obj = new Obj();
|
|
90
|
-
// const a2 = JSON.stringify(obj);
|
|
91
|
-
// // console.log("Bytes " + bytes(a2).toString());
|
|
92
|
-
// console.log("a2: " + a2);
|
|
93
|
-
|
|
94
|
-
// const a3 = JSON.stringify(player);
|
|
95
|
-
// // console.log("Bytes " + bytes(a3).toString());
|
|
96
|
-
// console.log("a3: " + a3);
|
|
97
|
-
|
|
98
|
-
// const a4 = new JSON.Obj();
|
|
99
|
-
|
|
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
|
-
|
|
106
|
-
// console.log("a4: " + JSON.stringify(a4));
|
|
107
|
-
|
|
108
|
-
// const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}');
|
|
109
|
-
|
|
110
|
-
// console.log("a5: " + JSON.stringify(a5));
|
|
111
|
-
|
|
112
|
-
// const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}');
|
|
113
|
-
|
|
114
|
-
// console.log("a6: " + JSON.stringify(a6));
|
|
115
|
-
|
|
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
|
-
|
|
118
|
-
// console.log("a7: " + JSON.stringify(a7));
|
|
119
|
-
|
|
120
|
-
// const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]);
|
|
121
|
-
|
|
122
|
-
// console.log("a8: " + a8);
|
|
123
|
-
|
|
124
|
-
// const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"'));
|
|
125
|
-
|
|
126
|
-
// console.log("a9: " + a9);
|
|
127
|
-
|
|
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
|
-
|
|
132
|
-
// const a10 = JSON.stringify(m10);
|
|
133
|
-
|
|
134
|
-
// console.log("a10: " + a10);
|
|
135
|
-
|
|
136
|
-
// const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } ');
|
|
137
|
-
|
|
138
|
-
// console.log("a11: " + JSON.stringify(a11));
|
|
139
|
-
|
|
140
|
-
// const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}');
|
|
141
|
-
|
|
142
|
-
// console.log("a12: " + JSON.stringify(a12));
|
|
143
|
-
|
|
144
|
-
// const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj());
|
|
145
|
-
|
|
146
|
-
// console.log("a13: " + a13);
|
|
147
|
-
|
|
148
|
-
// const a14 = JSON.stringify(new Point());
|
|
149
|
-
// console.log("a14: " + a14);
|
|
150
|
-
|
|
151
|
-
// const a15 = JSON.parse<Point>(a14);
|
|
152
|
-
// console.log("a15: " + JSON.stringify(a15));
|
|
153
|
-
|
|
154
|
-
// const a16 = JSON.stringify(new NewPoint(1.0, 2.0));
|
|
155
|
-
// console.log("a16: " + a16);
|
|
156
|
-
|
|
157
|
-
// const a17 = JSON.parse<NewPoint>(a16);
|
|
158
|
-
// console.log("a17: " + JSON.stringify(a17));
|
|
159
|
-
|
|
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
|
-
|
|
163
|
-
// const a19 = JSON.stringify<JSON.Obj[]>(a18);
|
|
164
|
-
// console.log("a19: " + a19);
|
|
165
|
-
|
|
166
|
-
// const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]");
|
|
167
|
-
// console.log("a20: " + JSON.stringify(a20));
|
|
168
|
-
|
|
169
|
-
// const a21 = JSON.stringify<JSON.Box<f64>[]>(a20);
|
|
170
|
-
// console.log("a21: " + a21);
|
|
171
|
-
|
|
172
|
-
// const a22 = JSON.parse<Foo>('{"id":"0xb8","firstName":"Jairus","lastName":"Tanaka"}');
|
|
173
|
-
// console.log("a22: " + JSON.stringify(a22));
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
// @json
|
|
177
|
-
// class Foo {
|
|
178
|
-
// id: string = "";
|
|
179
|
-
// firstName: string = "";
|
|
180
|
-
// lastName: string = "";
|
|
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())
|
|
219
|
-
import {
|
|
220
|
-
bs
|
|
221
|
-
} from "../lib/as-bs"
|
|
222
50
|
|
|
223
51
|
@json
|
|
224
|
-
class
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
this.tag = ""
|
|
230
|
-
this.value = null
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
static create<T>(tag: string, value: T): GenericEnum<T> {
|
|
234
|
-
const item = new GenericEnum<T>()
|
|
235
|
-
item.tag = tag
|
|
236
|
-
item.value = value
|
|
237
|
-
return item
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
getTag(): string {
|
|
241
|
-
return this.tag
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
getValue(): T | null {
|
|
245
|
-
return this.value
|
|
246
|
-
}
|
|
247
|
-
@serializer
|
|
248
|
-
serialize<T>(self: GenericEnum<T>): string {
|
|
249
|
-
const tagJson = JSON.stringify(self.tag);
|
|
250
|
-
const valueJson = JSON.stringify(self.value);
|
|
251
|
-
return `{${tagJson}:${valueJson}}`
|
|
252
|
-
}
|
|
253
|
-
@deserializer
|
|
254
|
-
deserialize(data: string): GenericEnum<T> {
|
|
255
|
-
const parsed = JSON.parse<Map<string, JSON.Raw>>(data);
|
|
256
|
-
const result = new GenericEnum<T>();
|
|
257
|
-
|
|
258
|
-
const keys = parsed.keys();
|
|
259
|
-
const values = parsed.values();
|
|
260
|
-
|
|
261
|
-
result.tag = keys[0];
|
|
262
|
-
result.value = JSON.parse<T>(values[0].data);
|
|
263
|
-
|
|
264
|
-
return result;
|
|
265
|
-
}
|
|
52
|
+
class OpenAIChatOutput {
|
|
53
|
+
id!: string;
|
|
54
|
+
object!: string;
|
|
55
|
+
model!: string;
|
|
56
|
+
system_fingerprint!: string;
|
|
266
57
|
}
|
|
267
|
-
|
|
268
|
-
@json
|
|
269
|
-
class Node<T> {
|
|
270
|
-
name: string
|
|
271
|
-
id: u32
|
|
272
|
-
data: T
|
|
273
|
-
|
|
274
|
-
constructor() {
|
|
275
|
-
this.name = ""
|
|
276
|
-
this.id = 0
|
|
277
|
-
this.data = changetype<T>(0);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const enumValue = GenericEnum.create<string>("success", "Hello World")
|
|
282
|
-
|
|
283
|
-
const node = new Node<GenericEnum<string>>();
|
|
284
|
-
node.name = "test-node";
|
|
285
|
-
node.id = 42;
|
|
286
|
-
node.data = enumValue;
|
|
287
|
-
|
|
288
|
-
const serialized = JSON.stringify(node);
|
|
289
|
-
console.log("Serialized Node: " + serialized);
|
|
290
|
-
|
|
291
|
-
const deserialized = JSON.parse<JSON.Obj>(serialized)
|
|
292
|
-
console.log("Deserialized Node: " + JSON.stringify(deserialized));
|
package/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { JSON } from "./assembly/index";
|
|
1
|
+
export { JSON } from "./assembly/index";
|