json-as 0.9.10 → 0.9.12
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/FUNDING.yml +1 -0
- package/CHANGELOG +2 -0
- package/README.md +1 -1
- package/as-test.config.json +24 -0
- package/assembly/__tests__/test.spec.ts +0 -25
- package/assembly/custom/bs.ts +155 -0
- package/assembly/{util.ts → custom/util.ts} +28 -0
- package/assembly/deserialize/array/array.ts +2 -2
- package/assembly/deserialize/array/bool.ts +2 -2
- package/assembly/deserialize/array/float.ts +2 -2
- package/assembly/deserialize/array/integer.ts +2 -2
- package/assembly/deserialize/array/map.ts +2 -2
- package/assembly/deserialize/array/object.ts +2 -2
- package/assembly/deserialize/array/string.ts +2 -2
- package/assembly/deserialize/array.ts +3 -3
- package/assembly/deserialize/bool.ts +2 -2
- package/assembly/deserialize/integer.ts +1 -1
- package/assembly/deserialize/map.ts +3 -5
- package/assembly/deserialize/object.ts +2 -2
- package/assembly/deserialize/string.ts +3 -3
- package/assembly/index.ts +4 -191
- package/assembly/serialize/array.ts +3 -5
- package/assembly/serialize/map.ts +2 -3
- package/assembly/serialize/string.ts +63 -52
- package/assembly/test.ts +38 -34
- package/bench/benchmark.ts +18 -5
- package/bench/benchmark.wasm +0 -0
- package/package.json +14 -14
- package/transform/package.json +3 -5
- package/transform/src/index.ts +1 -0
- package/assembly/deserialize/mpz.ts +0 -12
- package/assembly/serialize/mpz.ts +0 -6
- package/assembly/serialize/unknown.ts +0 -45
- package/build/test.spec.wasm +0 -0
- package/build/test.spec.wasm.map +0 -1
- package/build/test.spec.wat +0 -107507
- package/build/test.wasm +0 -0
- package/build/test.wasm.map +0 -1
- package/build/test.wat +0 -14414
- package/tsconfig.json +0 -95
- /package/assembly/{chars.ts → custom/chars.ts} +0 -0
- /package/assembly/{sink.ts → custom/sink.ts} +0 -0
- /package/assembly/{types.ts → custom/types.ts} +0 -0
|
@@ -6,15 +6,13 @@ import {
|
|
|
6
6
|
BRACKET_LEFT_WORD,
|
|
7
7
|
BRACKET_RIGHT,
|
|
8
8
|
BRACKET_RIGHT_WORD
|
|
9
|
-
} from "../chars";
|
|
10
|
-
import { Sink } from "../sink";
|
|
9
|
+
} from "../custom/chars";
|
|
10
|
+
import { Sink } from "../custom/sink";
|
|
11
11
|
import { serializeString } from "./string";
|
|
12
12
|
|
|
13
13
|
// @ts-ignore: Decorator valid here
|
|
14
14
|
@inline export function serializeArray<T extends any[]>(data: T): string {
|
|
15
|
-
if (
|
|
16
|
-
// @ts-ignore
|
|
17
|
-
else if (data.length == 0) {
|
|
15
|
+
if (data.length == 0) {
|
|
18
16
|
return EMPTY_BRACKET_WORD;
|
|
19
17
|
// @ts-ignore
|
|
20
18
|
} else if (isString<valueof<T>>()) {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { COLON, COMMA, BRACE_LEFT_WORD, BRACE_RIGHT } from "../chars";
|
|
1
|
+
import { COLON, COMMA, BRACE_LEFT_WORD, BRACE_RIGHT } from "../custom/chars";
|
|
2
2
|
import { JSON } from "..";
|
|
3
|
-
import { Sink } from "../sink";
|
|
3
|
+
import { Sink } from "../custom/sink";
|
|
4
4
|
|
|
5
5
|
// @ts-ignore: Decorator valid here
|
|
6
6
|
@inline export function serializeMap<T extends Map<any, any>>(data: T): string {
|
|
7
|
-
if (changetype<usize>(data) == <usize>0) return "{}";
|
|
8
7
|
let result = Sink.fromString(BRACE_LEFT_WORD);
|
|
9
8
|
if (!data.size) return "{}";
|
|
10
9
|
let keys = data.keys();
|
|
@@ -5,69 +5,80 @@ import {
|
|
|
5
5
|
FORM_FEED,
|
|
6
6
|
NEW_LINE,
|
|
7
7
|
QUOTE,
|
|
8
|
-
QUOTE_WORD,
|
|
9
8
|
TAB
|
|
10
|
-
} from "../chars";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
} from "../custom/chars";
|
|
10
|
+
import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
|
|
11
|
+
import { bs } from "../custom/bs";
|
|
12
|
+
import { _intTo16, intTo16 } from "../custom/util";
|
|
13
13
|
|
|
14
14
|
// @ts-ignore: Decorator valid here
|
|
15
15
|
@inline export function serializeString(data: string): string {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const len = data.length << 1;
|
|
17
|
+
if (len === 0) {
|
|
18
|
+
bs.write_16(2228258); /* {} */
|
|
19
|
+
return bs.out<string>();
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
bs.write_16(QUOTE);
|
|
21
23
|
|
|
22
24
|
let last: i32 = 0;
|
|
23
|
-
for (let i = 0; i <
|
|
24
|
-
const char =
|
|
25
|
-
if (char
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
25
|
+
for (let i = 0; i < len; i += 2) {
|
|
26
|
+
const char = load<u16>(changetype<usize>(data) + i);
|
|
27
|
+
if (char < 35) {
|
|
28
|
+
if (char === QUOTE) {
|
|
29
|
+
bs.write_s_se(<string>data, last, i);
|
|
30
|
+
bs.write_16(BACK_SLASH);
|
|
31
|
+
last = i;
|
|
32
|
+
continue;
|
|
33
|
+
} else if (char < 32) {
|
|
34
|
+
if (char < 16) {
|
|
35
|
+
bs.write_s_se(<string>data, last, i);
|
|
36
|
+
last = i + 2;
|
|
37
|
+
switch (char) {
|
|
38
|
+
case BACKSPACE: {
|
|
39
|
+
bs.write_32(6422620);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
case TAB: {
|
|
43
|
+
bs.write_32(7602268);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
case NEW_LINE: {
|
|
47
|
+
bs.write_32(7209052);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
case FORM_FEED: {
|
|
51
|
+
bs.write_32(6684764);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
case CARRIAGE_RETURN: {
|
|
55
|
+
bs.write_32(7471196);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
default: {
|
|
59
|
+
// all chars 0-31 must be encoded as a four digit unicode escape sequence
|
|
60
|
+
// \u0000 to \u000f handled here
|
|
61
|
+
bs.write_64(13511005048209500) /* \\u00 */
|
|
62
|
+
bs.write_32((_intTo16(char) << 16) | 48); /* 0_ */
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
bs.write_s_se(<string>data, last, i);
|
|
68
|
+
last = i + 2;
|
|
54
69
|
// all chars 0-31 must be encoded as a four digit unicode escape sequence
|
|
55
|
-
// \
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
break;
|
|
70
|
+
// \u0010 to \u001f handled here
|
|
71
|
+
bs.write_64(13511005048209500) /* \\u00 */
|
|
72
|
+
bs.write_32((intTo16(char) << 16) | 48); /* 0_ */
|
|
59
73
|
}
|
|
60
74
|
}
|
|
61
|
-
} else if (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// \u0010 to \u001f handled here
|
|
66
|
-
result.write("\\u00");
|
|
67
|
-
result.write(char.toString(16));
|
|
75
|
+
} else if (char === BACK_SLASH) {
|
|
76
|
+
bs.write_s_se(<string>data, last, i);
|
|
77
|
+
bs.write_16(BACK_SLASH);
|
|
78
|
+
last = i;
|
|
68
79
|
}
|
|
69
80
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return
|
|
81
|
+
bs.write_s_se_u(<string>data, last, changetype<OBJECT>(changetype<usize>(data) - TOTAL_OVERHEAD).rtSize);
|
|
82
|
+
bs.write_16(QUOTE);
|
|
83
|
+
return bs.out<string>();
|
|
73
84
|
}
|
package/assembly/test.ts
CHANGED
|
@@ -1,38 +1,42 @@
|
|
|
1
|
-
import { JSON } from ".";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
// import { JSON } from ".";
|
|
2
|
+
import { bs } from "./custom/bs";
|
|
3
|
+
// @json
|
|
4
|
+
// class Vec3 {
|
|
5
|
+
// x: f32 = 0.0;
|
|
6
|
+
// y: f32 = 0.0;
|
|
7
|
+
// z: f32 = 0.0;
|
|
8
|
+
// }
|
|
8
9
|
|
|
9
|
-
@json
|
|
10
|
-
class Player {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
10
|
+
// @json
|
|
11
|
+
// class Player {
|
|
12
|
+
// @alias("first name")
|
|
13
|
+
// firstName!: string;
|
|
14
|
+
// lastName!: string;
|
|
15
|
+
// lastActive!: i32[];
|
|
16
|
+
// // Drop in a code block, function, or expression that evaluates to a boolean
|
|
17
|
+
// @omitif("this.age < 18")
|
|
18
|
+
// age!: i32;
|
|
19
|
+
// @omitnull()
|
|
20
|
+
// pos!: Vec3 | null;
|
|
21
|
+
// isVerified!: boolean;
|
|
22
|
+
// }
|
|
22
23
|
|
|
23
|
-
const player: Player = {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
24
|
+
// const player: Player = {
|
|
25
|
+
// firstName: "Emmet",
|
|
26
|
+
// lastName: "West",
|
|
27
|
+
// lastActive: [8, 27, 2022],
|
|
28
|
+
// age: 23,
|
|
29
|
+
// pos: {
|
|
30
|
+
// x: 3.4,
|
|
31
|
+
// y: 1.2,
|
|
32
|
+
// z: 8.3
|
|
33
|
+
// },
|
|
34
|
+
// isVerified: true
|
|
35
|
+
// };
|
|
35
36
|
|
|
36
|
-
const stringified = JSON.stringify<Player>(player);
|
|
37
|
+
// const stringified = JSON.stringify<Player>(player);
|
|
37
38
|
|
|
38
|
-
const parsed = JSON.parse<Player>(stringified);
|
|
39
|
+
// const parsed = JSON.parse<Player>(stringified);
|
|
40
|
+
|
|
41
|
+
bs.write_32(6422620);
|
|
42
|
+
console.log(bs.out<string>())
|
package/bench/benchmark.ts
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
|
-
import { bench
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { bench } from "as-bench/assembly/bench";
|
|
2
|
+
import { serializeString } from "../assembly/serialize/string";
|
|
3
|
+
import { bs } from "../assembly/custom/bs";
|
|
4
4
|
|
|
5
5
|
@json
|
|
6
6
|
class Vec3 {
|
|
7
7
|
x: i32;
|
|
8
8
|
y: i32;
|
|
9
9
|
z: i32;
|
|
10
|
+
__SERIALIZE_BS(): void {
|
|
11
|
+
bs.write_128_u(i16x8(123, 34, 120, 34, 58, 49, 44, 34)); /* {"x":1," */
|
|
12
|
+
bs.write_128_u(i16x8(121, 34, 58, 50, 44, 34, 122, 34)); /* y":2,"z" */
|
|
13
|
+
bs.write_32_u(3342394); /* :3 */
|
|
14
|
+
bs.write_16_u(125); /* } */
|
|
15
|
+
}
|
|
10
16
|
}
|
|
11
|
-
|
|
17
|
+
const out = memory.data(1000);
|
|
12
18
|
const vec: Vec3 = {
|
|
13
19
|
x: 3,
|
|
14
20
|
y: 1,
|
|
15
21
|
z: 8,
|
|
16
22
|
}
|
|
23
|
+
bench("Stringify Vec3", () => {
|
|
24
|
+
vec.__SERIALIZE_BS();
|
|
25
|
+
//bs.reset()
|
|
26
|
+
})
|
|
27
|
+
bench("Stringify String", () => {
|
|
28
|
+
serializeString('Hello World');
|
|
29
|
+
});
|
|
17
30
|
/*
|
|
18
31
|
bench("Parse Number SNIP", () => {
|
|
19
32
|
blackbox<i32>(snip_fast<i32>("12345"));
|
|
@@ -29,7 +42,7 @@ bench("Parse Number STDLIB", () => {
|
|
|
29
42
|
|
|
30
43
|
bench("Stringify Object (Vec3)", () => {
|
|
31
44
|
blackbox<string>(JSON.stringify(vec));
|
|
32
|
-
})
|
|
45
|
+
});
|
|
33
46
|
|
|
34
47
|
bench("Parse Object (Vec3)", () => {
|
|
35
48
|
blackbox<Vec3>(JSON.parse<Vec3>('{"x":0,"y":0,"z":0}'));
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "JSON
|
|
3
|
+
"version": "0.9.12",
|
|
4
|
+
"description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
|
|
5
5
|
"types": "assembly/index.ts",
|
|
6
6
|
"author": "Jairus Tanaka",
|
|
7
7
|
"contributors": [
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
],
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"scripts": {
|
|
18
|
-
"test": "
|
|
19
|
-
"pretest": "
|
|
20
|
-
"build:test": "JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
|
|
21
|
-
"build:bench": "asc bench/benchmark.ts -o bench/benchmark.wasm --transform ./transform --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime stub",
|
|
18
|
+
"test": "ast test",
|
|
19
|
+
"pretest": "rm -rf ./build/ && ast build",
|
|
20
|
+
"build:test": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
|
|
21
|
+
"build:bench": "asc bench/benchmark.ts -o bench/benchmark.wasm --transform ./transform --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime stub --enable simd",
|
|
22
22
|
"bench:wasmtime": "wasmtime ./bench/benchmark.wasm",
|
|
23
23
|
"bench:wasmer": "wasmer --llvm ./bench/benchmark.wasm",
|
|
24
24
|
"build:transform": "tsc -p ./transform",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"@assemblyscript/wasi-shim": "^0.1.0",
|
|
33
33
|
"as-bench": "^0.0.0-alpha",
|
|
34
34
|
"as-console": "^7.0.0",
|
|
35
|
-
"
|
|
35
|
+
"as-test": "0.1.9",
|
|
36
|
+
"assemblyscript": "^0.27.29",
|
|
36
37
|
"assemblyscript-prettier": "^3.0.1",
|
|
37
38
|
"benchmark": "^2.1.4",
|
|
38
39
|
"microtime": "^3.1.1",
|
|
@@ -41,12 +42,7 @@
|
|
|
41
42
|
"typescript": "^5.5.3",
|
|
42
43
|
"visitor-as": "^0.11.4"
|
|
43
44
|
},
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"@hypercubed/as-mpz": "^2.2.0",
|
|
46
|
-
"as-string-sink": "^0.5.3",
|
|
47
|
-
"as-test": "^0.1.4",
|
|
48
|
-
"as-virtual": "^0.2.0"
|
|
49
|
-
},
|
|
45
|
+
"dependencies": { "as-virtual": "^0.2.0" },
|
|
50
46
|
"overrides": {
|
|
51
47
|
"assemblyscript": "$assemblyscript"
|
|
52
48
|
},
|
|
@@ -60,7 +56,11 @@
|
|
|
60
56
|
"serialize",
|
|
61
57
|
"deserialize",
|
|
62
58
|
"dynamic",
|
|
63
|
-
"serde"
|
|
59
|
+
"serde",
|
|
60
|
+
"SIMD",
|
|
61
|
+
"optimized",
|
|
62
|
+
"fast",
|
|
63
|
+
"algorithm"
|
|
64
64
|
],
|
|
65
65
|
"bugs": {
|
|
66
66
|
"url": "https://github.com/JairusSW/as-json/issues"
|
package/transform/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@json-as/transform",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "JSON
|
|
3
|
+
"version": "0.9.12",
|
|
4
|
+
"description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"author": "Jairus Tanaka",
|
|
7
7
|
"contributors": [
|
|
@@ -12,9 +12,7 @@
|
|
|
12
12
|
"lekiano"
|
|
13
13
|
],
|
|
14
14
|
"license": "MIT",
|
|
15
|
-
"devDependencies": {
|
|
16
|
-
"assemblyscript": "^0.27.1"
|
|
17
|
-
},
|
|
15
|
+
"devDependencies": {},
|
|
18
16
|
"dependencies": {},
|
|
19
17
|
"repository": {
|
|
20
18
|
"type": "git",
|
package/transform/src/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { toString, isStdlib } from "visitor-as/dist/utils.js";
|
|
|
13
13
|
import { BaseVisitor, SimpleParser } from "visitor-as/dist/index.js";
|
|
14
14
|
import { Transform } from "assemblyscript/dist/transform.js";
|
|
15
15
|
import { CommonFlags } from "types:assemblyscript/src/common";
|
|
16
|
+
import { DecoratorNode } from "types:assemblyscript/src/ast";
|
|
16
17
|
|
|
17
18
|
class JSONTransform extends BaseVisitor {
|
|
18
19
|
public schemasList: SchemaData[] = [];
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { MpZ } from "@hypercubed/as-mpz";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Deserialize a string to type MpZ
|
|
5
|
-
* @param data data to parse
|
|
6
|
-
* @returns MpZ
|
|
7
|
-
*/
|
|
8
|
-
// @ts-ignore: Decorator valid here
|
|
9
|
-
@inline export function deserializeMpZ(data: string, start: i32 = 0, end: i32 = 0): MpZ {
|
|
10
|
-
if (!end) end = data.length;
|
|
11
|
-
return MpZ.from(data.slice(start, end));
|
|
12
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { JSON } from "..";
|
|
2
|
-
import { Sink } from "../sink";
|
|
3
|
-
import { __atoi_fast } from "../util";
|
|
4
|
-
import { serializeBool } from "./bool";
|
|
5
|
-
import { serializeFloat } from "./float";
|
|
6
|
-
import { serializeInteger } from "./integer";
|
|
7
|
-
import { serializeString } from "./string";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Serializes unknown values into their correct serializer and returns the data.
|
|
11
|
-
*
|
|
12
|
-
* @param data - The JSON.Value to be serialized.
|
|
13
|
-
* @returns The serialized result.
|
|
14
|
-
*/
|
|
15
|
-
// @ts-ignore: Decorator valid here
|
|
16
|
-
@inline export function serializeUnknown(data: JSON.Value): string {
|
|
17
|
-
const type = data.type;
|
|
18
|
-
switch (type) {
|
|
19
|
-
case JSON.Types.String: {
|
|
20
|
-
return serializeString(data.get<string>());
|
|
21
|
-
}
|
|
22
|
-
case JSON.Types.Bool: {
|
|
23
|
-
return serializeBool(data.get<bool>());
|
|
24
|
-
}
|
|
25
|
-
case JSON.Types.U8: {
|
|
26
|
-
return serializeInteger(data.get<u8>());
|
|
27
|
-
}
|
|
28
|
-
case JSON.Types.U16: {
|
|
29
|
-
return serializeInteger(data.get<u16>());
|
|
30
|
-
}
|
|
31
|
-
case JSON.Types.U32: {
|
|
32
|
-
return serializeInteger(data.get<u32>());
|
|
33
|
-
}
|
|
34
|
-
case JSON.Types.U64: {
|
|
35
|
-
return serializeInteger(data.get<u64>());
|
|
36
|
-
}
|
|
37
|
-
case JSON.Types.F32: {
|
|
38
|
-
return serializeFloat(data.get<f32>());
|
|
39
|
-
}
|
|
40
|
-
case JSON.Types.F64: {
|
|
41
|
-
return serializeFloat(data.get<f64>());
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return "ERROR"//serializeUnknownArray(data.get<JSON.Value[]>());
|
|
45
|
-
}
|
package/build/test.spec.wasm
DELETED
|
Binary file
|