json-as 0.8.6 → 0.8.8

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 (35) hide show
  1. package/CHANGELOG +2 -1
  2. package/assembly/__benches__/as-json.ts +1 -1
  3. package/assembly/deserialize/array/array.ts +31 -0
  4. package/assembly/deserialize/array/bool.ts +19 -0
  5. package/assembly/deserialize/array/float.ts +24 -0
  6. package/assembly/deserialize/array/integer.ts +24 -0
  7. package/assembly/deserialize/array/map.ts +27 -0
  8. package/assembly/deserialize/array/object.ts +27 -0
  9. package/assembly/deserialize/array/string.ts +29 -0
  10. package/assembly/deserialize/array.ts +37 -0
  11. package/assembly/deserialize/bool.ts +18 -0
  12. package/assembly/deserialize/box.ts +14 -0
  13. package/assembly/deserialize/date.ts +11 -0
  14. package/assembly/deserialize/float.ts +9 -0
  15. package/assembly/deserialize/integer.ts +7 -0
  16. package/assembly/deserialize/map.ts +182 -0
  17. package/assembly/deserialize/object.ts +139 -0
  18. package/assembly/deserialize/string.ts +88 -0
  19. package/assembly/serialize/array.ts +51 -0
  20. package/assembly/serialize/bool.ts +4 -0
  21. package/assembly/serialize/box.ts +10 -0
  22. package/assembly/serialize/date.ts +4 -0
  23. package/assembly/serialize/float.ts +4 -0
  24. package/assembly/serialize/integer.ts +5 -0
  25. package/assembly/serialize/map.ts +24 -0
  26. package/assembly/serialize/object.ts +7 -0
  27. package/assembly/serialize/string.ts +64 -0
  28. package/assembly/src/json.ts +55 -872
  29. package/assembly/src/sink.ts +286 -0
  30. package/assembly/src/util.ts +6 -0
  31. package/assembly/test.ts +8 -1
  32. package/package.json +1 -1
  33. package/transform/lib/index.js +3 -3
  34. package/transform/package.json +1 -1
  35. package/transform/src/index.ts +3 -3
