json-as 0.5.4 → 0.5.6

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/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # AS-JSON
2
+ ![AssemblyScript](https://img.shields.io/badge/AssemblyScript-blue)
3
+ ![WebAssembly](https://img.shields.io/badge/WebAssemby-purple)
2
4
 
3
- **JSON serializer/deserializer for AssemblyScript**
5
+ ## Features
4
6
 
7
+ Full
5
8
  ## Installation
6
9
 
7
10
  ```bash
@@ -11,6 +14,12 @@
11
14
  ~ npm install visitor-as
12
15
  ```
13
16
 
17
+ For arbitrary-length numbers, use
18
+
19
+ ```bash
20
+ ~ npm install as-bignum
21
+ ```
22
+
14
23
  Add the transform to your `asc` command
15
24
 
16
25
  ```bash
@@ -31,34 +40,50 @@ Or, add it to `asconfig.json`
31
40
 
32
41
  ```js
33
42
  import { JSON } from "json-as/assembly";
43
+ import { u128 } from "as-bignum/assembly";
34
44
 
45
+ // @ts-ignore
35
46
  @json
36
- class Vec2 {
37
- x: f32
38
- y: f32
47
+ class Stats {
48
+ wins: u128
49
+ loss: u128
50
+ }
51
+ // @ts-ignore
52
+ @json
53
+ class Vec3 {
54
+ x: f32;
55
+ y: f32;
56
+ z: f32;
39
57
  }
40
58
 
59
+ // @ts-ignore
41
60
  @json
42
61
  class Player {
43
- firstName: string
44
- lastName: string
45
- lastActive: i32[]
46
- age: i32
47
- pos: Vec2
48
- isVerified: boolean
62
+ firstName: string;
63
+ lastName: string;
64
+ lastActive: i32[];
65
+ age: i32;
66
+ pos: Vec3 | null;
67
+ isVerified: boolean;
68
+ stats: Stats
49
69
  }
50
70
 
51
- const data: Player = {
71
+ const player: Player = {
52
72
  firstName: "Emmet",
53
73
  lastName: "West",
54
74
  lastActive: [8, 27, 2022],
55
75
  age: 23,
56
76
  pos: {
57
- x: -3.4,
58
- y: 1.2
77
+ x: 3.4,
78
+ y: 1.2,
79
+ z: 8.3
59
80
  },
60
- isVerified: true
61
- }
81
+ isVerified: true,
82
+ stats: {
83
+ wins: u128.fromString("443"),
84
+ loss: u128.fromString("693")
85
+ }
86
+ };
62
87
 
63
88
  const stringified = JSON.stringify<Player>(data);
64
89
 
package/asconfig.json CHANGED
@@ -11,6 +11,8 @@
11
11
  },
12
12
  "options": {
13
13
  "transform": ["./transform"],
14
- "bindings": "esm"
15
- }
14
+ "bindings": "esm",
15
+ "extends": "./node_modules/@assemblyscript/wasi-shim/asconfig.json"
16
+ },
17
+ "extends": "./node_modules/@assemblyscript/wasi-shim/asconfig.json"
16
18
  }
@@ -1,4 +1,5 @@
1
1
  import { JSON } from "..";
