@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,392 @@
1
+ import type { WitParameter } from "../../wit.js";
2
+ import {
3
+ InvalidRecordSignatureError,
4
+ InvalidSignatureError,
5
+ } from "./errors/signature.js";
6
+ import {
7
+ execRecordSignature,
8
+ execVariantSignature,
9
+ execEnumSignature,
10
+ isRecordSignature,
11
+ isVariantSignature,
12
+ isEnumSignature,
13
+ } from "./signatures.js";
14
+ import { parseWitParameter, splitParameters } from "./utils.js";
15
+ import type {
16
+ EnumLookup,
17
+ RecordLookup,
18
+ VariantLookup,
19
+ } from "./types/user-defined.js";
20
+
21
+ // type ParseOptions = {
22
+ // variants?: VariantLookup;
23
+ // records?: RecordLookup;
24
+ // enums?: EnumLookup;
25
+ // };
26
+
27
+ type TypeKind = "record" | "variant" | "enum";
28
+
29
+ type TypeSignatureHandler = {
30
+ kind: TypeKind;
31
+ isSignature: (sig: string) => boolean;
32
+ execSignature: (sig: string) => any;
33
+ parseComponents: (match: any, kind: TypeKind) => WitParameter[] | string[];
34
+ validateComponents: (components: any[], signature: string) => void;
35
+ };
36
+
37
+ function normalizeVariantCaseToken(caseItem: string): string {
38
+ const s = caseItem.trim();
39
+ if (!s) return "";
40
+ // ok(string) -> ok: string
41
+ // ok ( string ) -> ok: string
42
+ const m = /^([A-Za-z$_][A-Za-z0-9$_-]*)\s*(?:\(\s*([\s\S]*?)\s*\))?$/.exec(s);
43
+ if (!m) throw new Error(`Invalid variant case: ${caseItem}`);
44
+ const name = m[1]!;
45
+ const payload = m[2];
46
+ // No payload means a unit-like case. Use "_"
47
+ return payload == null || payload.trim() === ""
48
+ ? `${name}: _`
49
+ : `${name}: ${payload.trim()}`;
50
+ }
51
+
52
+ const typeHandlers: TypeSignatureHandler[] = [
53
+ {
54
+ kind: "record",
55
+ isSignature: isRecordSignature,
56
+ execSignature: execRecordSignature,
57
+ parseComponents: (match, kind) => {
58
+ const properties = splitParameters(match.properties);
59
+ const components: WitParameter[] = [];
60
+
61
+ for (let k = 0; k < properties.length; k++) {
62
+ const property = properties[k]!;
63
+ const trimmed = property.trim();
64
+ if (!trimmed) continue;
65
+
66
+ const witParameter = parseWitParameter(trimmed, { type: kind });
67
+ components.push(witParameter);
68
+ }
69
+
70
+ return components;
71
+ },
72
+ validateComponents: (components, signature) => {
73
+ if (!components.length) {
74
+ throw new InvalidRecordSignatureError({ signature });
75
+ }
76
+ },
77
+ },
78
+ {
79
+ kind: "variant",
80
+ isSignature: isVariantSignature,
81
+ execSignature: execVariantSignature,
82
+ parseComponents: (match, kind) => {
83
+ const cases = match.cases.split(",");
84
+ const components: WitParameter[] = [];
85
+
86
+ for (let k = 0; k < cases.length; k++) {
87
+ const caseItem = cases[k]!;
88
+ const trimmed = caseItem.trim();
89
+ if (!trimmed) continue;
90
+
91
+ const normalized = normalizeVariantCaseToken(trimmed);
92
+ const witParameter = parseWitParameter(normalized, { type: kind });
93
+ components.push(witParameter);
94
+ }
95
+
96
+ return components;
97
+ },
98
+ validateComponents: (components, signature) => {
99
+ if (!components.length) {
100
+ throw new InvalidSignatureError({ signature, type: "variant" });
101
+ }
102
+ },
103
+ },
104
+ {
105
+ kind: "enum",
106
+ isSignature: isEnumSignature,
107
+ execSignature: execEnumSignature,
108
+ parseComponents: (match) => {
109
+ const cases = match.cases.split(",");
110
+ const components: string[] = [];
111
+
112
+ for (let k = 0; k < cases.length; k++) {
113
+ const caseItem = cases[k]!;
114
+ const trimmed = caseItem.trim();
115
+ if (!trimmed) continue;
116
+
117
+ // Validate it's a simple identifier (no payloads)
118
+ if (!/^[A-Za-z$_][A-Za-z0-9$_-]*$/.test(trimmed)) {
119
+ throw new Error(
120
+ `Invalid enum case: ${trimmed}. Enums cannot have payloads.`,
121
+ );
122
+ }
123
+
124
+ components.push(trimmed);
125
+ }
126
+
127
+ return components;
128
+ },
129
+ validateComponents: (components, signature) => {
130
+ if (!components.length) {
131
+ throw new InvalidSignatureError({ signature, type: "enum" });
132
+ }
133
+ },
134
+ },
135
+ ];
136
+
137
+ export function parseTypes(signatures: readonly string[]) {
138
+ const shallowRecords: RecordLookup = {};
139
+ const shallowVariants: VariantLookup = {};
140
+ const shallowEnums: EnumLookup = {};
141
+ const signaturesLength = signatures.length;
142
+
143
+ // First pass: parse all signatures into shallow structures
144
+ for (let i = 0; i < signaturesLength; i++) {
145
+ const signature = signatures[i]!;
146
+
147
+ for (const handler of typeHandlers) {
148
+ if (!handler.isSignature(signature)) continue;
149
+
150
+ const match = handler.execSignature(signature);
151
+ if (!match) {
152
+ throw new InvalidSignatureError({ signature, type: handler.kind });
153
+ }
154
+
155
+ const components = handler.parseComponents(match, handler.kind);
156
+ handler.validateComponents(components, signature);
157
+
158
+ // Store in appropriate lookup
159
+ switch (handler.kind) {
160
+ case "record":
161
+ shallowRecords[match.name] = components as WitParameter[];
162
+ break;
163
+ case "variant":
164
+ shallowVariants[match.name] = components as WitParameter[];
165
+ break;
166
+ case "enum":
167
+ shallowEnums[match.name] = components as string[];
168
+ break;
169
+ }
170
+
171
+ break; // Found matching handler, no need to check others
172
+ }
173
+ }
174
+
175
+ // Check for namespace collisions
176
+ assertNoCollisions(shallowRecords, shallowVariants, shallowEnums);
177
+
178
+ // Second pass: resolve all references
179
+ const resolvedRecords: RecordLookup = {};
180
+ const recordEntries = Object.entries(shallowRecords);
181
+ for (let i = 0; i < recordEntries.length; i++) {
182
+ const [name, parameters] = recordEntries[i]!;
183
+ resolvedRecords[name] = resolveTypes(
184
+ parameters,
185
+ shallowRecords,
186
+ shallowVariants,
187
+ shallowEnums,
188
+ new Set<string>(),
189
+ );
190
+ }
191
+
192
+ const resolvedVariants: VariantLookup = {};
193
+ const variantEntries = Object.entries(shallowVariants);
194
+ for (let i = 0; i < variantEntries.length; i++) {
195
+ const [name, parameters] = variantEntries[i]!;
196
+ resolvedVariants[name] = resolveTypes(
197
+ parameters,
198
+ shallowRecords,
199
+ shallowVariants,
200
+ shallowEnums,
201
+ new Set<string>(),
202
+ );
203
+ }
204
+
205
+ // Enums don't need resolution as they have no type references
206
+ const resolvedEnums: EnumLookup = { ...shallowEnums };
207
+
208
+ return {
209
+ records: resolvedRecords,
210
+ variants: resolvedVariants,
211
+ enums: resolvedEnums,
212
+ };
213
+ }
214
+
215
+ type WitWrapper = "borrow" | "list" | "option" | "result";
216
+
217
+ type ExecWitType =
218
+ | { wrapper?: Exclude<WitWrapper, "result">; base: string }
219
+ | { wrapper: "result"; base: string }
220
+ | null;
221
+
222
+ function isAngleBalanced(s: string): boolean {
223
+ let depth = 0;
224
+ for (const ch of s) {
225
+ if (ch === "<") depth++;
226
+ else if (ch === ">") {
227
+ depth--;
228
+ if (depth < 0) return false;
229
+ }
230
+ }
231
+ return depth === 0;
232
+ }
233
+
234
+ export const witResultRegex =
235
+ /^result\s*<\s*(?<ok>[\s\S]+?)\s*,\s*(?<err>error)\s*>$/;
236
+
237
+ export const witTypeRegex =
238
+ /^(?:(?<wrapper>borrow|list|option)\s*<\s*(?<wrapped>[\s\S]+?)\s*>|(?<base>[a-zA-Z$_][a-zA-Z0-9$_-]*))$/;
239
+
240
+ export function execWitType(type: string): ExecWitType {
241
+ const t = type.trim();
242
+ if (!t) return null;
243
+
244
+ const rm = t.match(witResultRegex);
245
+ if (rm?.groups?.ok) {
246
+ const ok = rm.groups.ok.trim();
247
+ if (!isAngleBalanced(ok)) return null;
248
+ return { wrapper: "result", base: ok };
249
+ }
250
+
251
+ const m = t.match(witTypeRegex);
252
+ if (!m?.groups) return null;
253
+
254
+ const wrapper = m.groups.wrapper as "borrow" | "list" | "option" | undefined;
255
+ const base = (m.groups.wrapped ?? m.groups.base)?.trim();
256
+ if (!base) return null;
257
+
258
+ if (wrapper) {
259
+ if (!isAngleBalanced(base)) return null;
260
+ return { wrapper, base };
261
+ }
262
+
263
+ return { base };
264
+ }
265
+
266
+ function assertNoCollisions(
267
+ records: RecordLookup,
268
+ variants: VariantLookup,
269
+ enums: EnumLookup,
270
+ ) {
271
+ const allTypes = [
272
+ ...Object.keys(records).map((k) => ({ name: k, kind: "record" })),
273
+ ...Object.keys(variants).map((k) => ({ name: k, kind: "variant" })),
274
+ ...Object.keys(enums).map((k) => ({ name: k, kind: "enum" })),
275
+ ];
276
+
277
+ const seen = new Map<string, string>();
278
+
279
+ for (const { name, kind } of allTypes) {
280
+ const existing = seen.get(name);
281
+ if (existing) {
282
+ throw new Error(
283
+ `Namespace collision: "${name}" is both ${existing} and ${kind}.`,
284
+ );
285
+ }
286
+ seen.set(name, kind);
287
+ }
288
+ }
289
+
290
+ function resolveTypes(
291
+ witParameters: readonly (WitParameter & { indexed?: true })[],
292
+ records: RecordLookup,
293
+ variants: VariantLookup,
294
+ enums: EnumLookup,
295
+ ancestors = new Set<string>(),
296
+ ) {
297
+ const components: WitParameter[] = [];
298
+
299
+ for (const witParameter of witParameters) {
300
+ const m = execWitType(witParameter.type);
301
+ if (!m?.base) throw new Error(`Invalid WIT type: ${witParameter.type}`);
302
+
303
+ const base = m.base.trim();
304
+
305
+ // Check if it's a named record
306
+ if (base in records) {
307
+ if (ancestors.has(base)) {
308
+ throw new Error(`Circular reference detected at "${base}".`);
309
+ }
310
+
311
+ components.push({
312
+ ...witParameter,
313
+ type: m.wrapper
314
+ ? m.wrapper === "result"
315
+ ? `result<record, error>`
316
+ : `${m.wrapper}<record>`
317
+ : "record",
318
+ components: resolveTypes(
319
+ records[base] ?? [],
320
+ records,
321
+ variants,
322
+ enums,
323
+ new Set([...ancestors, base]),
324
+ ),
325
+ });
326
+ continue;
327
+ }
328
+
329
+ // Check if it's a named variant
330
+ if (base in variants) {
331
+ if (ancestors.has(base)) {
332
+ throw new Error(`Circular reference detected at "${base}".`);
333
+ }
334
+
335
+ components.push({
336
+ ...witParameter,
337
+ type: m.wrapper
338
+ ? m.wrapper === "result"
339
+ ? `result<variant, error>`
340
+ : `${m.wrapper}<variant>`
341
+ : "variant",
342
+ internalType: m.wrapper
343
+ ? m.wrapper === "result"
344
+ ? `result<${base}, error>`
345
+ : `${m.wrapper}<${base}>`
346
+ : base,
347
+ components: resolveTypes(
348
+ variants[base] ?? [],
349
+ records,
350
+ variants,
351
+ enums,
352
+ new Set([...ancestors, base]),
353
+ ),
354
+ });
355
+ continue;
356
+ }
357
+
358
+ // Check if it's a named enum
359
+ if (base in enums) {
360
+ if (ancestors.has(base)) {
361
+ throw new Error(`Circular reference detected at "${base}".`);
362
+ }
363
+
364
+ // Convert enum values to WitParameters for consistency
365
+ const enumCases = enums[base]!.map((caseName) => ({
366
+ name: caseName,
367
+ type: "_", // Unit type
368
+ }));
369
+
370
+ components.push({
371
+ ...witParameter,
372
+ type: m.wrapper
373
+ ? m.wrapper === "result"
374
+ ? `result<enum, error>`
375
+ : `${m.wrapper}<enum>`
376
+ : "enum",
377
+ internalType: m.wrapper
378
+ ? m.wrapper === "result"
379
+ ? `result<${base}, error>`
380
+ : `${m.wrapper}<${base}>`
381
+ : base,
382
+ components: enumCases as WitParameter[],
383
+ });
384
+ continue;
385
+ }
386
+
387
+ // Otherwise, pass through (builtins, generics, etc.)
388
+ components.push(witParameter);
389
+ }
390
+
391
+ return components;
392
+ }