You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

json-as

Package Overview
Dependencies
Maintainers
1
Versions
195
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

json-as - npm Package Compare versions

Comparing version

to
1.1.3

206

assembly/__tests__/array.spec.ts
import { JSON } from "..";
import { describe, expect } from "./lib";
describe("Should serialize integer arrays", () => {
expect(JSON.stringify<u32[]>([0, 100, 101])).toBe("[0,100,101]");
// describe("Should serialize integer arrays", () => {
// expect(JSON.stringify<u32[]>([0, 100, 101])).toBe("[0,100,101]");
expect(JSON.stringify<u64[]>([0, 100, 101])).toBe("[0,100,101]");
// expect(JSON.stringify<u64[]>([0, 100, 101])).toBe("[0,100,101]");
expect(JSON.stringify<i32[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]");
// expect(JSON.stringify<i32[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]");
expect(JSON.stringify<i64[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]");
});
// expect(JSON.stringify<i64[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]");
// });
describe("Should serialize float arrays", () => {
expect(JSON.stringify<f64[]>([7.23, 10e2, 10e2, 123456e-5, 123456e-5, 0.0, 7.23])).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]");
// describe("Should serialize float arrays", () => {
// expect(JSON.stringify<f64[]>([7.23, 10e2, 10e2, 123456e-5, 123456e-5, 0.0, 7.23])).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]");
expect(JSON.stringify<f64[]>([1e21, 1e22, 1e-7, 1e-8, 1e-9])).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]");
});
// expect(JSON.stringify<f64[]>([1e21, 1e22, 1e-7, 1e-8, 1e-9])).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]");
// });
describe("Should serialize boolean arrays", () => {
expect(JSON.stringify<bool[]>([true, false])).toBe("[true,false]");
// describe("Should serialize boolean arrays", () => {
// expect(JSON.stringify<bool[]>([true, false])).toBe("[true,false]");
expect(JSON.stringify<boolean[]>([true, false])).toBe("[true,false]");
});
// expect(JSON.stringify<boolean[]>([true, false])).toBe("[true,false]");
// });
describe("Should serialize string arrays", () => {
expect(JSON.stringify<string[]>(['string "with random spa\nces and \nnewlines\n\n\n'])).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]');
});
// describe("Should serialize string arrays", () => {
// expect(JSON.stringify<string[]>(['string "with random spa\nces and \nnewlines\n\n\n'])).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]');
// });
describe("Should serialize nested integer arrays", () => {
expect(JSON.stringify<i64[][]>([[100, 101], [-100, -101], [0]])).toBe("[[100,101],[-100,-101],[0]]");
});
// describe("Should serialize nested integer arrays", () => {
// expect(JSON.stringify<i64[][]>([[100, 101], [-100, -101], [0]])).toBe("[[100,101],[-100,-101],[0]]");
// });
describe("Should serialize nested float arrays", () => {
expect(JSON.stringify<f64[][]>([[7.23], [10e2], [10e2], [123456e-5], [123456e-5], [0.0], [7.23]])).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]");
});
// describe("Should serialize nested float arrays", () => {
// expect(JSON.stringify<f64[][]>([[7.23], [10e2], [10e2], [123456e-5], [123456e-5], [0.0], [7.23]])).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]");
// });
describe("Should serialize nested boolean arrays", () => {
expect(JSON.stringify<bool[][]>([[true], [false]])).toBe("[[true],[false]]");
// describe("Should serialize nested boolean arrays", () => {
// expect(JSON.stringify<bool[][]>([[true], [false]])).toBe("[[true],[false]]");
expect(JSON.stringify<boolean[][]>([[true], [false]])).toBe("[[true],[false]]");
});
// expect(JSON.stringify<boolean[][]>([[true], [false]])).toBe("[[true],[false]]");
// });
describe("Should serialize object arrays", () => {
expect(
JSON.stringify<Vec3[]>([
{
x: 3.4,
y: 1.2,
z: 8.3,
},
{
x: 3.4,
y: -2.1,
z: 9.3,
},
]),
).toBe('[{"x":3.4,"y":1.2,"z":8.3},{"x":3.4,"y":-2.1,"z":9.3}]');
});
// describe("Should serialize object arrays", () => {
// expect(
// JSON.stringify<Vec3[]>([
// {
// x: 3.4,
// y: 1.2,
// z: 8.3,
// },
// {
// x: 3.4,
// y: -2.1,
// z: 9.3,
// },
// ]),
// ).toBe('[{"x":3.4,"y":1.2,"z":8.3},{"x":3.4,"y":-2.1,"z":9.3}]');
// });
describe("Should deserialize integer arrays", () => {
expect(JSON.stringify(JSON.parse<u32[]>("[0,100,101]"))).toBe("[0,100,101]");
expect(JSON.stringify(JSON.parse<u64[]>("[0,100,101]"))).toBe("[0,100,101]");
expect(JSON.stringify(JSON.parse<i32[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]");
expect(JSON.stringify(JSON.parse<i64[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]");
});
// describe("Should deserialize integer arrays", () => {
// expect(JSON.stringify(JSON.parse<u32[]>("[0,100,101]"))).toBe("[0,100,101]");
// expect(JSON.stringify(JSON.parse<u64[]>("[0,100,101]"))).toBe("[0,100,101]");
// expect(JSON.stringify(JSON.parse<i32[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]");
// expect(JSON.stringify(JSON.parse<i64[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]");
// });
describe("Should deserialize float arrays", () => {
expect(JSON.stringify(JSON.parse<f64[]>("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"))).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]");
expect(JSON.stringify(JSON.parse<f64[]>("[1e+21,1e+22,1e-7,1e-8,1e-9]"))).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]");
});
// describe("Should deserialize float arrays", () => {
// expect(JSON.stringify(JSON.parse<f64[]>("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"))).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]");
// expect(JSON.stringify(JSON.parse<f64[]>("[1e+21,1e+22,1e-7,1e-8,1e-9]"))).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]");
// });
describe("Should deserialize boolean arrays", () => {
expect(JSON.stringify(JSON.parse<bool[]>("[true,false]"))).toBe("[true,false]");
expect(JSON.stringify(JSON.parse<boolean[]>("[true,false]"))).toBe("[true,false]");
});
// describe("Should deserialize boolean arrays", () => {
// expect(JSON.stringify(JSON.parse<bool[]>("[true,false]"))).toBe("[true,false]");
// expect(JSON.stringify(JSON.parse<boolean[]>("[true,false]"))).toBe("[true,false]");
// });
describe("Should deserialize string arrays", () => {
expect(JSON.stringify(JSON.parse<string[]>('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'))).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]');
});
// describe("Should deserialize string arrays", () => {
// expect(JSON.stringify(JSON.parse<string[]>('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'))).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]');
// });
describe("Should deserialize nested integer arrays", () => {
expect(JSON.stringify(JSON.parse<i64[][]>("[[100,101],[-100,-101],[0]]"))).toBe("[[100,101],[-100,-101],[0]]");
});
// describe("Should deserialize nested integer arrays", () => {
// expect(JSON.stringify(JSON.parse<i64[][]>("[[100,101],[-100,-101],[0]]"))).toBe("[[100,101],[-100,-101],[0]]");
// });
describe("Should deserialize nested float arrays", () => {
expect(JSON.stringify(JSON.parse<f64[][]>("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"))).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]");
});
// describe("Should deserialize nested float arrays", () => {
// expect(JSON.stringify(JSON.parse<f64[][]>("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"))).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]");
// });
describe("Should deserialize nested boolean arrays", () => {
expect(JSON.stringify(JSON.parse<bool[][]>("[[true],[false]]"))).toBe("[[true],[false]]");
expect(JSON.stringify(JSON.parse<boolean[][]>("[[true],[false]]"))).toBe("[[true],[false]]");
});
// describe("Should deserialize nested boolean arrays", () => {
// expect(JSON.stringify(JSON.parse<bool[][]>("[[true],[false]]"))).toBe("[[true],[false]]");
// expect(JSON.stringify(JSON.parse<boolean[][]>("[[true],[false]]"))).toBe("[[true],[false]]");
// });

