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/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 { bytes } from "./util";
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 GenericEnum<T> {
225
- private tag: string = ""
226
- private value: T | null = null
227
-
228
- constructor() {
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as",
3
- "version": "1.1.8",
3
+ "version": "1.1.9",
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",