json-as 1.3.3 → 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.
- package/CHANGELOG.md +16 -0
- package/assembly/deserialize/simd/string.ts +20 -0
- package/assembly/deserialize/swar/string.ts +21 -0
- package/assembly/serialize/simd/string.ts +43 -16
- package/assembly/serialize/simple/array.ts +47 -6
- package/assembly/serialize/simple/bool.ts +12 -0
- package/assembly/serialize/simple/float.ts +14 -0
- package/assembly/serialize/simple/integer.ts +6 -0
- package/assembly/serialize/simple/set.ts +59 -5
- package/assembly/serialize/simple/staticarray.ts +57 -3
- package/assembly/serialize/simple/typedarray.ts +29 -9
- package/assembly/serialize/swar/string.ts +165 -18
- package/package.json +10 -10
- package/transform/lib/builder.d.ts.map +1 -1
- package/transform/lib/builder.js +17 -16
- package/transform/lib/builder.js.map +1 -1
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +52 -10
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +3 -2
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/types.d.ts +1 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +8 -6
- package/transform/lib/types.js.map +1 -1
- package/transform/lib/util.d.ts.map +1 -1
- package/transform/lib/util.js +2 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/lib/visitor.d.ts.map +1 -1
- package/transform/lib/visitor.js +68 -67
- package/transform/lib/visitor.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA4G,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA4G,eAAe,EAAoG,MAAM,EAAE,OAAO,EAAS,MAAM,EAA6C,MAAM,uCAAuC,CAAC;AACjX,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAM7D,OAAO,EAA2B,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAmJvC,qBAAa,aAAc,SAAQ,OAAO;IACxC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAuB;IAExC,OAAO,EAAG,OAAO,CAAC;IAClB,OAAO,EAAG,MAAM,CAAC;IACjB,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAA+B;IAC7D,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAmB;IACrC,OAAO,EAAE,eAAe,EAAE,CAAM;IAChC,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAqB;IAEvD,OAAO,CAAC,4BAA4B;IA6CpC,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAYtD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,cAAoB,GAAG,MAAM;IAsC3E,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAghDnD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItC,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA4ClD,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA+J9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe,GAAG,MAAM,EAAE;IA0BxD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO;CAc3D;AA4BD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAChD,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAwDjC;AA+MD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C"}
|
package/transform/lib/index.js
CHANGED
|
@@ -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";
|
|
@@ -83,7 +84,7 @@ function parseCustomJsonKind(method, decoratorName) {
|
|
|
83
84
|
if (decorator.args.length > 1)
|
|
84
85
|
throwError(`@${decoratorName} accepts at most one argument`, decorator.range);
|
|
85
86
|
const arg = decorator.args[0];
|
|
86
|
-
if (arg.kind !=
|
|
87
|
+
if (arg.kind != NodeKind.Literal || arg.literalKind != 2) {
|
|
87
88
|
throwError(`@${decoratorName} argument must be a string literal like @${decoratorName}("string")`, arg.range);
|
|
88
89
|
}
|
|
89
90
|
const kind = arg.value;
|
|
@@ -171,7 +172,7 @@ export class JSONTransform extends Visitor {
|
|
|
171
172
|
if (isDecoratedBase)
|
|
172
173
|
return;
|
|
173
174
|
this.collectInheritedFieldMembers(baseDecl, baseSource, members, visited);
|
|
174
|
-
const inheritedMembers = baseDecl.members.filter((v) => v.kind ===
|
|
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"));
|
|
175
176
|
for (let i = inheritedMembers.length - 1; i >= 0; i--) {
|
|
176
177
|
const inherited = inheritedMembers[i];
|
|
177
178
|
if (!members.some((member) => member.name.text == inherited.name.text)) {
|
|
@@ -233,9 +234,9 @@ export class JSONTransform extends Visitor {
|
|
|
233
234
|
return;
|
|
234
235
|
if (!this.schemas.has(source.internalPath))
|
|
235
236
|
this.schemas.set(source.internalPath, []);
|
|
236
|
-
const members = [...node.members.filter((v) => v.kind ===
|
|
237
|
-
const serializers = [...node.members.filter((v) => v.kind ===
|
|
238
|
-
const deserializers = [...node.members.filter((v) => v.kind ===
|
|
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"))];
|
|
239
240
|
const schema = new Schema();
|
|
240
241
|
schema.node = node;
|
|
241
242
|
schema.name = source.getQualifiedName(node);
|
|
@@ -498,7 +499,7 @@ export class JSONTransform extends Visitor {
|
|
|
498
499
|
mem.type = type;
|
|
499
500
|
mem.value = value;
|
|
500
501
|
mem.node = member;
|
|
501
|
-
mem.byteSize =
|
|
502
|
+
mem.byteSize = estimatedSerializedByteSize(mem.type, source, this.parser);
|
|
502
503
|
mem.custom = schema.deps.some((dep) => dep?.name == stripNull(type) && dep.custom);
|
|
503
504
|
this.schema.byteSize += mem.byteSize;
|
|
504
505
|
if (member.decorators) {
|
|
@@ -507,7 +508,7 @@ export class JSONTransform extends Visitor {
|
|
|
507
508
|
switch (decoratorName) {
|
|
508
509
|
case "alias": {
|
|
509
510
|
const arg = decorator.args[0];
|
|
510
|
-
if (!arg || (arg.kind !=
|
|
511
|
+
if (!arg || (arg.kind != NodeKind.Literal && arg.literalKind != 2 && arg.literalKind != 1 && arg.literalKind != 0))
|
|
511
512
|
throwError("@alias must have an argument of type string or number", member.range);
|
|
512
513
|
mem.alias = arg.value.toString();
|
|
513
514
|
break;
|
|
@@ -634,7 +635,7 @@ export class JSONTransform extends Visitor {
|
|
|
634
635
|
SERIALIZE += indent + `}\n`;
|
|
635
636
|
}
|
|
636
637
|
else if (member.flags.has(PropertyFlags.OmitIf)) {
|
|
637
|
-
if (member.flags.get(PropertyFlags.OmitIf).kind ==
|
|
638
|
+
if (member.flags.get(PropertyFlags.OmitIf).kind == NodeKind.Function) {
|
|
638
639
|
const arg = member.flags.get(PropertyFlags.OmitIf);
|
|
639
640
|
arg.declaration.signature.parameters[0].type = Node.createNamedType(Node.createSimpleTypeName("this", node.range), null, false, node.range);
|
|
640
641
|
arg.declaration.signature.returnType.name = Node.createSimpleTypeName("boolean", arg.declaration.signature.returnType.name.range);
|
|
@@ -642,7 +643,7 @@ export class JSONTransform extends Visitor {
|
|
|
642
643
|
}
|
|
643
644
|
else {
|
|
644
645
|
const expression = member.flags.get(PropertyFlags.OmitIf);
|
|
645
|
-
const rendered = expression.kind ==
|
|
646
|
+
const rendered = expression.kind == NodeKind.Literal && expression.literalKind == 2 ? JSON.stringify(expression.value).slice(1, -1) : toString(expression);
|
|
646
647
|
SERIALIZE += indent + `if (!(${rendered})) {\n`;
|
|
647
648
|
}
|
|
648
649
|
indentInc();
|
|
@@ -2104,15 +2105,56 @@ function sizeof(type) {
|
|
|
2104
2105
|
return 20;
|
|
2105
2106
|
else if (type == "i32")
|
|
2106
2107
|
return 22;
|
|
2108
|
+
else if (type == "usize")
|
|
2109
|
+
return 40;
|
|
2110
|
+
else if (type == "isize")
|
|
2111
|
+
return 42;
|
|
2107
2112
|
else if (type == "u64")
|
|
2108
2113
|
return 40;
|
|
2109
2114
|
else if (type == "i64")
|
|
2110
|
-
return
|
|
2115
|
+
return 42;
|
|
2116
|
+
else if (type == "f32")
|
|
2117
|
+
return 34;
|
|
2118
|
+
else if (type == "f64")
|
|
2119
|
+
return 66;
|
|
2111
2120
|
else if (type == "bool" || type == "boolean")
|
|
2112
2121
|
return 10;
|
|
2113
2122
|
else
|
|
2114
2123
|
return 0;
|
|
2115
2124
|
}
|
|
2125
|
+
function estimatedSerializedByteSize(type, source, parser) {
|
|
2126
|
+
const trimmed = type.trim();
|
|
2127
|
+
const baseType = stripNull(trimmed);
|
|
2128
|
+
const nullable = trimmed != baseType;
|
|
2129
|
+
let estimated = sizeof(baseType);
|
|
2130
|
+
if (estimated == 0) {
|
|
2131
|
+
if (isEnum(baseType, source, parser)) {
|
|
2132
|
+
estimated = 22;
|
|
2133
|
+
}
|
|
2134
|
+
else if (baseType == "Date") {
|
|
2135
|
+
estimated = 52;
|
|
2136
|
+
}
|
|
2137
|
+
else if (isString(baseType)) {
|
|
2138
|
+
estimated = 4;
|
|
2139
|
+
}
|
|
2140
|
+
else if (isArray(baseType) || baseType.startsWith("Map<")) {
|
|
2141
|
+
estimated = 4;
|
|
2142
|
+
}
|
|
2143
|
+
else if (baseType == "JSON.Obj" || baseType == "Obj" || baseType == "JSON.Raw" || baseType == "Raw" || baseType == "JSON.Value" || baseType == "Value") {
|
|
2144
|
+
estimated = 4;
|
|
2145
|
+
}
|
|
2146
|
+
else if (baseType == "ArrayBuffer" || needsReferenceLoad(baseType)) {
|
|
2147
|
+
estimated = 4;
|
|
2148
|
+
}
|
|
2149
|
+
else {
|
|
2150
|
+
estimated = 4;
|
|
2151
|
+
}
|
|
2152
|
+
}
|
|
2153
|
+
if (nullable) {
|
|
2154
|
+
estimated = Math.max(estimated, 8);
|
|
2155
|
+
}
|
|
2156
|
+
return estimated;
|
|
2157
|
+
}
|
|
2116
2158
|
function isPrimitive(type) {
|
|
2117
2159
|
const primitiveTypes = ["u8", "u16", "u32", "u64", "i8", "i16", "i32", "i64", "f32", "f64", "bool", "boolean"];
|
|
2118
2160
|
return primitiveTypes.some((v) => type.startsWith(v));
|