json-as 1.1.8 → 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.
@@ -10,27 +10,22 @@ 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
14
 
15
15
  class CustomTransform extends Visitor {
16
16
  static SN: CustomTransform = new CustomTransform();
17
17
 
18
18
  private modify: boolean = false;
19
19
  visitCallExpression(node: CallExpression) {
20
-
21
20
  super.visit(node.args, node);
22
21
  if (node.expression.kind != NodeKind.PropertyAccess || (node.expression as PropertyAccessExpression).property.text != "stringify") return;
23
22
  if ((node.expression as PropertyAccessExpression).expression.kind != NodeKind.Identifier || ((node.expression as PropertyAccessExpression).expression as IdentifierExpression).text != "JSON") return;
24
23
 
25
24
  if (this.modify) {
26
- (node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(
27
- Node.createIdentifierExpression("JSON", node.expression.range),
28
- Node.createIdentifierExpression("internal", node.expression.range),
29
- node.expression.range
30
- );
25
+ (node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(Node.createIdentifierExpression("JSON", node.expression.range), Node.createIdentifierExpression("internal", node.expression.range), node.expression.range);
31
26
  }
32
27
  this.modify = true;
33
-
28
+
34
29
  // console.log(toString(node));
35
30
  // console.log(SimpleParser.parseStatement("JSON.internal.stringify").expression.expression)
36
31
  }
@@ -98,7 +93,7 @@ class JSONTransform extends Visitor {
98
93
  this.schema.custom = true;
99
94
  const serializer = serializers[0];
100
95
  const hasCall = CustomTransform.hasCall(serializer);
101
-
96
+
102
97
  CustomTransform.visit(serializer);
103
98
 
104
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);
@@ -375,7 +370,7 @@ class JSONTransform extends Visitor {
375
370
  DESERIALIZE += indent + " let keyStart: usize = 0;\n";
376
371
  DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
377
372
  DESERIALIZE += indent + " let isKey = false;\n";
378
- 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";
379
374
  DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
380
375
 
381
376
  DESERIALIZE += indent + " while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;\n";
@@ -425,12 +420,12 @@ class JSONTransform extends Visitor {
425
420
  }
426
421
 
427
422
  return [...groups.values()]
428
- .map(group =>
423
+ .map((group) =>
429
424
  group.sort((a, b) => {
430
425
  const aLen = (a.alias || a.name).length;
431
426
  const bLen = (b.alias || b.name).length;
432
427
  return aLen - bLen;
433
- })
428
+ }),
434
429
  )
435
430
  .sort((a, b) => b.length - a.length);
436
431
  };
@@ -471,21 +466,40 @@ class JSONTransform extends Visitor {
471
466
  // });
472
467
  // };
473
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
+ }
474
489
 
475
- const generateGroups = (members: Property[], cb: (group: Property[]) => void, nil: boolean = false) => {
476
- const groups = groupMembers(members);
477
- DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
478
-
479
- for (const group of groups) {
480
- const groupLen = (group[0].alias || group[0].name).length << 1
481
- DESERIALIZE += " case " + groupLen + ": {\n";
482
- cb(group);
483
- DESERIALIZE += "\n }\n";
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";
484
501
  }
485
-
486
- DESERIALIZE += " }\n";
487
- if (!members[0].node.type.isNullable && !isBoolean(members[0].type)) DESERIALIZE += " break;\n";
488
- }
502
+ };
489
503
 
490
504
  const generateComparisions = (members: Property[]) => {
491
505
  if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
@@ -528,13 +542,20 @@ class JSONTransform extends Visitor {
528
542
 
529
543
  if (STRICT) {
530
544
  DESERIALIZE += " else {\n";
531
- 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";
532
553
  DESERIALIZE += indent + " }\n";
533
554
  }
534
555
  };
535
556
 
536
557
  let mbElse = " ";
537
- if (sortedMembers.string.length) {
558
+ if (!STRICT || sortedMembers.string.length) {
538
559
  // generateGroups(sortedMembers.string, generateComparisions)
539
560
  DESERIALIZE += mbElse + "if (code == 34) {\n";
540
561
  DESERIALIZE += " lastIndex = srcStart;\n";
@@ -543,7 +564,7 @@ class JSONTransform extends Visitor {
543
564
  DESERIALIZE += " const code = load<u16>(srcStart);\n";
544
565
  DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
545
566
  // DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
546
- generateGroups(sortedMembers.string, generateComparisions);
567
+ generateGroups(sortedMembers.string, generateComparisions, "string");
547
568
  DESERIALIZE += " }\n"; // Close break char check
548
569
  DESERIALIZE += " srcStart += 2;\n";
549
570
  DESERIALIZE += " }\n"; // Close char scan loop
@@ -551,7 +572,7 @@ class JSONTransform extends Visitor {
551
572
  mbElse = " else ";
552
573
  }
553
574
 
554
- if (sortedMembers.number.length) {
575
+ if (!STRICT || sortedMembers.number.length) {
555
576
  DESERIALIZE += mbElse + "if (code - 48 <= 9 || code == 45) {\n";
556
577
  DESERIALIZE += " lastIndex = srcStart;\n";
557
578
  DESERIALIZE += " srcStart += 2;\n";
@@ -560,7 +581,7 @@ class JSONTransform extends Visitor {
560
581
  DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
561
582
  // DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
562
583
 
563
- generateGroups(sortedMembers.number, generateComparisions);
584
+ generateGroups(sortedMembers.number, generateComparisions, "number");
564
585
  DESERIALIZE += " }\n"; // Close break char check
565
586
  DESERIALIZE += " srcStart += 2;\n";
566
587
  DESERIALIZE += " }\n"; // Close char scan loop
@@ -568,7 +589,7 @@ class JSONTransform extends Visitor {
568
589
  mbElse = " else ";
569
590
  }
570
591
 
571
- if (sortedMembers.object.length) {
592
+ if (!STRICT || sortedMembers.object.length) {
572
593
  DESERIALIZE += mbElse + "if (code == 123) {\n";
573
594
  DESERIALIZE += " lastIndex = srcStart;\n";
574
595
  DESERIALIZE += " depth++;\n";
@@ -583,7 +604,7 @@ class JSONTransform extends Visitor {
583
604
  DESERIALIZE += " srcStart += 2;\n";
584
605
 
585
606
  indent = " ";
586
- generateGroups(sortedMembers.object, generateComparisions);
607
+ generateGroups(sortedMembers.object, generateComparisions, "object");
587
608
  indent = "";
588
609
 
589
610
  DESERIALIZE += " }\n"; // Close break char check
@@ -593,7 +614,7 @@ class JSONTransform extends Visitor {
593
614
  DESERIALIZE += " }"; // Close first char check
594
615
  mbElse = " else ";
595
616
  }
596
- if (sortedMembers.array.length) {
617
+ if (!STRICT || sortedMembers.array.length) {
597
618
  DESERIALIZE += mbElse + "if (code == 91) {\n";
598
619
  DESERIALIZE += " lastIndex = srcStart;\n";
599
620
  DESERIALIZE += " depth++;\n";
@@ -609,7 +630,7 @@ class JSONTransform extends Visitor {
609
630
  // DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
610
631
 
611
632
  indent = " ";
612
- generateGroups(sortedMembers.array, generateComparisions);
633
+ generateGroups(sortedMembers.array, generateComparisions, "array");
613
634
  indent = "";
614
635
 
615
636
  DESERIALIZE += " }\n"; // Close break char check
@@ -620,152 +641,197 @@ class JSONTransform extends Visitor {
620
641
  mbElse = " else ";
621
642
  }
622
643
 
623
- if (sortedMembers.boolean.length) {
644
+ if (!STRICT || sortedMembers.boolean.length) {
645
+ // TRUE
624
646
  DESERIALIZE += mbElse + "if (code == 116) {\n";
647
+
625
648
  DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
626
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
+ }
627
668
 
628
- generateGroups(sortedMembers.boolean, (group) => {
629
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
630
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
631
- }
632
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
633
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
634
- }
635
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
636
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
637
- }
638
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
639
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
640
- }
641
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
642
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
643
- }
644
- const firstMemberName = group[0].alias || group[0].name;
645
-
646
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
647
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
648
- DESERIALIZE += indent + " srcStart += 2;\n";
649
- DESERIALIZE += indent + " keyStart = 0;\n";
650
- DESERIALIZE += indent + " break;\n";
651
- DESERIALIZE += indent + " }";
652
-
653
- for (let i = 1; i < group.length; i++) {
654
- const member = group[i];
655
- const memberName = member.alias || member.name;
656
- DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
657
- 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";
658
672
  DESERIALIZE += indent + " srcStart += 2;\n";
659
673
  DESERIALIZE += indent + " keyStart = 0;\n";
660
674
  DESERIALIZE += indent + " break;\n";
661
675
  DESERIALIZE += indent + " }";
662
- }
663
676
 
664
- if (STRICT) {
665
- DESERIALIZE += " else {\n";
666
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
667
- DESERIALIZE += indent + " }\n";
668
- }
669
- });
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
+ );
670
702
 
671
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
+
672
709
  mbElse = " else ";
673
- 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";
674
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
+ }
675
734
 
676
- generateGroups(sortedMembers.boolean, (group) => {
677
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
678
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
679
- }
680
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
681
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
682
- }
683
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
684
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
685
- }
686
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
687
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
688
- }
689
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
690
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
691
- }
692
- const firstMemberName = group[0].alias || group[0].name;
693
-
694
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
695
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
696
- DESERIALIZE += indent + " srcStart += 2;\n";
697
- DESERIALIZE += indent + " keyStart = 0;\n";
698
- DESERIALIZE += indent + " break;\n";
699
- DESERIALIZE += indent + " }";
700
-
701
- for (let i = 1; i < group.length; i++) {
702
- const member = group[i];
703
- const memberName = member.alias || member.name;
704
- DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
705
- 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";
706
738
  DESERIALIZE += indent + " srcStart += 2;\n";
707
739
  DESERIALIZE += indent + " keyStart = 0;\n";
708
740
  DESERIALIZE += indent + " break;\n";
709
741
  DESERIALIZE += indent + " }";
710
- }
711
742
 
712
- if (STRICT) {
713
- DESERIALIZE += " else {\n";
714
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
715
- DESERIALIZE += indent + " }\n";
716
- }
717
- });
718
- DESERIALIZE += " }\n"; // Close first char check
719
- 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 ";
720
776
  }
721
777
 
722
- if (sortedMembers.null.length) {
778
+ if (!STRICT || sortedMembers.null.length) {
723
779
  DESERIALIZE += mbElse + "if (code == 110) {\n";
724
780
 
725
781
  DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
726
782
  DESERIALIZE += " srcStart += 8;\n";
727
- generateGroups(sortedMembers.null, (group) => {
728
- if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
729
- DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
730
- }
731
- if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
732
- DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
733
- }
734
- if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
735
- DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
736
- }
737
- if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
738
- DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
739
- }
740
- if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
741
- DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
742
- }
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
+ }
743
801
 
