json-as 1.3.0 → 1.3.1

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 (256) hide show
  1. package/CHANGELOG.md +417 -0
  2. package/README.md +96 -14
  3. package/assembly/deserialize/index/typedarray.ts +14 -0
  4. package/assembly/deserialize/simd/string.ts +3 -3
  5. package/assembly/deserialize/simple/string.ts +88 -2
  6. package/assembly/deserialize/swar/string.ts +8 -11
  7. package/assembly/index.ts +137 -181
  8. package/assembly/serialize/index/arbitrary.ts +5 -0
  9. package/assembly/serialize/index/typedarray.ts +65 -0
  10. package/assembly/serialize/simd/string.ts +3 -11
  11. package/assembly/serialize/simple/arbitrary.ts +6 -0
  12. package/assembly/serialize/simple/string.ts +3 -11
  13. package/assembly/serialize/swar/string.ts +3 -11
  14. package/assembly/util/swar.ts +49 -0
  15. package/lib/as-bs.ts +88 -69
  16. package/package.json +19 -1
  17. package/transform/lib/index.d.ts +1 -0
  18. package/transform/lib/index.d.ts.map +1 -1
  19. package/transform/lib/index.js +153 -32
  20. package/transform/lib/index.js.map +1 -1
  21. package/transform/lib/linkers/custom.d.ts.map +1 -1
  22. package/transform/lib/linkers/custom.js +7 -3
  23. package/transform/lib/linkers/custom.js.map +1 -1
  24. package/transform/lib/types.d.ts +2 -0
  25. package/transform/lib/types.d.ts.map +1 -1
  26. package/transform/lib/types.js +13 -0
  27. package/transform/lib/types.js.map +1 -1
  28. package/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +0 -5628
  29. package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +0 -5187
  30. package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +0 -5187
  31. package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +0 -5187
  32. package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +0 -5187
  33. package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +0 -5187
  34. package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +0 -5187
  35. package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +0 -5187
  36. package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +0 -5187
  37. package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +0 -5187
  38. package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +0 -5187
  39. package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +0 -5187
  40. package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +0 -5187
  41. package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +0 -5187
  42. package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +0 -5187
  43. package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +0 -5628
  44. package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +0 -5187
  45. package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +0 -5187
  46. package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +0 -5187
  47. package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +0 -5187
  48. package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +0 -5187
  49. package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +0 -5628
  50. package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +0 -5187
  51. package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +0 -5187
  52. package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +0 -5187
  53. package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +0 -5187
  54. package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +0 -5187
  55. package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +0 -5187
  56. package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +0 -5187
  57. package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +0 -5187
  58. package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +0 -5187
  59. package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +0 -5187
  60. package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +0 -5187
  61. package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +0 -5187
  62. package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +0 -5187
  63. package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +0 -5187
  64. package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +0 -5628
  65. package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +0 -5187
  66. package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +0 -5187
  67. package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +0 -5187
  68. package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +0 -5187
  69. package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +0 -5187
  70. package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +0 -5628
  71. package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +0 -5187
  72. package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +0 -5187
  73. package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +0 -5187
  74. package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +0 -5187
  75. package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +0 -5187
  76. package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +0 -5187
  77. package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +0 -5187
  78. package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +0 -5187
  79. package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +0 -5187
  80. package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +0 -5187
  81. package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +0 -5187
  82. package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +0 -5187
  83. package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +0 -5187
  84. package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +0 -5187
  85. package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +0 -5628
  86. package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +0 -5187
  87. package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +0 -5187
  88. package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +0 -5187
  89. package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +0 -5187
  90. package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +0 -5187
  91. package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +0 -943
  92. package/.as-test/logs/naive/run.array.spec.ts.log.json +0 -1053
  93. package/.as-test/logs/naive/run.bool.spec.ts.log.json +0 -257
  94. package/.as-test/logs/naive/run.box.spec.ts.log.json +0 -353
  95. package/.as-test/logs/naive/run.custom.spec.ts.log.json +0 -309
  96. package/.as-test/logs/naive/run.date.spec.ts.log.json +0 -397
  97. package/.as-test/logs/naive/run.enum.spec.ts.log.json +0 -343
  98. package/.as-test/logs/naive/run.float.spec.ts.log.json +0 -453
  99. package/.as-test/logs/naive/run.generics.spec.ts.log.json +0 -393
  100. package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +0 -325
  101. package/.as-test/logs/naive/run.integer.spec.ts.log.json +0 -373
  102. package/.as-test/logs/naive/run.map.spec.ts.log.json +0 -247
  103. package/.as-test/logs/naive/run.namespace.spec.ts.log.json +0 -361
  104. package/.as-test/logs/naive/run.null.spec.ts.log.json +0 -273
  105. package/.as-test/logs/naive/run.raw.spec.ts.log.json +0 -309
  106. package/.as-test/logs/naive/run.resolving.spec.ts.log.json +0 -273
  107. package/.as-test/logs/naive/run.set.spec.ts.log.json +0 -733
  108. package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +0 -931
  109. package/.as-test/logs/naive/run.string.spec.ts.log.json +0 -2289
  110. package/.as-test/logs/naive/run.struct.spec.ts.log.json +0 -523
  111. package/.as-test/logs/naive/run.types.spec.ts.log.json +0 -273
  112. package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +0 -943
  113. package/.as-test/logs/naive/test.array.spec.ts.log.json +0 -1053
  114. package/.as-test/logs/naive/test.bool.spec.ts.log.json +0 -257
  115. package/.as-test/logs/naive/test.box.spec.ts.log.json +0 -353
  116. package/.as-test/logs/naive/test.custom.spec.ts.log.json +0 -309
  117. package/.as-test/logs/naive/test.date.spec.ts.log.json +0 -397
  118. package/.as-test/logs/naive/test.enum.spec.ts.log.json +0 -343
  119. package/.as-test/logs/naive/test.float.spec.ts.log.json +0 -453
  120. package/.as-test/logs/naive/test.generics.spec.ts.log.json +0 -393
  121. package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +0 -325
  122. package/.as-test/logs/naive/test.integer.spec.ts.log.json +0 -373
  123. package/.as-test/logs/naive/test.log.json +0 -2289
  124. package/.as-test/logs/naive/test.map.spec.ts.log.json +0 -247
  125. package/.as-test/logs/naive/test.namespace.spec.ts.log.json +0 -361
  126. package/.as-test/logs/naive/test.null.spec.ts.log.json +0 -273
  127. package/.as-test/logs/naive/test.raw.spec.ts.log.json +0 -309
  128. package/.as-test/logs/naive/test.resolving.spec.ts.log.json +0 -273
  129. package/.as-test/logs/naive/test.set.spec.ts.log.json +0 -733
  130. package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +0 -931
  131. package/.as-test/logs/naive/test.string.spec.ts.log.json +0 -2345
  132. package/.as-test/logs/naive/test.struct.spec.ts.log.json +0 -523
  133. package/.as-test/logs/naive/test.types.spec.ts.log.json +0 -273
  134. package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +0 -943
  135. package/.as-test/logs/simd/run.array.spec.ts.log.json +0 -1053
  136. package/.as-test/logs/simd/run.bool.spec.ts.log.json +0 -257
  137. package/.as-test/logs/simd/run.box.spec.ts.log.json +0 -353
  138. package/.as-test/logs/simd/run.custom.spec.ts.log.json +0 -309
  139. package/.as-test/logs/simd/run.date.spec.ts.log.json +0 -397
  140. package/.as-test/logs/simd/run.enum.spec.ts.log.json +0 -343
  141. package/.as-test/logs/simd/run.float.spec.ts.log.json +0 -453
  142. package/.as-test/logs/simd/run.generics.spec.ts.log.json +0 -393
  143. package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +0 -325
  144. package/.as-test/logs/simd/run.integer.spec.ts.log.json +0 -373
  145. package/.as-test/logs/simd/run.map.spec.ts.log.json +0 -247
  146. package/.as-test/logs/simd/run.namespace.spec.ts.log.json +0 -361
  147. package/.as-test/logs/simd/run.null.spec.ts.log.json +0 -273
  148. package/.as-test/logs/simd/run.raw.spec.ts.log.json +0 -309
  149. package/.as-test/logs/simd/run.resolving.spec.ts.log.json +0 -273
  150. package/.as-test/logs/simd/run.set.spec.ts.log.json +0 -733
  151. package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +0 -931
  152. package/.as-test/logs/simd/run.string.spec.ts.log.json +0 -2289
  153. package/.as-test/logs/simd/run.struct.spec.ts.log.json +0 -523
  154. package/.as-test/logs/simd/run.types.spec.ts.log.json +0 -273
  155. package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +0 -943
  156. package/.as-test/logs/simd/test.array.spec.ts.log.json +0 -1053
  157. package/.as-test/logs/simd/test.bool.spec.ts.log.json +0 -257
  158. package/.as-test/logs/simd/test.box.spec.ts.log.json +0 -353
  159. package/.as-test/logs/simd/test.custom.spec.ts.log.json +0 -309
  160. package/.as-test/logs/simd/test.date.spec.ts.log.json +0 -397
  161. package/.as-test/logs/simd/test.enum.spec.ts.log.json +0 -343
  162. package/.as-test/logs/simd/test.float.spec.ts.log.json +0 -453
  163. package/.as-test/logs/simd/test.generics.spec.ts.log.json +0 -393
  164. package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +0 -325
  165. package/.as-test/logs/simd/test.integer.spec.ts.log.json +0 -373
  166. package/.as-test/logs/simd/test.log.json +0 -11371
  167. package/.as-test/logs/simd/test.map.spec.ts.log.json +0 -247
  168. package/.as-test/logs/simd/test.namespace.spec.ts.log.json +0 -361
  169. package/.as-test/logs/simd/test.null.spec.ts.log.json +0 -273
  170. package/.as-test/logs/simd/test.raw.spec.ts.log.json +0 -309
  171. package/.as-test/logs/simd/test.resolving.spec.ts.log.json +0 -273
  172. package/.as-test/logs/simd/test.set.spec.ts.log.json +0 -733
  173. package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +0 -931
  174. package/.as-test/logs/simd/test.string.spec.ts.log.json +0 -2345
  175. package/.as-test/logs/simd/test.struct.spec.ts.log.json +0 -523
  176. package/.as-test/logs/simd/test.types.spec.ts.log.json +0 -273
  177. package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +0 -943
  178. package/.as-test/logs/swar/run.array.spec.ts.log.json +0 -1053
  179. package/.as-test/logs/swar/run.bool.spec.ts.log.json +0 -257
  180. package/.as-test/logs/swar/run.box.spec.ts.log.json +0 -353
  181. package/.as-test/logs/swar/run.custom.spec.ts.log.json +0 -309
  182. package/.as-test/logs/swar/run.date.spec.ts.log.json +0 -397
  183. package/.as-test/logs/swar/run.enum.spec.ts.log.json +0 -343
  184. package/.as-test/logs/swar/run.float.spec.ts.log.json +0 -453
  185. package/.as-test/logs/swar/run.generics.spec.ts.log.json +0 -393
  186. package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +0 -325
  187. package/.as-test/logs/swar/run.integer.spec.ts.log.json +0 -373
  188. package/.as-test/logs/swar/run.map.spec.ts.log.json +0 -247
  189. package/.as-test/logs/swar/run.namespace.spec.ts.log.json +0 -361
  190. package/.as-test/logs/swar/run.null.spec.ts.log.json +0 -273
  191. package/.as-test/logs/swar/run.raw.spec.ts.log.json +0 -309
  192. package/.as-test/logs/swar/run.resolving.spec.ts.log.json +0 -273
  193. package/.as-test/logs/swar/run.set.spec.ts.log.json +0 -733
  194. package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +0 -931
  195. package/.as-test/logs/swar/run.string.spec.ts.log.json +0 -2289
  196. package/.as-test/logs/swar/run.struct.spec.ts.log.json +0 -523
  197. package/.as-test/logs/swar/run.types.spec.ts.log.json +0 -273
  198. package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +0 -943
  199. package/.as-test/logs/swar/test.array.spec.ts.log.json +0 -1053
  200. package/.as-test/logs/swar/test.bool.spec.ts.log.json +0 -257
  201. package/.as-test/logs/swar/test.box.spec.ts.log.json +0 -353
  202. package/.as-test/logs/swar/test.custom.spec.ts.log.json +0 -309
  203. package/.as-test/logs/swar/test.date.spec.ts.log.json +0 -397
  204. package/.as-test/logs/swar/test.enum.spec.ts.log.json +0 -343
  205. package/.as-test/logs/swar/test.float.spec.ts.log.json +0 -453
  206. package/.as-test/logs/swar/test.generics.spec.ts.log.json +0 -393
  207. package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +0 -325
  208. package/.as-test/logs/swar/test.integer.spec.ts.log.json +0 -373
  209. package/.as-test/logs/swar/test.log.json +0 -11371
  210. package/.as-test/logs/swar/test.map.spec.ts.log.json +0 -247
  211. package/.as-test/logs/swar/test.namespace.spec.ts.log.json +0 -361
  212. package/.as-test/logs/swar/test.null.spec.ts.log.json +0 -273
  213. package/.as-test/logs/swar/test.raw.spec.ts.log.json +0 -309
  214. package/.as-test/logs/swar/test.resolving.spec.ts.log.json +0 -273
  215. package/.as-test/logs/swar/test.set.spec.ts.log.json +0 -733
  216. package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +0 -931
  217. package/.as-test/logs/swar/test.string.spec.ts.log.json +0 -2345
  218. package/.as-test/logs/swar/test.struct.spec.ts.log.json +0 -523
  219. package/.as-test/logs/swar/test.types.spec.ts.log.json +0 -273
  220. package/.as-test/logs/test.arbitrary.spec.ts.log.json +0 -943
  221. package/.as-test/logs/test.array.spec.ts.log.json +0 -1053
  222. package/.as-test/logs/test.bool.spec.ts.log.json +0 -257
  223. package/.as-test/logs/test.box.spec.ts.log.json +0 -353
  224. package/.as-test/logs/test.custom.spec.ts.log.json +0 -309
  225. package/.as-test/logs/test.date.spec.ts.log.json +0 -397
  226. package/.as-test/logs/test.enum.spec.ts.log.json +0 -343
  227. package/.as-test/logs/test.float.spec.ts.log.json +0 -453
  228. package/.as-test/logs/test.generics.spec.ts.log.json +0 -393
  229. package/.as-test/logs/test.hierarchy.spec.ts.log.json +0 -325
  230. package/.as-test/logs/test.integer.spec.ts.log.json +0 -373
  231. package/.as-test/logs/test.log.json +0 -11371
  232. package/.as-test/logs/test.map.spec.ts.log.json +0 -247
  233. package/.as-test/logs/test.namespace.spec.ts.log.json +0 -361
  234. package/.as-test/logs/test.null.spec.ts.log.json +0 -273
  235. package/.as-test/logs/test.raw.spec.ts.log.json +0 -309
  236. package/.as-test/logs/test.resolving.spec.ts.log.json +0 -273
  237. package/.as-test/logs/test.set.spec.ts.log.json +0 -733
  238. package/.as-test/logs/test.staticarray.spec.ts.log.json +0 -931
  239. package/.as-test/logs/test.string.spec.ts.log.json +0 -2289
  240. package/.as-test/logs/test.struct.spec.ts.log.json +0 -523
  241. package/.as-test/logs/test.types.spec.ts.log.json +0 -273
  242. package/.as-test/runners/default.bindings.js +0 -68
  243. package/.as-test/runners/default.wasi.js +0 -38
  244. package/ARCHITECTURE.md +0 -323
  245. package/CONTRIBUTING.md +0 -244
  246. package/TODO +0 -1
  247. package/as-test.config.json +0 -40
  248. package/assembly/test.ts +0 -24
  249. package/eslint.config.js +0 -68
  250. package/lib/tsconfig.json +0 -8
  251. package/test.ts +0 -99
  252. package/tools/assemblyscript-eslint-local.js +0 -6
  253. package/tools/assemblyscript-eslint.js +0 -53
  254. package/tools/assemblyscript-prettier-plugin.js +0 -33
  255. package/tools/replacer.js +0 -63
  256. package/transform/tsconfig.json +0 -35
