json-as 1.1.7 → 1.1.9

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.
@@ -1,7 +1,7 @@
1
- import { ClassDeclaration, FieldDeclaration, IdentifierExpression, Parser, Source, NodeKind, CommonFlags, ImportStatement, Node, Tokenizer, SourceKind, NamedTypeNode, Range, FEATURE_SIMD, FunctionExpression, MethodDeclaration, Statement, Program, Feature } from "assemblyscript/dist/assemblyscript.js";
1
+ import { ClassDeclaration, FieldDeclaration, IdentifierExpression, Parser, Source, NodeKind, CommonFlags, ImportStatement, Node, Tokenizer, SourceKind, NamedTypeNode, Range, FEATURE_SIMD, FunctionExpression, MethodDeclaration, Statement, Program, Feature, CallExpression, PropertyAccessExpression } from "assemblyscript/dist/assemblyscript.js";
2
2
  import { Transform } from "assemblyscript/dist/transform.js";
3
3
  import { Visitor } from "./visitor.js";
4
- import { isStdlib, SimpleParser, toString } from "./util.js";
4
+ import { cloneNode, isStdlib, replaceRef, SimpleParser, toString } from "./util.js";
5
5
  import * as path from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  import { Property, PropertyFlags, Schema } from "./types.js";
@@ -10,7 +10,38 @@ import { getClasses, getImportedClass } from "./linker.js";
10
10
  let indent = " ";
11
11
 
12
12
  const DEBUG = process.env["JSON_DEBUG"];
