json-as 0.9.0 → 0.9.2

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.
Files changed (36) hide show
  1. package/CHANGELOG +5 -2
  2. package/README.md +39 -1
  3. package/assembly/deserialize/array/array.ts +4 -4
  4. package/assembly/deserialize/array/bool.ts +4 -4
  5. package/assembly/deserialize/array/float.ts +3 -3
  6. package/assembly/deserialize/array/integer.ts +3 -3
  7. package/assembly/deserialize/array/map.ts +4 -4
  8. package/assembly/deserialize/array/object.ts +4 -4
  9. package/assembly/deserialize/array/string.ts +4 -4
  10. package/assembly/deserialize/array.ts +1 -1
  11. package/assembly/deserialize/bool.ts +4 -4
  12. package/assembly/deserialize/box.ts +2 -2
  13. package/assembly/deserialize/date.ts +1 -1
  14. package/assembly/deserialize/float.ts +1 -1
  15. package/assembly/deserialize/integer.ts +1 -1
  16. package/assembly/deserialize/map.ts +43 -43
  17. package/assembly/deserialize/object.ts +25 -25
  18. package/assembly/deserialize/string.ts +33 -33
  19. package/assembly/index.ts +218 -36
  20. package/assembly/serialize/array.ts +16 -16
  21. package/assembly/serialize/bool.ts +6 -1
  22. package/assembly/serialize/box.ts +4 -3
  23. package/assembly/serialize/date.ts +1 -1
  24. package/assembly/serialize/float.ts +1 -1
  25. package/assembly/serialize/integer.ts +1 -1
  26. package/assembly/serialize/map.ts +7 -7
  27. package/assembly/serialize/object.ts +1 -1
  28. package/assembly/serialize/string.ts +19 -10
  29. package/assembly/src/chars.ts +37 -35
  30. package/assembly/src/sink.ts +17 -17
  31. package/assembly/src/util.ts +15 -15
  32. package/assembly/test.ts +16 -33
  33. package/package.json +2 -2
  34. package/transform/lib/index.js +29 -8
  35. package/transform/package.json +1 -1
  36. package/transform/src/index.ts +33 -9
@@ -1,74 +1,76 @@
1
1
  // Characters
2
2
  // @ts-ignore = Decorator is valid here
3
- @inline export const commaCode = 44;
3
+ export const COMMA = 44;
4
4
  // @ts-ignore = Decorator is valid here
5
- @inline export const quoteCode = 34;
5
+ export const QUOTE = 34;
6
6
  // @ts-ignore = Decorator is valid here
7
- @inline export const backSlashCode = 92;
7
+ export const BACK_SLASH = 92;
8
8
  // @ts-ignore: Decorator is valid here
9
- @inline export const forwardSlashCode = 47;
9
+ export const FWD_SLASH = 47;
10
10
  // @ts-ignore: Decorator is valid here
11
- @inline export const leftBraceCode = 123;
11
+ export const BRACE_LEFT = 123;
12
12
  // @ts-ignore: Decorator is valid here
13
- @inline export const rightBraceCode = 125;
13
+ export const BRACE_RIGHT = 125;
14
14
  // @ts-ignore: Decorator is valid here
15
- @inline export const leftBracketCode = 91;
15
+ export const BRACKET_LEFT = 91;
16
16
  // @ts-ignore: Decorator is valid here
17
- @inline export const rightBracketCode = 93;
17
+ export const BRACKET_RIGHT = 93;
18
18
  // @ts-ignore: Decorator is valid here
19
- @inline export const colonCode = 58;
19
+ export const COLON = 58;
20
20
  // @ts-ignore: Decorator is valid here
21
- @inline export const tCode = 116;
21
+ export const CHAR_T = 116;
22
22
  // @ts-ignore: Decorator is valid here
23
- @inline export const rCode = 114;
23
+ export const CHAR_R = 114;
24
24
  // @ts-ignore: Decorator is valid here
25
- @inline export const uCode = 117;
25
+ export const CHAR_U = 117;
26
26
  // @ts-ignore: Decorator is valid here
