json-as 1.3.4 → 1.3.5

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.
@@ -4,6 +4,7 @@ import { readFileSync, writeFileSync } from "fs";
4
4
  import * as path from "path";
5
5
  import { fileURLToPath } from "url";
6
6
  import { CustomTransform } from "./linkers/custom.js";
7
+ import { NodeKind } from "./types.js";
7
8
  import { Property, PropertyFlags, Schema, SourceSet } from "./types.js";
8
9
  import { isStdlib, removeExtension, SimpleParser, toString } from "./util.js";
9
10
  import { Visitor } from "./visitor.js";
@@ -75,9 +76,6 @@ function getSerializeCall(type, realName) {
75
76
  }
76
77
  return needsReferenceLoad(type) ? `JSON.__serialize<${type}>(changetype<${type}>(load<usize>(ptr, offsetof<this>(${JSON.stringify(realName)}))));\n` : `JSON.__serialize<${type}>(load<${type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
77
78
  }
78
- function isRawType(type) {
79
- return type == "JSON.Raw" || type == "Raw";
80
- }
81
79
  const CUSTOM_JSON_KINDS = new Set(["any", "string", "number", "object", "array", "boolean", "null", "any | null", "string | null", "number | null", "object | null", "array | null", "boolean | null"]);
82
80
  function parseCustomJsonKind(method, decoratorName) {
83
81
  const decorator = method.decorators?.find((v) => v.name.text.toLowerCase() == decoratorName);
@@ -86,7 +84,7 @@ function parseCustomJsonKind(method, decoratorName) {
86
84
  if (decorator.args.length > 1)
87
85
  throwError(`@${decoratorName} accepts at most one argument`, decorator.range);
88
86
  const arg = decorator.args[0];
89
- if (arg.kind != 16 || arg.literalKind != 2) {
87
+ if (arg.kind != NodeKind.Literal || arg.literalKind != 2) {
90
88
  throwError(`@${decoratorName} argument must be a string literal like @${decoratorName}("string")`, arg.range);
91
89
  }
92
90
  const kind = arg.value;
@@ -174,7 +172,7 @@ export class JSONTransform extends Visitor {
174
172
  if (isDecoratedBase)
175
173
  return;
176
174
  this.collectInheritedFieldMembers(baseDecl, baseSource, members, visited);
177
- const inheritedMembers = baseDecl.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"));
175
+ const inheritedMembers = baseDecl.members.filter((v) => v.kind === NodeKind.FieldDeclaration && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"));
178
176
  for (let i = inheritedMembers.length - 1; i >= 0; i--) {
179
177
  const inherited = inheritedMembers[i];
180
178
  if (!members.some((member) => member.name.text == inherited.name.text)) {
@@ -236,9 +234,9 @@ export class JSONTransform extends Visitor {
236
234
  return;
237
235
  if (!this.schemas.has(source.internalPath))
238
236
  this.schemas.set(source.internalPath, []);
239
- const members = [...node.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
240
- const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
241
- const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
237
+ const members = [...node.members.filter((v) => v.kind === NodeKind.FieldDeclaration && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
238
+ const serializers = [...node.members.filter((v) => v.kind === NodeKind.MethodDeclaration && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
239
+ const deserializers = [...node.members.filter((v) => v.kind === NodeKind.MethodDeclaration && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
242
240
  const schema = new Schema();
243
241
  schema.node = node;
244
242
  schema.name = source.getQualifiedName(node);
@@ -510,7 +508,7 @@ export class JSONTransform extends Visitor {
510
508
  switch (decoratorName) {
511
509
  case "alias": {
512
510
  const arg = decorator.args[0];
513
- if (!arg || (arg.kind != 16 && arg.literalKind != 2 && arg.literalKind != 1 && arg.literalKind != 0))
511
+ if (!arg || (arg.kind != NodeKind.Literal && arg.literalKind != 2 && arg.literalKind != 1 && arg.literalKind != 0))
514
512
  throwError("@alias must have an argument of type string or number", member.range);
515
513
  mem.alias = arg.value.toString();
516
514
  break;
@@ -637,7 +635,7 @@ export class JSONTransform extends Visitor {
637
635
  SERIALIZE += indent + `}\n`;
638
636
  }
639
637
  else if (member.flags.has(PropertyFlags.OmitIf)) {
640
- if (member.flags.get(PropertyFlags.OmitIf).kind == 14) {
638
+ if (member.flags.get(PropertyFlags.OmitIf).kind == NodeKind.Function) {
641
639
  const arg = member.flags.get(PropertyFlags.OmitIf);
642
640
  arg.declaration.signature.parameters[0].type = Node.createNamedType(Node.createSimpleTypeName("this", node.range), null, false, node.range);
643
641
  arg.declaration.signature.returnType.name = Node.createSimpleTypeName("boolean", arg.declaration.signature.returnType.name.range);
@@ -645,7 +643,7 @@ export class JSONTransform extends Visitor {
645
643
  }
646
644
  else {
647
645
  const expression = member.flags.get(PropertyFlags.OmitIf);
648
- const rendered = expression.kind == 16 && expression.literalKind == 2 ? JSON.stringify(expression.value).slice(1, -1) : toString(expression);
646
+ const rendered = expression.kind == NodeKind.Literal && expression.literalKind == 2 ? JSON.stringify(expression.value).slice(1, -1) : toString(expression);
649
647
  SERIALIZE += indent + `if (!(${rendered})) {\n`;
650
648
  }
651
649
  indentInc();
@@ -685,14 +683,8 @@ export class JSONTransform extends Visitor {
685
683
  sortedMembers.null.push(member);
686
684
  if (isString(type) || type == "Date")
687
685
  sortedMembers.string.push(member);
688
- else if (isRawType(type)) {
689
- sortedMembers.string.push(member);
690
- sortedMembers.number.push(member);
691
- sortedMembers.boolean.push(member);
692
- sortedMembers.null.push(member);
686
+ else if (type == "JSON.Raw")
693
687
  sortedMembers.object.push(member);
694
- sortedMembers.array.push(member);
695
- }
696
688
  else if (isBoolean(type) || type.startsWith("JSON.Box<bool"))
697
689
  sortedMembers.boolean.push(member);
698
690
  else if (isPrimitive(type) || type.startsWith("JSON.Box<") || isEnum(type, this.sources.get(this.schema.node.range.source), this.parser))
@@ -772,7 +764,7 @@ export class JSONTransform extends Visitor {
772
764
  out.push(` if (load<u16>(${valuePtr}) != 0x22) break;`);
773
765
  out.push(` let dateEnd = ${valuePtr} + 2;`);
774
766
  out.push(` while (dateEnd < srcEnd) {`);
775
- out.push(" if (load<u16>(dateEnd) == 0x22 && JSON.Util.isUnescapedQuote(dateEnd)) break;");
767
+ out.push(" if (load<u16>(dateEnd) == 0x22 && load<u16>(dateEnd - 2) != 0x5c) break;");
776
768
  out.push(" dateEnd += 2;");
777
769
  out.push(" }");
778
770
  out.push(" if (dateEnd >= srcEnd) break;");
@@ -817,7 +809,7 @@ export class JSONTransform extends Visitor {
817
809
  }
818
810
  out.push("}");
819
811
  }
820
- else if (isRawType(resolvedType)) {
812
+ else if (resolvedType == "JSON.Raw") {
821
813
  out.push("{");
822
814
  out.push(` const valueStart = ${srcPtr};`);
823
815
  out.push(" let depth: i32 = 0;");
@@ -825,7 +817,7 @@ export class JSONTransform extends Visitor {
825
817
  out.push(` while (${srcPtr} < srcEnd) {`);
826
818
  out.push(` const code = load<u16>(${srcPtr});`);
827
819
  out.push(" if (inString) {");
828
- out.push(` if (code == 0x22 && JSON.Util.isUnescapedQuote(${srcPtr})) inString = false;`);
820
+ out.push(` if (code == 0x22 && load<u16>(${srcPtr} - 2) != 0x5c) inString = false;`);
829
821
  out.push(` ${srcPtr} += 2;`);
830
822
  out.push(" continue;");
831
823
  out.push(" }");
@@ -1190,7 +1182,7 @@ export class JSONTransform extends Visitor {
1190
1182
  DESERIALIZE += indent + " let code = load<u16>(srcStart);\n";
1191
1183
  DESERIALIZE += indent + " while (JSON.Util.isSpace(code)) code = load<u16>(srcStart += 2);\n";
1192
1184
  DESERIALIZE += indent + " if (keyStart == 0) {\n";
1193
- DESERIALIZE += indent + " if (code == 34 && JSON.Util.isUnescapedQuote(srcStart)) {\n";
1185
+ DESERIALIZE += indent + " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
1194
1186
  DESERIALIZE += indent + " if (isKey) {\n";
1195
1187
  DESERIALIZE += indent + " keyStart = lastIndex;\n";
1196
1188
  DESERIALIZE += indent + " keyEnd = srcStart;\n";
@@ -1295,7 +1287,7 @@ export class JSONTransform extends Visitor {
1295
1287
  DESERIALIZE += " srcStart += 2;\n";
1296
1288
  DESERIALIZE += " while (srcStart < srcEnd) {\n";
1297
1289
  DESERIALIZE += " const code = load<u16>(srcStart);\n";
1298
- DESERIALIZE += " if (code == 34 && JSON.Util.isUnescapedQuote(srcStart)) {\n";
1290
+ DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
1299
1291
  if (DEBUG > 1)
1300
1292
  DESERIALIZE += ' console.log("Value (string, ' + ++id + '): " + JSON.Util.ptrToStr(lastIndex, srcStart + 2));';
1301
1293
  generateGroups(sortedMembers.string, (group) => {
@@ -1394,7 +1386,7 @@ export class JSONTransform extends Visitor {
1394
1386
  DESERIALIZE += " const code = load<u16>(srcStart);\n";
1395
1387
  DESERIALIZE += " if (code == 34) {\n";
1396
1388
  DESERIALIZE += " srcStart += 2;\n";
1397
- DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && JSON.Util.isUnescapedQuote(srcStart))) srcStart += 2;\n";
1389
+ DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;\n";
1398
1390
  DESERIALIZE += " } else if (code == 125) {\n";
1399
1391
  DESERIALIZE += " if (--depth == 0) {\n";
1400
1392
  DESERIALIZE += " srcStart += 2;\n";
@@ -1448,7 +1440,7 @@ export class JSONTransform extends Visitor {
1448
1440
  DESERIALIZE += " const code = load<u16>(srcStart);\n";
1449
1441
  DESERIALIZE += " if (code == 34) {\n";
1450
1442
  DESERIALIZE += " srcStart += 2;\n";
1451
- DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && JSON.Util.isUnescapedQuote(srcStart))) srcStart += 2;\n";
1443
+ DESERIALIZE += " while (!(load<u16>(srcStart) == 34 && load<u16>(srcStart - 2) != 92)) srcStart += 2;\n";
1452
1444
  DESERIALIZE += " } else if (code == 93) {\n";
1453
1445
  DESERIALIZE += " if (--depth == 0) {\n";
1454
1446
  DESERIALIZE += " srcStart += 2;\n";
@@ -1504,10 +1496,7 @@ export class JSONTransform extends Visitor {
1504
1496
  const first = group[0];
1505
1497
  const fName = first.alias || first.name;
1506
1498
  DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
1507
- if (isRawType(first.type)) {
1508
- DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1509
- }
1510
- else if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
1499
+ if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
1511
1500
  DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), changetype<" + first.type + ">(JSON.Box.from<bool>(true)), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1512
1501
  }
1513
1502
  else {
@@ -1521,10 +1510,7 @@ export class JSONTransform extends Visitor {
1521
1510
  const mem = group[i];
1522
1511
  const memName = mem.alias || mem.name;
1523
1512
  DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
1524
- if (isRawType(mem.type)) {
1525
- DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1526
- }
1527
- else if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
1513
+ if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
1528
1514
  DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), changetype<" + mem.type + ">(JSON.Box.from<bool>(true)), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1529
1515
  }
1530
1516
  else {
@@ -1564,10 +1550,7 @@ export class JSONTransform extends Visitor {
1564
1550
  const first = group[0];
1565
1551
  const fName = first.alias || first.name;
1566
1552
  DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
1567
- if (isRawType(first.type)) {
1568
- DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 10, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1569
- }
1570
- else if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
1553
+ if (first.type.startsWith("JSON.Box<bool") || first.type.startsWith("JSON.Box<boolean") || first.type.startsWith("Box<bool") || first.type.startsWith("Box<boolean")) {
1571
1554
  DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), changetype<" + first.type + ">(JSON.Box.from<bool>(false)), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1572
1555
  }
1573
1556
  else {
@@ -1581,10 +1564,7 @@ export class JSONTransform extends Visitor {
1581
1564
  const mem = group[i];
1582
1565
  const memName = mem.alias || mem.name;
1583
1566
  DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
1584
- if (isRawType(mem.type)) {
1585
- DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 10, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1586
- }
1587
- else if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
1567
+ if (mem.type.startsWith("JSON.Box<bool") || mem.type.startsWith("JSON.Box<boolean") || mem.type.startsWith("Box<bool") || mem.type.startsWith("Box<boolean")) {
1588
1568
  DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), changetype<" + mem.type + ">(JSON.Box.from<bool>(false)), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1589
1569
  }
1590
1570
  else {
@@ -1623,12 +1603,7 @@ export class JSONTransform extends Visitor {
1623
1603
  const first = group[0];
1624
1604
  const fName = first.alias || first.name;
1625
1605
  DESERIALIZE += indent + " if (" + (first.generic ? "isNullable<" + first.type + ">() && " : "") + getComparison(fName) + ") { // " + fName + "\n";
1626
- if (isRawType(first.type) && !first.node.type.isNullable) {
1627
- DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1628
- }
1629
- else {
1630
- DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1631
- }
1606
+ DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
1632
1607
  DESERIALIZE += indent + " srcStart += 2;\n";
1633
1608
  DESERIALIZE += indent + " keyStart = 0;\n";
1634
1609
  DESERIALIZE += indent + " break;\n";
@@ -1637,12 +1612,7 @@ export class JSONTransform extends Visitor {
1637
1612
  const mem = group[i];
1638
1613
  const memName = mem.alias || mem.name;
1639
1614
  DESERIALIZE += indent + " else if (" + (mem.generic ? "isNullable<" + mem.type + ">() && " : "") + getComparison(memName) + ") { // " + memName + "\n";
1640
- if (isRawType(mem.type) && !mem.node.type.isNullable) {
1641
- DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(srcStart - 8, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1642
- }
1643
- else {
1644
- DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1645
- }
1615
+ DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
1646
1616
  DESERIALIZE += indent + " srcStart += 2;\n";
1647
1617
  DESERIALIZE += indent + " keyStart = 0;\n";
1648
1618
  DESERIALIZE += indent + " break;\n";