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.
Files changed (43) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/CHANGELOG +2 -0
  3. package/README.md +1 -1
  4. package/as-test.config.json +24 -0
  5. package/assembly/__tests__/test.spec.ts +0 -25
  6. package/assembly/custom/bs.ts +155 -0
  7. package/assembly/{util.ts → custom/util.ts} +28 -0
  8. package/assembly/deserialize/array/array.ts +2 -2
  9. package/assembly/deserialize/array/bool.ts +2 -2
  10. package/assembly/deserialize/array/float.ts +2 -2
  11. package/assembly/deserialize/array/integer.ts +2 -2
  12. package/assembly/deserialize/array/map.ts +2 -2
  13. package/assembly/deserialize/array/object.ts +2 -2
  14. package/assembly/deserialize/array/string.ts +2 -2
  15. package/assembly/deserialize/array.ts +3 -3
  16. package/assembly/deserialize/bool.ts +2 -2
  17. package/assembly/deserialize/integer.ts +1 -1
  18. package/assembly/deserialize/map.ts +3 -5
  19. package/assembly/deserialize/object.ts +2 -2
  20. package/assembly/deserialize/string.ts +3 -3
  21. package/assembly/index.ts +4 -191
  22. package/assembly/serialize/array.ts +3 -5
  23. package/assembly/serialize/map.ts +2 -3
  24. package/assembly/serialize/string.ts +63 -52
  25. package/assembly/test.ts +38 -34
  26. package/bench/benchmark.ts +18 -5
  27. package/bench/benchmark.wasm +0 -0
  28. package/package.json +14 -14
  29. package/transform/package.json +3 -5
  30. package/transform/src/index.ts +1 -0
  31. package/assembly/deserialize/mpz.ts +0 -12
  32. package/assembly/serialize/mpz.ts +0 -6
  33. package/assembly/serialize/unknown.ts +0 -45
  34. package/build/test.spec.wasm +0 -0
  35. package/build/test.spec.wasm.map +0 -1
  36. package/build/test.spec.wat +0 -107507
  37. package/build/test.wasm +0 -0
  38. package/build/test.wasm.map +0 -1
  39. package/build/test.wat +0 -14414
  40. package/tsconfig.json +0 -95
  41. /package/assembly/{chars.ts → custom/chars.ts} +0 -0
  42. /package/assembly/{sink.ts → custom/sink.ts} +0 -0
  43. /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 (changetype<usize>(data) == <usize>0) return EMPTY_BRACKET_WORD;
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 { Sink } from "../sink";
12
- import { unsafeCharCodeAt } from "../util";
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
- if (data.length === 0) {
17
- return QUOTE_WORD + QUOTE_WORD;
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
- let result = Sink.fromString(QUOTE_WORD, data.length);
22
+ bs.write_16(QUOTE);
21
23
 
22
24
  let last: i32 = 0;
23
- for (let i = 0; i < data.length; i++) {
24
- const char = unsafeCharCodeAt(<string>data, i);
25
- if (char === QUOTE || char === BACK_SLASH) {
26
- result.write(<string>data, last, i);
27
- result.writeCodePoint(BACK_SLASH);
28
- last = i;
29
- } else if (16 > char) {
30
- result.write(<string>data, last, i);
31
- last = i + 1;
32
- switch (char) {
33
- case BACKSPACE: {
34
- result.write("\\b");
35
- break;
36
- }
37
- case TAB: {
38
- result.write("\\t");
39
- break;
40
- }
41
- case NEW_LINE: {
42
- result.write("\\n");
43
- break;
44
- }
45
- case FORM_FEED: {
46
- result.write("\\f");
47
- break;
48
- }
49
- case CARRIAGE_RETURN: {
50
- result.write("\\r");
51
- break;
52
- }
53
- default: {
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
- // \u0000 to \u000f handled here
56
- result.write("\\u000");
57
- result.write(char.toString(16));
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 (32 > char) {
62
- result.write(<string>data, last, i);
63
- last = i + 1;
64
- // all chars 0-31 must be encoded as a four digit unicode escape sequence
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
- result.write(<string>data, last);
71
- result.writeCodePoint(QUOTE);
72
- return result.toString();
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
- @json
3
- class Vec3 {
4
- x: f32 = 0.0;
5
- y: f32 = 0.0;
6
- z: f32 = 0.0;
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
- @alias("first name")
12
- firstName!: string;
13
- lastName!: string;
14
- lastActive!: i32[];
15
- // Drop in a code block, function, or expression that evaluates to a boolean
16
- @omitif("this.age < 18")
17
- age!: i32;
18
- @omitnull()
19
- pos!: Vec3 | null;
20
- isVerified!: boolean;
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
- firstName: "Emmet",
25
- lastName: "West",
26
- lastActive: [8, 27, 2022],
27
- age: 23,
28
- pos: {
29
- x: 3.4,
30
- y: 1.2,
31
- z: 8.3
32
- },
33
- isVerified: true
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>())
@@ -1,19 +1,32 @@
1
- import { bench, blackbox } from "as-bench/assembly/bench";
2
- import { __atoi_fast } from "../assembly/util";
3
- import { JSON } from "../assembly";
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.10",
4
- "description": "JSON encoder/decoder for AssemblyScript",
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": "wasmtime build/test.spec.wasm",
19
- "pretest": "asc assembly/__tests__/test.spec.ts --target test",
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
- "assemblyscript": "^0.27.28",
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"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@json-as/transform",
3
- "version": "0.9.10",
4
- "description": "JSON encoder/decoder for AssemblyScript",
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",
@@ -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,6 +0,0 @@
1
- import { MpZ } from "@hypercubed/as-mpz";
2
-
3
- // @ts-ignore: Decorator valid here
4
- @inline export function serializeMpZ(data: MpZ): string {
5
- return data.toString();
6
- }
@@ -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
- }
Binary file