json-as 0.9.24 → 0.9.25

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 CHANGED
@@ -30,8 +30,8 @@ v0.9.19 - Fix arguments in @omitif declarations not working properly
30
30
  v0.9.20 - Strings were being received with quotes attached via the toString functionality. Removed that.
31
31
  v0.9.22 - Fix #89 and #93. Several bug fixes some severe such as ",null" being prepended when using @omit. Properly warn when a schema has fields that are not compatible with json
32
32
  v0.9.23 - Comment out SIMD-related code for now
33
- v9.9.24 - Remove transform changes from previous release
34
-
33
+ v0.9.24 - Remove transform changes from previous release
34
+ v0.9.25 - Implement JSON.parseSafe
35
35
  [UNRELEASED] v1.0.0
36
36
  - Allow nullable primitives
37
37
  - Port over JSON.Value
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  __| || __|| || | | ___ | _ || __|
4
4
  | | ||__ || | || | | ||___|| ||__ |
5
5
  |_____||_____||_____||_|___| |__|__||_____|
6
- v0.9.24
6
+ v0.9.25
7
7
  </pre>
8
8
  </h5>
9
9
 
@@ -0,0 +1,33 @@
1
+ import { JSON } from "..";
2
+ import { BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_T, QUOTE } from "../custom/chars";
3
+
4
+ bench("Match Type (string)", () => {
5
+ blackbox<boolean>(matchType(blackbox<string>("\""), JSON.Types.String));
6
+ });
7
+
8
+ bench("Match Type (bool)", () => {
9
+ blackbox<boolean>(matchType(blackbox<string>("t"), JSON.Types.Bool));
10
+ });
11
+
12
+ bench("Match Type (array)", () => {
13
+ blackbox<boolean>(matchType(blackbox<string>("["), JSON.Types.Array));
14
+ });
15
+
16
+ bench("Match Type (struct)", () => {
17
+ blackbox<boolean>(matchType(blackbox<string>("{"), JSON.Types.Obj));
18
+ });
19
+
20
+ bench("Match Type (raw)", () => {
21
+ blackbox<boolean>(matchType(blackbox<string>("\""), JSON.Types.Raw));
22
+ });
23
+
24
+ @inline function matchType(data: string, type: JSON.Types): boolean {
25
+ const firstChar = load<u8>(changetype<usize>(data));
26
+ if (JSON.Types.String == type && firstChar == QUOTE) return true;
27
+ else if (JSON.Types.Bool == type && (firstChar == CHAR_T || firstChar == CHAR_F)) return true;
28
+ else if (JSON.Types.Array == type && firstChar == BRACKET_LEFT) return true;
29
+ else if (JSON.Types.Obj == type && firstChar == BRACE_LEFT) return true;
30
+ else if (type < 7 && type > 0 && (firstChar < 58 && firstChar > 46)) return true;
31
+ else if (JSON.Types.Raw == type) return true;
32
+ else return false;
33
+ }
@@ -1,6 +1,7 @@
1
1
  import { isSpace } from "util/string";
2
- import { BACK_SLASH, QUOTE } from "./chars";
2
+ import { BACK_SLASH, BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_T, QUOTE } from "./chars";
3
3
  import { Sink } from "./sink";
4
+ import { JSON } from "..";
4
5
 
5
6
  // @ts-ignore: Decorator