@@ -105,2 +105,68 @@ describe("Should deserialize object arrays", () => {

z: f64 = 0.0;
__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T {
let keyStart: usize = 0;
let keyEnd: usize = 0;
let isKey = false;
let lastIndex: usize = 0;
while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;
while (srcEnd > srcStart && JSON.Util.isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
if (load<u16>(srcStart) != 123) throw new Error("Expected '{' at start of object at position " + (srcEnd - srcStart).toString());
if (load<u16>(srcEnd - 2) != 125) throw new Error("Expected '}' at end of object at position " + (srcEnd - srcStart).toString());
srcStart += 2;
while (srcStart < srcEnd) {
let code = load<u16>(srcStart);
while (JSON.Util.isSpace(code)) code = load<u16>(srcStart += 2);
if (keyStart == 0) {
if (code == 34 && load<u16>(srcStart - 2) !== 92) {
if (isKey) {
keyStart = lastIndex;
keyEnd = srcStart;
while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) { }
if (code !== 58) throw new Error("Expected ':' after key at position " + (srcEnd - srcStart).toString());
isKey = false;
} else {
isKey = true;
lastIndex = srcStart + 2;
}
}
srcStart += 2;
} else {
if (code - 48 <= 9 || code == 45) {
lastIndex = srcStart;
srcStart += 2;
while (srcStart < srcEnd) {
const code = load<u16>(srcStart);
if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {
switch (<u32>keyEnd - <u32>keyStart) {
case 2: {
const code16 = load<u16>(keyStart);
if (code16 == 120) { // x
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("x"));
keyStart = 0;
break;
} else if (code16 == 121) { // y
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("y"));
keyStart = 0;
break;
} else if (code16 == 122) { // z
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("z"));
keyStart = 0;
break;
}
}
}
break;
}
srcStart += 2;
}
} else {
srcStart += 2;
}
}
}
return out;
}
}