@@ -19,10 +19,63 @@ function needsReferenceLoad(type) {
19
19
  }
20
20
  function getSerializeCall(type, realName) {
21
21
  if (type == "ArrayBuffer") {
22
- return `JSON.__serializeArrayBuffer(load<ArrayBuffer>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
22
+ return `JSON.__serialize<ArrayBuffer>(load<ArrayBuffer>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
23
23
  }
24
24
  return needsReferenceLoad(type) ? `JSON.__serialize<${type}>(changetype<${type}>(load<usize>(ptr, offsetof<this>(${JSON.stringify(realName)}))));\n` : `JSON.__serialize<${type}>(load<${type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
25
25
  }
26
+ const CUSTOM_JSON_KINDS = new Set(["any", "string", "number", "object", "array", "boolean", "null", "any | null", "string | null", "number | null", "object | null", "array | null", "boolean | null"]);
27
+ function parseCustomJsonKind(method, decoratorName) {
28
+ const decorator = method.decorators?.find((v) => v.name.text.toLowerCase() == decoratorName);
29
+ if (!decorator || !decorator.args || decorator.args.length == 0)
30
+ return "any";
31
+ if (decorator.args.length > 1)
32
+ throwError(`@${decoratorName} accepts at most one argument`, decorator.range);
33
+ const arg = decorator.args[0];
34
+ if (arg.kind != 16 || arg.literalKind != 2) {
35
+ throwError(`@${decoratorName} argument must be a string literal like @${decoratorName}("string")`, arg.range);
36
+ }
37
+ const kind = arg.value;
38
+ if (!CUSTOM_JSON_KINDS.has(kind)) {
39
+ throwError(`Unsupported @${decoratorName} JSON type '${kind}'. Expected one of: any, string, number, object, array, boolean, null`, arg.range);
40
+ }
41
+ return kind;
42
+ }
43
+ function addMemberToCustomBucket(sortedMembers, member, kind) {
44
+ const isNullable = kind.endsWith(" | null");
45
+ const baseKind = isNullable ? kind.slice(0, kind.length - 7) : kind;
46
+ if (isNullable)
47
+ sortedMembers.null.push(member);
48
+ switch (baseKind) {
49
+ case "string":
50
+ sortedMembers.string.push(member);
51
+ break;
52
+ case "number":
53
+ sortedMembers.number.push(member);
54
+ break;
55
+ case "boolean":
56
+ sortedMembers.boolean.push(member);
57
+ break;
58
+ case "null":
59
+ if (!isNullable)
60
+ sortedMembers.null.push(member);
61
+ break;
62
+ case "array":
63
+ sortedMembers.array.push(member);
64
+ break;
65
+ case "object":
66
+ sortedMembers.object.push(member);
67
+ break;
68
+ default:
69
+ sortedMembers.string.push(member);
70
+ sortedMembers.number.push(member);
71
+ sortedMembers.object.push(member);
72
+ sortedMembers.array.push(member);
73
+ sortedMembers.boolean.push(member);
74
+ if (!isNullable)
75
+ sortedMembers.null.push(member);
76
+ break;
77
+ }
78
+ }
26
79
  export class JSONTransform extends Visitor {
27
80
  static SN = new JSONTransform();
28
81
  program;
@@ -34,6 +87,46 @@ export class JSONTransform extends Visitor {
34
87
  imports = [];
35
88
  simdStatements = [];
36
89
  visitedClasses = new Set();
90
+ collectInheritedFieldMembers(node, source, members, visited = new Set()) {
91
+ if (!node.extendsType)
92
+ return;
93
+ const extendsName = source.resolveExtendsName(node);
94
+ if (!extendsName || visited.has(extendsName))
95
+ return;
96
+ visited.add(extendsName);
97
+ let baseDecl = source.getClass(extendsName);
98
+ let baseSource = baseDecl ? source : null;
99
+ if (!baseDecl) {
100
+ const imported = source.getImportedClass(extendsName, this.parser);
101
+ if (imported) {
102
+ baseDecl = imported;
103
+ baseSource = this.sources.get(imported.range.source);
104
+ }
105
+ }
106
+ if (!baseDecl) {
107
+ const available = source.getAvailableClass(extendsName, this.parser);
108
+ if (available) {
109
+ baseDecl = available;
110
+ baseSource = this.sources.get(available.range.source);
111
+ }
112
+ }
113
+ if (!baseDecl || !baseSource)
114
+ return;
115
+ const isDecoratedBase = !!baseDecl.decorators?.some((decorator) => {
116
+ const name = decorator.name.text;
117
+ return name === "json" || name === "serializable";
118
+ });
119
+ if (isDecoratedBase)
120
+ return;
121
+ this.collectInheritedFieldMembers(baseDecl, baseSource, members, visited);
122
+ const inheritedMembers = baseDecl.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"));
123
+ for (let i = inheritedMembers.length - 1; i >= 0; i--) {
124
+ const inherited = inheritedMembers[i];
125
+ if (!members.some((member) => member.name.text == inherited.name.text)) {
126
+ members.unshift(inherited);
127
+ }
128
+ }
129
+ }
37
130
  visitClassDeclarationRef(node) {
38
131
  if (!node.decorators?.length ||
39
132
  !node.decorators.some((decorator) => {
@@ -88,13 +181,14 @@ export class JSONTransform extends Visitor {
88
181
  return;
89
182
  if (!this.schemas.has(source.internalPath))
90
183
  this.schemas.set(source.internalPath, []);
91
- const members = [...node.members.filter((v) => v.kind === 54 && v.flags !== 32 && v.flags !== 512 && v.flags !== 1024 && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
184
+ const members = [...node.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
92
185
  const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
93
186
  const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
94
187
  const schema = new Schema();
95
188
  schema.node = node;
96
189
  schema.name = source.getQualifiedName(node);
97
190
  if (node.extendsType) {
191
+ this.collectInheritedFieldMembers(node, source, members);
98
192
  const extendsName = source.resolveExtendsName(node);
99
193
  if (!schema.parent) {
100
194
  const depSearch = schema.deps.find((v) => v.name == extendsName);
@@ -140,6 +234,30 @@ export class JSONTransform extends Visitor {
140
234
  schema.deps.push(schem);
141
235
  schema.parent = schem;
142
236
  }
237
+ else {
238
+ const availableSearch = source.getAvailableClass(extendsName, this.parser);
239
+ if (availableSearch) {
240
+ if (DEBUG > 0)
241
+ console.log("Found " + availableSearch.name.text + " from available sources for " + source.internalPath);
242
+ const availableSource = this.sources.get(availableSearch.range.source);
243
+ if (availableSearch.decorators?.some((decorator) => {
244
+ const name = decorator.name.text;
245
+ return name === "json" || name === "serializable";
246
+ })) {
247
+ if (!this.visitedClasses.has(availableSource.getFullPath(availableSearch))) {
248
+ this.visitClassDeclarationRef(availableSearch);
249
+ this.schemas.get(availableSource.internalPath).push(this.schema);
250
+ this.visitClassDeclaration(node);
251
+ return;
252
+ }
253
+ const schem = this.schemas.get(availableSource.internalPath)?.find((s) => s.name == extendsName);
254
+ if (schem) {
255
+ schema.deps.push(schem);
256
+ schema.parent = schem;
257
+ }
258
+ }
259
+ }
260
+ }
143
261
  }
144
262
  }
145
263
  }
@@ -256,7 +374,9 @@ export class JSONTransform extends Visitor {
256
374
  if (serializers.length) {
257
375
  this.schema.custom = true;
258
376
  const serializer = serializers[0];
377
+ const serializerJsonKind = parseCustomJsonKind(serializer, "serializer");
259
378
  const hasCall = CustomTransform.hasCall(serializer);
379
+ this.schema.customJsonKind = serializerJsonKind;
260
380
  CustomTransform.visit(serializer);
261
381
  if (serializer.signature.parameters.length > 1)
262
382
  throwError("Found too many parameters in custom serializer for " + this.schema.name + ", but serializers can only accept one parameter of type '" + this.schema.name + "'!", serializer.signature.parameters[1].range);
@@ -268,9 +388,16 @@ export class JSONTransform extends Visitor {
268
388
  serializer.decorators.push(Node.createDecorator(Node.createIdentifierExpression("inline", serializer.range), null, serializer.range));
269
389
  }
270
390
  SERIALIZE_CUSTOM += " __SERIALIZE(ptr: usize): void {\n";
271
- SERIALIZE_CUSTOM += " const data = this." + serializer.name.text + "(" + (serializer.signature.parameters.length ? "this" : "") + ");\n";
272
- if (hasCall)
273
- SERIALIZE_CUSTOM += " bs.resetState();\n";
391
+ if (hasCall) {
392
+ SERIALIZE_CUSTOM += " const savedOffset = bs.offset;\n";
393
+ SERIALIZE_CUSTOM += " const savedStackSize = bs.stackSize;\n";
394
+ }
395
+ SERIALIZE_CUSTOM += " const self = changetype<this>(ptr);\n";
396
+ SERIALIZE_CUSTOM += " const data = self." + serializer.name.text + "(" + (serializer.signature.parameters.length ? "self" : "") + ");\n";
397
+ if (hasCall) {
398
+ SERIALIZE_CUSTOM += " bs.offset = savedOffset;\n";
399
+ SERIALIZE_CUSTOM += " bs.stackSize = savedStackSize;\n";
400
+ }
274
401
  SERIALIZE_CUSTOM += " const dataSize = data.length << 1;\n";
275
402
  SERIALIZE_CUSTOM += " memory.copy(bs.offset, changetype<usize>(data), dataSize);\n";
276
403
  SERIALIZE_CUSTOM += " bs.offset += dataSize;\n";
@@ -279,6 +406,12 @@ export class JSONTransform extends Visitor {
279
406
  if (deserializers.length) {
280
407
  this.schema.custom = true;
281
408
  const deserializer = deserializers[0];
409
+ const deserializerJsonKind = parseCustomJsonKind(deserializer, "deserializer");
410
+ if (this.schema.customJsonKind != "any" && deserializerJsonKind != "any" && this.schema.customJsonKind != deserializerJsonKind) {
411
+ throwError(`@serializer and @deserializer JSON types for ${this.schema.name} must match`, deserializer.range);
412
+ }
413
+ if (this.schema.customJsonKind == "any")
414
+ this.schema.customJsonKind = deserializerJsonKind;
282
415
  if (!deserializer.signature.parameters.length)
283
416
  throwError("Could not find any parameters in custom deserializer for " + this.schema.name + ". Deserializers must have one parameter like 'deserializer(data: string): " + this.schema.name + " {}'", deserializer.range);
284
417
  if (deserializer.signature.parameters.length > 1)
@@ -290,10 +423,8 @@ export class JSONTransform extends Visitor {
290
423
  if (!deserializer.decorators.some((v) => v.name.text == "inline")) {
291
424
  deserializer.decorators.push(Node.createDecorator(Node.createIdentifierExpression("inline", deserializer.range), null, deserializer.range));
292
425
  }
293
- DESERIALIZE_CUSTOM += " __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {\n";
294
- DESERIALIZE_CUSTOM += " const data = inline.always(this." + deserializer.name.text + "(JSON.Util.ptrToStr(srcStart, srcEnd)));\n";
295
- DESERIALIZE_CUSTOM += " memory.copy(changetype<usize>(out), changetype<usize>(data), offsetof<nonnull<__JSON_T>>());\n";
296
- DESERIALIZE_CUSTOM += " return srcEnd;\n";
426
+ DESERIALIZE_CUSTOM += " @inline __DESERIALIZE_CUSTOM(data: string): this {\n";
427
+ DESERIALIZE_CUSTOM += " return inline.always(this." + deserializer.name.text + "(data));\n";
297
428
  DESERIALIZE_CUSTOM += " }\n";
298
429
  }
299
430
  if (!members.length && !deserializers.length && !serializers.length) {
@@ -316,6 +447,7 @@ export class JSONTransform extends Visitor {
316
447
  mem.value = value;
317
448
  mem.node = member;
318
449
  mem.byteSize = sizeof(mem.type);
450
+ mem.custom = schema.deps.some((dep) => dep?.name == stripNull(type) && dep.custom);
319
451
  this.schema.byteSize += mem.byteSize;
320
452
  if (member.decorators) {
321
453
  for (const decorator of member.decorators) {
@@ -482,13 +614,12 @@ export class JSONTransform extends Visitor {
482
614
  };
483
615
  for (const member of this.schema.members) {
484
616
  const type = stripNull(member.type);
485
- if (member.custom || member.generic) {
486
- sortedMembers.string.push(member);
487
- sortedMembers.number.push(member);
488
- sortedMembers.object.push(member);
489
- sortedMembers.array.push(member);
490
- sortedMembers.boolean.push(member);
491
- sortedMembers.null.push(member);
617
+ const customDep = this.schema.deps.find((dep) => dep && (dep.name == type || dep.name.endsWith("." + type)) && dep.custom);
618
+ const isCustomType = member.custom || !!customDep;
619
+ if (isCustomType || member.generic) {
620
+ addMemberToCustomBucket(sortedMembers, member, member.generic ? "any" : customDep?.customJsonKind || "any");
621
+ if (member.node.type.isNullable)
622
+ sortedMembers.null.push(member);
492
623
  }
493
624
  else {
494
625
  if (member.node.type.isNullable)
@@ -1222,13 +1353,16 @@ export class JSONTransform extends Visitor {
1222
1353
  const DESERIALIZE_DIRECT = useFastPath ? DESERIALIZE_FAST.replace("@inline __DESERIALIZE_FAST<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {", "@inline __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {") : DESERIALIZE.replace("__DESERIALIZE_SLOW<__JSON_T>", "__DESERIALIZE<__JSON_T>");
1223
1354
  const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE_CUSTOM || SERIALIZE, node);
1224
1355
  const INITIALIZE_METHOD = !useFastPath ? SimpleParser.parseClassMember(INITIALIZE, node) : null;
1225
- const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_CUSTOM || DESERIALIZE_DIRECT, node);
1356
+ const DESERIALIZE_CUSTOM_METHOD = DESERIALIZE_CUSTOM ? SimpleParser.parseClassMember(DESERIALIZE_CUSTOM, node) : null;
1357
+ const DESERIALIZE_METHOD = DESERIALIZE_CUSTOM ? null : SimpleParser.parseClassMember(DESERIALIZE_DIRECT, node);
1226
1358
  const DESERIALIZE_FAST_METHOD = useFastPath ? SimpleParser.parseClassMember(DESERIALIZE_FAST, node) : null;
1227
1359
  if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
1228
1360
  node.members.push(SERIALIZE_METHOD);
1229
1361
  if (!useFastPath && INITIALIZE_METHOD && !node.members.find((v) => v.name.text == "__INITIALIZE"))
1230
1362
  node.members.push(INITIALIZE_METHOD);
1231
- if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
1363
+ if (DESERIALIZE_CUSTOM_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE_CUSTOM"))
1364
+ node.members.push(DESERIALIZE_CUSTOM_METHOD);
1365
+ if (DESERIALIZE_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE"))
1232
1366
  node.members.push(DESERIALIZE_METHOD);
1233
1367
  if (!DESERIALIZE_CUSTOM && useFastPath && DESERIALIZE_FAST_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE_FAST"))
1234
1368
  node.members.push(DESERIALIZE_FAST_METHOD);
@@ -1271,15 +1405,6 @@ export class JSONTransform extends Visitor {
1271
1405
  this.baseCWD = this.baseCWD.replaceAll("/", path.sep);
1272
1406
  const baseDir = path.resolve(fileURLToPath(import.meta.url), "..", "..", "..");
1273
1407
  let fromPath = node.range.source.normalizedPath.replaceAll("/", path.sep);
1274
- const isLib = path.dirname(baseDir).endsWith("node_modules");
1275
- if (!isLib && !this.parser.sources.some((s) => s.normalizedPath.startsWith("assembly/index"))) {
1276
- const newPath = path.join(baseDir, "assembly", "index.ts");
1277
- this.parser.parseFile(readFileSync(newPath).toString(), newPath, false);
1278
- }
1279
- else if (isLib && !this.parser.sources.some((s) => s.normalizedPath.startsWith("~lib/json-as/assembly/index"))) {
1280
- const newPath = "~lib/json-as/assembly/index.ts";
1281
- this.parser.parseFile(readFileSync(path.join(baseDir, "assembly", "index.ts")).toString(), newPath, false);
1282
- }
1283
1408
  fromPath = fromPath.startsWith("~lib") ? fromPath.slice(5) : path.join(this.baseCWD, fromPath);
1284
1409
  const bsImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "bs" || d.name.text == "bs"));
1285
1410
  const jsonImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "JSON" || d.name.text == "JSON"));
@@ -1456,11 +1581,7 @@ export default class Transformer extends Transform {
1456
1581
  }
1457
1582
  }
1458
1583
  afterParse(parser) {
1459
- const transformer = JSONTransform.SN;
1460
- transformer.schemas = new Map();
1461
- transformer.sources = new SourceSet();
1462
- transformer.visitedClasses = new Set();
1463
- transformer.simdStatements = [];
1584
+ const transformer = new JSONTransform();
1464
1585
  const sources = parser.sources
1465
1586
  .filter((source) => {
1466
1587
  const p = source.internalPath;