6
7
  export function isMap<T>(): bool {
@@ -9,12 +10,12 @@ export function isMap<T>(): bool {
9
10
  }
10
11
 
11
12
  // @ts-ignore: Decorator
12
- export function unsafeCharCodeAt(data: string, pos: i32): i32 {
13
+ @inline export function unsafeCharCodeAt(data: string, pos: i32): i32 {
13
14
  return load<u16>(changetype<usize>(data) + ((<usize>pos) << 1));
14
15
  }
15
16
 
16
17
  // @ts-ignore: Decorator
17
- export function removeWhitespace(data: string): string {
18
+ @inline export function removeWhitespace(data: string): string {
18
19
  const result = new Sink();
19
20
  let instr = false;
20
21
  for (let i = 0; i < data.length; i++) {
@@ -35,7 +36,7 @@ export function removeWhitespace(data: string): string {
35
36
  }
36
37
 
37
38
  // @ts-ignore: Decorator
38
- export function escapeChar(char: string): string {
39
+ @inline export function escapeChar(char: string): string {
39
40
  switch (unsafeCharCodeAt(char, 0)) {
40
41
  case 0x22:
41
42
  return '\\"';
@@ -93,7 +94,7 @@ export function getArrayDepth<T extends ArrayLike>(depth: i32 = 1): i32 {
93
94
  * @param str - Any number. Can include scientific notation.
94
95
  */
95
96
  // @ts-ignore: Decorator
96
- export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
97
+ @inline export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
97
98
  if (isSigned<T>()) {
98
99
  const firstChar: u32 = load<u16>(changetype<usize>(str));
99
100
  if (firstChar === 48) return 0 as T;
@@ -258,7 +259,7 @@ export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u
258
259
  */
259
260
 
260
261
  // @ts-ignore
261
- export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
262
+ @inline export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
262
263
  // @ts-ignore
263
264
  let val: T = 0;
264
265
  if (!end) end = start + u32(str.length << 1);
@@ -293,7 +294,7 @@ export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end:
293
294
  */
294
295
 
295
296
  // @ts-ignore
296
- export function parseSciInteger<T extends number>(str: string): T {
297
+ @inline export function parseSciInteger<T extends number>(str: string): T {
297
298
  // @ts-ignore
298
299
  let val: T = 0;
299
300
  let offset = 0;
@@ -328,7 +329,7 @@ export function parseSciInteger<T extends number>(str: string): T {
328
329
  }
329
330
 
330
331
  // @ts-ignore
331
- function sciNote<T extends number>(num: T): T {
332
+ @inline function sciNote<T extends number>(num: T): T {
332
333
  let res = 1;
333
334
  // @ts-ignore
334
335
  if (num > 0) {
@@ -345,7 +346,7 @@ function sciNote<T extends number>(num: T): T {
345
346
  }
346
347
 
347
348
  // @ts-ignore
348
- function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
349
+ @inline function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
349
350
  const p1_len = p1_end - p1_start;
350
351
  const p2_len = p2_end - p2_start;
351
352
  if (p1_len != p2_len) return false;
@@ -356,14 +357,15 @@ function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: strin
356
357
  }
357
358
 
358
359
  // @ts-ignore
359
- export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
360
+ @inline export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
360
361
  for (let i = start; i <= end; i++) {
361
362
  if (unsafeCharCodeAt(str, i) == code) return true;
362
363
  }
363
364
  return false;
364
365
  }
365
366
 
366
- export function _intTo16(int: i32): i32 {
367
+ // @ts-ignore: Decorator
368
+ @inline export function _intTo16(int: i32): i32 {
367
369
  if (int < 10) {
368
370
  // 0-10
369
371
  return 48 + int;
@@ -373,6 +375,7 @@ export function _intTo16(int: i32): i32 {
373
375
  }
374
376
  }
375
377
 
378
+ // @ts-ignore: Decorator
376
379
  @inline export function intTo16(int: i32): i32 {
377
380
  const high = int >> 4;
378
381
  const low = int & 0x0F;
@@ -1,3 +1,4 @@
1
+ import { BRACKET_LEFT } from "../custom/chars";
1
2
  import { isMap } from "../custom/util";
2
3
  import { deserializeArrayArray } from "./array/array";
3
4
  import { deserializeBooleanArray } from "./array/bool";
@@ -36,3 +37,10 @@ export function deserializeArray<T extends unknown[]>(data: string): T {
36
37
  throw new Error("Could not parse array of type " + nameof<T>() + "!");
37
38
  }
38
39
  }
40
+
41
+ // @ts-ignore: Decorator valid here
42
+ export function deserializeArray_Safe<T extends unknown[]>(data: string): T {
43
+ const firstChar = load<u8>(changetype<usize>(data));
44
+ if (firstChar != BRACKET_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
45
+ return deserializeArray<T>(data);
46
+ }
@@ -15,4 +15,20 @@ import { unsafeCharCodeAt } from "../custom/util";
15
15
  if (len === 4 && firstChar === CHAR_T && load<u64>(ptr) === 28429475166421108) return true;
16
16
  else if (len === 5 && firstChar === CHAR_F && load<u64>(ptr, 2) === 28429466576093281) return false;
17
17
  return false//ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
18
+ }
19
+
20
+ /**
21
+ * Deserialize a string to type boolean (safely)
22
+ * @param data data to parse
23
+ * @returns boolean
24
+ */
25
+ // @ts-ignore: Decorator valid here
26
+ @inline export function deserializeBoolean_Safe(data: string, start: i32 = 0, end: i32 = 0): boolean {
27
+ if (!end) end = data.length;
28
+ const len = end - start;
29
+ const ptr = changetype<usize>(data) + <usize>(start << 1);
30
+ const firstChar = unsafeCharCodeAt(data, start);
31
+ if (len === 4 && firstChar === CHAR_T && load<u64>(ptr) === 28429475166421108) return true;
32
+ else if (len === 5 && firstChar === CHAR_F && load<u64>(ptr, 2) === 28429466576093281) return false;
33
+ throw new Error("Mismatched Types! Expected boolean but got \"" + data.slice(0, 100) + "\" instead!");
18
34
  }
@@ -1,11 +1,19 @@
1
+ import { QUOTE } from "../custom/chars";
2
+
1
3
  // @ts-ignore: Decorator valid here
2
4
  @inline export function deserializeDate(dateTimeString: string): Date {
3
- // Use AssemblyScript's date parser
4
- const d = Date.fromString(dateTimeString);
5
-
6
- // Return a new object instead of the one that the parser returned.
7
- // This may seem redundant, but addreses the issue when Date
8
- // is globally aliased to wasi_Date (or some other superclass).
9
- return new Date(d.getTime());
10
- }
11
-
5
+ // Use AssemblyScript's date parser
6
+ const d = Date.fromString(dateTimeString);
7
+
8
+ // Return a new object instead of the one that the parser returned.
9
+ // This may seem redundant, but addreses the issue when Date
10
+ // is globally aliased to wasi_Date (or some other superclass).
11
+ return new Date(d.getTime());
12
+ }
13
+
14
+ // @ts-ignore: Decorator valid here
15
+ @inline export function deserializeDate_Safe(dateTimeString: string): Date {
16
+ const firstChar = load<u8>(changetype<usize>(dateTimeString));
17
+ if (firstChar != QUOTE) throw new Error("Mismatched Types! Expected Date but got \"" + dateTimeString.slice(0, 100) + "\" instead!");
18
+ return deserializeDate(dateTimeString);
19
+ }
@@ -6,4 +6,16 @@
6
6
  if (type instanceof f64) return f64.parse(data);
7
7
  // @ts-ignore
8
8
  return f32.parse(data);
9
+ }
10
+
11
+ // @ts-ignore: Decorator valid here
12
+ @inline export function deserializeFloat_Safe<T>(data: string): T {
13
+ const firstChar = load<u8>(changetype<usize>(data));
14
+ if ((firstChar < 48 || firstChar > 57) && firstChar != 45) throw new Error("Mismatched Types! Expected float but got \""+data.slice(0, 100)+"\" instead!");
15
+ // @ts-ignore
16
+ const type: T = 0;
17
+ // @ts-ignore
18
+ if (type instanceof f64) return f64.parse(data);
19
+ // @ts-ignore
20
+ return f32.parse(data);
9
21
  }
@@ -4,4 +4,13 @@ import { snip_fast } from "../custom/util";
4
4
  @inline export function deserializeInteger<T>(data: string): T {
5
5
  // @ts-ignore
6
6
  return snip_fast<T>(data);
7
+ }
8
+
9
+ // @ts-ignore: Decorator valid here
10
+ @inline export function deserializeInteger_Safe<T>(data: string): T {
11
+ const firstChar = load<u8>(changetype<usize>(data));
12
+ console.log(firstChar.toString())
13
+ if ((firstChar < 48 || firstChar > 57) && firstChar != 45) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \""+data.slice(0, 100)+"\" instead!");
14
+ // @ts-ignore
15
+ return snip_fast<T>(data);
7
16
  }
@@ -180,3 +180,10 @@ function deserializeMapKey<T>(key: Virtual<string>): T {
180
180
 
181
181
  throw new Error(`JSON: Cannot parse JSON object to a Map with a key of type ${nameof<T>()}`);
182
182
  }
183
+
184
+ // @ts-ignore: Decorator valid here
185
+ @inline export function deserializeMap_Safe<T extends Map>(data: string): T {
186
+ const firstChar = load<u8>(changetype<usize>(data));
187
+ if (firstChar != BRACE_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
188
+ return deserializeMap<T>(data);
189
+ }
@@ -133,4 +133,139 @@ import { isSpace } from "util/string";
133
133
  }
134
134
  }
135
135
  return schema;
136
+ }
137
+
138
+ // @ts-ignore: Decorator valid here
139
+ @inline export function deserializeObject_Safe<T>(data: string): T {
140
+ const firstChar = load<u8>(changetype<usize>(data));
141
+ if (firstChar != BRACE_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
142
+ const schema: nonnull<T> = changetype<nonnull<T>>(
143
+ __new(offsetof<nonnull<T>>(), idof<nonnull<T>>())
144
+ );
145
+
146
+ // @ts-ignore
147
+ schema.__INITIALIZE();
148
+
149
+ let key_start: i32 = 0;
150
+ let key_end: i32 = 0;
151
+ let isKey = false;
152
+ let depth = 0;
153
+ let outerLoopIndex = 1;
154
+ for (; outerLoopIndex < data.length - 1; outerLoopIndex++) {
155
+ const char = unsafeCharCodeAt(data, outerLoopIndex);
156
+ if (char === BRACKET_LEFT) {
157
+ for (
158
+ let arrayValueIndex = outerLoopIndex;
159
+ arrayValueIndex < data.length - 1;
160
+ arrayValueIndex++
161
+ ) {
162
+ const char = unsafeCharCodeAt(data, arrayValueIndex);
163
+ if (char === BRACKET_LEFT) {
164
+ depth++;
165
+ } else if (char === BRACKET_RIGHT) {
166
+ depth--;
167
+ if (depth === 0) {
168
+ ++arrayValueIndex;
169
+ // @ts-ignore
170
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, arrayValueIndex);
171
+ outerLoopIndex = arrayValueIndex;
172
+ isKey = false;
173
+ break;
174
+ }
175
+ }
176
+ }
177
+ } else if (char === BRACE_LEFT) {
178
+ for (
179
+ let objectValueIndex = outerLoopIndex;
180
+ objectValueIndex < data.length - 1;
181
+ objectValueIndex++
182
+ ) {
183
+ const char = unsafeCharCodeAt(data, objectValueIndex);
184
+ if (char === BRACE_LEFT) {
185
+ depth++;
186
+ } else if (char === BRACE_RIGHT) {
187
+ depth--;
188
+ if (depth === 0) {
189
+ ++objectValueIndex;
190
+ // @ts-ignore
191
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, objectValueIndex);
192
+ outerLoopIndex = objectValueIndex;
193
+ isKey = false;
194
+ break;
195
+ }
196
+ }
197
+ }
198
+ } else if (char === QUOTE) {
199
+ let escaping = false;
200
+ for (
201
+ let stringValueIndex = ++outerLoopIndex;
202
+ stringValueIndex < data.length - 1;
203
+ stringValueIndex++
204
+ ) {
205
+ const char = unsafeCharCodeAt(data, stringValueIndex);
206
+ if (char === BACK_SLASH && !escaping) {
207
+ escaping = true;
208
+ } else {
209
+ if (char === QUOTE && !escaping) {
210
+ if (isKey === false) {
211
+ key_start = outerLoopIndex;
212
+ key_end = stringValueIndex;
213
+ isKey = true;
214
+ } else {
215
+ // @ts-ignore
216
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex - 1, stringValueIndex + 1);
217
+ isKey = false;
218
+ }
219
+ outerLoopIndex = ++stringValueIndex;
220
+ break;
221
+ }
222
+ escaping = false;
223
+ }
224
+ }
225
+ } else if (
226
+ char == CHAR_N &&
227
+ unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_U &&
228
+ unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_L &&
229
+ unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_L
230
+ ) {
231
+ // @ts-ignore
232
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 4);
233
+ outerLoopIndex += 3;
234
+ isKey = false;
235
+ } else if (
236
+ char === CHAR_T &&
237
+ unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_R &&
238
+ unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_U &&
239
+ unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_E
240
+ ) {
241
+ // @ts-ignore
242
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 4);
243
+ outerLoopIndex += 3;
244
+ isKey = false;
245
+ } else if (
246
+ char === CHAR_F &&
247
+ unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_A &&
248
+ unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_L &&
249
+ unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_S &&
250
+ unsafeCharCodeAt(data, outerLoopIndex + 4) === CHAR_E
251
+ ) {
252
+ // @ts-ignore
253
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 5);
254
+ outerLoopIndex += 4;
255
+ isKey = false;
256
+ } else if ((char >= 48 && char <= 57) || char === 45) {
257
+ let numberValueIndex = ++outerLoopIndex;
258
+ for (; numberValueIndex < data.length; numberValueIndex++) {
259
+ const char = unsafeCharCodeAt(data, numberValueIndex);
260
+ if (char === COMMA || char === BRACE_RIGHT || isSpace(char)) {
261
+ // @ts-ignore
262
+ schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex - 1, numberValueIndex);
263
+ outerLoopIndex = numberValueIndex;
264
+ isKey = false;
265
+ break;
266
+ }
267
+ }
268
+ }
269
+ }
270
+ return schema;
136
271
  }
@@ -154,4 +154,11 @@ import { unsafeCharCodeAt } from "../custom/util";
154
154
  // if (end > last) {
155
155
  // result.write(data, last, end);
156
156
  // }
157
- // }
157
+ // }
158
+
159
+ // @ts-ignore: Decorator valid here
160
+ @inline export function deserializeString_Safe(data: string, start: i32 = 0, end: i32 = 0): string {
161
+ const firstChar = load<u8>(changetype<usize>(data));
162
+ if (firstChar != QUOTE) throw new Error("Mismatched Types! Expected string but got \""+data.slice(0, 100)+"\" instead!");
163
+ return deserializeString(data, start, end);
164
+ }
package/assembly/index.ts CHANGED
@@ -7,15 +7,15 @@ import { serializeObject, serializeObject_Pretty } from "./serialize/object";
7
7
  import { serializeDate } from "./serialize/date";
8
8
  import { serializeArray } from "./serialize/array";
9
9
  import { serializeMap } from "./serialize/map";
10
- import { deserializeBoolean } from "./deserialize/bool";
11
- import { deserializeArray } from "./deserialize/array";
10
+ import { deserializeBoolean, deserializeBoolean_Safe } from "./deserialize/bool";
11
+ import { deserializeArray, deserializeArray_Safe } from "./deserialize/array";
12
12
  import { deserializeFloat } from "./deserialize/float";
13
- import { deserializeObject } from "./deserialize/object";
14
- import { deserializeMap } from "./deserialize/map";
13
+ import { deserializeObject, deserializeObject_Safe } from "./deserialize/object";
14
+ import { deserializeMap, deserializeMap_Safe } from "./deserialize/map";
15
15
  import { deserializeDate } from "./deserialize/date";
16
- import { NULL_WORD } from "./custom/chars";
17
- import { deserializeInteger } from "./deserialize/integer";
18
- import { deserializeString } from "./deserialize/string";
16
+ import { BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_N, CHAR_T, NULL_WORD, QUOTE } from "./custom/chars";
17
+ import { deserializeInteger, deserializeInteger_Safe } from "./deserialize/integer";
18
+ import { deserializeString, deserializeString_Safe } from "./deserialize/string";
19
19
  import { Sink } from "./custom/sink";
20
20
  import { getArrayDepth } from "./custom/util";
21
21
 
@@ -174,7 +174,7 @@ export namespace JSON {
174
174
  * @returns string
175
175
  */
176
176
  // @ts-ignore: Decorator
177
- export function stringify<T>(data: T/*, options: SerializeOptions = DEFAULT_SERIALIZE_OPTIONS*/): string {
177
+ @inline export function stringify<T>(data: T/*, options: SerializeOptions = DEFAULT_SERIALIZE_OPTIONS*/): string {
178
178
  if (isBoolean<T>()) {
179
179
  return serializeBool(data as bool);
180
180
  } else if (isInteger<T>()) {
@@ -222,7 +222,7 @@ export namespace JSON {
222
222
  */
223
223
 
224
224
  // @ts-ignore: Decorator
225
- export function parse<T>(data: string): T {
225
+ @inline export function parse<T>(data: string): T {
226
226
  if (isBoolean<T>()) {
227
227
  return deserializeBoolean(data) as T;
228
228
  } else if (isInteger<T>()) {
@@ -256,14 +256,62 @@ export namespace JSON {
256
256
  );
257
257
  }
258
258
  }
259
+ /**
260
+ * Parses valid JSON strings into their original format (safely).
261
+ * ```js
262
+ * JSON.parseSafe<T>(data)
263
+ * ```
264
+ * @param data string
265
+ * @returns T
266
+ */
267
+
268
+ // @ts-ignore: Decorator
269
+ @inline export function parseSafe<T>(data: string): T {
270
+ if (isBoolean<T>()) {
271
+ return deserializeBoolean_Safe(data) as T;
272
+ } else if (isInteger<T>()) {
273
+ return deserializeInteger_Safe<T>(data);
274
+ } else if (isFloat<T>()) {
275
+ return deserializeFloat<T>(data);
276
+ } else if (isNullable<T>() && data.length === 4 && data == "null") {
277
+ // @ts-ignore
278
+ return null;
279
+ } else if (isString<T>()) {
280
+ // @ts-ignore
281
+ return deserializeString_Safe(data);
282
+ } else if (isArray<T>()) {
283
+ // @ts-ignore
284
+ return deserializeArray_Safe<nonnull<T>>(data);
285
+ }
286
+ let type: nonnull<T> = changetype<nonnull<T>>(0);
287
+ // @ts-ignore: Defined by transform
288
+ if (isDefined(type.__DESERIALIZE)) {
289
+ // @ts-ignore
290
+ return deserializeObject_Safe<nonnull<T>>(data.trimStart());
291
+ } else if (type instanceof Map) {
292
+ // @ts-ignore
293
+ return deserializeMap_Safe<nonnull<T>>(data.trimStart());
294
+ } else if (type instanceof Date) {
295
+ // @ts-ignore
296
+ return deserializeDate_Safe(data);
297
+ } else {
298
+ throw new Error(
299
+ `Could not deserialize data ${data} to type ${nameof<T>()}. Make sure to add the correct decorators to classes.`
300
+ );
301
+ }
302
+ }
259
303
  }
260
304
 
261
305
  // This allows JSON.stringify and JSON.parse to be available globally through an alias
262
306
  // @ts-ignore: Decorator
263
- @global function __SERIALIZE<T>(data: T): string {
307
+ @global @inline function __SERIALIZE<T>(data: T): string {
264
308
  return JSON.stringify(data);
265
309
  }
266
310
  // @ts-ignore: Decorator
267
- @global function __DESERIALIZE<T>(data: string): T {
311
+ @global @inline function __DESERIALIZE<T>(data: string): T {
268
312
  return JSON.parse<T>(data);
313
+ }
314
+ // @ts-ignore: Decorator
315
+ @global @inline function __DESERIALIZE_SAFE<T>(data: string): T {
316
+ return JSON.parseSafe<T>(data);
269
317
  }
package/assembly/test.ts CHANGED
@@ -1,34 +1,34 @@
1
1
  import { JSON } from "."
2
2
 
3
3
  @json
4
- class Vec3<T> {
4
+ class Vec3 {
5
5
  public x: i32 = 0;
6
6
  public y: i32 = 0;
7
- public z: T;
7
+ public z: i32 = 0;
8
8
  }
9
9
 
10
- @json
11
- class Base {
12
- public bam: string = "harekogkeorgke"
13
- }
10
+ // @json
11
+ // class Base {
12
+ // public bam: string = "harekogkeorgke"
13
+ // }
14
14
 
15
- @json
16
- class Foo extends Base {
17
- public bar: JSON.Raw = "\"this is ok\'"
18
- public baz: i32 = 0;
19
- public pos: Vec3<Vec3<i32>> = {
20
- x: 1,
21
- y: 2,
22
- z: {
23
- x: 1,
24
- y: 2,
25
- z: 3
26
- }
27
- }
28
- // ^ this is not okay
29
- }
15
+ // @json
16
+ // class Foo extends Base {
17
+ // public bar: JSON.Raw = "\"this is ok\'"
18
+ // public baz: i32 = 0;
19
+ // public pos: Vec3<Vec3<i32>> = {
20
+ // x: 1,
21
+ // y: 2,
22
+ // z: {
23
+ // x: 1,
24
+ // y: 2,
25
+ // z: 3
26
+ // }
27
+ // }
28
+ // // ^ this is not okay
29
+ // }
30
30
 
31
- const serialized = JSON.stringify(new Foo());
31
+ const serialized = JSON.stringify(new Vec3());
32
32
  console.log("Serialized: " + serialized);
33
- const deserialized = JSON.parse<Foo>(serialized);
33
+ const deserialized = JSON.parseSafe<Vec3>(`{"x":1,"y":true,"z":3}`);
34
34
  console.log("Deserialized: " + JSON.stringify(deserialized));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as",
3
- "version": "0.9.24",
3
+ "version": "0.9.25",
4
4
  "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
5
5
  "types": "assembly/index.ts",
6
6
  "author": "Jairus Tanaka",
@@ -19,7 +19,7 @@
19
19
  "test": "ast test && rm -rf ./build/",
20
20
  "pretest": "rm -rf ./build/ && ast build",
21
21
  "bench": "astral --enable simd --runtime stub",
22
- "build:test": "rm -rf ./build/ && asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
22
+ "build:test": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
23
23
  "build:transform": "tsc -p ./transform",
24
24
  "test:wasmtime": "wasmtime ./build/test.wasm",
25
25
  "test:wavm": "wavm run ./build/test.wasm",
@@ -24,7 +24,7 @@ class JSONTransform extends BaseVisitor {
24
24
  schema.node = node;
25
25
  schema.name = node.name.text;
26
26
  const members = [
27
- ...node.members.filter((v) => v.kind === 54 /* NodeKind.FieldDeclaration */),
27
+ ...node.members.filter((v) => v.kind === 54),
28
28
  ];
29
29
  if (node.extendsType) {
30
30
  schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text);
@@ -39,17 +39,14 @@ class JSONTransform extends BaseVisitor {
39
39
  }
40
40
  if (!members.length) {
41
41
  let SERIALIZE_RAW_EMPTY = '__SERIALIZE(): string {\n return "{}";\n}';
42
- //let SERIALIZE_PRETTY_EMPTY = "__SERIALIZE_PRETTY(): string {\n return \"{}\";\n}";
43
42
  let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}";
44
43
  let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
45
44
  if (process.env["JSON_DEBUG"]) {
46
45
  console.log(SERIALIZE_RAW_EMPTY);
47
- //console.log(SERIALIZE_PRETTY_EMPTY);
48
46
  console.log(INITIALIZE_EMPTY);
49
47
  console.log(DESERIALIZE_EMPTY);
50
48
  }
51
49
  const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
52
- //const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
53
50
  const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
54
51
  const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
55
52
  if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
@@ -74,11 +71,11 @@ class JSONTransform extends BaseVisitor {
74
71
  if (type.startsWith("(") && type.includes("=>"))
75
72
  continue;
76
73
  const value = member.initializer ? toString(member.initializer) : null;
77
- if (member.flags == 32 /* CommonFlags.Static */)
74
+ if (member.flags == 32)
78
75
  continue;
79
- if (member.flags === 512 /* CommonFlags.Private */)
76
+ if (member.flags === 512)
80
77
  continue;
81
- if (member.flags === 1024 /* CommonFlags.Protected */)
78
+ if (member.flags === 1024)
82
79
  continue;
83
80
  const mem = new Property();
84
81
  mem.name = name.text;
@@ -122,7 +119,7 @@ class JSONTransform extends BaseVisitor {
122
119
  }
123
120
  }
124
121
  }
125
- mem.generate();
122
+ mem.generate(false);
126
123
  if (this.schemasList.find((v) => v.name == type)) {
127
124
  mem.initialize =
128
125
  "this." +
@@ -332,39 +329,36 @@ class JSONTransform extends BaseVisitor {
332
329
  DESERIALIZE += " } ";
333
330
  }
334
331
  DESERIALIZE += "\n return false;\n}";
335
- //console.log(sortedMembers);
336
332
  if (process.env["JSON_DEBUG"]) {
337
333
  console.log(SERIALIZE_RAW);
338
- //console.log(SERIALIZE_PRETTY);
339
334
  console.log(INITIALIZE);
340
335
  console.log(DESERIALIZE);
341
336
  }
342
337
  const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(SERIALIZE_RAW, node);
343
- //const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
338
+ const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE");
344
339
  const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
345
340
  const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
341
+ const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node);
346
342
  if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
347
343
  node.members.push(SERIALIZE_RAW_METHOD);
348
344
  if (!node.members.find((v) => v.name.text == "__INITIALIZE"))
349
345
  node.members.push(INITIALIZE_METHOD);
350
346
  if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
351
347
  node.members.push(DESERIALIZE_METHOD);
348
+ if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE"))
349
+ node.members.push(DESERIALIZE_SAFE_METHOD);
352
350
  this.schemasList.push(schema);
353
351
  }
354
352
  visitSource(node) {
355
353
  super.visitSource(node);
356
- // Only add the import statement to sources that have JSON decorated classes.
357
354
  if (!this.sources.has(node)) {
358
355
  return;
359
356
  }
360
357
  }
361
358
  }
362
359
  export default class Transformer extends Transform {
363
- // Trigger the transform after parse.
364
360
  afterParse(parser) {
365
- // Create new transform
366
361
  const transformer = new JSONTransform();
367
- // Sort the sources so that user scripts are visited last
368
362
  const sources = parser.sources
369
363
  .filter((source) => !isStdlib(source))
370
364
  .sort((_a, _b) => {
@@ -380,14 +374,11 @@ export default class Transformer extends Transform {
380
374
  return 0;
381
375
  }
382
376
  });
383
- // Loop over every source
384
377
  for (const source of sources) {
385
- // Ignore all lib and std. Visit everything else.
386
378
  if (!isStdlib(source)) {
387
379
  transformer.visit(source);
388
380
  }
389
381
  }
390
- // Check that every parent and child class is hooked up correctly
391
382
  const schemas = transformer.schemasList;
392
383
  for (const schema of schemas) {
393
384
  if (schema.parent) {
@@ -419,7 +410,7 @@ class Property {
419
410
  node;
420
411
  right_s = "";
421
412
  right_d = "";
422
- generate() {
413
+ generate(safe) {
423
414
  const name = this.name;
424
415
  const escapedName = escapeString(JSON.stringify(this.alias || this.name));
425
416
  const type = this.type;
@@ -438,7 +429,7 @@ class Property {
438
429
  else {
439
430
  this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")";
440
431
  this.right_d =
441
- "__DESERIALIZE<" + type + ">(data.substring(value_start, value_end))";
432
+ (safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
442
433
  }
443
434
  if (this.flags.has(PropertyFlags.OmitIf)) {
444
435
  const condition = this.flags.get(PropertyFlags.OmitIf)[0];
@@ -537,3 +528,4 @@ function getArgs(args) {
537
528
  }
538
529
  return out;
539
530
  }
531
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@json-as/transform",
3
- "version": "0.9.24",
3
+ "version": "0.9.25",
4
4
  "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
5
5
  "main": "./lib/index.js",
6
6
  "author": "Jairus Tanaka",
@@ -174,7 +174,7 @@ class JSONTransform extends BaseVisitor {
174
174
  }
175
175
  }
176
176
 
177
- mem.generate();
177
+ mem.generate(false);
178
178
 
179
179
  if (this.schemasList.find((v) => v.name == type)) {
180
180
  mem.initialize =
@@ -393,9 +393,12 @@ class JSONTransform extends BaseVisitor {
393
393
  SERIALIZE_RAW,
394
394
  node,
395
395
  );
396
+
397
+ const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE")
396
398
  //const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
397
399
  const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
398
400
  const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
401
+ const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node);
399
402
 
400
403
  if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
401
404
  node.members.push(SERIALIZE_RAW_METHOD);
@@ -403,6 +406,8 @@ class JSONTransform extends BaseVisitor {
403
406
  node.members.push(INITIALIZE_METHOD);
404
407
  if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
405
408
  node.members.push(DESERIALIZE_METHOD);
409
+ if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE"))
410
+ node.members.push(DESERIALIZE_SAFE_METHOD);
406
411
 
407
412
  this.schemasList.push(schema);
408
413
  }
@@ -486,7 +491,7 @@ class Property {
486
491
  private right_s: string = "";
487
492
  private right_d: string = "";
488
493
 
489
- public generate(): void {
494
+ public generate(safe: boolean): void {
490
495
  const name = this.name;
491
496
  const escapedName = escapeString(JSON.stringify(this.alias || this.name));
492
497
  const type = this.type;
@@ -503,7 +508,7 @@ class Property {
503
508
  } else {
504
509
  this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")";
505
510
  this.right_d =
506
- "__DESERIALIZE<" + type + ">(data.substring(value_start, value_end))";
511
+ (safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
507
512
  }
508
513
 
509
514
  if (this.flags.has(PropertyFlags.OmitIf)) {
@@ -1,30 +1,10 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "ESNext",
4
- "module": "ESNext",
5
- "downlevelIteration": true,
6
- "outDir": "./lib/",
7
-
8
- "strict": true,
9
- "noImplicitAny": true,
10
- "strictNullChecks": true,
11
- "strictFunctionTypes": true,
12
- "strictBindCallApply": true,
13
- "strictPropertyInitialization": true,
14
- "noImplicitThis": true,
15
- "alwaysStrict": true,
16
-
17
- "noUnusedLocals": true,
18
- "noUnusedParameters": false,
19
- "noImplicitReturns": true,
20
- "noFallthroughCasesInSwitch": true,
21
- "noUncheckedIndexedAccess": true,
22
- "noPropertyAccessFromIndexSignature": true,
23
-
24
- "moduleResolution": "node",
25
- "esModuleInterop": false,
26
-
27
- "skipLibCheck": false,
28
- "forceConsistentCasingInFileNames": true
3
+ "target": "ES2022",
4
+ "module": "ES2020",
5
+ "moduleResolution": "Node",
6
+ "removeComments": true,
7
+ "outDir": "./lib",
8
+ "sourceMap": true
29
9
  }
30
10
  }
@@ -1,14 +0,0 @@
1
- // import { bs } from "../custom/bs";
2
- // import { serializeBool, serializeBool_BS } from "../serialize/bool"
3
-
4
- // const out = memory.data(65536);
5
-
6
- // bench("Serialize Bool", () => {
7
- // blackbox<string>(serializeBool(true));
8
- // });
9
-
10
- // bench("Serialize Bool BS", () => {
11
- // serializeBool_BS(true);
12
- // bs._out(out);
13
- // bs.reset();
14
- // });
@@ -1,36 +0,0 @@
1
- // function esc_128(data: string): bool {
2
- // let len = data.length;
3
-
4
- // let running = v128.splat<i64>(0);
5
- // let i = 0;
6
-
7
- // while (i + 15 < len) {
8
- // let w = v128.load(changetype<usize>(data));
9
- // running = v128.or(running, v128.eq<i16>(w, i16x8.splat(34)));
10
- // running = v128.or(running, v128.eq<i16>(w, i16x8.splat(92)));
11
-
12
- // const subtracted = v128.sub<i16>(w, i8x16.splat(31));
13
- // running = v128.or(running, v128.eq<i16>(subtracted, v128.splat<i64>(0)));
14
- // i += 16;
15
- // }
16
-
17
- // return v128.any_true(running);
18
- // }
19
-
20
- // function esc_16(data: string): bool {
21
- // let len = data.length;
22
- // let b: u16 = 0;
23
- // while (len--) {
24
- // const c = load<u16>(changetype<usize>(data) + (len << 1));
25
- // b |= u16(c < 32) | u16(c == 34) | u16(c == 92);
26
- // }
27
- // return bool(b);
28
- // }
29
-
30
- // bench("needs escaping 128", () => {
31
- // blackbox<bool>(esc_128("hel\"o !!"));
32
- // })
33
-
34
- // bench("needs escaping 16", () => {
35
- // blackbox<bool>(esc_16("hel\"o !!"));
36
- // })
@@ -1,16 +0,0 @@
1
-
2
- bench("UTF-16 to UTF-8", () => {
3
- blackbox<ArrayBuffer>(String.UTF8.encode(blackbox<string>("hello world")));
4
- });
5
- // bench("Serialize String Native", () => {
6
- // blackbox<string>(serializeString("hello \"world abc"));
7
- // });
8
-
9
- // bench("Serialize String Sink", () => {
10
- // serializeString_BS("hello \"world abc");
11
- // bs.reset();
12
- // });
13
-
14
- // bench("Serialize String SIMD", () => {
15
- // serialize_simd_v1("hello \"world abc", out);
16
- // })
File without changes