2
+ import { u128, u128Safe, u256, u256Safe, i128, i128Safe, i256Safe } from "as-bignum/assembly";
2
3
  function canSerde<T>(data: T): void {
3
4
  const serialized = JSON.stringify<T>(data);
4
5
  const deserialized = JSON.stringify<T>(JSON.parse<T>(serialized));
@@ -39,6 +40,34 @@ describe("Ser/de Numbers", () => {
39
40
  canSerde<u64>(101);
40
41
  canSerde<i32>(-100);
41
42
  canSerde<i64>(-101);
43
+
44
+ canSerde<u128>(u128.from("0"))
45
+ canSerde<u128>(u128.from("100"))
46
+ canSerde<u128>(u128.from("101"))
47
+
48
+ canSerde<u128Safe>(u128Safe.from("0"))
49
+ canSerde<u128Safe>(u128Safe.from("100"))
50
+ canSerde<u128Safe>(u128Safe.from("101"))
51
+
52
+ /* canSerde<u256>(u256.fromU128(u128.from("0")))
53
+ canSerde<u256>(u256.fromU128(u128.from("100")))
54
+ canSerde<u256>(u256.fromU128(u128.from("101")))
55
+
56
+ canSerde<u256Safe>(u256Safe.fromU128(u128.from("0")))
57
+ canSerde<u256Safe>(u256Safe.fromU128(u128.from("100")))
58
+ canSerde<u256Safe>(u256Safe.fromU128(u128.from("101")))
59
+
60
+ canSerde<i128>(i128.from("0"))
61
+ canSerde<i128>(i128.from("100"))
62
+ canSerde<i128>(i128.from("101"))
63
+
64
+ canSerde<i128Safe>(i128Safe.from("0"))
65
+ canSerde<i128Safe>(i128Safe.from("100"))
66
+ canSerde<i128Safe>(i128Safe.from("101"))
67
+ canSerde<i128Safe>(i128Safe.from("-100"))
68
+ canSerde<i128Safe>(i128Safe.from("-101"))
69
+
70
+ canSerde<i256Safe>(new i256Safe(10, 11, 500, 501))*/
42
71
  });
43
72
 
44
73
  it("should ser/de floats", () => {
@@ -71,6 +100,21 @@ describe("Ser/de Numbers", () => {
71
100
  'string with colon : comma , brace [ ] bracket { } and quote " and other quote \\"'
72
101
  );
73
102
  });
103
+
104
+ it("should ser/de BigInt objects", () => {
105
+ canSerde<i32>(0);
106
+
107
+ canSerde<u32>(100);
108
+ canSerde<u64>(101);
109
+ canSerde<i32>(-100);
110
+ canSerde<i64>(-101);
111
+ canSerde<u128>(u128.from("0"))
112
+ canSerde<u128>(u128.from("100"))
113
+ canSerde<u128>(u128.from("101"))
114
+ canSerde<u128>(u128.from("-100"))
115
+ canSerde<u128>(u128.from("-101"))
116
+
117
+ })
74
118
  });
75
119
 