@@ -0,0 +1,88 @@
1
+ import {
2
+ bCode,
3
+ backSlashCode,
4
+ backspaceCode,
5
+ carriageReturnCode,
6
+ fCode,
7
+ formFeedCode,
8
+ forwardSlashCode,
9
+ nCode,
10
+ newLineCode,
11
+ quoteCode,
12
+ rCode,
13
+ tCode,
14
+ tabCode,
15
+ uCode
16
+ } from "../src/chars";
17
+ import { Sink } from "../src/sink";
18
+ import { unsafeCharCodeAt } from "../src/util";
19
+
20
+ // @ts-ignore: Decorator
21
+ @inline export function deserializeString(data: string, start: i32 = 0, end: i32 = 0): string {
22
+ end = end || data.length - 1;
23
+ let result = Sink.withCapacity(end - start - 1);
24
+ let last = start + 1;
25
+ for (let i = last; i < end; i++) {
26
+ if (unsafeCharCodeAt(data, i) !== backSlashCode) {
27
+ continue;
28
+ }
29
+ const char = unsafeCharCodeAt(data, ++i);
30
+ result.write(data, last, i - 1);
31
+ switch (char) {
32
+ case quoteCode: {
33
+ result.writeCodePoint(quoteCode);
34
+ last = i + 1;
35
+ break;
36
+ }
37
+ case backSlashCode: {
38
+ result.writeCodePoint(backSlashCode);
39
+ last = i + 1;
40
+ break;
41
+ }
42
+ case forwardSlashCode: {
43
+ result.writeCodePoint(forwardSlashCode);
44
+ last = i + 1;
45
+ break;
46
+ }
47
+ case bCode: {
48
+ result.writeCodePoint(backspaceCode);
49
+ last = i + 1;
50
+ break;
51
+ }
52
+ case fCode: {
53
+ result.writeCodePoint(formFeedCode);
54
+ last = i + 1;
55
+ break;
56
+ }
57
+ case nCode: {
58
+ result.writeCodePoint(newLineCode);
59
+ last = i + 1;
60
+ break;
61
+ }
62
+ case rCode: {
63
+ result.writeCodePoint(carriageReturnCode);
64
+ last = i + 1;
65
+ break;
66
+ }
67
+ case tCode: {
68
+ result.writeCodePoint(tabCode);
69
+ last = i + 1;
70
+ break;
71
+ }
72
+ case uCode: {
73
+ const code = u16.parse(data.slice(i + 1, i + 5), 16);
74
+ result.writeCodePoint(code);
75
+ i += 4;
76
+ last = i + 1;
77
+ break;
78
+ }
79
+ default: {
80
+ throw new Error(`JSON: Cannot parse "${data}" as string. Invalid escape sequence: \\${data.charAt(i)}`);
81
+ }
82
+ }
83
+ }
84
+ if (end > last) {
85
+ result.write(data, last, end);
86
+ }
87
+ return result.toString()
88
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ commaCode,
3
+ commaWord,
4
+ emptyArrayWord,
5
+ leftBracketWord,
6
+ rightBracketCode,
7
+ rightBracketWord
8
+ } from "../src/chars";
9
+ import { Sink } from "../src/sink";
10
+ import { serializeString } from "./string";
11
+
12
+ // @ts-ignore
13
+ @inline export function serializeArray<T extends any[]>(data: T): string {
14
+ // @ts-ignore
15
+ if (data.length == 0) {
16
+ return emptyArrayWord;
17
+ // @ts-ignore
18
+ } else if (isString<valueof<T>>()) {
19
+ let result = leftBracketWord;
20
+ // @ts-ignore
21
+ for (let i = 0; i < data.length - 1; i++) {
22
+ // @ts-ignore
23
+ result += serializeString(unchecked(data[i]));
24
+ result += commaWord;
25
+ }
26
+ // @ts-ignore
27
+ result += serializeString(unchecked(data[data.length - 1]));
28
+ result += rightBracketWord;
29
+ return result;
30
+ // @ts-ignore
31
+ } else if (isBoolean<valueof<T>>()) {
32
+ // @ts-ignore
33
+ return leftBracketWord + data.join(commaWord) + rightBracketWord;
34
+ // @ts-ignore
35
+ } else if (isFloat<valueof<T>>() || isInteger<valueof<T>>()) {
36
+ // @ts-ignore
37
+ return leftBracketWord + data.join(commaWord) + rightBracketWord;
38
+ } else {
39
+ let result = Sink.fromString(leftBracketWord);
40
+ // @ts-ignore
41
+ for (let i = 0; i < data.length - 1; i++) {
42
+ // @ts-ignore
43
+ result.write(__JSON_Stringify(unchecked(data[i])));
44
+ result.writeCodePoint(commaCode);
45
+ }
46
+ // @ts-ignore
47
+ result.write(__JSON_Stringify(unchecked(data[data.length - 1])));
48
+ result.writeCodePoint(rightBracketCode);
49
+ return result.toString();
50
+ }
51
+ }
@@ -0,0 +1,4 @@
1
+ // @ts-ignore
2
+ @inline export function serializeBool(data: bool): string {
3
+ return data ? "true" : "false";
4
+ }
@@ -0,0 +1,10 @@
1
+ import { nullWord } from "../src/chars";
2
+ import { JSON } from "../src/json";
3
+
4
+ // @ts-ignore
5
+ @inline export function serializeBox<T extends Box<any>>(data: T): string {
6
+ if (isNullable<T>() && changetype<usize>(data) == <usize>0) {
7
+ return nullWord;
8
+ }
9
+ return JSON.stringify(data.unwrap());
10
+ }
@@ -0,0 +1,4 @@
1
+ // @ts-ignore
2
+ @inline export function serializeDate(data: Date): string {
3
+ return `"${data.toISOString()}"`
4
+ }
@@ -0,0 +1,4 @@
1
+ // @ts-ignore
2
+ @inline export function serializeFloat<T extends number>(data: T): string {
3
+ return data.toString();
4
+ }
@@ -0,0 +1,5 @@
1
+ // @ts-ignore
2
+ @inline export function serializeInteger<T extends number>(data: T): string {
3
+ // I have a much faster implementation of itoa that I will port over later. Its ~4x faster
4
+ return data.toString();
5
+ }
@@ -0,0 +1,24 @@
1
+ import { colonCode, commaCode, leftBraceWord, rightBraceCode } from "../src/chars";
2
+ import { JSON } from "../src/json";
3
+ import { Sink } from "../src/sink";
4
+ import { serializeString } from "./string";
5
+
6
+ // @ts-ignore
7
+ @inline export function serializeMap<T extends Map<any, any>>(data: T): string {
8
+ let result = Sink.fromString(leftBraceWord);
9
+ let keys = data.keys();
10
+ let values = data.values();
11
+ const end = data.size - 1;
12
+ for (let i = 0; i < end; i++) {
13
+ result.write(serializeString(unchecked(keys[i]).toString()));
14
+ result.writeCodePoint(colonCode);
15
+ result.write(JSON.stringify(unchecked(values[i])));
16
+ result.writeCodePoint(commaCode);
17
+ }
18
+ result.write(serializeString(unchecked(keys[end]).toString()));
19
+ result.writeCodePoint(colonCode);
20
+ result.write(JSON.stringify(unchecked(values[end])));
21
+
22
+ result.writeCodePoint(rightBraceCode);
23
+ return result.toString();
24
+ }
@@ -0,0 +1,7 @@
1
+ interface GeneratedInterface {
2
+ __SERIALIZE(): string;
3
+ }
4
+ // @ts-ignore
5
+ @inline export function serializeObject<T extends GeneratedInterface>(data: T): string {
6
+ return changetype<nonnull<T>>(data).__SERIALIZE();
7
+ }
@@ -0,0 +1,64 @@
1
+ import { backSlashCode, backspaceCode as BACKSPACE, carriageReturnCode as CARRIAGE_RETURN, formFeedCode as FORM_FEED, newLineCode as NEWLINE, quoteCode, quoteWord, tabCode as TAB } from "../src/chars";
2
+ import { Sink } from "../src/sink";
3
+ import { unsafeCharCodeAt } from "../src/util";
4
+
5
+ // @ts-ignore: Decorator
6
+ @inline export function serializeString(data: string): string {
7
+ if (data.length === 0) {
8
+ return quoteWord + quoteWord;
9
+ }
10
+
11
+ let result = Sink.fromString(quoteWord, data.length);
12
+
13
+ let last: i32 = 0;
14
+ for (let i = 0; i < data.length; i++) {
15
+ const char = unsafeCharCodeAt(<string>data, i);
16
+ if (char === quoteCode || char === backSlashCode) {
17
+ result.write(<string>data, last, i);
18
+ result.writeCodePoint(backSlashCode);
19
+ last = i;
20
+ } else if (char < 16) {
21
+ result.write(<string>data, last, i);
22
+ last = i + 1;
23
+ switch (char) {
24
+ case BACKSPACE: {
25
+ result.write("\\b");
26
+ break;
27
+ }
28
+ case TAB: {
29
+ result.write("\\t");
30
+ break;
31
+ }
32
+ case NEWLINE: {
33
+ result.write("\\n");
34
+ break;
35
+ }
36
+ case FORM_FEED: {
37
+ result.write("\\f");
38
+ break;
39
+ }
40
+ case CARRIAGE_RETURN: {
41
+ result.write("\\r");
42
+ break;
43
+ }
44
+ default: {
45
+ // all chars 0-31 must be encoded as a four digit unicode escape sequence
46
+ // \u0000 to \u000f handled here
47
+ result.write("\\u000");
48
+ result.write(char.toString(16));
49
+ break;
50
+ }
51
+ }
52
+ } else if (char < 32) {
53
+ result.write(<string>data, last, i);
54
+ last = i + 1;
55
+ // all chars 0-31 must be encoded as a four digit unicode escape sequence
56
+ // \u0010 to \u001f handled here
57
+ result.write("\\u00");
58
+ result.write(char.toString(16));
59
+ }
60
+ }
61
+ result.write(<string>data, last);
62
+ result.writeCodePoint(quoteCode);
63
+ return result.toString();
64
+ }