json-as 0.5.4 → 0.5.5
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 +40 -15
- package/asconfig.json +4 -2
- package/assembly/__tests__/as-json.spec.ts +44 -0
- package/assembly/dynamic/dynamic.ts +0 -3
- package/assembly/src/json.ts +45 -6
- package/assembly/src/util.ts +15 -0
- package/assembly/test.ts +13 -1
- package/package.json +1 -1
- package/tests/index.js +0 -4
- package/tests/test.js +0 -17
package/README.md
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
# AS-JSON
|
|
2
|
+

|
|
3
|
+

|
|
2
4
|
|
|
3
|
-
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
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:
|
|
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
|
|
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:
|
|
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
|
@@ -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", () => {
|
package/assembly/src/json.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/assembly/src/util.ts
CHANGED
|
@@ -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
package/tests/index.js
DELETED
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);
|