27
- @inline export const eCode = 101;
27
+ export const CHAR_E = 101;
28
28
  // @ts-ignore: Decorator is valid here
29
- @inline export const fCode = 102;
29
+ export const CHAR_F = 102;
30
30
  // @ts-ignore: Decorator is valid here
31
- @inline export const aCode = 97;
31
+ export const CHAR_A = 97;
32
32
  // @ts-ignore: Decorator is valid here
33
- @inline export const lCode = 108;
33
+ export const CHAR_L = 108;
34
34
  // @ts-ignore: Decorator is valid here
35
- @inline export const sCode = 115;
35
+ export const CHAR_S = 115;
36
36
  // @ts-ignore = Decorator is valid here
37
- @inline export const nCode = 110;
37
+ export const CHAR_N = 110;
38
38
  // @ts-ignore = Decorator is valid here
39
- @inline export const bCode = 98;
39
+ export const CHAR_B = 98;
40
40
  // Strings
41
41
  // @ts-ignore: Decorator is valid here
42
- @inline export const trueWord = "true";
42
+ export const TRUE_WORD = "true";
43
43
  // @ts-ignore: Decorator is valid here
44
- @inline export const falseWord = "false";
44
+ export const FALSE_WORD = "false";
45
45
  // @ts-ignore: Decorator is valid here
46
- @inline export const nullWord = "null";
46
+ export const NULL_WORD = "null";
47
47
  // @ts-ignore: Decorator is valid here
48
- @inline export const leftBraceWord = "{";
48
+ export const BRACE_LEFT_WORD = "{";
49
49
  // @ts-ignore: Decorator is valid here
50
- @inline export const leftBracketWord = "[";
50
+ export const BRACKET_LEFT_WORD = "[";
51
51
  // @ts-ignore: Decorator is valid here
52
- @inline export const emptyArrayWord = "[]";
52
+ export const EMPTY_BRACKET_WORD = "[]";
53
53
  // @ts-ignore: Decorator is valid here
54
- @inline export const colonWord = ":";
54
+ export const COLON_WORD = ":";
55
55
  // @ts-ignore: Decorator is valid here
56
- @inline export const commaWord = ",";
56
+ export const COMMA_WORD = ",";
57
57
  // @ts-ignore: Decorator is valid here
58
- @inline export const rightBraceWord = "}";
58
+ export const BRACE_RIGHT_WORD = "}";
59
59
  // @ts-ignore: Decorator is valid here
60
- @inline export const rightBracketWord = "]";
60
+ export const BRACKET_RIGHT_WORD = "]";
61
61
  // @ts-ignore: Decorator is valid here
62
- @inline export const quoteWord = "\"";
62
+ export const QUOTE_WORD = "\"";
63
+ // @ts-ignore: Decorator is valid here
64
+ export const EMPTY_QUOTE_WORD = "\"\"";
63
65
 
64
66
  // Escape Codes
65
67
  // @ts-ignore: Decorator is valid here
66
- @inline export const backspaceCode = 8; // \b
68
+ export const BACKSPACE = 8; // \b
67
69
  // @ts-ignore: Decorator is valid here
68
- @inline export const tabCode = 9; // \t
70
+ export const TAB = 9; // \t
69
71
  // @ts-ignore: Decorator is valid here
70
- @inline export const newLineCode = 10; // \n
72
+ export const NEW_LINE = 10; // \n
71
73
  // @ts-ignore: Decorator is valid here
72
- @inline export const formFeedCode = 12; // \f
74
+ export const FORM_FEED = 12; // \f
73
75
  // @ts-ignore: Decorator is valid here
74
- @inline export const carriageReturnCode = 13; // \r
76
+ export const CARRIAGE_RETURN = 13; // \r
@@ -6,7 +6,7 @@ const MIN_BUFFER_SIZE: u32 = MIN_BUFFER_LEN << 1;
6
6
  const NEW_LINE_CHAR: u16 = 0x0A; // \n
7
7
 
8
8
  // @ts-ignore: decorator