@@ -18,5 +18,5 @@ import { JSON } from "../..";

else if (firstChar == CHAR_N) {
return JSON.Value.from(null);
return JSON.Value.from<usize>(0);
}
return unreachable();
}

@@ -11,3 +11,2 @@ /// <reference path="./index.d.ts" />

import { deserializeFloat } from "./deserialize/simple/float";
import { deserializeStruct } from "./deserialize/simple/struct";
import { deserializeMap } from "./deserialize/simple/map";

@@ -617,3 +616,3 @@ import { deserializeDate } from "./deserialize/simple/date";

}
namespace Util {
export namespace Util {
// @ts-ignore: decorator

@@ -620,0 +619,0 @@ @inline export function isSpace(code: u16): boolean {

import { JSON } from ".";
import { bytes } from "./util";
// @json
// class Obj {
// public a: string = "hello";
// public b: string = "world";
// public c: string = '"\t\f\u0000\u0001';
// }
@json
class Obj {
public a: string = "hello";
public b: string = "world";
public c: string = '"\t\f\u0000\u0001';
}
// @json
// class Vec3 {
// x: f32 = 0.0;
// y: f32 = 0.0;
// z: f32 = 0.0;
// }
@json
class Vec3 {
x: f32 = 0.0;
y: f32 = 0.0;
z: f32 = 0.0;
}
// @json
// class Player {
// @alias("first name")
// firstName!: string;
// lastName!: string;
// lastActive!: i32[];
// // Drop in a code block, function, or expression that evaluates to a boolean
// @omitif((self: Player) => self.age < 18)
// age!: i32;
@json
class Player {
@alias("first name")
firstName!: string;
lastName!: string;
lastActive!: i32[];
// Drop in a code block, function, or expression that evaluates to a boolean
@omitif((self: Player) => self.age < 18)
age!: i32;
// @omitnull()
// pos!: Vec3 | null;
// isVerified!: boolean;
// }
@omitnull()
pos!: Vec3 | null;
isVerified!: boolean;
}
// @json
// class Point {}
@json
class Point {}
// @json
// class NewPoint {
// x: f64 = 0.0;
// y: f64 = 0.0;
// constructor(x: f64, y: f64) {
// this.x = x;
// this.y = y;
// }
@json
class NewPoint {
x: f64 = 0.0;
y: f64 = 0.0;
constructor(x: f64, y: f64) {
this.x = x;
this.y = y;
}
// @serializer
// serializer(self: NewPoint): string {
// return `x=${self.x},y=${self.y}`;
// }
@serializer
serializer(self: NewPoint): string {
return `x=${self.x},y=${self.y}`;
}
// @deserializer
// deserializer(data: string): NewPoint {
// const dataSize = bytes(data);
@deserializer
deserializer(data: string): NewPoint {
const dataSize = bytes(data);
// const c = data.indexOf(",");
// const x = data.slice(2, c);
// const y = data.slice(c + 3);
const c = data.indexOf(",");
const x = data.slice(2, c);
const y = data.slice(c + 3);
// return new NewPoint(f64.parse(x), f64.parse(y));
// }
// }
return new NewPoint(f64.parse(x), f64.parse(y));
}
}
// @json
// class InnerObj<T> {
// obj: T = instantiate<T>();
// }
@json
class InnerObj<T> {
obj: T = instantiate<T>();
}
// @json
// class ObjWithBracketString {
// data: string = "";
// }
@json
class ObjWithBracketString {
data: string = "";
}
// const player: Player = {
// firstName: "Jairus",
// lastName: "Tanaka",
// lastActive: [2, 7, 2025],
// age: 18,
// pos: {
// x: 3.4,
// y: 1.2,
// z: 8.3,
// },
// isVerified: true,
// };
const player: Player = {
firstName: "Jairus",
lastName: "Tanaka",
lastActive: [2, 7, 2025],
age: 18,
pos: {
x: 3.4,
y: 1.2,
z: 8.3,
},
isVerified: true,
};
// const a1 = JSON.stringify("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f\u000f\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f");
// // console.log("Bytes " + bytes(a1).toString());
// console.log("a1: " + a1);
const a1 = JSON.stringify("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f\u000f\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f");
// console.log("Bytes " + bytes(a1).toString());
console.log("a1: " + a1);
// const obj = new Obj();
// const a2 = JSON.stringify(obj);
// // console.log("Bytes " + bytes(a2).toString());
// console.log("a2: " + a2);
const obj = new Obj();
const a2 = JSON.stringify(obj);
// console.log("Bytes " + bytes(a2).toString());
console.log("a2: " + a2);
// const a3 = JSON.stringify(player);
// // console.log("Bytes " + bytes(a3).toString());
// console.log("a3: " + a3);
const a3 = JSON.stringify(player);
// console.log("Bytes " + bytes(a3).toString());
console.log("a3: " + a3);
// const a4 = new JSON.Obj();
const a4 = new JSON.Obj();
// a4.set("x", 1.5);
// a4.set("y", 5.4);
// a4.set("z", 9.8);
// a4.set("obj", obj);
// a4.set<boolean>("bool", false);
a4.set("x", 1.5);
a4.set("y", 5.4);
a4.set("z", 9.8);
a4.set("obj", obj);
a4.set<boolean>("bool", false);
// console.log("a4: " + JSON.stringify(a4));
console.log("a4: " + JSON.stringify(a4));
// const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}');
const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}');
// console.log("a5: " + JSON.stringify(a5));
console.log("a5: " + JSON.stringify(a5));
// const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}');
const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}');
// console.log("a6: " + JSON.stringify(a6));
console.log("a6: " + JSON.stringify(a6));
// const a7 = JSON.parse<JSON.Value[]>('["string",true,3.14,{"x":1.0,"y":2.0,"z":3.0},[1,2,3,true]]');
const a7 = JSON.parse<JSON.Value[]>('["string",true,3.14,{"x":1.0,"y":2.0,"z":3.0},[1,2,3,true]]');
// console.log("a7: " + JSON.stringify(a7));
console.log("a7: " + JSON.stringify(a7));
// const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]);
const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]);
// console.log("a8: " + a8);
console.log("a8: " + a8);
// const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"'));
const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"'));
// console.log("a9: " + a9);
console.log("a9: " + a9);
// const m10 = new Map<string, JSON.Raw>();
// m10.set("hello", new JSON.Raw('"world"'));
// m10.set("pos", new JSON.Raw('{"x":1.0,"y":2.0,"z":3.0}'));
const m10 = new Map<string, JSON.Raw>();
m10.set("hello", new JSON.Raw('"world"'));
m10.set("pos", new JSON.Raw('{"x":1.0,"y":2.0,"z":3.0}'));
// const a10 = JSON.stringify(m10);
const a10 = JSON.stringify(m10);
// console.log("a10: " + a10);
console.log("a10: " + a10);
// const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } ');
const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } ');
// console.log("a11: " + JSON.stringify(a11));
console.log("a11: " + JSON.stringify(a11));
// const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}');
const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}');
// console.log("a12: " + JSON.stringify(a12));
console.log("a12: " + JSON.stringify(a12));
// const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj());
const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj());
// console.log("a13: " + a13);
console.log("a13: " + a13);
// const a14 = JSON.stringify(new Point());
// console.log("a14: " + a14);
const a14 = JSON.stringify(new Point());
console.log("a14: " + a14);
// const a15 = JSON.parse<Point>(a14);
// console.log("a15: " + JSON.stringify(a15));
const a15 = JSON.parse<Point>(a14);
console.log("a15: " + JSON.stringify(a15));
// const a16 = JSON.stringify(new NewPoint(1.0, 2.0));
// console.log("a16: " + a16);
const a16 = JSON.stringify(new NewPoint(1.0, 2.0));
console.log("a16: " + a16);
// const a17 = JSON.parse<NewPoint>(a16);
// console.log("a17: " + JSON.stringify(a17));
const a17 = JSON.parse<NewPoint>(a16);
console.log("a17: " + JSON.stringify(a17));
// const a18 = JSON.parse<JSON.Obj[]>('[{"x":1.0,"y":2.0,"z":3.0},{"x":4.0,"y":5.0,"z":6.0},{"x":7.0,"y":8.0,"z":9.0}]');
// console.log("a18: " + JSON.stringify(a18));
const a18 = JSON.parse<JSON.Obj[]>('[{"x":1.0,"y":2.0,"z":3.0},{"x":4.0,"y":5.0,"z":6.0},{"x":7.0,"y":8.0,"z":9.0}]');
console.log("a18: " + JSON.stringify(a18));
// const a19 = JSON.stringify<JSON.Obj[]>(a18);
// console.log("a19: " + a19);
const a19 = JSON.stringify<JSON.Obj[]>(a18);
console.log("a19: " + a19);
// const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]");
// console.log("a20: " + JSON.stringify(a20));
const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]");
console.log("a20: " + JSON.stringify(a20));
// const a21 = JSON.stringify<JSON.Box<f64>[]>(a20);
// console.log("a21: " + a21);
const a21 = JSON.stringify<JSON.Box<f64>[]>(a20);
console.log("a21: " + a21);