76
120
  describe("Ser/de Array", () => {
@@ -1,3 +0,0 @@
1
- class Dynamic {
2
-
3
- }
@@ -1,3 +1,4 @@
1
+ import { u128, u128Safe, u256, u256Safe, i128, i128Safe, i256Safe } from "as-bignum/assembly";
1
2
  import { StringSink } from "as-string-sink/assembly";
2
3
  import { isSpace } from "util/string";
3
4
  import {
@@ -21,12 +22,12 @@ import {
21
22
  uCode,
22
23
  emptyArrayWord
23
24
  } from "./chars";
24
- import { unsafeCharCodeAt } from "./util";
25
+ import { isBigNum, unsafeCharCodeAt } from "./util";
25
26
 
26
27
  /**
27
28
  * JSON Encoder/Decoder for AssemblyScript
28
29
  */
29
- export class JSON {
30
+ export namespace JSON {
30
31
  /**
31
32
  * Stringifies valid JSON data.
32
33
  * ```js
@@ -35,7 +36,7 @@ export class JSON {
35
36
  * @param data T
36
37
  * @returns string
37
38
  */
38
- static stringify<T>(data: T): string {
39
+ export function stringify<T>(data: T): string {
39
40
  // String
40
41
  if (isString<T>()) {
41
42
  return '"' + (<string>data).replaceAll('"', '\\"') + '"';
@@ -77,6 +78,9 @@ export class JSON {
77
78
  result.write(JSON.stringify(unchecked(data[data.length - 1])));
78
79
  result.write(rightBracketWord);
79
80
  return result.toString();
81
+ } else if ((isManaged<T>() || isReference<T>()) && isBigNum<T>()) {
82
+ // @ts-ignore
83
+ return data.toString();
80
84
  } else {
81
85
  throw new Error(`Could not serialize data of type ${nameof<T>()}. Invalid data provided.`);
82
86
  }
@@ -89,7 +93,7 @@ export class JSON {
89
93
  * @param data string
90
94
  * @returns T
91
95
  */
92
- static parse<T>(data: string): T {
96
+ export function parse<T>(data: string): T {
93
97
  let type!: T;
94
98
  if (isString<T>()) {
95
99
  // @ts-ignore
@@ -109,12 +113,15 @@ export class JSON {
109
113
  // @ts-ignore
110
114
  } else if (isDefined(type.__JSON_Set_Key)) {
111
115
  return parseObject<T>(data.trimStart());
116
+ } else if ((isManaged<T>() || isReference<T>()) && isBigNum<T>()) {
117
+ // @ts-ignore
118
+ return parseBigNum<T>(data);
112
119
  } else {
113
120
  // @ts-ignore
114
121
  throw new Error(`Could not deserialize data ${data} to type ${nameof<T>()}. Invalide data provided.`);
115
122
  }
116
123
  }
117
- private static parseObjectValue<T>(data: string): T {
124
+ function parseObjectValue<T>(data: string): T {
118
125
  let type!: T;
119
126
  if (isString<T>()) {
120
127
  // @ts-ignore
@@ -136,12 +143,44 @@ export class JSON {
136
143
  // @ts-ignore
137
144
  //if (isNullable<T>()) return null;
138
145
  return parseObject<T>(data);
146
+ } else if ((isManaged<T>() || isReference<T>()) && isBigNum<T>()) {
147
+ // @ts-ignore
148
+ return parseBigNum<T>(data);
139
149
  } else {
140
150
  // @ts-ignore
141
151
  //return null;
142
152
  throw new Error(`Could not deserialize data ${data} to type ${nameof<T>()}. Invalide data provided.`)
143
153
  }
144
154
  }
155
+ /*export class Arr extends Array<Variant> {
156
+ public data: Variant[] = [];
157
+ push<T>(data: T): i32 {
158
+ return this.data.push(Variant.from<T>(data));
159
+ }
160
+ at<T>(index: i32): T {
161
+ return this.data.at(index).get<T>();
162
+ }
163
+ }*/
164
+ }
165
+
166
+ // @ts-ignore
167
+ @inline
168
+ // @ts-ignore
169
+ function parseBigNum<T>(data: string): T {
170
+ // @ts-ignore
171
+ if (idof<T>() == idof<u128>()) return u128.fromString(data);
172
+ // @ts-ignore
173
+ if (idof<T>() == idof<u128Safe>()) return u128Safe.fromString(data);
174
+ // @ts-ignore
175
+ if (idof<T>() == idof<u256>()) return u128Safe.fromString(data);
176
+ // @ts-ignore
177
+ if (idof<T>() == idof<u256Safe>()) return u256Safe.fromString(data);
178
+ // @ts-ignore
179
+ if (idof<T>() == idof<i128>()) return i128.fromString(data);
180
+ // @ts-ignore
181
+ if (idof<T>() == idof<i128Safe>()) return i128Safe.fromString(data);
182
+ // @ts-ignore
183
+ if (idof<T>() == idof<i256Safe>()) return i256Safe.fromString(data);
145
184
  }
146
185
 
147
186
  // @ts-ignore
@@ -190,7 +229,7 @@ export class JSON {
190
229
 
191
230
  // @ts-ignore
192
231
  @inline
193
- export function parseObject<T>(data: string): T {
232
+ export function parseObject<T>(data: string): T {
194
233
  let schema: nonnull<T> = changetype<nonnull<T>>(__new(offsetof<nonnull<T>>(), idof<nonnull<T>>()));
195
234
  let key = "";
196
235
  let isKey = false;
@@ -1,6 +1,21 @@
1
1
  import { StringSink } from "as-string-sink/assembly";
2
2
  import { isSpace } from "assemblyscript/std/assembly/util/string";
3
3
  import { backSlashCode, quoteCode } from "./chars";
4
+ import { u128, u128Safe, u256, u256Safe, i128, i128Safe, i256Safe } from "as-bignum/assembly";
5
+
6
+ // @ts-ignore
7
+ @inline
8
+ export function isBigNum<T>(): boolean {
9
+ if (idof<T>() == idof<u128>()) return true;
10
+ if (idof<T>() == idof<u128Safe>()) return true;
11
+ if (idof<T>() == idof<u256>()) return true;
12
+ if (idof<T>() == idof<u256Safe>()) return true;
13
+ if (idof<T>() == idof<i128>()) return true;
14
+ if (idof<T>() == idof<i128Safe>()) return true;
15
+ if (idof<T>() == idof<i256Safe>()) return true;
16
+ return false;
17
+ }
18
+
4
19
  // @ts-ignore
5
20
  @inline
6
21
  export function unsafeCharCodeAt(data: string, pos: i32): i32 {
package/assembly/test.ts CHANGED
@@ -1,8 +1,15 @@
1
1
  import "wasi";
2
+ import { u128 } from "as-bignum/assembly";
2
3
  import {
3
4
  JSON
4
5
  } from ".";
5
6
 
7
+ // @ts-ignore
8
+ @json
9
+ class Stats {
10
+ wins: u128
11
+ loss: u128
12
+ }
6
13
  // @ts-ignore
7
14
  @json
8
15
  class Vec3 {
@@ -20,6 +27,7 @@ class Player {
20
27
  age: i32;
21
28
  pos: Vec3 | null;
22
29
  isVerified: boolean;
30
+ stats: Stats
23
31
  }
24
32
 
25
33
  const player: Player = {
@@ -33,9 +41,13 @@ const player: Player = {
33
41
  z: 8.3
34
42
  },
35
43
  isVerified: true,
44
+ stats: {
45
+ wins: u128.fromString("443"),
46
+ loss: u128.fromString("693")
47
+ }
36
48
  };
37
49
 
38
50
  const serializedPlayer = JSON.stringify<Player>(player);
39
51
  console.log("Serialized Player: " + serializedPlayer);
40
52
  const deserializedPlayer = JSON.parse<Player>(serializedPlayer);
41
- console.log("Deserialized Player: " + JSON.stringify(deserializedPlayer));
53
+ console.log("Deserialized Player: " + JSON.stringify(deserializedPlayer));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "JSON encoder/decoder for AssemblyScript",
5
5
  "types": "assembly/index.ts",
6
6
  "author": "Jairus Tanaka",
@@ -81,7 +81,6 @@ class AsJSONTransform extends ClassDecorator {
81
81
  ${
82
82
  // @ts-ignore
83
83
  this.setDataStmts.join("")}
84
- throw new Error("Cannot find key: " + key);
85
84
  }
86
85
  `;
87
86
  //console.log(setKeyFunc, deserializeFunc, serializeFunc)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@json-as/transform",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "JSON encoder/decoder for AssemblyScript",
5
5
  "main": "./lib/index.js",
6
6
  "author": "Jairus Tanaka",
@@ -104,7 +104,6 @@ class AsJSONTransform extends ClassDecorator {
104
104
  // @ts-ignore
105
105
  this.setDataStmts.join("")
106
106
  }
107
- throw new Error("Cannot find key: " + key);
108
107
  }
109
108
  `
110
109
  //console.log(setKeyFunc, deserializeFunc, serializeFunc)
package/tests/index.js DELETED
@@ -1,4 +0,0 @@
1
- import assert from "assert";
2
- import { add } from "../build/debug.js";
3
- assert.strictEqual(add(1, 2), 3);
4
- console.log("ok");
package/tests/test.js DELETED
@@ -1,17 +0,0 @@
1
- const fs = require("fs");
2
- const loader = require("@assemblyscript/loader");
3
- const { WASI } = require("wasi");
4
- const ConsoleImport = require('as-console/imports')
5
- const Console = new ConsoleImport()
6
- const wasiOptions = {};
7
- const wasi = new WASI(wasiOptions);
8
- const imports = {
9
- wasi_snapshot_preview1: wasi.wasiImport,
10
- ...Console.wasmImports
11
- };
12
- const wasmModule = loader.instantiateSync(
13
- fs.readFileSync(__dirname + "/output/test.wasm"),
14
- imports
15
- );
16
- Console.wasmExports = wasmModule.exports
17
- wasi.start(wasmModule);