13
- const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false");
13
+ const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "true";
14
+
15
+ class CustomTransform extends Visitor {
16
+ static SN: CustomTransform = new CustomTransform();
17
+
18
+ private modify: boolean = false;
19
+ visitCallExpression(node: CallExpression) {
20
+ super.visit(node.args, node);
21
+ if (node.expression.kind != NodeKind.PropertyAccess || (node.expression as PropertyAccessExpression).property.text != "stringify") return;
22
+ if ((node.expression as PropertyAccessExpression).expression.kind != NodeKind.Identifier || ((node.expression as PropertyAccessExpression).expression as IdentifierExpression).text != "JSON") return;
23
+
24
+ if (this.modify) {
25
+ (node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(Node.createIdentifierExpression("JSON", node.expression.range), Node.createIdentifierExpression("internal", node.expression.range), node.expression.range);
26
+ }
27
+ this.modify = true;
28
+
29
+ // console.log(toString(node));
30
+ // console.log(SimpleParser.parseStatement("JSON.internal.stringify").expression.expression)
31
+ }
32
+ static visit(node: Node | Node[], ref: Node | null = null): void {
33
+ if (!node) return;
34
+ CustomTransform.SN.modify = true;
35
+ CustomTransform.SN.visit(node, ref);
36
+ CustomTransform.SN.modify = false;
37
+ }
38
+ static hasCall(node: Node | Node[]): boolean {
39
+ if (!node) return;
40
+ CustomTransform.SN.modify = false;
41
+ CustomTransform.SN.visit(node);
42
+ return CustomTransform.SN.modify;
43
+ }
44
+ }
14
45
 
15
46
  class JSONTransform extends Visitor {
16
47
  static SN: JSONTransform = new JSONTransform();
@@ -61,6 +92,10 @@ class JSONTransform extends Visitor {
61
92
  if (serializers.length) {
62
93
  this.schema.custom = true;
63
94
  const serializer = serializers[0];
95
+ const hasCall = CustomTransform.hasCall(serializer);
96
+
97
+ CustomTransform.visit(serializer);
98
+
64
99
  // if (!serializer.signature.parameters.length) throwError("Could not find any parameters in custom serializer for " + this.schema.name + ". Serializers must have one parameter like 'serializer(self: " + this.schema.name + "): string {}'", serializer.range);
65
100
  if (serializer.signature.parameters.length > 1) throwError("Found too many parameters in custom serializer for " + this.schema.name + ", but serializers can only accept one parameter of type '" + this.schema.name + "'!", serializer.signature.parameters[1].range);
66
101
  if (serializer.signature.parameters.length > 0 && (<NamedTypeNode>serializer.signature.parameters[0].type).name.identifier.text != node.name.text && (<NamedTypeNode>serializer.signature.parameters[0].type).name.identifier.text != "this") throwError("Type of parameter for custom serializer does not match! It should be 'string'either be 'this' or '" + this.schema.name + "'", serializer.signature.parameters[0].type.range);
@@ -71,6 +106,7 @@ class JSONTransform extends Visitor {
71
106
  }
72
107
  SERIALIZE_CUSTOM += " __SERIALIZE(ptr: usize): void {\n";
73
108
  SERIALIZE_CUSTOM += " const data = this." + serializer.name.text + "(" + (serializer.signature.parameters.length ? "this" : "") + ");\n";
109
+ if (hasCall) SERIALIZE_CUSTOM += " bs.resetState();\n";
74
110
  SERIALIZE_CUSTOM += " const dataSize = data.length << 1;\n";
75
111
  SERIALIZE_CUSTOM += " memory.copy(bs.offset, changetype<usize>(data), dataSize);\n";
76
112
  SERIALIZE_CUSTOM += " bs.offset += dataSize;\n";
@@ -199,13 +235,18 @@ class JSONTransform extends Visitor {
199
235
  }
200
236
 
201
237
  for (const member of this.schema.members) {
202
- const nonNullType = member.type.replace(" | null", "");
203
- if (!isPrimitive(nonNullType)) {
204
- const schema = this.schemas.find((v) => v.name == nonNullType);
205
- if (schema && !this.schema.deps.includes(schema)) {
238
+ if (isStruct(member.type)) {
239
+ const schema = this.schemas.find((v) => v.name == stripNull(member.type));
240
+ if (!schema) continue;
241
+
242
+ if (!this.schema.deps.includes(schema)) {
206
243
  this.schema.deps.push(schema);
207
244
  this.schema.byteSize += schema.byteSize;
208
245
  }
246
+
247
+ // if (schema.custom) {
248
+ // member.flags.set(PropertyFlags.Custom, null);
249
+ // }
209
250
  }
210
251
  }
211
252
 
@@ -329,7 +370,7 @@ class JSONTransform extends Visitor {
329
370
  DESERIALIZE += indent + " let keyStart: usize = 0;\n";
330
371
  DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
331
372
  DESERIALIZE += indent + " let isKey = false;\n";
332
- if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
373
+ if (!STRICT || sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
333
374
  DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
334
375
 
335
376
  DESERIALIZE += indent + " while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;\n";
@@ -360,6 +401,11 @@ class JSONTransform extends Visitor {
360
401
  // if (shouldGroup) DESERIALIZE += " const keySize = keyEnd - keyStart;\n";
361
402
 
362
403
  const groupMembers = (members: Property[]): Property[][] => {
404
+ // const customMembers = this.schema.members.filter((m) => m.flags.has(PropertyFlags.Custom));
405
+ // console.log("Custom members: ", customMembers.map((m) => m.name));
406
+
407
+ // members.push(...customMembers)
408
+
363
409
  const groups = new Map<number, Property[]>();
364
410
 
365
411
  for (const member of members) {
@@ -374,30 +420,86 @@ class JSONTransform extends Visitor {
374
420
  }
375
421
 
376
422
  return [...groups.values()]
377
- .map(group =>
423
+ .map((group) =>
378
424
  group.sort((a, b) => {
379
425
  const aLen = (a.alias || a.name).length;
380
426
  const bLen = (b.alias || b.name).length;
381
427
  return aLen - bLen;
382
- })
428
+ }),
383
429
  )
384
430
  .sort((a, b) => b.length - a.length);
385
431
  };
386
432
 
387
- const generateGroups = (members: Property[], cb: (group: Property[]) => void, nil: boolean = false) => {
388
- const groups = groupMembers(members);
389
- DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
433
+ // const groupMembers = (members: Property[]): Property[][] => {
434
+ // const customMembers = this.schema.members.filter((m) =>
435
+ // m.flags.has(PropertyFlags.Custom)
436
+ // );
437
+ // console.log("Custom members: ", customMembers.map((m) => m.name));
390
438
 
391
- for (const group of groups) {
392
- const groupLen = (group[0].alias || group[0].name).length << 1
393
- DESERIALIZE += " case " + groupLen + ": {\n";
394
- cb(group);
395
- DESERIALIZE += "\n }\n";
396
- }
439
+ // const customSet = new Set(customMembers);
440
+ // members = members.filter((m) => !customSet.has(m));
441
+ // members.push(...customMembers);
397
442
 
398
- DESERIALIZE += " }\n";
399
- if (!members[0].node.type.isNullable && !isBoolean(members[0].type)) DESERIALIZE += " break;\n";
400
- }
443
+ // const groups = new Map<number, Property[]>();
444
+
445
+ // for (const member of members) {
446
+ // const name = member.alias || member.name;
447
+ // const length = name.length;
448
+
449
+ // if (!groups.has(length)) {
450
+ // groups.set(length, []);
451
+ // }
452
+
453
+ // groups.get(length)!.push(member);
454
+ // }
455
+
456
+ // return [...groups.entries()]
457
+ // .sort(([a], [b]) => a - b)
458
+ // .map(([_, group]) => {
459
+ // const regulars = group.filter((m) => !customSet.has(m));
460
+ // const customs = group.filter((m) => customSet.has(m));
461
+
462
+ // const sortByLength = (a: Property, b: Property) =>
463
+ // (a.alias || a.name).length - (b.alias || b.name).length;
464
+
465
+ // return [...regulars.sort(sortByLength), ...customs.sort(sortByLength)];
466
+ // });
467
+ // };
468
+
469
+ const generateGroups = (members: Property[], cb: (group: Property[]) => void, type: "string" | "array" | "object" | "number" | "boolean" | "null") => {
470
+ if (!members.length) {
471
+ if (STRICT) {
472
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
473
+ } else {
474
+ if (type == "string") DESERIALIZE += indent + " srcStart += 4;\n";
475
+ else DESERIALIZE += indent + " srcStart += 2;\n";
476
+ DESERIALIZE += indent + " keyStart = 0;\n";
477
+ if (type != "boolean" && type != "null") DESERIALIZE += indent + " break;\n";
478
+ }
479
+ } else {
480
+ const groups = groupMembers(members);
481
+ DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
482
+
483
+ for (const group of groups) {
484
+ const groupLen = (group[0].alias || group[0].name).length << 1;
485
+ DESERIALIZE += " case " + groupLen + ": {\n";
486
+ cb(group);
487
+ DESERIALIZE += "\n }\n";
488
+ }
489
+
490
+ DESERIALIZE += " default: {\n";
491
+ if (STRICT) {
492
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
493
+ } else {
494
+ if (type == "string") DESERIALIZE += indent + " srcStart += 4;\n";
495
+ else DESERIALIZE += indent + " srcStart += 2;\n";
496
+ DESERIALIZE += indent + " keyStart = 0;\n";
497
+ }
498
+ DESERIALIZE += " }\n";
499
+ DESERIALIZE += " }\n";
500
+ if (!members[0].node.type.isNullable && !isBoolean(members[0].type)) DESERIALIZE += " break;\n";
501
+ }
502
+ };
401
503
 
402
504
  const generateComparisions = (members: Property[]) => {
403
505
  if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
@@ -440,13 +542,20 @@ class JSONTransform extends Visitor {
440
542
 
441
543
  if (STRICT) {
442
544
  DESERIALIZE += " else {\n";
443
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
545
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
546
+ DESERIALIZE += indent + " }\n";
547
+ } else {
548
+ DESERIALIZE += " else {\n";
549
+ if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";
550
+ else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
551
+ DESERIALIZE += indent + " keyStart = 0;\n";
552
+ DESERIALIZE += indent + " break;\n";
444
553
  DESERIALIZE += indent + " }\n";
445
554
  }
446
555
  };
447
556
 
448
557
  let mbElse = " ";
449
- if (sortedMembers.string.length) {
558
+ if (!STRICT || sortedMembers.string.length) {
450
559
  // generateGroups(sortedMembers.string, generateComparisions)
451
560
  DESERIALIZE += mbElse + "if (code == 34) {\n";
452
561
  DESERIALIZE += " lastIndex = srcStart;\n";
@@ -455,7 +564,7 @@ class JSONTransform extends Visitor {
455
564
  DESERIALIZE += " const code = load<u16>(srcStart);\n";
456
565
  DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
457
566
  // DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
458
- generateGroups(sortedMembers.string, generateComparisions);
567
+ generateGroups(sortedMembers.string, generateComparisions, "string");
459
568
  DESERIALIZE += " }\n"; // Close break char check
460
569
  DESERIALIZE += " srcStart += 2;\n";
461
570
  DESERIALIZE += " }\n"; // Close char scan loop
@@ -463,7 +572,7 @@ class JSONTransform extends Visitor {
463
572
  mbElse = " else ";
464
573
  }
465
574
 
466
- if (sortedMembers.number.length) {
575
+ if (!STRICT || sortedMembers.number.length) {
467
576
  DESERIALIZE += mbElse + "if (code - 48 <= 9 || code == 45) {\n";
468
577
  DESERIALIZE += " lastIndex = srcStart;\n";
469
578
  DESERIALIZE += " srcStart += 2;\n";
@@ -472,7 +581,7 @@ class JSONTransform extends Visitor {
472
581
  DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
473
582
  // DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
474
583
 
475
- generateGroups(sortedMembers.number, generateComparisions);
584
+ generateGroups(sortedMembers.number, generateComparisions, "number");
476
585
  DESERIALIZE += " }\n"; // Close break char check
477
586
  DESERIALIZE += " srcStart += 2;\n";
478
587
  DESERIALIZE += " }\n"; // Close char scan loop
@@ -480,7 +589,7 @@ class JSONTransform extends Visitor {
480
589
  mbElse = " else ";
481
590
  }
482
591
 
483
- if (sortedMembers.object.length) {
592
+ if (!STRICT || sortedMembers.object.length) {
484
593
  DESERIALIZE += mbElse + "if (code == 123) {\n";
485
594
  DESERIALIZE += " lastIndex = srcStart;\n";
486
595
  DESERIALIZE += " depth++;\n";
@@ -495,7 +604,7 @@ class JSONTransform extends Visitor {
495
604
  DESERIALIZE += " srcStart += 2;\n";
496
605
 
497
606
  indent = " ";
498
- generateGroups(sortedMembers.object, generateComparisions);
607
+ generateGroups(sortedMembers.object, generateComparisions, "object");
499
608
  indent = "";
500
609
 
501
610
  DESERIALIZE += " }\n"; // Close break char check
@@ -505,7 +614,7 @@ class JSONTransform extends Visitor {
505
614
  DESERIALIZE += " }"; // Close first char check
506
615
  mbElse = " else ";
507
616
  }
508
- if (sortedMembers.array.length) {
617
+ if (!STRICT || sortedMembers.array.length) {
509
618
  DESERIALIZE += mbElse + "if (code == 91) {\n";
510
619
  DESERIALIZE += " lastIndex = srcStart;\n";
511
620
  DESERIALIZE += " depth++;\n";
@@ -521,7 +630,7 @@ class JSONTransform extends Visitor {
521
630
  // DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
522
631
 
523
632
  indent = " ";
524
- generateGroups(sortedMembers.array, generateComparisions);
633
+ generateGroups(sortedMembers.array, generateComparisions, "array");
525
634
  indent = "";
526
635
 
527
636
  DESERIALIZE += " }\n"; // Close break char check
@@ -532,152 +641,197 @@ class JSONTransform extends Visitor {
532
641
  mbElse = " else ";
533
642
  }
534
643
 
535
- if (sortedMembers.boolean.length) {
644
+ if (!STRICT || sortedMembers.boolean.length) {
645
+ // TRUE
536
646
  DESERIALIZE += mbElse + "if (code == 116) {\n";
647
+
537
648
  DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
538
649
  DESERIALIZE += " srcStart += 8;\n";
650
+ generateGroups(
651
+ sortedMembers.boolean,
652
+ (group) => {
653
+ if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
654
+ DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
655
+ }
656
+ if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
657
+ DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
658
+ }
659
+ if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
660
+ DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
661
+ }
662
+ if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
663
+ DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
664
+ }
665
+ if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
666
+ DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
667
+ }
539
668
 
540
- generateGroups(sortedMembers.boolean, (group) => {
541
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
542
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
543
- }
544
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
545
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
546
- }
547
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
548
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
549
- }
550
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
551
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
552
- }
553
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
554
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
555
- }
556
- const firstMemberName = group[0].alias || group[0].name;
557
-
558
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
559
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
560
- DESERIALIZE += indent + " srcStart += 2;\n";
561
- DESERIALIZE += indent + " keyStart = 0;\n";
562
- DESERIALIZE += indent + " break;\n";
563
- DESERIALIZE += indent + " }";
564
-
565
- for (let i = 1; i < group.length; i++) {
566
- const member = group[i];
567
- const memberName = member.alias || member.name;
568
- DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
569
- DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
669
+ const firstMemberName = group[0].alias || group[0].name;
670
+ DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
671
+ DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
570
672
  DESERIALIZE += indent + " srcStart += 2;\n";
571
673
  DESERIALIZE += indent + " keyStart = 0;\n";
572
674
  DESERIALIZE += indent + " break;\n";
573
675
  DESERIALIZE += indent + " }";
574
- }
575
676
 
576
- if (STRICT) {
577
- DESERIALIZE += " else {\n";
578
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
579
- DESERIALIZE += indent + " }\n";
580
- }
581
- });
677
+ for (let i = 1; i < group.length; i++) {
678
+ const member = group[i];
679
+ const memberName = member.alias || member.name;
680
+ DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
681
+ DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
682
+ DESERIALIZE += indent + " srcStart += 2;\n";
683
+ DESERIALIZE += indent + " keyStart = 0;\n";
684
+ DESERIALIZE += indent + " break;\n";
685
+ DESERIALIZE += indent + " }";
686
+ }
687
+
688
+ if (STRICT) {
689
+ DESERIALIZE += " else {\n";
690
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
691
+ DESERIALIZE += indent + " }\n";
692
+ } else {
693
+ DESERIALIZE += " else { \n";
694
+ DESERIALIZE += indent + " srcStart += 2;\n";
695
+ DESERIALIZE += indent + " keyStart = 0;\n";
696
+ DESERIALIZE += indent + " break;\n";
697
+ DESERIALIZE += indent + " }\n";
698
+ }
699
+ },
700
+ "boolean",
701
+ );
582
702
 
583
703
  DESERIALIZE += " }"; // Close first char check
704
+ DESERIALIZE += " else {\n";
705
+ DESERIALIZE += " throw new Error(\"Expected to find 'true' but found '\" + JSON.Util.ptrToStr(lastIndex, srcStart) + \"' instead at position \" + (srcEnd - srcStart).toString());\n";
706
+ DESERIALIZE += " }"; // Close error check
707
+ DESERIALIZE += "\n }"; // Close first char check
708
+
584
709
  mbElse = " else ";
585
- DESERIALIZE += " else if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
710
+
711
+ // FALSE
712
+ DESERIALIZE += mbElse + "if (code == 102) {\n";
713
+
714
+ DESERIALIZE += " if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
586
715
  DESERIALIZE += " srcStart += 10;\n";
716
+ generateGroups(
717
+ sortedMembers.boolean,
718
+ (group) => {
719
+ if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
720
+ DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
721
+ }
722
+ if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
723
+ DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
724
+ }
725
+ if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
726
+ DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
727
+ }
728
+ if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
729
+ DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
730
+ }
731
+ if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
732
+ DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
733
+ }
587
734
 
588
- generateGroups(sortedMembers.boolean, (group) => {
589
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
590
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
591
- }
592
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
593
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
594
- }
595
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
596
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
597
- }
598
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
599
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
600
- }
601
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
602
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
603
- }
604
- const firstMemberName = group[0].alias || group[0].name;
605
-
606
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
607
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
608
- DESERIALIZE += indent + " srcStart += 2;\n";
609
- DESERIALIZE += indent + " keyStart = 0;\n";
610
- DESERIALIZE += indent + " break;\n";
611
- DESERIALIZE += indent + " }";
612
-
613
- for (let i = 1; i < group.length; i++) {
614
- const member = group[i];
615
- const memberName = member.alias || member.name;
616
- DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
617
- DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
735
+ const firstMemberName = group[0].alias || group[0].name;
736
+ DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
737
+ DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
618
738
  DESERIALIZE += indent + " srcStart += 2;\n";
619
739
  DESERIALIZE += indent + " keyStart = 0;\n";
620
740
  DESERIALIZE += indent + " break;\n";
621
741
  DESERIALIZE += indent + " }";
622
- }
623
742
 
624
- if (STRICT) {
625
- DESERIALIZE += " else {\n";
626
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
627
- DESERIALIZE += indent + " }\n";
628
- }
629
- });
630
- DESERIALIZE += " }\n"; // Close first char check
631
- DESERIALIZE += " }"; // Close first char check
743
+ for (let i = 1; i < group.length; i++) {
744
+ const member = group[i];
745
+ const memberName = member.alias || member.name;
746
+ DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
747
+ DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
748
+ DESERIALIZE += indent + " srcStart += 2;\n";
749
+ DESERIALIZE += indent + " keyStart = 0;\n";
750
+ DESERIALIZE += indent + " break;\n";
751
+ DESERIALIZE += indent + " }";
752
+ }
753
+
754
+ if (STRICT) {
755
+ DESERIALIZE += " else {\n";
756
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
757
+ DESERIALIZE += indent + " }\n";
758
+ } else {
759
+ DESERIALIZE += " else { \n";
760
+ DESERIALIZE += indent + " srcStart += 2;\n";
761
+ DESERIALIZE += indent + " keyStart = 0;\n";
762
+ DESERIALIZE += indent + " break;\n";
763
+ DESERIALIZE += indent + " }\n";
764
+ }
765
+ },
766
+ "boolean",
767
+ );
768
+
769
+ DESERIALIZE += " }"; // Close first char check
770
+ DESERIALIZE += " else {\n";
771
+ DESERIALIZE += " throw new Error(\"Expected to find 'false' but found '\" + JSON.Util.ptrToStr(lastIndex, srcStart) + \"' instead at position \" + (srcEnd - srcStart).toString());\n";
772
+ DESERIALIZE += " }"; // Close error check
773
+ DESERIALIZE += "\n }"; // Close first char check
774
+
775
+ mbElse = " else ";
632
776
  }
633
777
 
634
- if (sortedMembers.null.length) {
778
+ if (!STRICT || sortedMembers.null.length) {
635
779
  DESERIALIZE += mbElse + "if (code == 110) {\n";
636
780
 
637
781
  DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
638
782
  DESERIALIZE += " srcStart += 8;\n";
639
- generateGroups(sortedMembers.null, (group) => {
640
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
641
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
642
- }
643
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
644
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
645
- }
646
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
647
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
648
- }
649
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
650
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
651
- }
652
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
653
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
654
- }
783
+ generateGroups(
784
+ sortedMembers.null,
785
+ (group) => {
786
+ if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
787
+ DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
788
+ }
789
+ if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
790
+ DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
791
+ }
792
+ if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
793
+ DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
794
+ }
795
+ if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
796
+ DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
797
+ }
798
+ if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
799
+ DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
800
+ }
655
801
 