744
- const firstMemberName = group[0].alias || group[0].name;
745
- DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
746
- DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
747
- DESERIALIZE += indent + " srcStart += 2;\n";
748
- DESERIALIZE += indent + " keyStart = 0;\n";
749
- DESERIALIZE += indent + " break;\n";
750
- DESERIALIZE += indent + " }";
751
-
752
- for (let i = 1; i < group.length; i++) {
753
- const member = group[i];
754
- const memberName = member.alias || member.name;
755
- 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";
756
804
  DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
757
805
  DESERIALIZE += indent + " srcStart += 2;\n";
758
806
  DESERIALIZE += indent + " keyStart = 0;\n";
759
807
  DESERIALIZE += indent + " break;\n";
760
808
  DESERIALIZE += indent + " }";
761
- }
762
809
 
763
- if (STRICT) {
764
- DESERIALIZE += " else {\n";
765
- DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
766
- DESERIALIZE += indent + " }\n";
767
- }
768
- }, 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
+ );
769
835
 
770
836
  DESERIALIZE += " }"; // Close first char check
771
837
  DESERIALIZE += "\n }"; // Close first char check
@@ -775,6 +841,7 @@ class JSONTransform extends Visitor {
775
841
 
776
842
  DESERIALIZE += " else {\n";
777
843
  DESERIALIZE += " srcStart += 2;\n";
844
+ DESERIALIZE += " keyStart = 0;\n";
778
845
  DESERIALIZE += "}\n";
779
846
  DESERIALIZE += "\n }\n"; // Close value portion
780
847
 
@@ -1188,4 +1255,4 @@ function getComparision(data: string) {
1188
1255
  return toMemCCheck(data);
1189
1256
  }
1190
1257
  }