@@ -182,1 +182,38 @@ const a22 = JSON.parse<Foo>('{"id":"0xb8","firstName":"Jairus","lastName":"Tanaka"}');

}
@json
class SrvInfo {
accessUrl: string = "https://example.com";
cardTypes: i32[] = [1, 2, 3];
customService: string = "Contact us at support@example.com";
invoiceApplicationStatus: i32 = 1;
isCertification: bool = true;
isOnlineRecharge: bool = false;
loginTypes: i32[] = [0, 1]; // e.g. 0 = password, 1 = OTP
record: string = "ICP 12345678";
regCompanyAudit: i32 = 2;
regCompanyPipeline: i32[] = [101, 102, 103];
regPwdLimit: i32 = 8; // min password length
serverTime: i64 = 1650000000000; // dummy timestamp
srvDescription: string = "A demo service for handling customer operations.";
srvHiddenMenu: string[] = ["admin", "beta"];
srvHost: string = "srv.example.com";
srvId: i32 = 999;
srvKeywords: string[] = ["finance", "payments", "online"];
srvLogoImgUrl: string = "https://example.com/logo.png";
srvName: string = "ExampleService";
srvPageId: i32 = 5;
thirdAuthUrl: string = "https://auth.example.com";
userCenterStyle: i32 = 1; // e.g. 1 = modern, 0 = legacy
}
const a23 = JSON.stringify(new SrvInfo());
console.log("a23: " + a23);
const a24 = '{"accessUrl":"https://example.com","cardTypes":[1,2,3],"customService":"Contact us at support@example.com","invoiceApplicationStatus":1,"isCertification":true,"isOnlineRecharge":false,"loginTypes":[0,1],"record":"ICP 12345678","regCompanyAudit":2,"regCompanyPipeline":[101,102,103],"regPwdLimit":8,"serverTime":1650000000000,"srvDescription":"A demo service for handling customer operations.","srvHiddenMenu":["admin","beta"],"srvHost":"srv.example.com","srvId":999,"srvKeywords":["finance","payments","online"],"srvLogoImgUrl":"https://example.com/logo.png","srvName":"ExampleService","srvPageId":5,"thirdAuthUrl":"https://auth.example.com","userCenterStyle":1}';
console.log("a25: " + (a24 == a23).toString());
const a26 = JSON.parse<SrvInfo>(a23);
console.log("a26: " + JSON.stringify(a26));
console.log("a27: " + (JSON.stringify(a26) == a23).toString())
# Change Log
## 2025-05-23 - 1.1.3
- feat: group properties of structs before code generation
- fix: break out of switch case after completion
- ci: make compatible with act for local testing
## 2025-05-22 - 1.1.2