9
- @inline function nextPowerOf2(n: u32): u32 {
9
+ function nextPowerOf2(n: u32): u32 {
10
10
  return 1 << 32 - clz(n - 1);
11
11
  }
12
12
 
@@ -79,17 +79,17 @@ export class Sink {
79
79
 
80
80
  constructor() { }
81
81
 
82
- @inline get length(): i32 {
82
+ get length(): i32 {
83
83
  return this.offset >> 1;
84
84
  }
85
85
 
86
- @inline get capacity(): i32 {
86
+ get capacity(): i32 {
87
87
  return this.buffer.byteLength >>> 1;
88
88
  }
89
- @inline reset(): void {
89
+ reset(): void {
90
90
  this.offset = 0;
91
91
  }
92
- @inline write(src: string, start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink | null {
92
+ write(src: string, start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink | null {
93
93
  let len = src.length as u32;
94
94
 
95
95
  if (start != 0 || end != i32.MAX_VALUE) {
@@ -116,7 +116,7 @@ export class Sink {
116
116
  return this;
117
117
  }
118
118
 
119
- @inline writeLn(src: string = "", start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink {
119
+ writeLn(src: string = "", start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink {
120
120
  let len = src.length as u32;
121
121
  if (start != 0 || end != i32.MAX_VALUE) {
122
122
  let from: i32;
@@ -137,7 +137,7 @@ export class Sink {
137
137
  return this;
138
138
  }
139
139
 
140
- @inline writeCodePoint(code: i32): Sink {
140
+ writeCodePoint(code: i32): Sink {
141
141
  let hasSur = <u32>code > 0xFFFF;
142
142
  this.ensureCapacity(2 << i32(hasSur));
143
143
 
@@ -158,7 +158,7 @@ export class Sink {
158
158
  return this;
159
159
  }
160
160
 
161
- @inline writeCodePoint16(code: i32): Sink {
161
+ writeCodePoint16(code: i32): Sink {
162
162
  this.ensureCapacity(2);
163
163
 
164
164
  let offset = this.offset;
@@ -170,7 +170,7 @@ export class Sink {
170
170
  return this;
171
171
  }
172
172
 
173
- @inline writeCodePointUnsafe(code: i32): Sink {
173
+ writeCodePointUnsafe(code: i32): Sink {
174
174
  this.ensureCapacity(2);
175
175
 
176
176
  let offset = this.offset;
@@ -184,7 +184,7 @@ export class Sink {
184
184
  return this;
185
185
  }
186
186
 
187
- @inline writeNumber<T extends number>(value: T): Sink {
187
+ writeNumber<T extends number>(value: T): Sink {
188
188
  let offset = this.offset;
189
189
  if (isInteger<T>()) {
190
190
  let maxCapacity = 0;
@@ -213,7 +213,7 @@ export class Sink {
213
213
  this.offset = offset;
214
214
  return this;
215
215
  }
216
- @inline writeNumberUnsafe<T extends number>(value: T): Sink {
216
+ writeNumberUnsafe<T extends number>(value: T): Sink {
217
217
  let offset = this.offset;
218
218
  if (isInteger<T>()) {
219
219
  offset += itoa_buffered(
@@ -229,7 +229,7 @@ export class Sink {
229
229
  this.offset = offset;
230
230
  return this;
231
231
  }
232
- @inline writeIntegerUnsafe<T extends number>(value: T): Sink {
232
+ writeIntegerUnsafe<T extends number>(value: T): Sink {
233
233
  let offset = this.offset;
234
234
  if (isInteger<T>()) {
235
235
  offset += itoa_buffered(
@@ -246,7 +246,7 @@ export class Sink {
246
246
  return this;
247
247
  }
248
248
 
249
- @inline reserve(capacity: i32, clear: bool = false): void {
249
+ reserve(capacity: i32, clear: bool = false): void {
250
250
  if (clear) this.offset = 0;
251
251
  this.buffer = changetype<ArrayBuffer>(__renew(
252
252
  changetype<usize>(this.buffer),
@@ -254,18 +254,18 @@ export class Sink {
254
254
  ));
255
255
  }
256
256
 
257
- @inline shrink(): void {
257
+ shrink(): void {
258
258
  this.buffer = changetype<ArrayBuffer>(__renew(
259
259
  changetype<usize>(this.buffer),
260
260
  max<u32>(this.offset, MIN_BUFFER_SIZE)
261
261
  ));
262
262
  }
263
263
 
264
- @inline clear(): void {
264
+ clear(): void {
265
265
  this.reserve(0, true);
266
266
  }
267
267
 
268
- @inline toString(): string {
268
+ toString(): string {
269
269
  let size = this.offset;
270
270
  if (!size) return "";
271
271
  let out = changetype<string>(__new(size, idof<string>()));
@@ -273,7 +273,7 @@ export class Sink {
273
273
  return out;
274
274
  }
275
275
 
276
- @inline ensureCapacity(deltaBytes: u32): void {
276
+ ensureCapacity(deltaBytes: u32): void {
277
277
  let buffer = this.buffer;
278
278
  let newSize = this.offset + deltaBytes;
279
279
  if (newSize > <u32>buffer.byteLength) {
@@ -1,28 +1,28 @@
1
1
  import { StringSink } from "as-string-sink/assembly";
2
2
  import { isSpace } from "util/string";
3
- import { backSlashCode, quoteCode } from "./chars";
3
+ import { BACK_SLASH, QUOTE } from "./chars";
4
4
 
5
5
  // @ts-ignore: Decorator
6
- @inline export function isMap<T>(): bool {
6
+ export function isMap<T>(): bool {
7
7
  let type = changetype<T>(0);
8
8
  return type instanceof Map;
9
9
  }
10
10
 
11
11
  // @ts-ignore: Decorator
12
- @inline export function unsafeCharCodeAt(data: string, pos: i32): i32 {
12
+ export function unsafeCharCodeAt(data: string, pos: i32): i32 {
13
13
  return load<u16>(changetype<usize>(data) + ((<usize>pos) << 1));
14
14
  }
15
15
 
16
16
  // @ts-ignore: Decorator
17
- @inline export function removeWhitespace(data: string): string {
17
+ export function removeWhitespace(data: string): string {
18
18
  const result = new StringSink();
19
19
  let instr = false;
20
20
  for (let i = 0; i < data.length; i++) {
21
21
  const char = unsafeCharCodeAt(data, i);
22
- if (instr === false && char === quoteCode) instr = true;
22
+ if (instr === false && char === QUOTE) instr = true;
23
23
  else if (
24
- instr === true && char === quoteCode
25
- && unsafeCharCodeAt(data, i - 1) !== backSlashCode
24
+ instr === true && char === QUOTE
25
+ && unsafeCharCodeAt(data, i - 1) !== BACK_SLASH
26
26
  ) instr = false;
27
27
 
28
28
  if (instr === false) {
@@ -35,7 +35,7 @@ import { backSlashCode, quoteCode } from "./chars";
35
35
  }
36
36
 
37
37
  // @ts-ignore: Decorator
38
- @inline export function escapeChar(char: string): string {
38
+ export function escapeChar(char: string): string {
39
39
  switch (unsafeCharCodeAt(char, 0)) {
40
40
  case 0x22:
41
41
  return '\\"';
@@ -65,7 +65,7 @@ import { backSlashCode, quoteCode } from "./chars";
65
65
  */
66
66
 
67
67
  // @ts-ignore: Decorator
68
- @inline export function getArrayDepth<T extends ArrayLike>(depth: i32 = 1): i32 {
68
+ export function getArrayDepth<T extends ArrayLike>(depth: i32 = 1): i32 {
69
69
  if (!isArray<T>()) {
70
70
  return 0;
71
71
  } else if (isArray<valueof<T>>()) {
@@ -93,7 +93,7 @@ import { backSlashCode, quoteCode } from "./chars";
93
93
  * @param str - Any number. Can include scientific notation.
94
94
  */
95
95
  // @ts-ignore: Decorator
96
- @inline export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
96
+ export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
97
97
  if (isSigned<T>()) {
98
98
  const firstChar: u32 = load<u16>(changetype<usize>(str));
99
99
  if (firstChar === 48) return 0 as T;
@@ -258,7 +258,7 @@ import { backSlashCode, quoteCode } from "./chars";
258
258
  */
259
259
 
260
260
  // @ts-ignore
261
- @global @inline export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
261
+ @global export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
262
262
  // @ts-ignore
263
263
  let val: T = 0;
264
264
  if (!end) end = start + u32(str.length << 1);
@@ -293,7 +293,7 @@ import { backSlashCode, quoteCode } from "./chars";
293
293
  */
294
294
 
295
295
  // @ts-ignore
296
- @inline export function parseSciInteger<T extends number>(str: string): T {
296
+ export function parseSciInteger<T extends number>(str: string): T {
297
297
  // @ts-ignore
298
298
  let val: T = 0;
299
299
  let offset = 0;
@@ -328,7 +328,7 @@ import { backSlashCode, quoteCode } from "./chars";
328
328
  }
329
329
 
330
330
  // @ts-ignore
331
- @inline function sciNote<T extends number>(num: T): T {
331
+ function sciNote<T extends number>(num: T): T {
332
332
  let res = 1;
333
333
  // @ts-ignore
334
334
  if (num > 0) {
@@ -345,7 +345,7 @@ import { backSlashCode, quoteCode } from "./chars";
345
345
  }
346
346
 
347
347
  // @ts-ignore
348
- @inline function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
348
+ function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
349
349
  const p1_len = p1_end - p1_start;
350
350
  const p2_len = p2_end - p2_start;
351
351
  if (p1_len != p2_len) return false;
@@ -356,7 +356,7 @@ import { backSlashCode, quoteCode } from "./chars";
356
356
  }
357
357
 
358
358
  // @ts-ignore
359
- @inline export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
359
+ export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
360
360
  for (let i = start; i <= end; i++) {
361
361
  if (unsafeCharCodeAt(str, i) == code) return true;
362
362
  }
package/assembly/test.ts CHANGED
@@ -1,41 +1,24 @@
1
1
  import { JSON } from ".";
2
2
 
3
3
  @json
4
- class Vec3 {
5
- x: f32 = 0.0;
6
- y: f32 = 0.0;
7
- z: f32 = 0.0;
4
+ class Base {}
5
+ @json
6
+ class Vec1 extends Base {
7
+ x: f32 = 1.0;
8
8
  }
9
-
10
9
  @json
11
- class Player {
12
- @alias("first name")
13
- firstName!: string;
14
- lastName!: string;
15
- lastActive!: i32[];
16
- @omitif("this.age < 18")
17
- age!: i32;
18
- @omitnull()
19
- pos!: Vec3 | null;
20
- isVerified!: boolean;
10
+ class Vec2 extends Vec1 {
11
+ y: f32 = 2.0;
12
+ }
13
+ @json
14
+ class Vec3 extends Vec2 {
15
+ z: f32 = 3.0;
21
16
  }
22
17
 
23
- const player: Player = {
24
- firstName: "Emmet",
25
- lastName: "West",
26
- lastActive: [8, 27, 2022],
27
- age: 13,
28
- pos: {
29
- x: 3.4,
30
- y: 1.2,
31
- z: 8.3
32
- },
33
- isVerified: true
34
- };
35
-
36
- const stringified = JSON.stringify<Player>(player);
37
-
38
- const parsed = JSON.parse<Player>(stringified);
18
+ const arr: Base[] = [
19
+ new Vec1(),
20
+ new Vec2(),
21
+ new Vec3()
22
+ ];
39
23
 
40
- console.log("Stringified: " + stringified);
41
- console.log("Parsed: " + JSON.stringify(parsed));
24
+ console.log(JSON.stringify(arr));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "JSON encoder/decoder for AssemblyScript",
5
5
  "types": "assembly/index.ts",
6
6
  "author": "Jairus Tanaka",
@@ -20,7 +20,7 @@
20
20
  "build:test": "asc assembly/test.ts -o build/test.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 0 --shrinkLevel 0 --noAssert --uncheckedBehavior always",
21
21
  "build:bench": "asc bench/benchmark.ts -o bench/benchmark.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime stub",
22
22
  "bench:wasmtime": "wasmtime ./bench/benchmark.wasm",
23
- "bench:wazmer": "wasmer --llvm ./bench/benchmark.wasm",
23
+ "bench:wasmer": "wasmer --llvm ./bench/benchmark.wasm",
24
24
  "build:transform": "tsc -p ./transform",
25
25
  "test:wasmtime": "wasmtime ./build/test.wasm",
26
26
  "test:wavm": "wavm run ./build/test.wasm",
@@ -1,4 +1,4 @@
1
- import { FieldDeclaration, } from "assemblyscript/dist/assemblyscript.js";
1
+ import { FieldDeclaration } from "assemblyscript/dist/assemblyscript.js";
2
2
  import { toString, isStdlib } from "visitor-as/dist/utils.js";
3
3
  import { BaseVisitor, SimpleParser } from "visitor-as/dist/index.js";
4
4
  import { Transform } from "assemblyscript/dist/transform.js";
@@ -12,8 +12,6 @@ class JSONTransform extends BaseVisitor {
12
12
  visitClassDeclaration(node) {
13
13
  if (!node.decorators?.length)
14
14
  return;
15
- if (!node.members?.length)
16
- return;
17
15
  let found = false;
18
16
  for (const decorator of node.decorators) {
19
17
  const name = decorator.name.text;
@@ -28,7 +26,7 @@ class JSONTransform extends BaseVisitor {
28
26
  schema.node = node;
29
27
  schema.name = node.name.text;
30
28
  const members = [
31
- ...node.members
29
+ ...node.members.filter(v => v instanceof FieldDeclaration)
32
30
  ];
33
31
  if (node.extendsType) {
34
32
  schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text);
@@ -40,6 +38,29 @@ class JSONTransform extends BaseVisitor {
40
38
  }
41
39
  }
42
40
  }
41
+ if (!members.length) {
42
+ let SERIALIZE_RAW_EMPTY = "__SERIALIZE(): string {\n return \"{}\";\n}";
43
+ //let SERIALIZE_PRETTY_EMPTY = "__SERIALIZE_PRETTY(): string {\n return \"{}\";\n}";
44
+ let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}";
45
+ let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
46
+ if (process.env["JSON_DEBUG"]) {
47
+ console.log(SERIALIZE_RAW_EMPTY);
48
+ //console.log(SERIALIZE_PRETTY_EMPTY);
49
+ console.log(INITIALIZE_EMPTY);
50
+ console.log(DESERIALIZE_EMPTY);
51
+ }
52
+ const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
53
+ //const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
54
+ const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
55
+ const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
56
+ if (!node.members.find(v => v.name.text == "__SERIALIZE"))
57
+ node.members.push(SERIALIZE_RAW_METHOD_EMPTY);
58
+ if (!node.members.find(v => v.name.text == "__INITIALIZE"))
59
+ node.members.push(INITIALIZE_METHOD_EMPTY);
60
+ if (!node.members.find(v => v.name.text == "__DESERIALIZE"))
61
+ node.members.push(DESERIALIZE_METHOD_EMPTY);
62
+ this.schemasList.push(schema);
63
+ }
43
64
  for (const member of members) {
44
65
  if (!(member instanceof FieldDeclaration))
45
66
  continue;
@@ -109,10 +130,10 @@ class JSONTransform extends BaseVisitor {
109
130
  }
110
131
  schema.members.push(mem);
111
132
  }
112
- let SERIALIZE_RAW = "@inline __SERIALIZE(): string {\n let out = `{";
113
- let SERIALIZE_PRETTY = "@inline __SERIALIZE_PRETTY(): string {\n let out = `{";
114
- let INITIALIZE = "@inline __INITIALIZE(): this {\n";
115
- let DESERIALIZE = "@inline __DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n";
133
+ let SERIALIZE_RAW = "__SERIALIZE(): string {\n let out = `{";
134
+ let SERIALIZE_PRETTY = "__SERIALIZE_PRETTY(): string {\n let out = `{";
135
+ let INITIALIZE = "__INITIALIZE(): this {\n";
136
+ let DESERIALIZE = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n";
116
137
  let indent = " ";
117
138
  if (!schema.members.length)
118
139
  return;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@json-as/transform",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "JSON encoder/decoder for AssemblyScript",
5
5
  "main": "./lib/index.js",
6
6
  "author": "Jairus Tanaka",
@@ -5,9 +5,7 @@ import {
5
5
  NamedTypeNode,
6
6
  StringLiteralExpression,
7
7
  Parser,
8
- Source,
9
- SourceKind,
10
- Tokenizer,
8
+ Source
11
9
  } from "assemblyscript/dist/assemblyscript.js";
12
10
 
13
11
  import { toString, isStdlib } from "visitor-as/dist/utils.js";
@@ -23,7 +21,6 @@ class JSONTransform extends BaseVisitor {
23
21
  visitMethodDeclaration(): void { }
24
22
  visitClassDeclaration(node: ClassDeclaration): void {
25
23
  if (!node.decorators?.length) return;
26
- if (!node.members?.length) return;
27
24
 
28
25
  let found = false;
29
26
  for (const decorator of node.decorators) {
@@ -40,7 +37,7 @@ class JSONTransform extends BaseVisitor {
40
37
  schema.name = node.name.text;
41
38
 
42
39
  const members = [
43
- ...node.members
40
+ ...node.members.filter(v => v instanceof FieldDeclaration)
44
41
  ];
45
42
 
46
43
  if (node.extendsType) {
@@ -58,6 +55,33 @@ class JSONTransform extends BaseVisitor {
58
55
  }
59
56
  }
60
57
 
58
+ if (!members.length) {
59
+ let SERIALIZE_RAW_EMPTY = "__SERIALIZE(): string {\n return \"{}\";\n}";
60
+ //let SERIALIZE_PRETTY_EMPTY = "__SERIALIZE_PRETTY(): string {\n return \"{}\";\n}";
61
+
62
+ let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}";
63
+
64
+ let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
65
+
66
+ if (process.env["JSON_DEBUG"]) {
67
+ console.log(SERIALIZE_RAW_EMPTY);
68
+ //console.log(SERIALIZE_PRETTY_EMPTY);
69
+ console.log(INITIALIZE_EMPTY);
70
+ console.log(DESERIALIZE_EMPTY);
71
+ }
72
+
73
+ const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
74
+ //const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
75
+ const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
76
+ const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
77
+
78
+ if (!node.members.find(v => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD_EMPTY);
79
+ if (!node.members.find(v => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD_EMPTY);
80
+ if (!node.members.find(v => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD_EMPTY);
81
+
82
+ this.schemasList.push(schema);
83
+ }
84
+
61
85
  for (const member of members) {
62
86
  if (!(member instanceof FieldDeclaration)) continue;
63
87
  const name = member.name;
@@ -122,12 +146,12 @@ class JSONTransform extends BaseVisitor {
122
146
  schema.members.push(mem);
123
147
  }
124
148
 
125
- let SERIALIZE_RAW = "@inline __SERIALIZE(): string {\n let out = `{";
126
- let SERIALIZE_PRETTY = "@inline __SERIALIZE_PRETTY(): string {\n let out = `{";
149
+ let SERIALIZE_RAW = "__SERIALIZE(): string {\n let out = `{";
150
+ let SERIALIZE_PRETTY = "__SERIALIZE_PRETTY(): string {\n let out = `{";
127
151
 
128
- let INITIALIZE = "@inline __INITIALIZE(): this {\n";
152
+ let INITIALIZE = "__INITIALIZE(): this {\n";
129
153
 
130
- let DESERIALIZE = "@inline __DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n"
154
+ let DESERIALIZE = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n"
131
155
  let indent = " ";
132
156
 
133
157
  if (!schema.members.length) return;