1191
- }
1258
+ }
@@ -4,7 +4,7 @@ export enum PropertyFlags {
4
4
  OmitNull,
5
5
  OmitIf,
6
6
  Raw,
7
- Custom
7
+ Custom,
8
8
  }
9
9
 
10
10
  export class Property {
@@ -55,11 +55,7 @@ export function toString(node: Node): string {
55
55
  return ASTBuilder.build(node);
56
56
  }
57
57
 
58
- export function replaceRef(
59
- node: Node,
60
- replacement: Node | Node[],
61
- ref: Node | Node[] | null,
62
- ): void {
58
+ export function replaceRef(node: Node, replacement: Node | Node[], ref: Node | Node[] | null): void {
63
59
  if (!node || !ref) return;
64
60
  const nodeExpr = stripExpr(node);
65
61
 
@@ -77,8 +73,7 @@ export function replaceRef(
77
73
  if (Array.isArray(current)) {
78
74
  for (let i = 0; i < current.length; i++) {
79
75
  if (stripExpr(current[i]) === nodeExpr) {
80
- if (Array.isArray(replacement))
81
- current.splice(i, 1, ...replacement);
76
+ if (Array.isArray(replacement)) current.splice(i, 1, ...replacement);
82
77
  else current.splice(i, 1, replacement);
83
78
  return;
84
79
  }
@@ -91,17 +86,11 @@ export function replaceRef(
91
86
  }
92
87
  }
93
88
 
94
- export function cloneNode(
95
- input: Node | Node[] | null,
96
- seen = new WeakMap(),
97
- path = "",
98
- ): Node | Node[] | null {
89
+ export function cloneNode(input: Node | Node[] | null, seen = new WeakMap(), path = ""): Node | Node[] | null {
99
90
  if (input === null || typeof input !== "object") return input;
100
91
 
101
92
  if (Array.isArray(input)) {
102
- return input.map((item, index) =>
103
- cloneNode(item, seen, `${path}[${index}]`),
104
- ) as Node | Node[] | null;
93
+ return input.map((item, index) => cloneNode(item, seen, `${path}[${index}]`)) as Node | Node[] | null;
105
94
  }
106
95
 
107
96
  if (seen.has(input)) return seen.get(input);
@@ -130,4 +119,4 @@ export function stripExpr(node: Node): Node {
130
119
  if (!node) return node;
131
120
  if (node.kind == NodeKind.Expression) return node["expression"];
132
121
  return node;
133
- }
122
+ }