@@ -4,0 +10,0 @@

@@ -1,1 +0,26 @@

export { JSON } from "./assembly/index";
class SrvInfo {
accessUrl: string = "https://example.com";
cardTypes: number[] = [1, 2, 3];
customService: string = "Contact us at support@example.com";
invoiceApplicationStatus: number = 1;
isCertification: bool = true;
isOnlineRecharge: bool = false;
loginTypes: number[] = [0, 1]; // e.g. 0 = password, 1 = OTP
record: string = "ICP 12345678";
regCompanyAudit: number = 2;
regCompanyPipeline: number[] = [101, 102, 103];
regPwdLimit: number = 8; // min password length
serverTime: i64 = 1650000000000; // dummy timestamp
srvDescription: string = "A demo service for handling customer operations.";
srvHiddenMenu: string[] = ["admin", "beta"];
srvHost: string = "srv.example.com";
srvId: number = 999;
srvKeywords: string[] = ["finance", "payments", "online"];
srvLogoImgUrl: string = "https://example.com/logo.png";
srvName: string = "ExampleService";
srvPageId: number = 5;
thirdAuthUrl: string = "https://auth.example.com";
userCenterStyle: number = 1; // e.g. 1 = modern, 0 = legacy
}
console.log(JSON.stringify(new SrvInfo()))
{
"name": "json-as",
"version": "1.1.2",
"version": "1.1.3",
"author": "Jairus Tanaka",

@@ -18,2 +18,3 @@ "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",

"scripts": {
"ci": "act",
"test": "bash ./run-tests.sh",

@@ -20,0 +21,0 @@ "bench:as": "bash ./run-bench.as.sh",

@@ -9,3 +9,3 @@ <h6 align="center">

</span>
AssemblyScript - v1.1.2
AssemblyScript - v1.1.3
</pre>

@@ -12,0 +12,0 @@ </h6>

@@ -11,3 +11,3 @@ import { Node } from "assemblyscript/dist/assemblyscript.js";

const DEBUG = process.env["JSON_DEBUG"];
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false";
const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false");
class JSONTransform extends Visitor {

@@ -306,4 +306,3 @@ static SN = new JSONTransform();

DESERIALIZE += indent + " let keyStart: usize = 0;\n";
if (shouldGroup || DEBUG)
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
DESERIALIZE += indent + " let isKey = false;\n";

@@ -326,4 +325,3 @@ if (sortedMembers.object.length || sortedMembers.array.length)

DESERIALIZE += indent + " keyStart = lastIndex;\n";
if (shouldGroup || DEBUG)
DESERIALIZE += indent + " keyEnd = srcStart;\n";
DESERIALIZE += indent + " keyEnd = srcStart;\n";
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n";

@@ -340,20 +338,31 @@ DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n";

const groupMembers = (members) => {
let sorted = [];
let len = -1;
members
.slice()
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length))
.forEach((member) => {
const _nameLength = member.alias?.length || member.name.length;
if (_nameLength === len) {
sorted[sorted.length - 1].push(member);
const groups = new Map();
for (const member of members) {
const name = member.alias || member.name;
const length = name.length;
if (!groups.has(length)) {
groups.set(length, []);
}
else {
sorted.push([member]);
len = _nameLength;
}
});
sorted = sorted.sort((a, b) => b.length - a.length);
return sorted;
groups.get(length).push(member);
}
return [...groups.values()]
.map(group => group.sort((a, b) => {
const aLen = (a.alias || a.name).length;
const bLen = (b.alias || b.name).length;
return aLen - bLen;
}))
.sort((a, b) => b.length - a.length);
};
const generateGroups = (members, cb) => {
const groups = groupMembers(members);
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
for (const group of groups) {
const groupLen = (group[0].alias || group[0].name).length << 1;
DESERIALIZE += " case " + groupLen + ": {\n";
cb(group);
DESERIALIZE += "\n }\n";
}
DESERIALIZE += " }\n";
DESERIALIZE += " break;\n";
};
const generateComparisions = (members) => {

@@ -378,3 +387,3 @@ if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {

DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(firstMemberName) + "));\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(members[0].name) + "));\n";
if (isString(members[0].type))

@@ -391,4 +400,4 @@ DESERIALIZE += indent + " srcStart += 4;\n";

DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(memberName) + "));\n";
if (isString(members[0].type))
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), JSON.__deserialize<" + member.type + ">(lastIndex, srcStart" + (isString(member.type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(member.name) + "));\n";
if (isString(member.type))
DESERIALIZE += indent + " srcStart += 4;\n";

