@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,221 @@
1
+ import { describe, it, expect } from "vitest";
2
+
3
+ import {
4
+ stripOuter,
5
+ parseConstructorCall,
6
+ findMatchingParenIndex,
7
+ splitTopLevelComma,
8
+ splitTopLevelColon,
9
+ } from "./util.js";
10
+
11
+ describe("wave-parse helpers", () => {
12
+ describe("stripOuter", () => {
13
+ it("strips outer delimiters and trims inner", () => {
14
+ expect(stripOuter(" { a: 1 } ", "{", "}")).toEqual({
15
+ inner: "a: 1",
16
+ hadOuter: true,
17
+ });
18
+ });
19
+
20
+ it("returns trimmed string when delimiters not present", () => {
21
+ expect(stripOuter(" a: 1 ", "{", "}")).toEqual({
22
+ inner: "a: 1",
23
+ hadOuter: false,
24
+ });
25
+ });
26
+
27
+ it("does not strip if only opening matches", () => {
28
+ expect(stripOuter("{ a: 1 ", "{", "}")).toEqual({
29
+ inner: "{ a: 1",
30
+ hadOuter: false,
31
+ });
32
+ });
33
+
34
+ it("does not strip if only closing matches", () => {
35
+ expect(stripOuter(" a: 1 }", "{", "}")).toEqual({
36
+ inner: "a: 1 }",
37
+ hadOuter: false,
38
+ });
39
+ });
40
+
41
+ it("supports multi-character delimiters", () => {
42
+ expect(stripOuter(" ok( 123 ) ", "ok(", ")")).toEqual({
43
+ inner: "123",
44
+ hadOuter: true,
45
+ });
46
+ });
47
+
48
+ it("strips even if inner is empty", () => {
49
+ expect(stripOuter(" ( ) ", "(", ")")).toEqual({
50
+ inner: "",
51
+ hadOuter: true,
52
+ });
53
+ });
54
+ });
55
+
56
+ describe("findMatchingParenIndex", () => {
57
+ it("finds matching closing paren for simple expression", () => {
58
+ const s = "(abc)";
59
+ expect(findMatchingParenIndex(s, 0)).toBe(4);
60
+ });
61
+
62
+ it("handles nested parentheses", () => {
63
+ const s = "(a(b)c)";
64
+ // indices: 0 '(' ... 6 ')'
65
+ expect(findMatchingParenIndex(s, 0)).toBe(6);
66
+ });
67
+
68
+ it("handles nested braces and brackets inside parens", () => {
69
+ const s = "({x: [1, 2, (3)]})";
70
+ expect(findMatchingParenIndex(s, 0)).toBe(s.length - 1);
71
+ });
72
+ it("ignores parentheses inside quoted strings", () => {
73
+ const s = '(")")';
74
+ expect(findMatchingParenIndex(s, 0)).toBe(s.length - 1);
75
+ });
76
+
77
+ it("handles escaped quotes inside strings", () => {
78
+ const s = '("a \\" ) \\" b")';
79
+ expect(findMatchingParenIndex(s, 0)).toBe(s.length - 1);
80
+ });
81
+
82
+ it("throws if openIndex is not '('", () => {
83
+ expect(() => findMatchingParenIndex("abc", 0)).toThrow(
84
+ "internal: expected '('",
85
+ );
86
+ });
87
+
88
+ it("throws on missing closing paren", () => {
89
+ expect(() => findMatchingParenIndex("(abc", 0)).toThrow(
90
+ "missing closing ')'",
91
+ );
92
+ });
93
+ });
94
+
95
+ describe("parseConstructorCall", () => {
96
+ it("parses name only", () => {
97
+ expect(parseConstructorCall("none")).toEqual({ name: "none", arg: null });
98
+ });
99
+
100
+ it("parses name + argument", () => {
101
+ expect(parseConstructorCall("some( 123 )")).toEqual({
102
+ name: "some",
103
+ arg: "123",
104
+ });
105
+ });
106
+
107
+ it("parses nested argument with braces/brackets/parens", () => {
108
+ expect(
109
+ parseConstructorCall('ok({r0: 7, r1: 0, inner: [1, (2)], s: "a,b"})'),
110
+ ).toEqual({
111
+ name: "ok",
112
+ arg: '{r0: 7, r1: 0, inner: [1, (2)], s: "a,b"}',
113
+ });
114
+ });
115
+
116
+ it("returns null arg for empty parens", () => {
117
+ expect(parseConstructorCall("some( )")).toEqual({
118
+ name: "some",
119
+ arg: null,
120
+ });
121
+ });
122
+
123
+ it("throws when missing '(' after name but has trailing stuff", () => {
124
+ expect(() => parseConstructorCall("some 123")).toThrow(
125
+ 'expected "(" after constructor name "some"',
126
+ );
127
+ });
128
+
129
+ it("throws when trailing junk exists after closing paren", () => {
130
+ expect(() => parseConstructorCall("some(1) )")).toThrow(
131
+ 'unexpected trailing characters after some(...): ")"',
132
+ );
133
+ });
134
+
135
+ it("throws on invalid constructor expression", () => {
136
+ expect(() => parseConstructorCall(" 123")).toThrow(
137
+ 'invalid constructor expression: " 123"',
138
+ );
139
+ });
140
+ expect(() => parseConstructorCall("some(1))")).toThrow(
141
+ 'unexpected trailing characters after some(...): ")"',
142
+ );
143
+ });
144
+
145
+ describe("splitTopLevelComma", () => {
146
+ it("splits simple comma-separated values", () => {
147
+ expect(splitTopLevelComma("a, b, c")).toEqual(["a", "b", "c"]);
148
+ });
149
+
150
+ it("does not split inside parentheses", () => {
151
+ expect(splitTopLevelComma("a, f(1,2), c")).toEqual(["a", "f(1,2)", "c"]);
152
+ });
153
+
154
+ it("does not split inside braces", () => {
155
+ expect(splitTopLevelComma("a, {x: 1, y: 2}, c")).toEqual([
156
+ "a",
157
+ "{x: 1, y: 2}",
158
+ "c",
159
+ ]);
160
+ });
161
+
162
+ it("does not split inside brackets", () => {
163
+ expect(splitTopLevelComma("a, [1,2,3], c")).toEqual([
164
+ "a",
165
+ "[1,2,3]",
166
+ "c",
167
+ ]);
168
+ });
169
+
170
+ it("does not split inside quoted strings", () => {
171
+ expect(splitTopLevelComma('"a,b", c, "d,e"')).toEqual([
172
+ '"a,b"',
173
+ "c",
174
+ '"d,e"',
175
+ ]);
176
+ });
177
+
178
+ it("handles escaped quotes within strings", () => {
179
+ expect(splitTopLevelComma('"a,\\"b\\"", c')).toEqual([
180
+ '"a,\\"b\\""',
181
+ "c",
182
+ ]);
183
+ });
184
+
185
+ it("drops empty segments (consecutive commas)", () => {
186
+ expect(splitTopLevelComma("a,, b, , c")).toEqual(["a", "b", "c"]);
187
+ });
188
+
189
+ it("returns [] when inner is empty or whitespace", () => {
190
+ expect(splitTopLevelComma("")).toEqual([]);
191
+ expect(splitTopLevelComma(" ")).toEqual([]);
192
+ });
193
+ });
194
+
195
+ describe("splitTopLevelColon", () => {
196
+ it("splits key:value at the top level", () => {
197
+ expect(splitTopLevelColon("r0: 7")).toEqual(["r0", "7"]);
198
+ });
199
+
200
+ it("does not split on colons inside braces/brackets/parens", () => {
201
+ expect(splitTopLevelColon('k: {a: 1, b: "x:y"}')).toEqual([
202
+ "k",
203
+ '{a: 1, b: "x:y"}',
204
+ ]);
205
+ });
206
+
207
+ it("does not split on colon inside quoted strings", () => {
208
+ expect(splitTopLevelColon('k: "a:b:c"')).toEqual(["k", '"a:b:c"']);
209
+ });
210
+
211
+ it("trims both sides", () => {
212
+ expect(splitTopLevelColon(" k : v ")).toEqual(["k", "v"]);
213
+ });
214
+
215
+ it("throws if no top-level colon exists", () => {
216
+ expect(() => splitTopLevelColon("nope")).toThrow(
217
+ 'expected "key: value", got "nope"',
218
+ );
219
+ });
220
+ });
221
+ });
@@ -0,0 +1,193 @@
1
+ export function stripOuter(
2
+ s: string,
3
+ open: string,
4
+ close: string,
5
+ ): { inner: string; hadOuter: boolean } {
6
+ const t = s.trim();
7
+ if (t.startsWith(open) && t.endsWith(close)) {
8
+ return {
9
+ inner: t.slice(open.length, t.length - close.length).trim(),
10
+ hadOuter: true,
11
+ };
12
+ }
13
+ return { inner: t, hadOuter: false };
14
+ }
15
+
16
+ export function parseConstructorCall(expr: string): {
17
+ name: string;
18
+ arg: string | null;
19
+ } {
20
+ const s = expr.trim();
21
+ const m = /^([a-zA-Z_][a-zA-Z0-9_]*)\s*(.*)$/.exec(s);
22
+ if (!m) throw new Error(`invalid constructor expression: "${expr}"`);
23
+
24
+ const name = m[1]!;
25
+ const rest = m[2]!.trim();
26
+ if (rest === "") return { name, arg: null };
27
+
28
+ if (!rest.startsWith("(")) {
29
+ throw new Error(`expected "(" after constructor name "${name}": "${expr}"`);
30
+ }
31
+
32
+ const end = findMatchingParenIndex(rest, 0);
33
+ const arg = rest.slice(1, end).trim();
34
+ const trailing = rest.slice(end + 1).trim();
35
+ if (trailing.length !== 0) {
36
+ throw new Error(
37
+ `unexpected trailing characters after ${name}(...): "${trailing}"`,
38
+ );
39
+ }
40
+
41
+ return { name, arg: arg === "" ? null : arg };
42
+ }
43
+
44
+ // Finds matching ')' for '(' at openIndex, respecting nested (), {}, [], and quoted strings.
45
+ export function findMatchingParenIndex(s: string, openIndex: number): number {
46
+ if (s[openIndex] !== "(") throw new Error("internal: expected '('");
47
+
48
+ let paren = 0;
49
+ let brace = 0;
50
+ let bracket = 0;
51
+ let inString = false;
52
+ let escape = false;
53
+
54
+ for (let i = openIndex; i < s.length; i++) {
55
+ const ch = s[i]!;
56
+
57
+ if (inString) {
58
+ if (escape) {
59
+ escape = false;
60
+ continue;
61
+ }
62
+ if (ch === "\\") {
63
+ escape = true;
64
+ continue;
65
+ }
66
+ if (ch === '"') {
67
+ inString = false;
68
+ }
69
+ continue;
70
+ }
71
+
72
+ if (ch === '"') {
73
+ inString = true;
74
+ continue;
75
+ }
76
+
77
+ if (ch === "(") paren++;
78
+ else if (ch === ")") {
79
+ paren--;
80
+ if (paren === 0 && brace === 0 && bracket === 0) return i;
81
+ if (paren < 0) throw new Error("unbalanced parentheses");
82
+ } else if (ch === "{") brace++;
83
+ else if (ch === "}") brace--;
84
+ else if (ch === "[") bracket++;
85
+ else if (ch === "]") bracket--;
86
+ }
87
+
88
+ throw new Error("missing closing ')'");
89
+ }
90
+
91
+ // Split a string by top-level commas, respecting nested delimiters + strings.
92
+ export function splitTopLevelComma(inner: string): string[] {
93
+ const out: string[] = [];
94
+
95
+ let paren = 0;
96
+ let brace = 0;
97
+ let bracket = 0;
98
+ let inString = false;
99
+ let escape = false;
100
+
101
+ let cur = "";
102
+
103
+ for (let i = 0; i < inner.length; i++) {
104
+ const ch = inner[i]!;
105
+
106
+ if (inString) {
107
+ cur += ch;
108
+ if (escape) {
109
+ escape = false;
110
+ continue;
111
+ }
112
+ if (ch === "\\") {
113
+ escape = true;
114
+ continue;
115
+ }
116
+ if (ch === '"') inString = false;
117
+ continue;
118
+ }
119
+
120
+ if (ch === '"') {
121
+ inString = true;
122
+ cur += ch;
123
+ continue;
124
+ }
125
+
126
+ if (ch === "(") paren++;
127
+ else if (ch === ")") paren--;
128
+ else if (ch === "{") brace++;
129
+ else if (ch === "}") brace--;
130
+ else if (ch === "[") bracket++;
131
+ else if (ch === "]") bracket--;
132
+
133
+ if (ch === "," && paren === 0 && brace === 0 && bracket === 0) {
134
+ const piece = cur.trim();
135
+ if (piece) out.push(piece);
136
+ cur = "";
137
+ continue;
138
+ }
139
+
140
+ cur += ch;
141
+ }
142
+
143
+ const last = cur.trim();
144
+ if (last) out.push(last);
145
+
146
+ return out;
147
+ }
148
+
149
+ // Split `key: value` at the first top-level colon (rarely necessary, but safe).
150
+ export function splitTopLevelColon(part: string): [string, string] {
151
+ const s = part.trim();
152
+
153
+ let paren = 0;
154
+ let brace = 0;
155
+ let bracket = 0;
156
+ let inString = false;
157
+ let escape = false;
158
+
159
+ for (let i = 0; i < s.length; i++) {
160
+ const ch = s[i]!;
161
+
162
+ if (inString) {
163
+ if (escape) {
164
+ escape = false;
165
+ continue;
166
+ }
167
+ if (ch === "\\") {
168
+ escape = true;
169
+ continue;
170
+ }
171
+ if (ch === '"') inString = false;
172
+ continue;
173
+ }
174
+
175
+ if (ch === '"') {
176
+ inString = true;
177
+ continue;
178
+ }
179
+
180
+ if (ch === "(") paren++;
181
+ else if (ch === ")") paren--;
182
+ else if (ch === "{") brace++;
183
+ else if (ch === "}") brace--;
184
+ else if (ch === "[") bracket++;
185
+ else if (ch === "]") bracket--;
186
+
187
+ if (ch === ":" && paren === 0 && brace === 0 && bracket === 0) {
188
+ return [s.slice(0, i).trim(), s.slice(i + 1).trim()];
189
+ }
190
+ }
191
+
192
+ throw new Error(`expected "key: value", got "${part}"`);
193
+ }