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.
- package/CHANGELOG +2 -1
- package/assembly/__benches__/as-json.ts +1 -1
- package/assembly/deserialize/array/array.ts +31 -0
- package/assembly/deserialize/array/bool.ts +19 -0
- package/assembly/deserialize/array/float.ts +24 -0
- package/assembly/deserialize/array/integer.ts +24 -0
- package/assembly/deserialize/array/map.ts +27 -0
- package/assembly/deserialize/array/object.ts +27 -0
- package/assembly/deserialize/array/string.ts +29 -0
- package/assembly/deserialize/array.ts +37 -0
- package/assembly/deserialize/bool.ts +18 -0
- package/assembly/deserialize/box.ts +14 -0
- package/assembly/deserialize/date.ts +11 -0
- package/assembly/deserialize/float.ts +9 -0
- package/assembly/deserialize/integer.ts +7 -0
- package/assembly/deserialize/map.ts +182 -0
- package/assembly/deserialize/object.ts +139 -0
- package/assembly/deserialize/string.ts +88 -0
- package/assembly/serialize/array.ts +51 -0
- package/assembly/serialize/bool.ts +4 -0
- package/assembly/serialize/box.ts +10 -0
- package/assembly/serialize/date.ts +4 -0
- package/assembly/serialize/float.ts +4 -0
- package/assembly/serialize/integer.ts +5 -0
- package/assembly/serialize/map.ts +24 -0
- package/assembly/serialize/object.ts +7 -0
- package/assembly/serialize/string.ts +64 -0
- package/assembly/src/json.ts +55 -872
- package/assembly/src/sink.ts +286 -0
- package/assembly/src/util.ts +6 -0
- package/assembly/test.ts +8 -1
- package/package.json +1 -1
- package/transform/lib/index.js +3 -3
- package/transform/package.json +1 -1
- 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,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,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,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
|
+
}
|