656
- const firstMemberName = group[0].alias || group[0].name;
657
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
658
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
659
- DESERIALIZE += indent + " srcStart += 2;\n";
660
- DESERIALIZE += indent + " keyStart = 0;\n";
661
- DESERIALIZE += indent + " break;\n";
662
- DESERIALIZE += indent + " }";
663
-
664
- for (let i = 1; i < group.length; i++) {
665
- const member = group[i];
666
- const memberName = member.alias || member.name;
667
- DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
802
+ const firstMemberName = group[0].alias || group[0].name;
803
+ DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
668
804
  DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
669
805
  DESERIALIZE += indent + " srcStart += 2;\n";
670
806
  DESERIALIZE += indent + " keyStart = 0;\n";
671
807
  DESERIALIZE += indent + " break;\n";
672
808
  DESERIALIZE += indent + " }";
673
- }
674
809
 
675
- if (STRICT) {
676
- DESERIALIZE += " else {\n";
677
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
678
- DESERIALIZE += indent + " }\n";
679
- }
680
- }, true);
810
+ for (let i = 1; i < group.length; i++) {
811
+ const member = group[i];
812
+ const memberName = member.alias || member.name;
813
+ DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
814
+ DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
815
+ DESERIALIZE += indent + " srcStart += 2;\n";
816
+ DESERIALIZE += indent + " keyStart = 0;\n";
817
+ DESERIALIZE += indent + " break;\n";
818
+ DESERIALIZE += indent + " }";
819
+ }
820
+
821
+ if (STRICT) {
822
+ DESERIALIZE += " else {\n";
823
+ DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
824
+ DESERIALIZE += indent + " }\n";
825
+ } else {
826
+ DESERIALIZE += " else { \n";
827
+ DESERIALIZE += indent + " srcStart += 2;\n";
828
+ DESERIALIZE += indent + " keyStart = 0;\n";
829
+ DESERIALIZE += indent + " break;\n";
830
+ DESERIALIZE += indent + " }\n";
831
+ }
832
+ },
833
+ "null",
834
+ );
681
835
 
682
836
  DESERIALIZE += " }"; // Close first char check
683
837
  DESERIALIZE += "\n }"; // Close first char check
@@ -687,6 +841,7 @@ class JSONTransform extends Visitor {
687
841
 
688
842
  DESERIALIZE += " else {\n";
689
843
  DESERIALIZE += " srcStart += 2;\n";
844
+ DESERIALIZE += " keyStart = 0;\n";
690
845
  DESERIALIZE += "}\n";
691
846
  DESERIALIZE += "\n }\n"; // Close value portion
692
847
 
@@ -4,6 +4,7 @@ export enum PropertyFlags {
4
4
  OmitNull,
5
5
  OmitIf,
6
6
  Raw,
7
+ Custom,
7
8
  }
8
9
 
9
10
  export class Property {