@@ -415,3 +424,3 @@ else if (!complex)

DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
generateComparisions(sortedMembers.string);
generateGroups(sortedMembers.string, generateComparisions);
DESERIALIZE += " }\n";

@@ -430,3 +439,3 @@ DESERIALIZE += " srcStart += 2;\n";

DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
generateComparisions(sortedMembers.number);
generateGroups(sortedMembers.number, generateComparisions);
DESERIALIZE += " }\n";

@@ -452,3 +461,3 @@ DESERIALIZE += " srcStart += 2;\n";

indent = " ";
generateComparisions(sortedMembers.object);
generateGroups(sortedMembers.object, generateComparisions);
indent = "";

@@ -476,3 +485,3 @@ DESERIALIZE += " }\n";

indent = " ";
generateComparisions(sortedMembers.array);
generateGroups(sortedMembers.array, generateComparisions);
indent = "";

@@ -490,39 +499,41 @@ DESERIALIZE += " }\n";

DESERIALIZE += " srcStart += 8;\n";
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < sortedMembers.boolean.length; i++) {
const member = sortedMembers.boolean[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
generateGroups(sortedMembers.boolean, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = group[0].alias || group[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }";

@@ -532,13 +543,21 @@ mbElse = " else ";

DESERIALIZE += " srcStart += 10;\n";
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < sortedMembers.boolean.length; i++) {
const member = sortedMembers.boolean[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
generateGroups(sortedMembers.boolean, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = group[0].alias || group[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";

@@ -548,8 +567,18 @@ DESERIALIZE += indent + " keyStart = 0;\n";

DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }\n";

@@ -562,29 +591,21 @@ DESERIALIZE += " }";

DESERIALIZE += " srcStart += 8;\n";
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < sortedMembers.null.length; i++) {
const member = sortedMembers.null[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
generateGroups(sortedMembers.null, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = group[0].alias || group[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";

@@ -594,8 +615,18 @@ DESERIALIZE += indent + " keyStart = 0;\n";

DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }";

@@ -602,0 +633,0 @@ DESERIALIZE += "\n }";

@@ -13,3 +13,3 @@ 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";

const DEBUG = process.env["JSON_DEBUG"];
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false";
const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false");

@@ -331,3 +331,3 @@ class JSONTransform extends Visitor {

DESERIALIZE += indent + " let keyStart: usize = 0;\n";
if (shouldGroup || DEBUG) DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
DESERIALIZE += indent + " let isKey = false;\n";

@@ -351,3 +351,3 @@ if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";

DESERIALIZE += indent + " keyStart = lastIndex;\n";
if (shouldGroup || DEBUG) DESERIALIZE += indent + " keyEnd = srcStart;\n";
DESERIALIZE += indent + " keyEnd = srcStart;\n";
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n";

@@ -365,23 +365,42 @@ DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n";

const groupMembers = (members: Property[]) => {
let sorted: Property[][] = [];
const groupMembers = (members: Property[]): Property[][] => {
const groups = new Map<number, Property[]>();
let len = -1;
members
.slice()
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length))
.forEach((member) => {
const _nameLength = member.alias?.length || member.name.length;
if (_nameLength === len) {
sorted[sorted.length - 1].push(member);
} else {
sorted.push([member]);
len = _nameLength;
}
});
for (const member of members) {
const name = member.alias || member.name;
const length = name.length;
sorted = sorted.sort((a, b) => b.length - a.length);
return sorted;
if (!groups.has(length)) {
groups.set(length, []);
}
groups.get(length)!.push(member);
}
return [...groups.values()]
.map(group =>
group.sort((a, b) => {
const aLen = (a.alias || a.name).length;
const bLen = (b.alias || b.name).length;
return aLen - bLen;
})
)
.sort((a, b) => b.length - a.length);
};
const generateGroups = (members: Property[], cb: (group: Property[]) => void) => {
const groups = groupMembers(members);
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
for (const group of groups) {
const groupLen = (group[0].alias || group[0].name).length << 1
DESERIALIZE += " case " + groupLen + ": {\n";
cb(group);
DESERIALIZE += "\n }\n";
}
DESERIALIZE += " }\n";
DESERIALIZE += " break;\n";
}
const generateComparisions = (members: Property[]) => {

@@ -407,3 +426,3 @@ if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {

DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(firstMemberName) + "));\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(members[0].name) + "));\n";
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";

@@ -419,4 +438,4 @@ else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";

DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(memberName) + "));\n";
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), JSON.__deserialize<" + member.type + ">(lastIndex, srcStart" + (isString(member.type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(member.name) + "));\n";
if (isString(member.type)) DESERIALIZE += indent + " srcStart += 4;\n";
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";

@@ -437,2 +456,3 @@ DESERIALIZE += indent + " keyStart = 0;\n";

if (sortedMembers.string.length) {
// generateGroups(sortedMembers.string, generateComparisions)
DESERIALIZE += mbElse + "if (code == 34) {\n";

@@ -445,3 +465,3 @@ DESERIALIZE += " lastIndex = srcStart;\n";

// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
generateComparisions(sortedMembers.string);
generateGroups(sortedMembers.string, generateComparisions);
DESERIALIZE += " }\n"; // Close break char check

@@ -463,3 +483,3 @@ DESERIALIZE += " srcStart += 2;\n";

generateComparisions(sortedMembers.number);
generateGroups(sortedMembers.number, generateComparisions);
DESERIALIZE += " }\n"; // Close break char check

@@ -487,3 +507,3 @@ DESERIALIZE += " srcStart += 2;\n";

indent = " ";
generateComparisions(sortedMembers.object);
generateGroups(sortedMembers.object, generateComparisions);
indent = "";

@@ -514,3 +534,3 @@

indent = " ";
generateComparisions(sortedMembers.array);
generateGroups(sortedMembers.array, generateComparisions);
indent = "";

@@ -530,42 +550,46 @@

DESERIALIZE += " srcStart += 8;\n";
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < sortedMembers.boolean.length; i++) {
const member = sortedMembers.boolean[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
generateGroups(sortedMembers.boolean, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = group[0].alias || group[0].name;
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }"; // Close first char check

@@ -576,14 +600,22 @@ mbElse = " else ";

DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
generateGroups(sortedMembers.boolean, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = group[0].alias || group[0].name;
for (let i = 1; i < sortedMembers.boolean.length; i++) {
const member = sortedMembers.boolean[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";

@@ -593,10 +625,20 @@ DESERIALIZE += indent + " keyStart = 0;\n";

DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }\n"; // Close first char check

@@ -611,32 +653,22 @@ DESERIALIZE += " }"; // Close first char check

DESERIALIZE += " srcStart += 8;\n";
generateGroups(sortedMembers.null, (group) => {
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 2)) {
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) {
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) {
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) {
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
}
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) {
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " ");
}
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
for (let i = 1; i < sortedMembers.null.length; i++) {
const member = sortedMembers.null[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
const firstMemberName = group[0].alias || group[0].name;
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";

@@ -646,10 +678,21 @@ DESERIALIZE += indent + " keyStart = 0;\n";

DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
for (let i = 1; i < group.length; i++) {
const member = group[i];
const memberName = member.alias || member.name;
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
DESERIALIZE += indent + " srcStart += 2;\n";
DESERIALIZE += indent + " keyStart = 0;\n";
DESERIALIZE += indent + " break;\n";
DESERIALIZE += indent + " }";
}
if (STRICT) {
DESERIALIZE += " else {\n";
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
DESERIALIZE += indent + " }\n";
}
});
DESERIALIZE += " }"; // Close first char check

@@ -656,0 +699,0 @@ DESERIALIZE += "\n }"; // Close first char check

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet