@kontor/kontor-sdk 1.0.0-alpha.39 → 1.0.0-alpha.40

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 (270) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/sdk/actions/kontor/public/call-view.js.map +1 -1
  3. package/dist/cjs/sdk/chains/definitions/signet.js +2 -2
  4. package/dist/cjs/sdk/test/e2e.test-deprecated.js +2 -0
  5. package/dist/cjs/sdk/test/e2e.test-deprecated.js.map +1 -0
  6. package/dist/cjs/sdk/utils/wit/codecs/bool.js +9 -21
  7. package/dist/cjs/sdk/utils/wit/codecs/bool.js.map +1 -1
  8. package/dist/cjs/sdk/utils/wit/codecs/contract-address.js +92 -0
  9. package/dist/cjs/sdk/utils/wit/codecs/contract-address.js.map +1 -0
  10. package/dist/cjs/sdk/utils/wit/codecs/index.js +29 -0
  11. package/dist/cjs/sdk/utils/wit/codecs/index.js.map +1 -0
  12. package/dist/cjs/sdk/utils/wit/codecs/list.js +21 -95
  13. package/dist/cjs/sdk/utils/wit/codecs/list.js.map +1 -1
  14. package/dist/cjs/sdk/utils/wit/codecs/numerics.js +228 -0
  15. package/dist/cjs/sdk/utils/wit/codecs/numerics.js.map +1 -0
  16. package/dist/cjs/sdk/utils/wit/codecs/option.js +21 -72
  17. package/dist/cjs/sdk/utils/wit/codecs/option.js.map +1 -1
  18. package/dist/cjs/sdk/utils/wit/codecs/result.js +32 -0
  19. package/dist/cjs/sdk/utils/wit/codecs/result.js.map +1 -0
  20. package/dist/cjs/sdk/utils/wit/codecs/string.js +16 -21
  21. package/dist/cjs/sdk/utils/wit/codecs/string.js.map +1 -1
  22. package/dist/cjs/sdk/utils/wit/codecs/unit.js +11 -19
  23. package/dist/cjs/sdk/utils/wit/codecs/unit.js.map +1 -1
  24. package/dist/cjs/sdk/utils/wit/codecs/util.js +185 -0
  25. package/dist/cjs/sdk/utils/wit/codecs/util.js.map +1 -0
  26. package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js +297 -163
  27. package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
  28. package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js +214 -221
  29. package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
  30. package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
  31. package/dist/cjs/wit/built-ins.js +19 -0
  32. package/dist/cjs/wit/built-ins.js.map +1 -0
  33. package/dist/cjs/wit/regex.js +1 -1
  34. package/dist/cjs/wit/regex.js.map +1 -1
  35. package/dist/cjs/wit/wit-parser/core/errors/signature.js +17 -2
  36. package/dist/cjs/wit/wit-parser/core/errors/signature.js.map +1 -1
  37. package/dist/cjs/wit/wit-parser/core/signatures.js +18 -0
  38. package/dist/cjs/wit/wit-parser/core/signatures.js.map +1 -1
  39. package/dist/cjs/wit/wit-parser/core/types/{records.js → user-defined.js} +1 -1
  40. package/dist/cjs/wit/wit-parser/core/types/user-defined.js.map +1 -0
  41. package/dist/cjs/wit/wit-parser/core/user-defined.js +271 -0
  42. package/dist/cjs/wit/wit-parser/core/user-defined.js.map +1 -0
  43. package/dist/cjs/wit/wit-parser/core/utils.js +29 -7
  44. package/dist/cjs/wit/wit-parser/core/utils.js.map +1 -1
  45. package/dist/cjs/wit/wit-parser/parse-wit-parameter.js +9 -3
  46. package/dist/cjs/wit/wit-parser/parse-wit-parameter.js.map +1 -1
  47. package/dist/cjs/wit/wit-parser/parse-wit.js +7 -3
  48. package/dist/cjs/wit/wit-parser/parse-wit.js.map +1 -1
  49. package/dist/esm/sdk/actions/kontor/public/call-view.js.map +1 -1
  50. package/dist/esm/sdk/chains/definitions/signet.js +2 -2
  51. package/dist/esm/sdk/test/e2e.test-deprecated.js +197 -0
  52. package/dist/esm/sdk/test/e2e.test-deprecated.js.map +1 -0
  53. package/dist/esm/sdk/utils/wit/codecs/bool.js +9 -21
  54. package/dist/esm/sdk/utils/wit/codecs/bool.js.map +1 -1
  55. package/dist/esm/sdk/utils/wit/codecs/contract-address.js +92 -0
  56. package/dist/esm/sdk/utils/wit/codecs/contract-address.js.map +1 -0
  57. package/dist/esm/sdk/utils/wit/codecs/index.js +9 -0
  58. package/dist/esm/sdk/utils/wit/codecs/index.js.map +1 -0
  59. package/dist/esm/sdk/utils/wit/codecs/list.js +20 -114
  60. package/dist/esm/sdk/utils/wit/codecs/list.js.map +1 -1
  61. package/dist/esm/sdk/utils/wit/codecs/numerics.js +234 -0
  62. package/dist/esm/sdk/utils/wit/codecs/numerics.js.map +1 -0
  63. package/dist/esm/sdk/utils/wit/codecs/option.js +21 -88
  64. package/dist/esm/sdk/utils/wit/codecs/option.js.map +1 -1
  65. package/dist/esm/sdk/utils/wit/codecs/result.js +29 -0
  66. package/dist/esm/sdk/utils/wit/codecs/result.js.map +1 -0
  67. package/dist/esm/sdk/utils/wit/codecs/string.js +22 -22
  68. package/dist/esm/sdk/utils/wit/codecs/string.js.map +1 -1
  69. package/dist/esm/sdk/utils/wit/codecs/unit.js +12 -21
  70. package/dist/esm/sdk/utils/wit/codecs/unit.js.map +1 -1
  71. package/dist/esm/sdk/utils/wit/codecs/util.js +181 -0
  72. package/dist/esm/sdk/utils/wit/codecs/util.js.map +1 -0
  73. package/dist/esm/sdk/utils/wit/decode-wit-parameter.js +322 -188
  74. package/dist/esm/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
  75. package/dist/esm/sdk/utils/wit/encode-wit-parameters.js +230 -233
  76. package/dist/esm/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
  77. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  78. package/dist/esm/wit/built-ins.js +16 -0
  79. package/dist/esm/wit/built-ins.js.map +1 -0
  80. package/dist/esm/wit/regex.js +1 -1
  81. package/dist/esm/wit/regex.js.map +1 -1
  82. package/dist/esm/wit/wit-parser/core/errors/signature.js +15 -1
  83. package/dist/esm/wit/wit-parser/core/errors/signature.js.map +1 -1
  84. package/dist/esm/wit/wit-parser/core/signatures.js +14 -0
  85. package/dist/esm/wit/wit-parser/core/signatures.js.map +1 -1
  86. package/dist/esm/wit/wit-parser/core/types/signatures.js.map +1 -1
  87. package/dist/esm/wit/wit-parser/core/types/user-defined.js +2 -0
  88. package/dist/esm/wit/wit-parser/core/types/user-defined.js.map +1 -0
  89. package/dist/esm/wit/wit-parser/core/types/utils.js +25 -0
  90. package/dist/esm/wit/wit-parser/core/types/utils.js.map +1 -1
  91. package/dist/esm/wit/wit-parser/core/user-defined.js +280 -0
  92. package/dist/esm/wit/wit-parser/core/user-defined.js.map +1 -0
  93. package/dist/esm/wit/wit-parser/core/utils.js +33 -36
  94. package/dist/esm/wit/wit-parser/core/utils.js.map +1 -1
  95. package/dist/esm/wit/wit-parser/parse-wit-parameter.js +10 -4
  96. package/dist/esm/wit/wit-parser/parse-wit-parameter.js.map +1 -1
  97. package/dist/esm/wit/wit-parser/parse-wit.js +8 -4
  98. package/dist/esm/wit/wit-parser/parse-wit.js.map +1 -1
  99. package/dist/types/sdk/actions/kontor/public/call-view.d.ts +2 -1
  100. package/dist/types/sdk/actions/kontor/public/call-view.d.ts.map +1 -1
  101. package/dist/types/sdk/chains/definitions/signet.d.ts +2 -2
  102. package/dist/types/sdk/test/e2e.test-deprecated.d.ts +2 -0
  103. package/dist/types/sdk/test/e2e.test-deprecated.d.ts.map +1 -0
  104. package/dist/types/sdk/types/contract.d.ts +5 -5
  105. package/dist/types/sdk/types/contract.d.ts.map +1 -1
  106. package/dist/types/sdk/utils/wit/codecs/bool.d.ts +2 -2
  107. package/dist/types/sdk/utils/wit/codecs/bool.d.ts.map +1 -1
  108. package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts +5 -0
  109. package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts.map +1 -0
  110. package/dist/types/sdk/utils/wit/codecs/index.d.ts +9 -0
  111. package/dist/types/sdk/utils/wit/codecs/index.d.ts.map +1 -0
  112. package/dist/types/sdk/utils/wit/codecs/list.d.ts +2 -16
  113. package/dist/types/sdk/utils/wit/codecs/list.d.ts.map +1 -1
  114. package/dist/types/sdk/utils/wit/codecs/numerics.d.ts +14 -0
  115. package/dist/types/sdk/utils/wit/codecs/numerics.d.ts.map +1 -0
  116. package/dist/types/sdk/utils/wit/codecs/option.d.ts +3 -23
  117. package/dist/types/sdk/utils/wit/codecs/option.d.ts.map +1 -1
  118. package/dist/types/sdk/utils/wit/codecs/result.d.ts +4 -0
  119. package/dist/types/sdk/utils/wit/codecs/result.d.ts.map +1 -0
  120. package/dist/types/sdk/utils/wit/codecs/string.d.ts +6 -2
  121. package/dist/types/sdk/utils/wit/codecs/string.d.ts.map +1 -1
  122. package/dist/types/sdk/utils/wit/codecs/types.d.ts +4 -0
  123. package/dist/types/sdk/utils/wit/codecs/types.d.ts.map +1 -1
  124. package/dist/types/sdk/utils/wit/codecs/unit.d.ts +2 -11
  125. package/dist/types/sdk/utils/wit/codecs/unit.d.ts.map +1 -1
  126. package/dist/types/sdk/utils/wit/codecs/util.d.ts +12 -0
  127. package/dist/types/sdk/utils/wit/codecs/util.d.ts.map +1 -0
  128. package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts +9 -31
  129. package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts.map +1 -1
  130. package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts +9 -1
  131. package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts.map +1 -1
  132. package/dist/types/wit/built-ins.d.ts +6 -0
  133. package/dist/types/wit/built-ins.d.ts.map +1 -0
  134. package/dist/types/wit/regex.d.ts.map +1 -1
  135. package/dist/types/wit/utils.d.ts +53 -33
  136. package/dist/types/wit/utils.d.ts.map +1 -1
  137. package/dist/types/wit/wit-parser/core/errors/signature.d.ts +7 -1
  138. package/dist/types/wit/wit-parser/core/errors/signature.d.ts.map +1 -1
  139. package/dist/types/wit/wit-parser/core/signatures.d.ts +10 -0
  140. package/dist/types/wit/wit-parser/core/signatures.d.ts.map +1 -1
  141. package/dist/types/wit/wit-parser/core/types/signatures.d.ts +6 -2
  142. package/dist/types/wit/wit-parser/core/types/signatures.d.ts.map +1 -1
  143. package/dist/types/wit/wit-parser/core/types/user-defined.d.ts +134 -0
  144. package/dist/types/wit/wit-parser/core/types/user-defined.d.ts.map +1 -0
  145. package/dist/types/wit/wit-parser/core/types/utils.d.ts +86 -11
  146. package/dist/types/wit/wit-parser/core/types/utils.d.ts.map +1 -1
  147. package/dist/types/wit/wit-parser/core/user-defined.d.ts +19 -0
  148. package/dist/types/wit/wit-parser/core/user-defined.d.ts.map +1 -0
  149. package/dist/types/wit/wit-parser/core/utils.d.ts +8 -4
  150. package/dist/types/wit/wit-parser/core/utils.d.ts.map +1 -1
  151. package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts +11 -5
  152. package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts.map +1 -1
  153. package/dist/types/wit/wit-parser/parse-wit.d.ts +7 -3
  154. package/dist/types/wit/wit-parser/parse-wit.d.ts.map +1 -1
  155. package/dist/types/wit/wit.d.ts +20 -12
  156. package/dist/types/wit/wit.d.ts.map +1 -1
  157. package/package.json +1 -1
  158. package/src/sdk/actions/get-contract.test-d.ts +430 -50
  159. package/src/sdk/actions/get-contract.test.ts +324 -24
  160. package/src/sdk/actions/kontor/public/call-view.ts +2 -1
  161. package/src/sdk/actions/kontor/public/proc-contract.test-d.ts +107 -0
  162. package/src/sdk/actions/kontor/public/proc-contract.test.ts +234 -21
  163. package/src/sdk/actions/kontor/public/view-contract.test-d.ts +240 -0
  164. package/src/sdk/actions/kontor/public/view-contract.test.ts +613 -18
  165. package/src/sdk/chains/definitions/signet.ts +2 -2
  166. package/src/sdk/clients/base/create-rpc-client.test.ts +2 -2
  167. package/src/sdk/clients/create-public-client.test.ts +2 -2
  168. package/src/sdk/clients/kontor/create-public-client.test.ts +2 -2
  169. package/src/sdk/clients/transports/http-rpc.test.ts +0 -24
  170. package/src/sdk/test/e2e.test-deprecated.ts +195 -0
  171. package/src/sdk/types/contract.test-d.ts +489 -55
  172. package/src/sdk/types/contract.ts +6 -7
  173. package/src/sdk/utils/wit/codecs/bool.test.ts +29 -0
  174. package/src/sdk/utils/wit/codecs/bool.ts +10 -25
  175. package/src/sdk/utils/wit/codecs/contract-address.test.ts +37 -0
  176. package/src/sdk/utils/wit/codecs/contract-address.ts +114 -0
  177. package/src/sdk/utils/wit/codecs/index.ts +20 -0
  178. package/src/sdk/utils/wit/codecs/list.test-d.ts +13 -0
  179. package/src/sdk/utils/wit/codecs/list.test.ts +55 -0
  180. package/src/sdk/utils/wit/codecs/list.ts +21 -150
  181. package/src/sdk/utils/wit/codecs/numerics.test.ts +399 -0
  182. package/src/sdk/utils/wit/codecs/numerics.ts +304 -0
  183. package/src/sdk/utils/wit/codecs/option.test.ts +71 -0
  184. package/src/sdk/utils/wit/codecs/option.ts +21 -120
  185. package/src/sdk/utils/wit/codecs/result.test.ts +82 -0
  186. package/src/sdk/utils/wit/codecs/result.ts +37 -0
  187. package/src/sdk/utils/wit/codecs/string.test.ts +62 -0
  188. package/src/sdk/utils/wit/codecs/string.ts +23 -25
  189. package/src/sdk/utils/wit/codecs/types.ts +5 -0
  190. package/src/sdk/utils/wit/codecs/unit.test.ts +27 -0
  191. package/src/sdk/utils/wit/codecs/unit.ts +14 -38
  192. package/src/sdk/utils/wit/codecs/util.test.ts +221 -0
  193. package/src/sdk/utils/wit/codecs/util.ts +193 -0
  194. package/src/sdk/utils/wit/decode-wit-parameter.test.ts +1264 -32
  195. package/src/sdk/utils/wit/decode-wit-parameter.ts +508 -211
  196. package/src/sdk/utils/wit/encode-wit-parameters.test.ts +955 -91
  197. package/src/sdk/utils/wit/encode-wit-parameters.ts +277 -274
  198. package/src/sdk/utils/wit/get-wit-item.test.ts +1 -1
  199. package/src/wit/built-ins.ts +23 -0
  200. package/src/wit/regex.ts +1 -1
  201. package/src/wit/utils.ts +120 -74
  202. package/src/wit/wit-parser/core/errors/signature.ts +13 -2
  203. package/src/wit/wit-parser/core/signatures.ts +28 -0
  204. package/src/wit/wit-parser/core/types/signatures.test-d.ts +21 -0
  205. package/src/wit/wit-parser/core/types/signatures.ts +19 -2
  206. package/src/wit/wit-parser/core/types/user-defined.test-d.ts +1308 -0
  207. package/src/wit/wit-parser/core/types/user-defined.ts +412 -0
  208. package/src/wit/wit-parser/core/types/utils.test-d.ts +43 -2
  209. package/src/wit/wit-parser/core/types/utils.ts +143 -14
  210. package/src/wit/wit-parser/core/user-defined.test.ts +609 -0
  211. package/src/wit/wit-parser/core/user-defined.ts +392 -0
  212. package/src/wit/wit-parser/core/utils.test.ts +334 -115
  213. package/src/wit/wit-parser/core/utils.ts +54 -38
  214. package/src/wit/wit-parser/parse-wit-parameter.test.ts +282 -4
  215. package/src/wit/wit-parser/parse-wit-parameter.ts +37 -11
  216. package/src/wit/wit-parser/parse-wit.test.ts +738 -12
  217. package/src/wit/wit-parser/parse-wit.ts +25 -10
  218. package/src/wit/wit.ts +37 -16
  219. package/vitest.config.ts +5 -0
  220. package/dist/cjs/sdk/utils/wit/codecs/decimal.js +0 -148
  221. package/dist/cjs/sdk/utils/wit/codecs/decimal.js.map +0 -1
  222. package/dist/cjs/sdk/utils/wit/codecs/enum.js +0 -94
  223. package/dist/cjs/sdk/utils/wit/codecs/enum.js.map +0 -1
  224. package/dist/cjs/sdk/utils/wit/codecs/integer.js +0 -125
  225. package/dist/cjs/sdk/utils/wit/codecs/integer.js.map +0 -1
  226. package/dist/cjs/sdk/utils/wit/codecs/s64.js +0 -57
  227. package/dist/cjs/sdk/utils/wit/codecs/s64.js.map +0 -1
  228. package/dist/cjs/sdk/utils/wit/codecs/u64.js +0 -56
  229. package/dist/cjs/sdk/utils/wit/codecs/u64.js.map +0 -1
  230. package/dist/cjs/wit/wit-parser/core/records.js +0 -70
  231. package/dist/cjs/wit/wit-parser/core/records.js.map +0 -1
  232. package/dist/cjs/wit/wit-parser/core/types/records.js.map +0 -1
  233. package/dist/esm/sdk/utils/wit/codecs/decimal.js +0 -165
  234. package/dist/esm/sdk/utils/wit/codecs/decimal.js.map +0 -1
  235. package/dist/esm/sdk/utils/wit/codecs/enum.js +0 -104
  236. package/dist/esm/sdk/utils/wit/codecs/enum.js.map +0 -1
  237. package/dist/esm/sdk/utils/wit/codecs/integer.js +0 -167
  238. package/dist/esm/sdk/utils/wit/codecs/integer.js.map +0 -1
  239. package/dist/esm/sdk/utils/wit/codecs/s64.js +0 -65
  240. package/dist/esm/sdk/utils/wit/codecs/s64.js.map +0 -1
  241. package/dist/esm/sdk/utils/wit/codecs/u64.js +0 -63
  242. package/dist/esm/sdk/utils/wit/codecs/u64.js.map +0 -1
  243. package/dist/esm/wit/wit-parser/core/records.js +0 -73
  244. package/dist/esm/wit/wit-parser/core/records.js.map +0 -1
  245. package/dist/esm/wit/wit-parser/core/types/records.js +0 -2
  246. package/dist/esm/wit/wit-parser/core/types/records.js.map +0 -1
  247. package/dist/types/sdk/utils/wit/codecs/decimal.d.ts +0 -42
  248. package/dist/types/sdk/utils/wit/codecs/decimal.d.ts.map +0 -1
  249. package/dist/types/sdk/utils/wit/codecs/enum.d.ts +0 -49
  250. package/dist/types/sdk/utils/wit/codecs/enum.d.ts.map +0 -1
  251. package/dist/types/sdk/utils/wit/codecs/integer.d.ts +0 -36
  252. package/dist/types/sdk/utils/wit/codecs/integer.d.ts.map +0 -1
  253. package/dist/types/sdk/utils/wit/codecs/s64.d.ts +0 -23
  254. package/dist/types/sdk/utils/wit/codecs/s64.d.ts.map +0 -1
  255. package/dist/types/sdk/utils/wit/codecs/u64.d.ts +0 -23
  256. package/dist/types/sdk/utils/wit/codecs/u64.d.ts.map +0 -1
  257. package/dist/types/wit/wit-parser/core/records.d.ts +0 -4
  258. package/dist/types/wit/wit-parser/core/records.d.ts.map +0 -1
  259. package/dist/types/wit/wit-parser/core/types/records.d.ts +0 -51
  260. package/dist/types/wit/wit-parser/core/types/records.d.ts.map +0 -1
  261. package/src/sdk/test/e2e.test.ts +0 -194
  262. package/src/sdk/utils/wit/codecs/decimal.ts +0 -215
  263. package/src/sdk/utils/wit/codecs/enum.ts +0 -114
  264. package/src/sdk/utils/wit/codecs/integer.ts +0 -193
  265. package/src/sdk/utils/wit/codecs/s64.ts +0 -76
  266. package/src/sdk/utils/wit/codecs/u64.ts +0 -73
  267. package/src/wit/wit-parser/core/records.test.ts +0 -69
  268. package/src/wit/wit-parser/core/records.ts +0 -101
  269. package/src/wit/wit-parser/core/types/records.test-d.ts +0 -331
  270. package/src/wit/wit-parser/core/types/records.ts +0 -91
@@ -0,0 +1,609 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { parseTypes, execWitType } from "./user-defined.js";
3
+
4
+ describe("execWitType (locked contract)", () => {
5
+ test("plain identifier", () => {
6
+ expect(execWitType("u64")).toEqual({ base: "u64" });
7
+ expect(execWitType("proc-context")).toEqual({ base: "proc-context" });
8
+ });
9
+
10
+ test("single-arg wrappers", () => {
11
+ expect(execWitType("list<u64>")).toEqual({ wrapper: "list", base: "u64" });
12
+ expect(execWitType("option<signer>")).toEqual({
13
+ wrapper: "option",
14
+ base: "signer",
15
+ });
16
+ expect(execWitType("borrow<proc-context>")).toEqual({
17
+ wrapper: "borrow",
18
+ base: "proc-context",
19
+ });
20
+ });
21
+
22
+ test("wrapper payload is opaque (no recursion here)", () => {
23
+ expect(execWitType("option<list<u64>>")).toEqual({
24
+ wrapper: "option",
25
+ base: "list<u64>",
26
+ });
27
+ });
28
+
29
+ test("result<ok, error>", () => {
30
+ expect(execWitType("result<integer, error>")).toEqual({
31
+ wrapper: "result",
32
+ base: "integer",
33
+ });
34
+ expect(execWitType("result< list<u8> , error >")).toEqual({
35
+ wrapper: "result",
36
+ base: "list<u8>",
37
+ });
38
+ });
39
+
40
+ test("rejects result with non-error err channel", () => {
41
+ expect(execWitType("result<integer, string>")).toBeNull();
42
+ expect(execWitType("result<integer>")).toBeNull();
43
+ });
44
+
45
+ test("rejects malformed wrappers", () => {
46
+ expect(execWitType("list<u64")).toBeNull();
47
+ expect(execWitType("list<u64>>")).toBeNull();
48
+ expect(execWitType("")).toBeNull();
49
+ expect(execWitType("1abc")).toBeNull();
50
+ });
51
+ });
52
+
53
+ describe("parseTypes - records", () => {
54
+ test("parse basic records", () => {
55
+ const result = parseTypes([
56
+ "record contract-address { name: string, height: s64, tx-index: s64 }",
57
+ "record token-pair { a: contract-address, b: contract-address }",
58
+ ]);
59
+
60
+ expect(result.records).toEqual({
61
+ "contract-address": [
62
+ { name: "name", type: "string", internalType: "string" },
63
+ { name: "height", type: "s64", internalType: "s64" },
64
+ { name: "tx-index", type: "s64", internalType: "s64" },
65
+ ],
66
+ "token-pair": [
67
+ {
68
+ type: "record",
69
+ name: "a",
70
+ internalType: "contract-address",
71
+ components: [
72
+ { name: "name", type: "string", internalType: "string" },
73
+ { name: "height", type: "s64", internalType: "s64" },
74
+ { name: "tx-index", type: "s64", internalType: "s64" },
75
+ ],
76
+ },
77
+ {
78
+ type: "record",
79
+ name: "b",
80
+ internalType: "contract-address",
81
+ components: [
82
+ { name: "name", type: "string", internalType: "string" },
83
+ { name: "height", type: "s64", internalType: "s64" },
84
+ { name: "tx-index", type: "s64", internalType: "s64" },
85
+ ],
86
+ },
87
+ ],
88
+ });
89
+ });
90
+
91
+ test("record with generic types", () => {
92
+ const result = parseTypes(["record generic { values: list<string> }"]);
93
+
94
+ expect(result.records).toEqual({
95
+ generic: [
96
+ { name: "values", type: "list<string>", internalType: "list<string>" },
97
+ ],
98
+ });
99
+ });
100
+
101
+ test("record with wrapped generics", () => {
102
+ const result = parseTypes([
103
+ "record contract-address { name: string, height: s64, tx-index: s64 }",
104
+ "record generic { as-list: list<contract-address>, as-option: option<contract-address>, as-result: result<contract-address, error> }",
105
+ ]);
106
+
107
+ expect(result.records).toEqual({
108
+ "contract-address": [
109
+ { name: "name", type: "string", internalType: "string" },
110
+ { name: "height", type: "s64", internalType: "s64" },
111
+ { name: "tx-index", type: "s64", internalType: "s64" },
112
+ ],
113
+ generic: [
114
+ {
115
+ name: "as-list",
116
+ type: "list<record>",
117
+ internalType: "list<contract-address>",
118
+ components: [
119
+ { name: "name", type: "string", internalType: "string" },
120
+ { name: "height", type: "s64", internalType: "s64" },
121
+ { name: "tx-index", type: "s64", internalType: "s64" },
122
+ ],
123
+ },
124
+ {
125
+ name: "as-option",
126
+ type: "option<record>",
127
+ internalType: "option<contract-address>",
128
+ components: [
129
+ { name: "name", type: "string", internalType: "string" },
130
+ { name: "height", type: "s64", internalType: "s64" },
131
+ { name: "tx-index", type: "s64", internalType: "s64" },
132
+ ],
133
+ },
134
+ {
135
+ name: "as-result",
136
+ type: "result<record, error>",
137
+ internalType: "result<contract-address, error>",
138
+ components: [
139
+ { name: "name", type: "string", internalType: "string" },
140
+ { name: "height", type: "s64", internalType: "s64" },
141
+ { name: "tx-index", type: "s64", internalType: "s64" },
142
+ ],
143
+ },
144
+ ],
145
+ });
146
+ });
147
+
148
+ test("record referencing variant", () => {
149
+ const result = parseTypes([
150
+ "variant color { hex(string), literal(string) }",
151
+ "record palette { a: color, b: list<color> }",
152
+ ]);
153
+
154
+ expect(result.records).toEqual({
155
+ palette: [
156
+ {
157
+ name: "a",
158
+ type: "variant",
159
+ internalType: "color",
160
+ components: [
161
+ { name: "hex", type: "string", internalType: "string" },
162
+ { name: "literal", type: "string", internalType: "string" },
163
+ ],
164
+ },
165
+ {
166
+ name: "b",
167
+ type: "list<variant>",
168
+ internalType: "list<color>",
169
+ components: [
170
+ { name: "hex", type: "string", internalType: "string" },
171
+ { name: "literal", type: "string", internalType: "string" },
172
+ ],
173
+ },
174
+ ],
175
+ });
176
+
177
+ expect(result.variants).toEqual({
178
+ color: [
179
+ { name: "hex", type: "string", internalType: "string" },
180
+ { name: "literal", type: "string", internalType: "string" },
181
+ ],
182
+ });
183
+ });
184
+
185
+ test("variant with nested record reference", () => {
186
+ const result = parseTypes([
187
+ "record rgb { r: u8, g: u8, b: u8 }",
188
+ "variant color { hex(string), rgb(rgb) }",
189
+ "record palette { a: color, b: list<color> }",
190
+ ]);
191
+
192
+ expect(result.records).toEqual({
193
+ rgb: [
194
+ { name: "r", type: "u8", internalType: "u8" },
195
+ { name: "g", type: "u8", internalType: "u8" },
196
+ { name: "b", type: "u8", internalType: "u8" },
197
+ ],
198
+ palette: [
199
+ {
200
+ name: "a",
201
+ type: "variant",
202
+ internalType: "color",
203
+ components: [
204
+ { name: "hex", type: "string", internalType: "string" },
205
+ {
206
+ name: "rgb",
207
+ type: "record",
208
+ internalType: "rgb",
209
+ components: [
210
+ { name: "r", type: "u8", internalType: "u8" },
211
+ { name: "g", type: "u8", internalType: "u8" },
212
+ { name: "b", type: "u8", internalType: "u8" },
213
+ ],
214
+ },
215
+ ],
216
+ },
217
+ {
218
+ name: "b",
219
+ type: "list<variant>",
220
+ internalType: "list<color>",
221
+ components: [
222
+ { name: "hex", type: "string", internalType: "string" },
223
+ {
224
+ name: "rgb",
225
+ type: "record",
226
+ internalType: "rgb",
227
+ components: [
228
+ { name: "r", type: "u8", internalType: "u8" },
229
+ { name: "g", type: "u8", internalType: "u8" },
230
+ { name: "b", type: "u8", internalType: "u8" },
231
+ ],
232
+ },
233
+ ],
234
+ },
235
+ ],
236
+ });
237
+ });
238
+ });
239
+
240
+ describe("parseTypes - variants", () => {
241
+ test("parse basic variants", () => {
242
+ const result = parseTypes([
243
+ "variant response { ok(string), err(string) }",
244
+ "variant complex { success(response), failure(string) }",
245
+ ]);
246
+
247
+ expect(result.variants).toEqual({
248
+ response: [
249
+ { name: "ok", type: "string", internalType: "string" },
250
+ { name: "err", type: "string", internalType: "string" },
251
+ ],
252
+ complex: [
253
+ {
254
+ name: "success",
255
+ type: "variant",
256
+ internalType: "response",
257
+ components: [
258
+ { name: "ok", type: "string", internalType: "string" },
259
+ { name: "err", type: "string", internalType: "string" },
260
+ ],
261
+ },
262
+ { name: "failure", type: "string", internalType: "string" },
263
+ ],
264
+ });
265
+ });
266
+
267
+ test("parse variants with generics", () => {
268
+ const result = parseTypes([
269
+ "variant response { ok(string), err(string) }",
270
+ "variant error { msg(string), code(u64) }",
271
+ "variant envelope { maybe(option<string>), many(list<string>), nested(response) }",
272
+ ]);
273
+
274
+ expect(result.variants).toEqual({
275
+ response: [
276
+ { name: "ok", type: "string", internalType: "string" },
277
+ { name: "err", type: "string", internalType: "string" },
278
+ ],
279
+ error: [
280
+ { name: "msg", type: "string", internalType: "string" },
281
+ { name: "code", type: "u64", internalType: "u64" },
282
+ ],
283
+ envelope: [
284
+ {
285
+ name: "maybe",
286
+ type: "option<string>",
287
+ internalType: "option<string>",
288
+ },
289
+ { name: "many", type: "list<string>", internalType: "list<string>" },
290
+ {
291
+ name: "nested",
292
+ type: "variant",
293
+ internalType: "response",
294
+ components: [
295
+ { name: "ok", type: "string", internalType: "string" },
296
+ { name: "err", type: "string", internalType: "string" },
297
+ ],
298
+ },
299
+ ],
300
+ });
301
+ });
302
+
303
+ test("variant with unit cases (no payload)", () => {
304
+ const result = parseTypes(["variant status { pending, complete, failed }"]);
305
+
306
+ expect(result.variants).toEqual({
307
+ status: [
308
+ { name: "pending", type: "_", internalType: "_" },
309
+ { name: "complete", type: "_", internalType: "_" },
310
+ { name: "failed", type: "_", internalType: "_" },
311
+ ],
312
+ });
313
+ });
314
+ });
315
+
316
+ describe("parseTypes - enums", () => {
317
+ test("parse basic enum", () => {
318
+ const result = parseTypes(["enum color { red, green, blue }"]);
319
+
320
+ expect(result.enums).toEqual({
321
+ color: ["red", "green", "blue"],
322
+ });
323
+ });
324
+
325
+ test("parse multiple enums", () => {
326
+ const result = parseTypes([
327
+ "enum color { red, green, blue }",
328
+ "enum status { pending, complete, failed }",
329
+ ]);
330
+
331
+ expect(result.enums).toEqual({
332
+ color: ["red", "green", "blue"],
333
+ status: ["pending", "complete", "failed"],
334
+ });
335
+ });
336
+
337
+ test("record referencing enum", () => {
338
+ const result = parseTypes([
339
+ "enum color { red, green, blue }",
340
+ "record palette { primary: color, secondary: color }",
341
+ ]);
342
+
343
+ expect(result.records).toEqual({
344
+ palette: [
345
+ {
346
+ name: "primary",
347
+ type: "enum",
348
+ internalType: "color",
349
+ components: [
350
+ { name: "red", type: "_" },
351
+ { name: "green", type: "_" },
352
+ { name: "blue", type: "_" },
353
+ ],
354
+ },
355
+ {
356
+ name: "secondary",
357
+ type: "enum",
358
+ internalType: "color",
359
+ components: [
360
+ { name: "red", type: "_" },
361
+ { name: "green", type: "_" },
362
+ { name: "blue", type: "_" },
363
+ ],
364
+ },
365
+ ],
366
+ });
367
+ });
368
+
369
+ test("enum wrapped in generics", () => {
370
+ const result = parseTypes([
371
+ "enum status { pending, complete, failed }",
372
+ "record task { current: status, history: list<status>, maybe: option<status> }",
373
+ ]);
374
+
375
+ expect(result.records).toEqual({
376
+ task: [
377
+ {
378
+ name: "current",
379
+ type: "enum",
380
+ internalType: "status",
381
+ components: [
382
+ { name: "pending", type: "_" },
383
+ { name: "complete", type: "_" },
384
+ { name: "failed", type: "_" },
385
+ ],
386
+ },
387
+ {
388
+ name: "history",
389
+ type: "list<enum>",
390
+ internalType: "list<status>",
391
+ components: [
392
+ { name: "pending", type: "_" },
393
+ { name: "complete", type: "_" },
394
+ { name: "failed", type: "_" },
395
+ ],
396
+ },
397
+ {
398
+ name: "maybe",
399
+ type: "option<enum>",
400
+ internalType: "option<status>",
401
+ components: [
402
+ { name: "pending", type: "_" },
403
+ { name: "complete", type: "_" },
404
+ { name: "failed", type: "_" },
405
+ ],
406
+ },
407
+ ],
408
+ });
409
+ });
410
+
411
+ test("variant referencing enum", () => {
412
+ const result = parseTypes([
413
+ "enum status { pending, complete, failed }",
414
+ "variant response { ok(status), err(string) }",
415
+ ]);
416
+
417
+ expect(result.variants).toEqual({
418
+ response: [
419
+ {
420
+ name: "ok",
421
+ type: "enum",
422
+ internalType: "status",
423
+ components: [
424
+ { name: "pending", type: "_" },
425
+ { name: "complete", type: "_" },
426
+ { name: "failed", type: "_" },
427
+ ],
428
+ },
429
+ { name: "err", type: "string", internalType: "string" },
430
+ ],
431
+ });
432
+ });
433
+ });
434
+
435
+ describe("parseTypes - mixed types", () => {
436
+ test("parse all three types together", () => {
437
+ const result = parseTypes([
438
+ "enum status { pending, complete, failed }",
439
+ "record user { name: string, status: status }",
440
+ "variant response { ok(user), err(string) }",
441
+ ]);
442
+
443
+ expect(result.enums).toEqual({
444
+ status: ["pending", "complete", "failed"],
445
+ });
446
+
447
+ expect(result.records).toEqual({
448
+ user: [
449
+ { name: "name", type: "string", internalType: "string" },
450
+ {
451
+ name: "status",
452
+ type: "enum",
453
+ internalType: "status",
454
+ components: [
455
+ { name: "pending", type: "_" },
456
+ { name: "complete", type: "_" },
457
+ { name: "failed", type: "_" },
458
+ ],
459
+ },
460
+ ],
461
+ });
462
+
463
+ expect(result.variants).toEqual({
464
+ response: [
465
+ {
466
+ name: "ok",
467
+ type: "record",
468
+ internalType: "user",
469
+ components: [
470
+ { name: "name", type: "string", internalType: "string" },
471
+ {
472
+ name: "status",
473
+ type: "enum",
474
+ internalType: "status",
475
+ components: [
476
+ { name: "pending", type: "_" },
477
+ { name: "complete", type: "_" },
478
+ { name: "failed", type: "_" },
479
+ ],
480
+ },
481
+ ],
482
+ },
483
+ { name: "err", type: "string", internalType: "string" },
484
+ ],
485
+ });
486
+ });
487
+
488
+ test("complex nested types", () => {
489
+ const result = parseTypes([
490
+ "enum color { red, green, blue }",
491
+ "record point { x: u32, y: u32 }",
492
+ "record rectangle { top-left: point, bottom-right: point }",
493
+ "variant shape { circle(u32), rect(rectangle), colored(color) }",
494
+ "record canvas { shapes: list<shape>, background: color }",
495
+ ]);
496
+
497
+ expect(result.records.canvas).toEqual([
498
+ {
499
+ name: "shapes",
500
+ type: "list<variant>",
501
+ internalType: "list<shape>",
502
+ components: [
503
+ { name: "circle", type: "u32", internalType: "u32" },
504
+ {
505
+ name: "rect",
506
+ type: "record",
507
+ internalType: "rectangle",
508
+ components: [
509
+ {
510
+ name: "top-left",
511
+ type: "record",
512
+ internalType: "point",
513
+ components: [
514
+ { name: "x", type: "u32", internalType: "u32" },
515
+ { name: "y", type: "u32", internalType: "u32" },
516
+ ],
517
+ },
518
+ {
519
+ name: "bottom-right",
520
+ type: "record",
521
+ internalType: "point",
522
+ components: [
523
+ { name: "x", type: "u32", internalType: "u32" },
524
+ { name: "y", type: "u32", internalType: "u32" },
525
+ ],
526
+ },
527
+ ],
528
+ },
529
+ {
530
+ name: "colored",
531
+ type: "enum",
532
+ internalType: "color",
533
+ components: [
534
+ { name: "red", type: "_" },
535
+ { name: "green", type: "_" },
536
+ { name: "blue", type: "_" },
537
+ ],
538
+ },
539
+ ],
540
+ },
541
+ {
542
+ name: "background",
543
+ type: "enum",
544
+ internalType: "color",
545
+ components: [
546
+ { name: "red", type: "_" },
547
+ { name: "green", type: "_" },
548
+ { name: "blue", type: "_" },
549
+ ],
550
+ },
551
+ ]);
552
+ });
553
+ });
554
+
555
+ describe("parseTypes - error handling", () => {
556
+ test("detects namespace collision between record and variant", () => {
557
+ expect(() =>
558
+ parseTypes([
559
+ "record user { name: string }",
560
+ "variant user { ok(string), err(string) }",
561
+ ]),
562
+ ).toThrow('Namespace collision: "user" is both record and variant.');
563
+ });
564
+
565
+ test("detects namespace collision between record and enum", () => {
566
+ expect(() =>
567
+ parseTypes([
568
+ "record status { value: string }",
569
+ "enum status { pending, complete, failed }",
570
+ ]),
571
+ ).toThrow('Namespace collision: "status" is both record and enum.');
572
+ });
573
+
574
+ test("detects namespace collision between variant and enum", () => {
575
+ expect(() =>
576
+ parseTypes([
577
+ "record rgb { r: u8, g: u8, b: u8 }",
578
+ "variant color { hex(string), rgb(rbg) }",
579
+ "enum color { red, green, blue }",
580
+ ]),
581
+ ).toThrow('Namespace collision: "color" is both variant and enum.');
582
+ });
583
+
584
+ test("detects circular reference in records", () => {
585
+ expect(() =>
586
+ parseTypes(["record a { b: b }", "record b { a: a }"]),
587
+ ).toThrow('Circular reference detected at "b".');
588
+ });
589
+
590
+ test("detects circular reference in variants", () => {
591
+ expect(() =>
592
+ parseTypes(["variant a { wraps(b) }", "variant b { wraps(a) }"]),
593
+ ).toThrow('Circular reference detected at "b".');
594
+ });
595
+
596
+ test("detects circular reference across record and variant", () => {
597
+ expect(() =>
598
+ parseTypes(["record r { value: v }", "variant v { wraps(r) }"]),
599
+ ).toThrow('Circular reference detected at "v".');
600
+ });
601
+
602
+ test("rejects enum with payload", () => {
603
+ expect(() =>
604
+ parseTypes(["enum status { pending(string), complete, failed }"]),
605
+ ).toThrow(
606
+ "Invalid enum case: pending(string). Enums cannot have payloads.",
607
+ );
608
+ });
609
+ });