@stellar/stellar-sdk 16.0.1 → 16.2.0

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 (310) hide show
  1. package/README.md +41 -2
  2. package/dist/stellar-sdk-axios.js +5401 -3690
  3. package/dist/stellar-sdk-axios.js.map +1 -1
  4. package/dist/stellar-sdk-axios.min.js +12 -11
  5. package/dist/stellar-sdk-axios.min.js.map +1 -1
  6. package/dist/stellar-sdk.js +4850 -3681
  7. package/dist/stellar-sdk.js.map +1 -1
  8. package/dist/stellar-sdk.min.js +17 -17
  9. package/dist/stellar-sdk.min.js.map +1 -1
  10. package/lib/axios/cjs/base/auth.js +147 -30
  11. package/lib/axios/cjs/base/auth.js.map +1 -1
  12. package/lib/axios/cjs/base/index.js +113 -0
  13. package/lib/axios/cjs/base/index.js.map +1 -0
  14. package/lib/axios/cjs/base/keypair.js +39 -0
  15. package/lib/axios/cjs/base/keypair.js.map +1 -1
  16. package/lib/axios/cjs/base/scval.js +34 -0
  17. package/lib/axios/cjs/base/scval.js.map +1 -1
  18. package/lib/axios/cjs/bindings/client.js +170 -0
  19. package/lib/axios/cjs/bindings/client.js.map +1 -1
  20. package/lib/axios/cjs/bindings/config.js +1 -1
  21. package/lib/axios/cjs/bindings/generator.js +45 -16
  22. package/lib/axios/cjs/bindings/generator.js.map +1 -1
  23. package/lib/axios/cjs/bindings/types.js +151 -1
  24. package/lib/axios/cjs/bindings/types.js.map +1 -1
  25. package/lib/axios/cjs/bindings/utils.js +10 -0
  26. package/lib/axios/cjs/bindings/utils.js.map +1 -1
  27. package/lib/axios/cjs/cli/index.js +19 -22
  28. package/lib/axios/cjs/cli/index.js.map +1 -1
  29. package/lib/axios/cjs/cli/util.js +1 -20
  30. package/lib/axios/cjs/cli/util.js.map +1 -1
  31. package/lib/axios/cjs/contract/assembled_transaction.js +39 -17
  32. package/lib/axios/cjs/contract/assembled_transaction.js.map +1 -1
  33. package/lib/axios/cjs/contract/basic_node_signer.js +8 -42
  34. package/lib/axios/cjs/contract/basic_node_signer.js.map +1 -1
  35. package/lib/axios/cjs/contract/client.js +56 -3
  36. package/lib/axios/cjs/contract/client.js.map +1 -1
  37. package/lib/axios/cjs/contract/event_spec.js +164 -0
  38. package/lib/axios/cjs/contract/event_spec.js.map +1 -0
  39. package/lib/axios/cjs/contract/index.js +2 -0
  40. package/lib/axios/cjs/contract/index.js.map +1 -1
  41. package/lib/axios/cjs/contract/sent_transaction.js +0 -20
  42. package/lib/axios/cjs/contract/sent_transaction.js.map +1 -1
  43. package/lib/axios/cjs/contract/signer.js +96 -0
  44. package/lib/axios/cjs/contract/signer.js.map +1 -0
  45. package/lib/axios/cjs/contract/spec.js +107 -3
  46. package/lib/axios/cjs/contract/spec.js.map +1 -1
  47. package/lib/axios/cjs/contract/types.js.map +1 -1
  48. package/lib/axios/cjs/errors/transaction_failed.js +62 -0
  49. package/lib/axios/cjs/errors/transaction_failed.js.map +1 -0
  50. package/lib/axios/cjs/errors/wrap_http_error.js +20 -0
  51. package/lib/axios/cjs/errors/wrap_http_error.js.map +1 -0
  52. package/lib/axios/cjs/federation/server.js +15 -35
  53. package/lib/axios/cjs/federation/server.js.map +1 -1
  54. package/lib/axios/cjs/horizon/account_response.js +0 -20
  55. package/lib/axios/cjs/horizon/account_response.js.map +1 -1
  56. package/lib/axios/cjs/horizon/horizon_api.js +5 -0
  57. package/lib/axios/cjs/horizon/horizon_api.js.map +1 -1
  58. package/lib/axios/cjs/horizon/horizon_axios_client.js +1 -1
  59. package/lib/axios/cjs/horizon/server.js +20 -26
  60. package/lib/axios/cjs/horizon/server.js.map +1 -1
  61. package/lib/axios/cjs/index.js +66 -65
  62. package/lib/axios/cjs/index.js.map +1 -1
  63. package/lib/axios/cjs/rpc/api.js.map +1 -1
  64. package/lib/axios/cjs/rpc/axios.js +1 -1
  65. package/lib/axios/cjs/rpc/server.js +181 -13
  66. package/lib/axios/cjs/rpc/server.js.map +1 -1
  67. package/lib/axios/cjs/rpc/transaction.js +2 -20
  68. package/lib/axios/cjs/rpc/transaction.js.map +1 -1
  69. package/lib/axios/cjs/webauth/challenge_transaction.js +7 -22
  70. package/lib/axios/cjs/webauth/challenge_transaction.js.map +1 -1
  71. package/lib/axios/cjs/webauth/utils.js +1 -20
  72. package/lib/axios/cjs/webauth/utils.js.map +1 -1
  73. package/lib/axios/esm/base/auth.d.ts +181 -13
  74. package/lib/axios/esm/base/auth.js +146 -31
  75. package/lib/axios/esm/base/auth.js.map +1 -1
  76. package/lib/axios/esm/base/index.d.ts +2 -2
  77. package/lib/axios/esm/base/index.js +44 -0
  78. package/lib/axios/esm/base/index.js.map +1 -0
  79. package/lib/axios/esm/base/keypair.d.ts +27 -0
  80. package/lib/axios/esm/base/keypair.js +39 -0
  81. package/lib/axios/esm/base/keypair.js.map +1 -1
  82. package/lib/axios/esm/base/scval.d.ts +4 -0
  83. package/lib/axios/esm/base/scval.js +34 -0
  84. package/lib/axios/esm/base/scval.js.map +1 -1
  85. package/lib/axios/esm/bindings/client.d.ts +39 -0
  86. package/lib/axios/esm/bindings/client.js +171 -1
  87. package/lib/axios/esm/bindings/client.js.map +1 -1
  88. package/lib/axios/esm/bindings/config.js +1 -1
  89. package/lib/axios/esm/bindings/generator.d.ts +34 -0
  90. package/lib/axios/esm/bindings/generator.js +45 -16
  91. package/lib/axios/esm/bindings/generator.js.map +1 -1
  92. package/lib/axios/esm/bindings/types.d.ts +42 -0
  93. package/lib/axios/esm/bindings/types.js +153 -3
  94. package/lib/axios/esm/bindings/types.js.map +1 -1
  95. package/lib/axios/esm/bindings/utils.d.ts +10 -0
  96. package/lib/axios/esm/bindings/utils.js +9 -1
  97. package/lib/axios/esm/bindings/utils.js.map +1 -1
  98. package/lib/axios/esm/cli/index.js +19 -22
  99. package/lib/axios/esm/cli/index.js.map +1 -1
  100. package/lib/axios/esm/cli/util.d.ts +1 -1
  101. package/lib/axios/esm/cli/util.js +1 -20
  102. package/lib/axios/esm/cli/util.js.map +1 -1
  103. package/lib/axios/esm/contract/assembled_transaction.d.ts +7 -5
  104. package/lib/axios/esm/contract/assembled_transaction.js +39 -17
  105. package/lib/axios/esm/contract/assembled_transaction.js.map +1 -1
  106. package/lib/axios/esm/contract/basic_node_signer.d.ts +3 -0
  107. package/lib/axios/esm/contract/basic_node_signer.js +8 -42
  108. package/lib/axios/esm/contract/basic_node_signer.js.map +1 -1
  109. package/lib/axios/esm/contract/client.d.ts +49 -3
  110. package/lib/axios/esm/contract/client.js +56 -3
  111. package/lib/axios/esm/contract/client.js.map +1 -1
  112. package/lib/axios/esm/contract/event_spec.d.ts +78 -0
  113. package/lib/axios/esm/contract/event_spec.js +159 -0
  114. package/lib/axios/esm/contract/event_spec.js.map +1 -0
  115. package/lib/axios/esm/contract/index.d.ts +3 -0
  116. package/lib/axios/esm/contract/index.js +1 -0
  117. package/lib/axios/esm/contract/index.js.map +1 -1
  118. package/lib/axios/esm/contract/sent_transaction.js +0 -20
  119. package/lib/axios/esm/contract/sent_transaction.js.map +1 -1
  120. package/lib/axios/esm/contract/signer.d.ts +104 -0
  121. package/lib/axios/esm/contract/signer.js +91 -0
  122. package/lib/axios/esm/contract/signer.js.map +1 -0
  123. package/lib/axios/esm/contract/spec.d.ts +84 -0
  124. package/lib/axios/esm/contract/spec.js +107 -3
  125. package/lib/axios/esm/contract/spec.js.map +1 -1
  126. package/lib/axios/esm/contract/types.d.ts +25 -8
  127. package/lib/axios/esm/contract/types.js.map +1 -1
  128. package/lib/axios/esm/errors/index.d.ts +1 -0
  129. package/lib/axios/esm/errors/transaction_failed.d.ts +55 -0
  130. package/lib/axios/esm/errors/transaction_failed.js +60 -0
  131. package/lib/axios/esm/errors/transaction_failed.js.map +1 -0
  132. package/lib/axios/esm/errors/wrap_http_error.d.ts +20 -0
  133. package/lib/axios/esm/errors/wrap_http_error.js +18 -0
  134. package/lib/axios/esm/errors/wrap_http_error.js.map +1 -0
  135. package/lib/axios/esm/federation/server.js +15 -35
  136. package/lib/axios/esm/federation/server.js.map +1 -1
  137. package/lib/axios/esm/horizon/account_response.js +0 -20
  138. package/lib/axios/esm/horizon/account_response.js.map +1 -1
  139. package/lib/axios/esm/horizon/horizon_api.d.ts +12 -1
  140. package/lib/axios/esm/horizon/horizon_api.js +5 -0
  141. package/lib/axios/esm/horizon/horizon_api.js.map +1 -1
  142. package/lib/axios/esm/horizon/horizon_axios_client.js +1 -1
  143. package/lib/axios/esm/horizon/server.d.ts +10 -4
  144. package/lib/axios/esm/horizon/server.js +20 -26
  145. package/lib/axios/esm/horizon/server.js.map +1 -1
  146. package/lib/axios/esm/index.js +27 -29
  147. package/lib/axios/esm/index.js.map +1 -1
  148. package/lib/axios/esm/rpc/api.d.ts +21 -0
  149. package/lib/axios/esm/rpc/api.js.map +1 -1
  150. package/lib/axios/esm/rpc/axios.js +1 -1
  151. package/lib/axios/esm/rpc/server.d.ts +115 -3
  152. package/lib/axios/esm/rpc/server.js +181 -13
  153. package/lib/axios/esm/rpc/server.js.map +1 -1
  154. package/lib/axios/esm/rpc/transaction.js +2 -20
  155. package/lib/axios/esm/rpc/transaction.js.map +1 -1
  156. package/lib/axios/esm/webauth/challenge_transaction.js +7 -22
  157. package/lib/axios/esm/webauth/challenge_transaction.js.map +1 -1
  158. package/lib/axios/esm/webauth/utils.js +1 -20
  159. package/lib/axios/esm/webauth/utils.js.map +1 -1
  160. package/lib/cjs/base/auth.js +147 -30
  161. package/lib/cjs/base/auth.js.map +1 -1
  162. package/lib/cjs/base/index.js +113 -0
  163. package/lib/cjs/base/index.js.map +1 -0
  164. package/lib/cjs/base/keypair.js +39 -0
  165. package/lib/cjs/base/keypair.js.map +1 -1
  166. package/lib/cjs/base/scval.js +34 -0
  167. package/lib/cjs/base/scval.js.map +1 -1
  168. package/lib/cjs/bindings/client.js +170 -0
  169. package/lib/cjs/bindings/client.js.map +1 -1
  170. package/lib/cjs/bindings/config.js +1 -1
  171. package/lib/cjs/bindings/generator.js +45 -16
  172. package/lib/cjs/bindings/generator.js.map +1 -1
  173. package/lib/cjs/bindings/types.js +151 -1
  174. package/lib/cjs/bindings/types.js.map +1 -1
  175. package/lib/cjs/bindings/utils.js +10 -0
  176. package/lib/cjs/bindings/utils.js.map +1 -1
  177. package/lib/cjs/cli/index.js +19 -22
  178. package/lib/cjs/cli/index.js.map +1 -1
  179. package/lib/cjs/cli/util.js +1 -20
  180. package/lib/cjs/cli/util.js.map +1 -1
  181. package/lib/cjs/contract/assembled_transaction.js +39 -17
  182. package/lib/cjs/contract/assembled_transaction.js.map +1 -1
  183. package/lib/cjs/contract/basic_node_signer.js +8 -42
  184. package/lib/cjs/contract/basic_node_signer.js.map +1 -1
  185. package/lib/cjs/contract/client.js +56 -3
  186. package/lib/cjs/contract/client.js.map +1 -1
  187. package/lib/cjs/contract/event_spec.js +164 -0
  188. package/lib/cjs/contract/event_spec.js.map +1 -0
  189. package/lib/cjs/contract/index.js +2 -0
  190. package/lib/cjs/contract/index.js.map +1 -1
  191. package/lib/cjs/contract/sent_transaction.js +0 -20
  192. package/lib/cjs/contract/sent_transaction.js.map +1 -1
  193. package/lib/cjs/contract/signer.js +96 -0
  194. package/lib/cjs/contract/signer.js.map +1 -0
  195. package/lib/cjs/contract/spec.js +107 -3
  196. package/lib/cjs/contract/spec.js.map +1 -1
  197. package/lib/cjs/contract/types.js.map +1 -1
  198. package/lib/cjs/errors/transaction_failed.js +62 -0
  199. package/lib/cjs/errors/transaction_failed.js.map +1 -0
  200. package/lib/cjs/errors/wrap_http_error.js +20 -0
  201. package/lib/cjs/errors/wrap_http_error.js.map +1 -0
  202. package/lib/cjs/federation/server.js +15 -35
  203. package/lib/cjs/federation/server.js.map +1 -1
  204. package/lib/cjs/horizon/account_response.js +0 -20
  205. package/lib/cjs/horizon/account_response.js.map +1 -1
  206. package/lib/cjs/horizon/horizon_api.js +5 -0
  207. package/lib/cjs/horizon/horizon_api.js.map +1 -1
  208. package/lib/cjs/horizon/horizon_axios_client.js +1 -1
  209. package/lib/cjs/horizon/server.js +20 -26
  210. package/lib/cjs/horizon/server.js.map +1 -1
  211. package/lib/cjs/index.js +66 -65
  212. package/lib/cjs/index.js.map +1 -1
  213. package/lib/cjs/rpc/api.js.map +1 -1
  214. package/lib/cjs/rpc/axios.js +1 -1
  215. package/lib/cjs/rpc/server.js +181 -13
  216. package/lib/cjs/rpc/server.js.map +1 -1
  217. package/lib/cjs/rpc/transaction.js +2 -20
  218. package/lib/cjs/rpc/transaction.js.map +1 -1
  219. package/lib/cjs/webauth/challenge_transaction.js +7 -22
  220. package/lib/cjs/webauth/challenge_transaction.js.map +1 -1
  221. package/lib/cjs/webauth/utils.js +1 -20
  222. package/lib/cjs/webauth/utils.js.map +1 -1
  223. package/lib/esm/base/auth.d.ts +181 -13
  224. package/lib/esm/base/auth.js +146 -31
  225. package/lib/esm/base/auth.js.map +1 -1
  226. package/lib/esm/base/index.d.ts +2 -2
  227. package/lib/esm/base/index.js +44 -0
  228. package/lib/esm/base/index.js.map +1 -0
  229. package/lib/esm/base/keypair.d.ts +27 -0
  230. package/lib/esm/base/keypair.js +39 -0
  231. package/lib/esm/base/keypair.js.map +1 -1
  232. package/lib/esm/base/scval.d.ts +4 -0
  233. package/lib/esm/base/scval.js +34 -0
  234. package/lib/esm/base/scval.js.map +1 -1
  235. package/lib/esm/bindings/client.d.ts +39 -0
  236. package/lib/esm/bindings/client.js +171 -1
  237. package/lib/esm/bindings/client.js.map +1 -1
  238. package/lib/esm/bindings/config.js +1 -1
  239. package/lib/esm/bindings/generator.d.ts +34 -0
  240. package/lib/esm/bindings/generator.js +45 -16
  241. package/lib/esm/bindings/generator.js.map +1 -1
  242. package/lib/esm/bindings/types.d.ts +42 -0
  243. package/lib/esm/bindings/types.js +153 -3
  244. package/lib/esm/bindings/types.js.map +1 -1
  245. package/lib/esm/bindings/utils.d.ts +10 -0
  246. package/lib/esm/bindings/utils.js +9 -1
  247. package/lib/esm/bindings/utils.js.map +1 -1
  248. package/lib/esm/cli/index.js +19 -22
  249. package/lib/esm/cli/index.js.map +1 -1
  250. package/lib/esm/cli/util.d.ts +1 -1
  251. package/lib/esm/cli/util.js +1 -20
  252. package/lib/esm/cli/util.js.map +1 -1
  253. package/lib/esm/contract/assembled_transaction.d.ts +7 -5
  254. package/lib/esm/contract/assembled_transaction.js +39 -17
  255. package/lib/esm/contract/assembled_transaction.js.map +1 -1
  256. package/lib/esm/contract/basic_node_signer.d.ts +3 -0
  257. package/lib/esm/contract/basic_node_signer.js +8 -42
  258. package/lib/esm/contract/basic_node_signer.js.map +1 -1
  259. package/lib/esm/contract/client.d.ts +49 -3
  260. package/lib/esm/contract/client.js +56 -3
  261. package/lib/esm/contract/client.js.map +1 -1
  262. package/lib/esm/contract/event_spec.d.ts +78 -0
  263. package/lib/esm/contract/event_spec.js +159 -0
  264. package/lib/esm/contract/event_spec.js.map +1 -0
  265. package/lib/esm/contract/index.d.ts +3 -0
  266. package/lib/esm/contract/index.js +1 -0
  267. package/lib/esm/contract/index.js.map +1 -1
  268. package/lib/esm/contract/sent_transaction.js +0 -20
  269. package/lib/esm/contract/sent_transaction.js.map +1 -1
  270. package/lib/esm/contract/signer.d.ts +104 -0
  271. package/lib/esm/contract/signer.js +91 -0
  272. package/lib/esm/contract/signer.js.map +1 -0
  273. package/lib/esm/contract/spec.d.ts +84 -0
  274. package/lib/esm/contract/spec.js +107 -3
  275. package/lib/esm/contract/spec.js.map +1 -1
  276. package/lib/esm/contract/types.d.ts +25 -8
  277. package/lib/esm/contract/types.js.map +1 -1
  278. package/lib/esm/errors/index.d.ts +1 -0
  279. package/lib/esm/errors/transaction_failed.d.ts +55 -0
  280. package/lib/esm/errors/transaction_failed.js +60 -0
  281. package/lib/esm/errors/transaction_failed.js.map +1 -0
  282. package/lib/esm/errors/wrap_http_error.d.ts +20 -0
  283. package/lib/esm/errors/wrap_http_error.js +18 -0
  284. package/lib/esm/errors/wrap_http_error.js.map +1 -0
  285. package/lib/esm/federation/server.js +15 -35
  286. package/lib/esm/federation/server.js.map +1 -1
  287. package/lib/esm/horizon/account_response.js +0 -20
  288. package/lib/esm/horizon/account_response.js.map +1 -1
  289. package/lib/esm/horizon/horizon_api.d.ts +12 -1
  290. package/lib/esm/horizon/horizon_api.js +5 -0
  291. package/lib/esm/horizon/horizon_api.js.map +1 -1
  292. package/lib/esm/horizon/horizon_axios_client.js +1 -1
  293. package/lib/esm/horizon/server.d.ts +10 -4
  294. package/lib/esm/horizon/server.js +20 -26
  295. package/lib/esm/horizon/server.js.map +1 -1
  296. package/lib/esm/index.js +27 -29
  297. package/lib/esm/index.js.map +1 -1
  298. package/lib/esm/rpc/api.d.ts +21 -0
  299. package/lib/esm/rpc/api.js.map +1 -1
  300. package/lib/esm/rpc/axios.js +1 -1
  301. package/lib/esm/rpc/server.d.ts +115 -3
  302. package/lib/esm/rpc/server.js +181 -13
  303. package/lib/esm/rpc/server.js.map +1 -1
  304. package/lib/esm/rpc/transaction.js +2 -20
  305. package/lib/esm/rpc/transaction.js.map +1 -1
  306. package/lib/esm/webauth/challenge_transaction.js +7 -22
  307. package/lib/esm/webauth/challenge_transaction.js.map +1 -1
  308. package/lib/esm/webauth/utils.js +1 -20
  309. package/lib/esm/webauth/utils.js.map +1 -1
  310. package/package.json +35 -30
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sources":["../../../src/bindings/generator.ts"],"sourcesContent":["import { Spec } from \"../contract/index.js\";\nimport { ConfigGenerator } from \"./config.js\";\nimport { TypeGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport { specFromWasm } from \"../contract/wasm_spec_parser.js\";\nimport { fetchFromContractId, fetchFromWasmHash } from \"./wasm_fetcher.js\";\nimport { SAC_SPEC } from \"./sac-spec.js\";\nimport { Server } from \"../rpc/index.js\";\n\n/**\n * Options for generating TypeScript bindings.\n */\nexport type GenerateOptions = {\n /**\n * The name used for the generated package and client class.\n * Should be in kebab-case (e.g., \"my-contract\").\n */\n contractName: string;\n};\n\n/**\n * The output of the binding generation process.\n *\n * Contains all generated TypeScript source files and configuration files\n * needed to create a standalone npm package for interacting with a Stellar contract.\n */\nexport type GeneratedBindings = {\n /** The index.ts barrel export file that re-exports Client and types */\n index: string;\n /** The types.ts file containing TypeScript interfaces for contract structs, enums, and unions */\n types: string;\n /** The client.ts file containing the generated Client class with typed methods */\n client: string;\n /** The package.json for the generated npm package */\n packageJson: string;\n /** The tsconfig.json for TypeScript compilation */\n tsConfig: string;\n /** The README.md with usage documentation */\n readme: string;\n /** The .gitignore file for the generated package */\n gitignore: string;\n};\n\n/**\n * Generates TypeScript bindings for Stellar smart contracts.\n *\n * This class creates fully-typed TypeScript client code from a contract's specification,\n * allowing developers to interact with Stellar smart contracts with full IDE support\n * and compile-time type checking.\n *\n * @example\n * ```ts\n * // Create from a local WASM file\n * const wasmBuffer = fs.readFileSync(\"./my_contract.wasm\");\n * const generator = await BindingGenerator.fromWasm(wasmBuffer);\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n *\n * @example\n * ```ts\n * // Create from a contract deployed on the network\n * const generator = await BindingGenerator.fromContractId(\n * \"CABC...XYZ\",\n * \"https://soroban-testnet.stellar.org\",\n * Networks.TESTNET\n * );\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n *\n * @example\n * ```ts\n * // Create from a Spec object directly\n * const spec = new Spec(specEntries);\n * const generator = BindingGenerator.fromSpec(spec);\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n */\nexport class BindingGenerator {\n private spec: Spec;\n\n /**\n * Private constructor - use static factory methods instead.\n *\n * @param spec - The parsed contract specification\n */\n private constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Creates a BindingGenerator from an existing Spec object.\n *\n * Use this when you already have a parsed contract specification,\n * such as from manually constructed spec entries or from another source.\n *\n * @param spec - The contract specification containing function and type definitions\n * @returns A new BindingGenerator instance\n *\n * @example\n * ```ts\n * const spec = new Spec(specEntries);\n * const generator = BindingGenerator.fromSpec(spec);\n * ```\n */\n static fromSpec(spec: Spec): BindingGenerator {\n return new BindingGenerator(spec);\n }\n\n /**\n * Creates a BindingGenerator from a WASM binary buffer.\n *\n * Parses the contract specification directly from the WASM file's custom section.\n * This is the most common method when working with locally compiled contracts.\n *\n * @param wasmBuffer - The raw WASM binary as a Buffer\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the WASM file doesn't contain a valid contract spec\n *\n * @example\n * ```ts\n * const wasmBuffer = fs.readFileSync(\"./target/wasm32-unknown-unknown/release/my_contract.wasm\");\n * const generator = await BindingGenerator.fromWasm(wasmBuffer);\n * ```\n */\n static fromWasm(wasmBuffer: Buffer): BindingGenerator {\n const spec = new Spec(specFromWasm(wasmBuffer));\n return new BindingGenerator(spec);\n }\n\n /**\n * Creates a BindingGenerator by fetching WASM from the network using its hash.\n *\n * Retrieves the WASM bytecode from Stellar RPC using the WASM hash,\n * then parses the contract specification from it. Useful when you know\n * the hash of an installed WASM but don't have the binary locally.\n *\n * @param wasmHash - The hex-encoded hash of the installed WASM blob\n * @param rpcServer - The Stellar RPC server instance\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the WASM cannot be fetched or doesn't contain a valid spec\n *\n * @example\n * ```ts\n * const generator = await BindingGenerator.fromWasmHash(\n * \"a1b2c3...xyz\",\n * \"https://soroban-testnet.stellar.org\",\n * Networks.TESTNET\n * );\n * ```\n */\n static async fromWasmHash(\n wasmHash: string,\n rpcServer: Server,\n ): Promise<BindingGenerator> {\n const wasm = await fetchFromWasmHash(wasmHash, rpcServer);\n if (wasm.type !== \"wasm\") {\n throw new Error(\"Fetched contract is not of type 'wasm'\");\n }\n return BindingGenerator.fromWasm(wasm.wasmBytes);\n }\n\n /**\n * Creates a BindingGenerator by fetching contract info from a deployed contract ID.\n *\n * Retrieves the contract's WASM from the network using the contract ID,\n * then parses the specification. If the contract is a Stellar Asset Contract (SAC),\n * returns a generator with the standard SAC specification.\n *\n * @param contractId - The contract ID (C... address) of the deployed contract\n * @param rpcServer - The Stellar RPC server instance\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the contract cannot be found or fetched\n *\n * @example\n * ```ts\n * const generator = await BindingGenerator.fromContractId(\n * \"CABC123...XYZ\",\n * rpcServer\n * );\n * ```\n */\n static async fromContractId(\n contractId: string,\n rpcServer: Server,\n ): Promise<BindingGenerator> {\n const result = await fetchFromContractId(contractId, rpcServer);\n if (result.type === \"wasm\") {\n return BindingGenerator.fromWasm(result.wasmBytes);\n }\n // Stellar Asset Contract\n const spec = new Spec(SAC_SPEC);\n return BindingGenerator.fromSpec(spec);\n }\n\n /**\n * Generates TypeScript bindings for the contract.\n *\n * Produces all the files needed for a standalone npm package:\n * - `client.ts`: A typed Client class with methods for each contract function\n * - `types.ts`: TypeScript interfaces for all contract types (structs, enums, unions)\n * - `index.ts`: Barrel export file\n * - `package.json`, `tsconfig.json`, `README.md`, `.gitignore`: Package configuration\n *\n * The generated code does not write to disk - use the returned strings\n * to write files as needed.\n *\n * @param options - Configuration options for generation\n * - `contractName`: Required. The name for the generated package (kebab-case recommended)\n * @returns An object containing all generated file contents as strings\n * @throws If contractName is missing or empty\n *\n * @example\n * ```ts\n * const bindings = generator.generate({\n * contractName: \"my-token\",\n * contractAddress: \"CABC...XYZ\",\n * rpcUrl: \"https://soroban-testnet.stellar.org\",\n * networkPassphrase: Networks.TESTNET\n * });\n *\n * // Write files to disk\n * fs.writeFileSync(\"./src/client.ts\", bindings.client);\n * fs.writeFileSync(\"./src/types.ts\", bindings.types);\n * ```\n */\n generate(options: GenerateOptions): GeneratedBindings {\n this.validateOptions(options);\n\n const typeGenerator = new TypeGenerator(this.spec);\n const clientGenerator = new ClientGenerator(this.spec);\n\n const types = typeGenerator.generate();\n const client = clientGenerator.generate();\n\n let index = `export { Client } from \"./client.js\";`;\n if (types.trim() !== \"\") {\n index = index.concat(`\\nexport * from \"./types.js\";`);\n }\n\n // Generate config files\n const configGenerator = new ConfigGenerator();\n const { packageJson, tsConfig, readme, gitignore } =\n configGenerator.generate(options);\n\n return {\n index,\n types,\n client,\n packageJson,\n tsConfig,\n readme,\n gitignore,\n };\n }\n\n /**\n * Validates that required generation options are provided.\n *\n * @param options - The options to validate\n * @throws If contractName is missing or empty\n */\n private validateOptions(options: GenerateOptions): void {\n if (!options.contractName || options.contractName.trim() === \"\") {\n throw new Error(\"contractName is required and cannot be empty\");\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sources":["../../../src/bindings/generator.ts"],"sourcesContent":["import { Spec } from \"../contract/index.js\";\nimport { ConfigGenerator } from \"./config.js\";\nimport { sanitizeIdentifier, toCamelCase, toPascalCase } from \"./utils.js\";\nimport { TypeGenerator } from \"./types.js\";\nimport { ClientGenerator } from \"./client.js\";\nimport { specFromWasm } from \"../contract/wasm_spec_parser.js\";\nimport { fetchFromContractId, fetchFromWasmHash } from \"./wasm_fetcher.js\";\nimport { SAC_SPEC } from \"./sac-spec.js\";\nimport { Server } from \"../rpc/index.js\";\n\n/**\n * Options for generating TypeScript bindings.\n */\nexport type GenerateOptions = {\n /**\n * The name used for the generated package and client class.\n * Should be in kebab-case (e.g., \"my-contract\").\n */\n contractName: string;\n};\n\n/**\n * A note about an event whose generated names need the user's attention:\n * either the contract declares the same event name more than once, or the\n * generated names were renamed away from their preferred form to avoid a\n * collision with another generated name.\n */\nexport type EventDiagnostic = {\n /** The event name exactly as declared in the contract spec */\n rawName: string;\n /** 0-based index of this declaration among same-named events */\n occurrence: number;\n /** Total number of declarations of this raw name in the spec */\n declarations: number;\n /** The exported interface name generated in types.ts */\n interfaceName: string;\n /** The filter method name generated on the Client class */\n filterMethodName: string;\n /** True if the interface name differs from its preferred form */\n interfaceRenamed: boolean;\n /** True if the filter method name differs from its preferred form */\n filterMethodRenamed: boolean;\n};\n\n/**\n * The output of the binding generation process.\n *\n * Contains all generated TypeScript source files and configuration files\n * needed to create a standalone npm package for interacting with a Stellar contract.\n */\nexport type GeneratedBindings = {\n /** The index.ts barrel export file that re-exports Client and types */\n index: string;\n /** The types.ts file containing TypeScript interfaces for contract structs, enums, and unions */\n types: string;\n /** The client.ts file containing the generated Client class with typed methods */\n client: string;\n /** The package.json for the generated npm package */\n packageJson: string;\n /** The tsconfig.json for TypeScript compilation */\n tsConfig: string;\n /** The README.md with usage documentation */\n readme: string;\n /** The .gitignore file for the generated package */\n gitignore: string;\n /**\n * Notes about events whose generated names need attention (duplicate\n * declarations or collision-driven renames); empty when there are none\n */\n diagnostics: EventDiagnostic[];\n};\n\n/**\n * Generates TypeScript bindings for Stellar smart contracts.\n *\n * This class creates fully-typed TypeScript client code from a contract's specification,\n * allowing developers to interact with Stellar smart contracts with full IDE support\n * and compile-time type checking.\n *\n * @example\n * ```ts\n * // Create from a local WASM file\n * const wasmBuffer = fs.readFileSync(\"./my_contract.wasm\");\n * const generator = await BindingGenerator.fromWasm(wasmBuffer);\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n *\n * @example\n * ```ts\n * // Create from a contract deployed on the network\n * const generator = await BindingGenerator.fromContractId(\n * \"CABC...XYZ\",\n * \"https://soroban-testnet.stellar.org\",\n * Networks.TESTNET\n * );\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n *\n * @example\n * ```ts\n * // Create from a Spec object directly\n * const spec = new Spec(specEntries);\n * const generator = BindingGenerator.fromSpec(spec);\n * const bindings = generator.generate({ contractName: \"my-contract\" });\n * ```\n */\nexport class BindingGenerator {\n private spec: Spec;\n\n /**\n * Private constructor - use static factory methods instead.\n *\n * @param spec - The parsed contract specification\n */\n private constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Creates a BindingGenerator from an existing Spec object.\n *\n * Use this when you already have a parsed contract specification,\n * such as from manually constructed spec entries or from another source.\n *\n * @param spec - The contract specification containing function and type definitions\n * @returns A new BindingGenerator instance\n *\n * @example\n * ```ts\n * const spec = new Spec(specEntries);\n * const generator = BindingGenerator.fromSpec(spec);\n * ```\n */\n static fromSpec(spec: Spec): BindingGenerator {\n return new BindingGenerator(spec);\n }\n\n /**\n * Creates a BindingGenerator from a WASM binary buffer.\n *\n * Parses the contract specification directly from the WASM file's custom section.\n * This is the most common method when working with locally compiled contracts.\n *\n * @param wasmBuffer - The raw WASM binary as a Buffer\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the WASM file doesn't contain a valid contract spec\n *\n * @example\n * ```ts\n * const wasmBuffer = fs.readFileSync(\"./target/wasm32-unknown-unknown/release/my_contract.wasm\");\n * const generator = await BindingGenerator.fromWasm(wasmBuffer);\n * ```\n */\n static fromWasm(wasmBuffer: Buffer): BindingGenerator {\n const spec = new Spec(specFromWasm(wasmBuffer));\n return new BindingGenerator(spec);\n }\n\n /**\n * Creates a BindingGenerator by fetching WASM from the network using its hash.\n *\n * Retrieves the WASM bytecode from Stellar RPC using the WASM hash,\n * then parses the contract specification from it. Useful when you know\n * the hash of an installed WASM but don't have the binary locally.\n *\n * @param wasmHash - The hex-encoded hash of the installed WASM blob\n * @param rpcServer - The Stellar RPC server instance\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the WASM cannot be fetched or doesn't contain a valid spec\n *\n * @example\n * ```ts\n * const generator = await BindingGenerator.fromWasmHash(\n * \"a1b2c3...xyz\",\n * \"https://soroban-testnet.stellar.org\",\n * Networks.TESTNET\n * );\n * ```\n */\n static async fromWasmHash(\n wasmHash: string,\n rpcServer: Server,\n ): Promise<BindingGenerator> {\n const wasm = await fetchFromWasmHash(wasmHash, rpcServer);\n if (wasm.type !== \"wasm\") {\n throw new Error(\"Fetched contract is not of type 'wasm'\");\n }\n return BindingGenerator.fromWasm(wasm.wasmBytes);\n }\n\n /**\n * Creates a BindingGenerator by fetching contract info from a deployed contract ID.\n *\n * Retrieves the contract's WASM from the network using the contract ID,\n * then parses the specification. If the contract is a Stellar Asset Contract (SAC),\n * returns a generator with the standard SAC specification.\n *\n * @param contractId - The contract ID (C... address) of the deployed contract\n * @param rpcServer - The Stellar RPC server instance\n * @returns A Promise resolving to a new BindingGenerator instance\n * @throws If the contract cannot be found or fetched\n *\n * @example\n * ```ts\n * const generator = await BindingGenerator.fromContractId(\n * \"CABC123...XYZ\",\n * rpcServer\n * );\n * ```\n */\n static async fromContractId(\n contractId: string,\n rpcServer: Server,\n ): Promise<BindingGenerator> {\n const result = await fetchFromContractId(contractId, rpcServer);\n if (result.type === \"wasm\") {\n return BindingGenerator.fromWasm(result.wasmBytes);\n }\n // Stellar Asset Contract\n const spec = new Spec(SAC_SPEC);\n return BindingGenerator.fromSpec(spec);\n }\n\n /**\n * Generates TypeScript bindings for the contract.\n *\n * Produces all the files needed for a standalone npm package:\n * - `client.ts`: A typed Client class with methods for each contract function\n * - `types.ts`: TypeScript interfaces for all contract types (structs, enums, unions)\n * - `index.ts`: Barrel export file\n * - `package.json`, `tsconfig.json`, `README.md`, `.gitignore`: Package configuration\n *\n * The generated code does not write to disk - use the returned strings\n * to write files as needed.\n *\n * @param options - Configuration options for generation\n * - `contractName`: Required. The name for the generated package (kebab-case recommended)\n * @returns An object containing all generated file contents as strings\n * @throws If contractName is missing or empty\n *\n * @example\n * ```ts\n * const bindings = generator.generate({\n * contractName: \"my-token\",\n * contractAddress: \"CABC...XYZ\",\n * rpcUrl: \"https://soroban-testnet.stellar.org\",\n * networkPassphrase: Networks.TESTNET\n * });\n *\n * // Write files to disk\n * fs.writeFileSync(\"./src/client.ts\", bindings.client);\n * fs.writeFileSync(\"./src/types.ts\", bindings.types);\n * ```\n */\n generate(options: GenerateOptions): GeneratedBindings {\n this.validateOptions(options);\n\n const typeGenerator = new TypeGenerator(this.spec);\n const clientGenerator = new ClientGenerator(this.spec);\n\n const types = typeGenerator.generate();\n const client = clientGenerator.generate();\n const diagnostics = this.eventDiagnostics(typeGenerator, clientGenerator);\n\n let index = `export { Client } from \"./client.js\";`;\n if (types.trim() !== \"\") {\n index = index.concat(`\\nexport * from \"./types.js\";`);\n }\n\n // Generate config files\n const configGenerator = new ConfigGenerator();\n const { packageJson, tsConfig, readme, gitignore } =\n configGenerator.generate(options);\n\n return {\n index,\n types,\n client,\n packageJson,\n tsConfig,\n readme,\n gitignore,\n diagnostics,\n };\n }\n\n /**\n * Collect an {@link EventDiagnostic} for every event that a user should\n * review in the generated output: duplicate declarations of the same raw\n * name, and generated names renamed away from their preferred form to\n * avoid a collision.\n */\n private eventDiagnostics(\n typeGenerator: TypeGenerator,\n clientGenerator: ClientGenerator,\n ): EventDiagnostic[] {\n const events = this.spec.events();\n const interfaceNames = typeGenerator.eventInterfaceNamesInOrder();\n const filterMethodNames = clientGenerator.eventFilterMethodNamesInOrder();\n\n const declarationCounts = new Map<string, number>();\n events.forEach((event) => {\n const rawName = event.name().toString();\n declarationCounts.set(rawName, (declarationCounts.get(rawName) ?? 0) + 1);\n });\n\n const occurrenceSoFar = new Map<string, number>();\n return events.flatMap((event, eventIndex) => {\n const rawName = event.name().toString();\n const occurrence = occurrenceSoFar.get(rawName) ?? 0;\n occurrenceSoFar.set(rawName, occurrence + 1);\n\n const declarations = declarationCounts.get(rawName)!;\n const sanitized = sanitizeIdentifier(rawName);\n const interfaceRenamed =\n interfaceNames[eventIndex] !== `${toPascalCase(sanitized)}Event`;\n const filterMethodRenamed =\n filterMethodNames[eventIndex] !==\n `${toCamelCase(sanitized)}EventFilter`;\n\n if (declarations <= 1 && !interfaceRenamed && !filterMethodRenamed) {\n return [];\n }\n return [\n {\n rawName,\n occurrence,\n declarations,\n interfaceName: interfaceNames[eventIndex],\n filterMethodName: filterMethodNames[eventIndex],\n interfaceRenamed,\n filterMethodRenamed,\n },\n ];\n });\n }\n\n /**\n * Validates that required generation options are provided.\n *\n * @param options - The options to validate\n * @throws If contractName is missing or empty\n */\n private validateOptions(options: GenerateOptions): void {\n if (!options.contractName || options.contractName.trim() === \"\") {\n throw new Error(\"contractName is required and cannot be empty\");\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ export interface EnumCase {
28
28
  */
29
29
  export declare class TypeGenerator {
30
30
  private spec;
31
+ private eventInterfaceNames;
31
32
  constructor(spec: Spec);
32
33
  /**
33
34
  * Generate all TypeScript type definitions
@@ -62,5 +63,46 @@ export declare class TypeGenerator {
62
63
  * Generate enum case
63
64
  */
64
65
  private generateEnumCase;
66
+ /**
67
+ * Compute the exported TS interface name for an event, e.g. "transfer"
68
+ * becomes "TransferEvent". Resolved (and disambiguated if necessary) via
69
+ * {@link resolveEventInterfaceNames}, so every call site agrees.
70
+ */
71
+ private eventInterfaceName;
72
+ /**
73
+ * The resolved (possibly disambiguated) interface name of every event in
74
+ * the spec, in declaration order. Exposed so callers (e.g. the bindings
75
+ * generator's diagnostics) can report renames and duplicates.
76
+ */
77
+ eventInterfaceNamesInOrder(): string[];
78
+ /**
79
+ * True if the given event's resolved interface name differs from its
80
+ * preferred (unsuffixed) form, i.e. it was disambiguated away from a
81
+ * collision.
82
+ */
83
+ private eventInterfaceNameWasRenamed;
84
+ /**
85
+ * The name-normalization used for event interface names (and UDT type
86
+ * names) is not injective — e.g. events "FooBar" and "foo_bar" both
87
+ * produce the interface name "FooBarEvent", a contract may declare
88
+ * several events with the very same name (composed modules each emitting
89
+ * their own "transfer"), and an event can just as easily collide with a
90
+ * UDT (struct/union/enum) of the same generated name. Since UDT/function
91
+ * names are load-bearing (referenced directly in signatures) and
92
+ * event-derived names are already synthetic, UDT names always win: they
93
+ * are reserved first, in spec-entry order. Events are then resolved in
94
+ * spec-entry order, appending the smallest integer 2 or greater needed to
95
+ * make the name unique (and reserving whatever name results, so later
96
+ * events see it too). This is deterministic for a given spec.
97
+ */
98
+ private resolveEventInterfaceNames;
99
+ /**
100
+ * Generate TypeScript interface for a Soroban contract event
101
+ */
102
+ private generateEvent;
103
+ /**
104
+ * Generate the discriminated union of all contract events, if the spec defines any.
105
+ */
106
+ private generateContractEventUnion;
65
107
  private generateTupleStruct;
66
108
  }
@@ -18,10 +18,15 @@ import '../base/numbers/uint128.js';
18
18
  import '../base/numbers/uint256.js';
19
19
  import '../base/numbers/int128.js';
20
20
  import '../base/numbers/int256.js';
21
- import { isTupleStruct, generateTypeImports, formatImports, sanitizeIdentifier, formatJSDocComment, parseTypeFromTypeDef, escapeStringLiteral } from './utils.js';
21
+ import { isTupleStruct, generateTypeImports, formatImports, sanitizeIdentifier, formatJSDocComment, parseTypeFromTypeDef, escapeStringLiteral, toPascalCase } from './utils.js';
22
22
 
23
23
  class TypeGenerator {
24
24
  spec;
25
+ // event index (in event-entry declaration order) -> resolved (possibly
26
+ // disambiguated) interface name. Keyed by index rather than raw name
27
+ // because a contract may declare several events with the same name.
28
+ // Lazily computed on first use; see resolveEventInterfaceNames().
29
+ eventInterfaceNames = null;
25
30
  constructor(spec) {
26
31
  this.spec = spec;
27
32
  }
@@ -29,11 +34,16 @@ class TypeGenerator {
29
34
  * Generate all TypeScript type definitions
30
35
  */
31
36
  generate() {
32
- const types = this.spec.entries.map((entry) => this.generateEntry(entry)).filter((t) => t).join("\n\n");
37
+ let eventIndex = 0;
38
+ const types$1 = this.spec.entries.map(
39
+ (entry) => entry.switch() === types.ScSpecEntryKind.scSpecEntryEventV0() ? this.generateEvent(entry.eventV0(), eventIndex++) : this.generateEntry(entry)
40
+ ).filter((t) => t).join("\n\n");
33
41
  const imports = this.generateImports();
42
+ const eventUnion = this.generateContractEventUnion();
34
43
  return `${imports}
35
44
 
36
- ${types}
45
+ ${types$1}
46
+ ${eventUnion}
37
47
  `;
38
48
  }
39
49
  /**
@@ -52,6 +62,8 @@ class TypeGenerator {
52
62
  return this.generateEnum(entry.udtEnumV0());
53
63
  case types.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():
54
64
  return this.generateErrorEnum(entry.udtErrorEnumV0());
65
+ // Events are handled directly in generate(), which numbers them in
66
+ // declaration order.
55
67
  default:
56
68
  return null;
57
69
  }
@@ -73,6 +85,8 @@ class TypeGenerator {
73
85
  return [];
74
86
  case types.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():
75
87
  return [];
88
+ case types.ScSpecEntryKind.scSpecEntryEventV0():
89
+ return entry.eventV0().params().map((param) => param.type());
76
90
  default:
77
91
  return [];
78
92
  }
@@ -192,6 +206,142 @@ ${members}
192
206
  value: enumCase.value()
193
207
  };
194
208
  }
209
+ /**
210
+ * Compute the exported TS interface name for an event, e.g. "transfer"
211
+ * becomes "TransferEvent". Resolved (and disambiguated if necessary) via
212
+ * {@link resolveEventInterfaceNames}, so every call site agrees.
213
+ */
214
+ eventInterfaceName(event, eventIndex) {
215
+ const resolved = this.resolveEventInterfaceNames().get(eventIndex);
216
+ if (resolved === void 0) {
217
+ return `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;
218
+ }
219
+ return resolved;
220
+ }
221
+ /**
222
+ * The resolved (possibly disambiguated) interface name of every event in
223
+ * the spec, in declaration order. Exposed so callers (e.g. the bindings
224
+ * generator's diagnostics) can report renames and duplicates.
225
+ */
226
+ eventInterfaceNamesInOrder() {
227
+ return this.spec.events().map((event, eventIndex) => this.eventInterfaceName(event, eventIndex));
228
+ }
229
+ /**
230
+ * True if the given event's resolved interface name differs from its
231
+ * preferred (unsuffixed) form, i.e. it was disambiguated away from a
232
+ * collision.
233
+ */
234
+ eventInterfaceNameWasRenamed(event, eventIndex) {
235
+ const preferred = `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;
236
+ return this.eventInterfaceName(event, eventIndex) !== preferred;
237
+ }
238
+ /**
239
+ * The name-normalization used for event interface names (and UDT type
240
+ * names) is not injective — e.g. events "FooBar" and "foo_bar" both
241
+ * produce the interface name "FooBarEvent", a contract may declare
242
+ * several events with the very same name (composed modules each emitting
243
+ * their own "transfer"), and an event can just as easily collide with a
244
+ * UDT (struct/union/enum) of the same generated name. Since UDT/function
245
+ * names are load-bearing (referenced directly in signatures) and
246
+ * event-derived names are already synthetic, UDT names always win: they
247
+ * are reserved first, in spec-entry order. Events are then resolved in
248
+ * spec-entry order, appending the smallest integer 2 or greater needed to
249
+ * make the name unique (and reserving whatever name results, so later
250
+ * events see it too). This is deterministic for a given spec.
251
+ */
252
+ resolveEventInterfaceNames() {
253
+ if (this.eventInterfaceNames !== null) {
254
+ return this.eventInterfaceNames;
255
+ }
256
+ const reserved = /* @__PURE__ */ new Set(["ContractEvent"]);
257
+ for (const entry of this.spec.entries) {
258
+ switch (entry.switch()) {
259
+ case types.ScSpecEntryKind.scSpecEntryUdtStructV0():
260
+ reserved.add(
261
+ sanitizeIdentifier(entry.udtStructV0().name().toString())
262
+ );
263
+ break;
264
+ case types.ScSpecEntryKind.scSpecEntryUdtUnionV0():
265
+ reserved.add(
266
+ sanitizeIdentifier(entry.udtUnionV0().name().toString())
267
+ );
268
+ break;
269
+ case types.ScSpecEntryKind.scSpecEntryUdtEnumV0():
270
+ reserved.add(sanitizeIdentifier(entry.udtEnumV0().name().toString()));
271
+ break;
272
+ case types.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():
273
+ reserved.add(
274
+ sanitizeIdentifier(entry.udtErrorEnumV0().name().toString())
275
+ );
276
+ break;
277
+ }
278
+ }
279
+ const resolved = /* @__PURE__ */ new Map();
280
+ let eventIndex = 0;
281
+ for (const entry of this.spec.entries) {
282
+ if (entry.switch() !== types.ScSpecEntryKind.scSpecEntryEventV0()) {
283
+ continue;
284
+ }
285
+ const event = entry.eventV0();
286
+ const preferred = `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;
287
+ let candidate = preferred;
288
+ let suffix = 2;
289
+ while (reserved.has(candidate)) {
290
+ candidate = `${preferred}${suffix}`;
291
+ suffix += 1;
292
+ }
293
+ reserved.add(candidate);
294
+ resolved.set(eventIndex, candidate);
295
+ eventIndex += 1;
296
+ }
297
+ this.eventInterfaceNames = resolved;
298
+ return resolved;
299
+ }
300
+ /**
301
+ * Generate TypeScript interface for a Soroban contract event
302
+ */
303
+ generateEvent(event, eventIndex) {
304
+ const rawName = event.name().toString();
305
+ const name = this.eventInterfaceName(event, eventIndex);
306
+ const preferred = `${toPascalCase(sanitizeIdentifier(rawName))}Event`;
307
+ const renameNote = this.eventInterfaceNameWasRenamed(event, eventIndex) ? `
308
+
309
+ Note: renamed from "${preferred}" to avoid a collision with another generated name.` : "";
310
+ const doc = formatJSDocComment(
311
+ (event.doc().toString() || `Event: ${rawName}`) + renameNote,
312
+ 0
313
+ );
314
+ const fieldKey = (rawParamName) => /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName) ? rawParamName : `"${escapeStringLiteral(rawParamName)}"`;
315
+ const dataIsMapFormat = event.dataFormat().value === types.ScSpecEventDataFormat.scSpecEventDataFormatMap().value;
316
+ const dataFields = event.params().map((param) => {
317
+ const fieldName = fieldKey(param.name().toString());
318
+ const fieldType = parseTypeFromTypeDef(param.type());
319
+ const fieldDoc = formatJSDocComment(param.doc().toString(), 4);
320
+ const optional = dataIsMapFormat && param.location().value === types.ScSpecEventParamLocationV0.scSpecEventParamLocationData().value;
321
+ return `${fieldDoc} ${fieldName}${optional ? "?" : ""}: ${fieldType};`;
322
+ }).join("\n");
323
+ return `${doc}export interface ${name} {
324
+ name: "${escapeStringLiteral(rawName)}";
325
+ data: {
326
+ ${dataFields}
327
+ };
328
+ }`;
329
+ }
330
+ /**
331
+ * Generate the discriminated union of all contract events, if the spec defines any.
332
+ */
333
+ generateContractEventUnion() {
334
+ const eventEntries = this.spec.entries.filter(
335
+ (entry) => entry.switch() === types.ScSpecEntryKind.scSpecEntryEventV0()
336
+ );
337
+ if (eventEntries.length === 0) {
338
+ return "";
339
+ }
340
+ const names = eventEntries.map(
341
+ (entry, eventIndex) => this.eventInterfaceName(entry.eventV0(), eventIndex)
342
+ );
343
+ return `export type ContractEvent = ${names.join(" | ")};`;
344
+ }
195
345
  generateTupleStruct(udtStruct) {
196
346
  const name = sanitizeIdentifier(udtStruct.name().toString());
197
347
  const doc = formatJSDocComment(
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/bindings/types.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n escapeStringLiteral,\n formatJSDocComment,\n formatImports,\n isTupleStruct,\n} from \"./utils.js\";\n\n/**\n * Interface for struct fields\n */\nexport interface StructField {\n doc: string;\n name: string;\n type: string;\n}\n\n/**\n * Interface for union cases\n */\nexport interface UnionCase {\n doc: string;\n name: string;\n types: string[];\n}\n\n/**\n * Interface for enum cases\n */\nexport interface EnumCase {\n doc: string;\n name: string;\n value: number;\n}\n\n/**\n * Generates TypeScript type definitions from Stellar contract specs\n */\nexport class TypeGenerator {\n private spec: Spec;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate all TypeScript type definitions\n */\n generate(): string {\n // Generate types for each entry in the spec\n const types = this.spec.entries\n .map((entry) => this.generateEntry(entry))\n .filter((t) => t)\n .join(\"\\n\\n\");\n // Generate imports for all types\n const imports = this.generateImports();\n\n return `${imports}\n\n ${types}\n `;\n }\n\n /**\n * Generate TypeScript for a single spec entry\n */\n private generateEntry(entry: xdr.ScSpecEntry): string | null {\n switch (entry.switch()) {\n case xdr.ScSpecEntryKind.scSpecEntryUdtStructV0():\n if (isTupleStruct(entry.udtStructV0())) {\n return this.generateTupleStruct(entry.udtStructV0());\n }\n return this.generateStruct(entry.udtStructV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0():\n return this.generateUnion(entry.udtUnionV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0():\n return this.generateEnum(entry.udtEnumV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():\n return this.generateErrorEnum(entry.udtErrorEnumV0());\n default:\n return null;\n }\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.entries.flatMap((entry) => {\n switch (entry.switch()) {\n case xdr.ScSpecEntryKind.scSpecEntryUdtStructV0():\n return entry\n .udtStructV0()\n .fields()\n .map((field) => field.type());\n case xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0():\n return entry\n .udtUnionV0()\n .cases()\n .flatMap((unionCase) => {\n if (\n unionCase.switch() ===\n xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseTupleV0()\n ) {\n return unionCase.tupleCase().type();\n }\n return [];\n });\n case xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0():\n // Enums do not have associated types\n return [];\n case xdr.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():\n // Enums do not have associated types\n return [];\n default:\n return [];\n }\n }),\n );\n\n return formatImports(imports, {\n includeTypeFileImports: false, // Types file doesn't import from itself\n });\n }\n\n /**\n * Generate TypeScript interface for a struct\n */\n private generateStruct(struct: xdr.ScSpecUdtStructV0): string {\n const name = sanitizeIdentifier(struct.name().toString());\n const doc = formatJSDocComment(\n struct.doc().toString() || `Struct: ${name}`,\n 0,\n );\n\n const fields = struct\n .fields()\n .map((field) => {\n const fieldName = sanitizeIdentifier(field.name().toString());\n const fieldType = parseTypeFromTypeDef(field.type());\n const fieldDoc = formatJSDocComment(field.doc().toString(), 2);\n\n return `${fieldDoc} ${fieldName}: ${fieldType};`;\n })\n .join(\"\\n\");\n\n return `${doc}export interface ${name} {\n${fields}\n}`;\n }\n\n /**\n * Generate TypeScript union type\n */\n private generateUnion(union: xdr.ScSpecUdtUnionV0): string {\n const name = sanitizeIdentifier(union.name().toString());\n const doc = formatJSDocComment(\n union.doc().toString() || `Union: ${name}`,\n 0,\n );\n const cases = union\n .cases()\n .map((unionCase) => this.generateUnionCase(unionCase));\n\n const caseTypes = cases\n .map((c) => {\n if (c.types.length > 0) {\n return `${formatJSDocComment(c.doc, 2)} { tag: \"${escapeStringLiteral(c.name)}\"; values: readonly [${c.types.join(\", \")}] }`;\n }\n return `${formatJSDocComment(c.doc, 2)} { tag: \"${escapeStringLiteral(c.name)}\"; values: void }`;\n })\n .join(\" |\\n\");\n\n return `${doc} export type ${name} =\n${caseTypes};`;\n }\n\n /**\n * Generate TypeScript enum\n */\n private generateEnum(enumEntry: xdr.ScSpecUdtEnumV0): string {\n const name = sanitizeIdentifier(enumEntry.name().toString());\n const doc = formatJSDocComment(\n enumEntry.doc().toString() || `Enum: ${name}`,\n 0,\n );\n\n const members = enumEntry\n .cases()\n .map((enumCase) => {\n const caseName = sanitizeIdentifier(enumCase.name().toString());\n const caseValue = enumCase.value();\n const caseDoc = enumCase.doc().toString() || `Enum Case: ${caseName}`;\n\n return `${formatJSDocComment(caseDoc, 2)} ${caseName} = ${caseValue}`;\n })\n .join(\",\\n\");\n\n return `${doc}export enum ${name} {\n${members}\n}`;\n }\n\n /**\n * Generate TypeScript error enum\n */\n private generateErrorEnum(errorEnum: xdr.ScSpecUdtErrorEnumV0): string {\n const name = sanitizeIdentifier(errorEnum.name().toString());\n const doc = formatJSDocComment(\n errorEnum.doc().toString() || `Error Enum: ${name}`,\n 0,\n );\n const cases = errorEnum\n .cases()\n .map((enumCase) => this.generateEnumCase(enumCase));\n\n const members = cases\n .map((c) => {\n return `${formatJSDocComment(c.doc, 2)} ${c.value} : { message: \"${escapeStringLiteral(c.name)}\" }`;\n })\n .join(\",\\n\");\n\n return `${doc}export const ${name} = {\n${members}\n}`;\n }\n\n /**\n * Generate union case\n */\n private generateUnionCase(unionCase: xdr.ScSpecUdtUnionCaseV0): UnionCase {\n switch (unionCase.switch()) {\n case xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseVoidV0(): {\n const voidCase = unionCase.voidCase();\n return {\n doc: voidCase.doc().toString(),\n name: voidCase.name().toString(),\n types: [],\n };\n }\n case xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseTupleV0(): {\n const tupleCase = unionCase.tupleCase();\n return {\n doc: tupleCase.doc().toString(),\n name: tupleCase.name().toString(),\n types: tupleCase.type().map((t) => parseTypeFromTypeDef(t)),\n };\n }\n default:\n throw new Error(`Unknown union case kind: ${unionCase.switch()}`);\n }\n }\n\n /**\n * Generate enum case\n */\n private generateEnumCase(enumCase: xdr.ScSpecUdtEnumCaseV0): EnumCase {\n return {\n doc: enumCase.doc().toString(),\n name: enumCase.name().toString(),\n value: enumCase.value(),\n };\n }\n\n private generateTupleStruct(udtStruct: xdr.ScSpecUdtStructV0): string {\n const name = sanitizeIdentifier(udtStruct.name().toString());\n const doc = formatJSDocComment(\n udtStruct.doc().toString() || `Tuple Struct: ${name}`,\n 0,\n );\n\n const types = udtStruct\n .fields()\n .map((field) => parseTypeFromTypeDef(field.type()))\n .join(\", \");\n\n return `${doc}export type ${name} = readonly [${types}];`;\n }\n}\n"],"names":["xdr"],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/bindings/types.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n escapeStringLiteral,\n formatJSDocComment,\n formatImports,\n isTupleStruct,\n toPascalCase,\n} from \"./utils.js\";\n\n/**\n * Interface for struct fields\n */\nexport interface StructField {\n doc: string;\n name: string;\n type: string;\n}\n\n/**\n * Interface for union cases\n */\nexport interface UnionCase {\n doc: string;\n name: string;\n types: string[];\n}\n\n/**\n * Interface for enum cases\n */\nexport interface EnumCase {\n doc: string;\n name: string;\n value: number;\n}\n\n/**\n * Generates TypeScript type definitions from Stellar contract specs\n */\nexport class TypeGenerator {\n private spec: Spec;\n\n // event index (in event-entry declaration order) -> resolved (possibly\n // disambiguated) interface name. Keyed by index rather than raw name\n // because a contract may declare several events with the same name.\n // Lazily computed on first use; see resolveEventInterfaceNames().\n private eventInterfaceNames: Map<number, string> | null = null;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate all TypeScript type definitions\n */\n generate(): string {\n // Generate types for each entry in the spec. Events are numbered in\n // declaration order so same-named events resolve to distinct interfaces.\n let eventIndex = 0;\n const types = this.spec.entries\n .map((entry) =>\n entry.switch() === xdr.ScSpecEntryKind.scSpecEntryEventV0()\n ? this.generateEvent(entry.eventV0(), eventIndex++)\n : this.generateEntry(entry),\n )\n .filter((t) => t)\n .join(\"\\n\\n\");\n // Generate imports for all types\n const imports = this.generateImports();\n // Generate the discriminated union of all contract events, if any\n const eventUnion = this.generateContractEventUnion();\n\n return `${imports}\n\n ${types}\n ${eventUnion}\n `;\n }\n\n /**\n * Generate TypeScript for a single spec entry\n */\n private generateEntry(entry: xdr.ScSpecEntry): string | null {\n switch (entry.switch()) {\n case xdr.ScSpecEntryKind.scSpecEntryUdtStructV0():\n if (isTupleStruct(entry.udtStructV0())) {\n return this.generateTupleStruct(entry.udtStructV0());\n }\n return this.generateStruct(entry.udtStructV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0():\n return this.generateUnion(entry.udtUnionV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0():\n return this.generateEnum(entry.udtEnumV0());\n case xdr.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():\n return this.generateErrorEnum(entry.udtErrorEnumV0());\n // Events are handled directly in generate(), which numbers them in\n // declaration order.\n default:\n return null;\n }\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.entries.flatMap((entry) => {\n switch (entry.switch()) {\n case xdr.ScSpecEntryKind.scSpecEntryUdtStructV0():\n return entry\n .udtStructV0()\n .fields()\n .map((field) => field.type());\n case xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0():\n return entry\n .udtUnionV0()\n .cases()\n .flatMap((unionCase) => {\n if (\n unionCase.switch() ===\n xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseTupleV0()\n ) {\n return unionCase.tupleCase().type();\n }\n return [];\n });\n case xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0():\n // Enums do not have associated types\n return [];\n case xdr.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():\n // Enums do not have associated types\n return [];\n case xdr.ScSpecEntryKind.scSpecEntryEventV0():\n return entry\n .eventV0()\n .params()\n .map((param) => param.type());\n default:\n return [];\n }\n }),\n );\n\n return formatImports(imports, {\n includeTypeFileImports: false, // Types file doesn't import from itself\n });\n }\n\n /**\n * Generate TypeScript interface for a struct\n */\n private generateStruct(struct: xdr.ScSpecUdtStructV0): string {\n const name = sanitizeIdentifier(struct.name().toString());\n const doc = formatJSDocComment(\n struct.doc().toString() || `Struct: ${name}`,\n 0,\n );\n\n const fields = struct\n .fields()\n .map((field) => {\n const fieldName = sanitizeIdentifier(field.name().toString());\n const fieldType = parseTypeFromTypeDef(field.type());\n const fieldDoc = formatJSDocComment(field.doc().toString(), 2);\n\n return `${fieldDoc} ${fieldName}: ${fieldType};`;\n })\n .join(\"\\n\");\n\n return `${doc}export interface ${name} {\n${fields}\n}`;\n }\n\n /**\n * Generate TypeScript union type\n */\n private generateUnion(union: xdr.ScSpecUdtUnionV0): string {\n const name = sanitizeIdentifier(union.name().toString());\n const doc = formatJSDocComment(\n union.doc().toString() || `Union: ${name}`,\n 0,\n );\n const cases = union\n .cases()\n .map((unionCase) => this.generateUnionCase(unionCase));\n\n const caseTypes = cases\n .map((c) => {\n if (c.types.length > 0) {\n return `${formatJSDocComment(c.doc, 2)} { tag: \"${escapeStringLiteral(c.name)}\"; values: readonly [${c.types.join(\", \")}] }`;\n }\n return `${formatJSDocComment(c.doc, 2)} { tag: \"${escapeStringLiteral(c.name)}\"; values: void }`;\n })\n .join(\" |\\n\");\n\n return `${doc} export type ${name} =\n${caseTypes};`;\n }\n\n /**\n * Generate TypeScript enum\n */\n private generateEnum(enumEntry: xdr.ScSpecUdtEnumV0): string {\n const name = sanitizeIdentifier(enumEntry.name().toString());\n const doc = formatJSDocComment(\n enumEntry.doc().toString() || `Enum: ${name}`,\n 0,\n );\n\n const members = enumEntry\n .cases()\n .map((enumCase) => {\n const caseName = sanitizeIdentifier(enumCase.name().toString());\n const caseValue = enumCase.value();\n const caseDoc = enumCase.doc().toString() || `Enum Case: ${caseName}`;\n\n return `${formatJSDocComment(caseDoc, 2)} ${caseName} = ${caseValue}`;\n })\n .join(\",\\n\");\n\n return `${doc}export enum ${name} {\n${members}\n}`;\n }\n\n /**\n * Generate TypeScript error enum\n */\n private generateErrorEnum(errorEnum: xdr.ScSpecUdtErrorEnumV0): string {\n const name = sanitizeIdentifier(errorEnum.name().toString());\n const doc = formatJSDocComment(\n errorEnum.doc().toString() || `Error Enum: ${name}`,\n 0,\n );\n const cases = errorEnum\n .cases()\n .map((enumCase) => this.generateEnumCase(enumCase));\n\n const members = cases\n .map((c) => {\n return `${formatJSDocComment(c.doc, 2)} ${c.value} : { message: \"${escapeStringLiteral(c.name)}\" }`;\n })\n .join(\",\\n\");\n\n return `${doc}export const ${name} = {\n${members}\n}`;\n }\n\n /**\n * Generate union case\n */\n private generateUnionCase(unionCase: xdr.ScSpecUdtUnionCaseV0): UnionCase {\n switch (unionCase.switch()) {\n case xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseVoidV0(): {\n const voidCase = unionCase.voidCase();\n return {\n doc: voidCase.doc().toString(),\n name: voidCase.name().toString(),\n types: [],\n };\n }\n case xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseTupleV0(): {\n const tupleCase = unionCase.tupleCase();\n return {\n doc: tupleCase.doc().toString(),\n name: tupleCase.name().toString(),\n types: tupleCase.type().map((t) => parseTypeFromTypeDef(t)),\n };\n }\n default:\n throw new Error(`Unknown union case kind: ${unionCase.switch()}`);\n }\n }\n\n /**\n * Generate enum case\n */\n private generateEnumCase(enumCase: xdr.ScSpecUdtEnumCaseV0): EnumCase {\n return {\n doc: enumCase.doc().toString(),\n name: enumCase.name().toString(),\n value: enumCase.value(),\n };\n }\n\n /**\n * Compute the exported TS interface name for an event, e.g. \"transfer\"\n * becomes \"TransferEvent\". Resolved (and disambiguated if necessary) via\n * {@link resolveEventInterfaceNames}, so every call site agrees.\n */\n private eventInterfaceName(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const resolved = this.resolveEventInterfaceNames().get(eventIndex);\n /* istanbul ignore next -- every event in the spec is reserved a name */\n if (resolved === undefined) {\n return `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;\n }\n return resolved;\n }\n\n /**\n * The resolved (possibly disambiguated) interface name of every event in\n * the spec, in declaration order. Exposed so callers (e.g. the bindings\n * generator's diagnostics) can report renames and duplicates.\n */\n eventInterfaceNamesInOrder(): string[] {\n return this.spec\n .events()\n .map((event, eventIndex) => this.eventInterfaceName(event, eventIndex));\n }\n\n /**\n * True if the given event's resolved interface name differs from its\n * preferred (unsuffixed) form, i.e. it was disambiguated away from a\n * collision.\n */\n private eventInterfaceNameWasRenamed(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): boolean {\n const preferred = `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;\n return this.eventInterfaceName(event, eventIndex) !== preferred;\n }\n\n /**\n * The name-normalization used for event interface names (and UDT type\n * names) is not injective — e.g. events \"FooBar\" and \"foo_bar\" both\n * produce the interface name \"FooBarEvent\", a contract may declare\n * several events with the very same name (composed modules each emitting\n * their own \"transfer\"), and an event can just as easily collide with a\n * UDT (struct/union/enum) of the same generated name. Since UDT/function\n * names are load-bearing (referenced directly in signatures) and\n * event-derived names are already synthetic, UDT names always win: they\n * are reserved first, in spec-entry order. Events are then resolved in\n * spec-entry order, appending the smallest integer 2 or greater needed to\n * make the name unique (and reserving whatever name results, so later\n * events see it too). This is deterministic for a given spec.\n */\n private resolveEventInterfaceNames(): Map<number, string> {\n if (this.eventInterfaceNames !== null) {\n return this.eventInterfaceNames;\n }\n // Reserve names that are already taken by UDTs and other special entries. ContractEvent is a special entry for the discriminated union of all events.\n const reserved = new Set<string>([\"ContractEvent\"]);\n\n for (const entry of this.spec.entries) {\n switch (entry.switch()) {\n case xdr.ScSpecEntryKind.scSpecEntryUdtStructV0():\n reserved.add(\n sanitizeIdentifier(entry.udtStructV0().name().toString()),\n );\n break;\n case xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0():\n reserved.add(\n sanitizeIdentifier(entry.udtUnionV0().name().toString()),\n );\n break;\n case xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0():\n reserved.add(sanitizeIdentifier(entry.udtEnumV0().name().toString()));\n break;\n case xdr.ScSpecEntryKind.scSpecEntryUdtErrorEnumV0():\n reserved.add(\n sanitizeIdentifier(entry.udtErrorEnumV0().name().toString()),\n );\n break;\n default:\n break;\n }\n }\n\n const resolved = new Map<number, string>();\n\n let eventIndex = 0;\n for (const entry of this.spec.entries) {\n if (entry.switch() !== xdr.ScSpecEntryKind.scSpecEntryEventV0()) {\n continue;\n }\n const event = entry.eventV0();\n const preferred = `${toPascalCase(sanitizeIdentifier(event.name().toString()))}Event`;\n\n let candidate = preferred;\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `${preferred}${suffix}`;\n suffix += 1;\n }\n\n reserved.add(candidate);\n resolved.set(eventIndex, candidate);\n eventIndex += 1;\n }\n\n this.eventInterfaceNames = resolved;\n return resolved;\n }\n\n /**\n * Generate TypeScript interface for a Soroban contract event\n */\n private generateEvent(event: xdr.ScSpecEventV0, eventIndex: number): string {\n const rawName = event.name().toString();\n const name = this.eventInterfaceName(event, eventIndex);\n const preferred = `${toPascalCase(sanitizeIdentifier(rawName))}Event`;\n const renameNote = this.eventInterfaceNameWasRenamed(event, eventIndex)\n ? `\\n\\nNote: renamed from \"${preferred}\" to avoid a collision with another generated name.`\n : \"\";\n const doc = formatJSDocComment(\n (event.doc().toString() || `Event: ${rawName}`) + renameNote,\n 0,\n );\n\n // parseEvent keys its output by the raw param names, so the interface\n // must use them too — quoted when they aren't valid identifiers.\n const fieldKey = (rawParamName: string): string =>\n /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName)\n ? rawParamName\n : `\"${escapeStringLiteral(rawParamName)}\"`;\n\n // Map-format data entries may be absent from an emitted event's map, in\n // which case parseEvent omits the key — so those fields are optional.\n const dataIsMapFormat =\n event.dataFormat().value ===\n xdr.ScSpecEventDataFormat.scSpecEventDataFormatMap().value;\n\n // parseEvent merges topic-list and data-located params into a single\n // flat `data` record; generate one field per param in declaration order.\n const dataFields = event\n .params()\n .map((param) => {\n const fieldName = fieldKey(param.name().toString());\n const fieldType = parseTypeFromTypeDef(param.type());\n const fieldDoc = formatJSDocComment(param.doc().toString(), 4);\n const optional =\n dataIsMapFormat &&\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationData().value;\n\n return `${fieldDoc} ${fieldName}${optional ? \"?\" : \"\"}: ${fieldType};`;\n })\n .join(\"\\n\");\n\n return `${doc}export interface ${name} {\n name: \"${escapeStringLiteral(rawName)}\";\n data: {\n${dataFields}\n };\n}`;\n }\n\n /**\n * Generate the discriminated union of all contract events, if the spec defines any.\n */\n private generateContractEventUnion(): string {\n const eventEntries = this.spec.entries.filter(\n (entry) => entry.switch() === xdr.ScSpecEntryKind.scSpecEntryEventV0(),\n );\n\n if (eventEntries.length === 0) {\n return \"\";\n }\n\n const names = eventEntries.map((entry, eventIndex) =>\n this.eventInterfaceName(entry.eventV0(), eventIndex),\n );\n\n return `export type ContractEvent = ${names.join(\" | \")};`;\n }\n\n private generateTupleStruct(udtStruct: xdr.ScSpecUdtStructV0): string {\n const name = sanitizeIdentifier(udtStruct.name().toString());\n const doc = formatJSDocComment(\n udtStruct.doc().toString() || `Tuple Struct: ${name}`,\n 0,\n );\n\n const types = udtStruct\n .fields()\n .map((field) => parseTypeFromTypeDef(field.type()))\n .join(\", \");\n\n return `${doc}export type ${name} = readonly [${types}];`;\n }\n}\n"],"names":["types","xdr"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA2CO,MAAM,aAAA,CAAc;AAAA,EACjB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAA,GAAkD,IAAA;AAAA,EAE1D,YAAY,IAAA,EAAY;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AAGjB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAMA,OAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,CACrB,GAAA;AAAA,MAAI,CAAC,KAAA,KACJ,KAAA,CAAM,QAAO,KAAMC,KAAA,CAAI,gBAAgB,kBAAA,EAAmB,GACtD,IAAA,CAAK,aAAA,CAAc,MAAM,OAAA,EAAQ,EAAG,YAAY,CAAA,GAChD,IAAA,CAAK,cAAc,KAAK;AAAA,MAE7B,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CACf,KAAK,MAAM,CAAA;AAEd,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AAErC,IAAA,MAAM,UAAA,GAAa,KAAK,0BAAA,EAA2B;AAEnD,IAAA,OAAO,GAAG,OAAO;;AAAA,IAAA,EAEfD,OAAK;AAAA,IAAA,EACL,UAAU;AAAA,IAAA,CAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAuC;AAC3D,IAAA,QAAQ,KAAA,CAAM,QAAO;AAAG,MACtB,KAAKC,KAAA,CAAI,eAAA,CAAgB,sBAAA,EAAuB;AAC9C,QAAA,IAAI,aAAA,CAAc,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AACtC,UAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,QACrD;AACA,QAAA,OAAO,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,MAChD,KAAKA,KAAA,CAAI,eAAA,CAAgB,qBAAA,EAAsB;AAC7C,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,UAAA,EAAY,CAAA;AAAA,MAC9C,KAAKA,KAAA,CAAI,eAAA,CAAgB,oBAAA,EAAqB;AAC5C,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,SAAA,EAAW,CAAA;AAAA,MAC5C,KAAKA,KAAA,CAAI,eAAA,CAAgB,yBAAA,EAA0B;AACjD,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA,MAGtD;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA,EAEQ,eAAA,GAA0B;AAChC,IAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,MACd,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AACnC,QAAA,QAAQ,KAAA,CAAM,QAAO;AAAG,UACtB,KAAKA,KAAA,CAAI,eAAA,CAAgB,sBAAA,EAAuB;AAC9C,YAAA,OAAO,KAAA,CACJ,WAAA,EAAY,CACZ,MAAA,EAAO,CACP,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,UAChC,KAAKA,KAAA,CAAI,eAAA,CAAgB,qBAAA,EAAsB;AAC7C,YAAA,OAAO,MACJ,UAAA,EAAW,CACX,OAAM,CACN,OAAA,CAAQ,CAAC,SAAA,KAAc;AACtB,cAAA,IACE,UAAU,MAAA,EAAO,KACjBA,KAAA,CAAI,wBAAA,CAAyB,2BAA0B,EACvD;AACA,gBAAA,OAAO,SAAA,CAAU,SAAA,EAAU,CAAE,IAAA,EAAK;AAAA,cACpC;AACA,cAAA,OAAO,EAAC;AAAA,YACV,CAAC,CAAA;AAAA,UACL,KAAKA,KAAA,CAAI,eAAA,CAAgB,oBAAA,EAAqB;AAE5C,YAAA,OAAO,EAAC;AAAA,UACV,KAAKA,KAAA,CAAI,eAAA,CAAgB,yBAAA,EAA0B;AAEjD,YAAA,OAAO,EAAC;AAAA,UACV,KAAKA,KAAA,CAAI,eAAA,CAAgB,kBAAA,EAAmB;AAC1C,YAAA,OAAO,KAAA,CACJ,OAAA,EAAQ,CACR,MAAA,EAAO,CACP,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,UAChC;AACE,YAAA,OAAO,EAAC;AAAA;AACZ,MACF,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,cAAc,OAAA,EAAS;AAAA,MAC5B,sBAAA,EAAwB;AAAA;AAAA,KACzB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAA,EAAuC;AAC5D,IAAA,MAAM,OAAO,kBAAA,CAAmB,MAAA,CAAO,IAAA,EAAK,CAAE,UAAU,CAAA;AACxD,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,OAAO,GAAA,EAAI,CAAE,QAAA,EAAS,IAAK,WAAW,IAAI,CAAA,CAAA;AAAA,MAC1C;AAAA,KACF;AAEA,IAAA,MAAM,SAAS,MAAA,CACZ,MAAA,EAAO,CACP,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,MAAA,MAAM,YAAY,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAK,CAAE,UAAU,CAAA;AAC5D,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,CAAA;AACnD,MAAA,MAAM,WAAW,kBAAA,CAAmB,KAAA,CAAM,KAAI,CAAE,QAAA,IAAY,CAAC,CAAA;AAE7D,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,SAAS,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,IAChD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,iBAAA,EAAoB,IAAI,CAAA;AAAA,EACvC,MAAM;AAAA,CAAA,CAAA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAqC;AACzD,IAAA,MAAM,OAAO,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAK,CAAE,UAAU,CAAA;AACvD,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,MAAM,GAAA,EAAI,CAAE,QAAA,EAAS,IAAK,UAAU,IAAI,CAAA,CAAA;AAAA,MACxC;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CACX,KAAA,EAAM,CACN,GAAA,CAAI,CAAC,SAAA,KAAc,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAEvD,IAAA,MAAM,SAAA,GAAY,KAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACtB,QAAA,OAAO,GAAG,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAA,UAAA,EAAa,mBAAA,CAAoB,CAAA,CAAE,IAAI,CAAC,CAAA,qBAAA,EAAwB,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,GAAA,CAAA;AAAA,MAC1H;AACA,MAAA,OAAO,CAAA,EAAG,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAA,UAAA,EAAa,mBAAA,CAAoB,CAAA,CAAE,IAAI,CAAC,CAAA,iBAAA,CAAA;AAAA,IAChF,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAEd,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAA;AAAA,EACnC,SAAS,CAAA,CAAA,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAAA,EAAwC;AAC3D,IAAA,MAAM,OAAO,kBAAA,CAAmB,SAAA,CAAU,IAAA,EAAK,CAAE,UAAU,CAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,UAAU,GAAA,EAAI,CAAE,QAAA,EAAS,IAAK,SAAS,IAAI,CAAA,CAAA;AAAA,MAC3C;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,SAAA,CACb,KAAA,EAAM,CACN,GAAA,CAAI,CAAC,QAAA,KAAa;AACjB,MAAA,MAAM,WAAW,kBAAA,CAAmB,QAAA,CAAS,IAAA,EAAK,CAAE,UAAU,CAAA;AAC9D,MAAA,MAAM,SAAA,GAAY,SAAS,KAAA,EAAM;AACjC,MAAA,MAAM,UAAU,QAAA,CAAS,GAAA,GAAM,QAAA,EAAS,IAAK,cAAc,QAAQ,CAAA,CAAA;AAEnE,MAAA,OAAO,CAAA,EAAG,mBAAmB,OAAA,EAAS,CAAC,CAAC,CAAA,EAAA,EAAK,QAAQ,MAAM,SAAS,CAAA,CAAA;AAAA,IACtE,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AAEb,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,EAAe,IAAI,CAAA;AAAA,EAClC,OAAO;AAAA,CAAA,CAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAA6C;AACrE,IAAA,MAAM,OAAO,kBAAA,CAAmB,SAAA,CAAU,IAAA,EAAK,CAAE,UAAU,CAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,UAAU,GAAA,EAAI,CAAE,QAAA,EAAS,IAAK,eAAe,IAAI,CAAA,CAAA;AAAA,MACjD;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,SAAA,CACX,KAAA,EAAM,CACN,GAAA,CAAI,CAAC,QAAA,KAAa,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAEpD,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,OAAO,CAAA,EAAG,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,eAAA,EAAkB,mBAAA,CAAoB,CAAA,CAAE,IAAI,CAAC,CAAA,GAAA,CAAA;AAAA,IACjG,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AAEb,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAA;AAAA,EACnC,OAAO;AAAA,CAAA,CAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAAgD;AACxE,IAAA,QAAQ,SAAA,CAAU,QAAO;AAAG,MAC1B,KAAKA,KAAA,CAAI,wBAAA,CAAyB,wBAAA,EAAyB,EAAG;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAU,QAAA,EAAS;AACpC,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,QAAA,CAAS,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,UAC7B,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK,CAAE,QAAA,EAAS;AAAA,UAC/B,OAAO;AAAC,SACV;AAAA,MACF;AAAA,MACA,KAAKA,KAAA,CAAI,wBAAA,CAAyB,yBAAA,EAA0B,EAAG;AAC7D,QAAA,MAAM,SAAA,GAAY,UAAU,SAAA,EAAU;AACtC,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,SAAA,CAAU,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,UAC9B,IAAA,EAAM,SAAA,CAAU,IAAA,EAAK,CAAE,QAAA,EAAS;AAAA,UAChC,KAAA,EAAO,UAAU,IAAA,EAAK,CAAE,IAAI,CAAC,CAAA,KAAM,oBAAA,CAAqB,CAAC,CAAC;AAAA,SAC5D;AAAA,MACF;AAAA,MACA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,CAAA;AAAA;AACpE,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAA,EAA6C;AACpE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,QAAA,CAAS,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,MAC7B,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK,CAAE,QAAA,EAAS;AAAA,MAC/B,KAAA,EAAO,SAAS,KAAA;AAAM,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,CACN,OACA,UAAA,EACQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,0BAAA,EAA2B,CAAE,IAAI,UAAU,CAAA;AAEjE,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAO,CAAA,EAAG,aAAa,kBAAA,CAAmB,KAAA,CAAM,MAAK,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA,KAAA,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA,CACT,MAAA,EAAO,CACP,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,KAAe,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,4BAAA,CACN,OACA,UAAA,EACS;AACT,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,YAAA,CAAa,kBAAA,CAAmB,KAAA,CAAM,MAAK,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA,KAAA,CAAA;AAC9E,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA,KAAM,SAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBQ,0BAAA,GAAkD;AACxD,IAAA,IAAI,IAAA,CAAK,wBAAwB,IAAA,EAAM;AACrC,MAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,mBAAW,IAAI,GAAA,CAAY,CAAC,eAAe,CAAC,CAAA;AAElD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,QAAQ,KAAA,CAAM,QAAO;AAAG,QACtB,KAAKA,KAAA,CAAI,eAAA,CAAgB,sBAAA,EAAuB;AAC9C,UAAA,QAAA,CAAS,GAAA;AAAA,YACP,mBAAmB,KAAA,CAAM,WAAA,GAAc,IAAA,EAAK,CAAE,UAAU;AAAA,WAC1D;AACA,UAAA;AAAA,QACF,KAAKA,KAAA,CAAI,eAAA,CAAgB,qBAAA,EAAsB;AAC7C,UAAA,QAAA,CAAS,GAAA;AAAA,YACP,mBAAmB,KAAA,CAAM,UAAA,GAAa,IAAA,EAAK,CAAE,UAAU;AAAA,WACzD;AACA,UAAA;AAAA,QACF,KAAKA,KAAA,CAAI,eAAA,CAAgB,oBAAA,EAAqB;AAC5C,UAAA,QAAA,CAAS,GAAA,CAAI,mBAAmB,KAAA,CAAM,SAAA,GAAY,IAAA,EAAK,CAAE,QAAA,EAAU,CAAC,CAAA;AACpE,UAAA;AAAA,QACF,KAAKA,KAAA,CAAI,eAAA,CAAgB,yBAAA,EAA0B;AACjD,UAAA,QAAA,CAAS,GAAA;AAAA,YACP,mBAAmB,KAAA,CAAM,cAAA,GAAiB,IAAA,EAAK,CAAE,UAAU;AAAA,WAC7D;AACA,UAAA;AAEA;AACJ,IACF;AAEA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,IAAI,MAAM,MAAA,EAAO,KAAMA,KAAA,CAAI,eAAA,CAAgB,oBAAmB,EAAG;AAC/D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAQ;AAC5B,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,YAAA,CAAa,kBAAA,CAAmB,KAAA,CAAM,MAAK,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA,KAAA,CAAA;AAE9E,MAAA,IAAI,SAAA,GAAY,SAAA;AAChB,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,QAAA,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,CAAA,CAAA;AACjC,QAAA,MAAA,IAAU,CAAA;AAAA,MACZ;AAEA,MAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AACtB,MAAA,QAAA,CAAS,GAAA,CAAI,YAAY,SAAS,CAAA;AAClC,MAAA,UAAA,IAAc,CAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB,QAAA;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,OAA0B,UAAA,EAA4B;AAC1E,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,QAAA,EAAS;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA;AACtD,IAAA,MAAM,YAAY,CAAA,EAAG,YAAA,CAAa,kBAAA,CAAmB,OAAO,CAAC,CAAC,CAAA,KAAA,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,4BAAA,CAA6B,KAAA,EAAO,UAAU,CAAA,GAClE;;AAAA,oBAAA,EAA2B,SAAS,CAAA,mDAAA,CAAA,GACpC,EAAA;AACJ,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MAAA,CACT,MAAM,GAAA,EAAI,CAAE,UAAS,IAAK,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,IAAM,UAAA;AAAA,MAClD;AAAA,KACF;AAIA,IAAA,MAAM,QAAA,GAAW,CAAC,YAAA,KAChB,4BAAA,CAA6B,IAAA,CAAK,YAAY,CAAA,GAC1C,YAAA,GACA,CAAA,CAAA,EAAI,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA,CAAA;AAI3C,IAAA,MAAM,eAAA,GACJ,MAAM,UAAA,EAAW,CAAE,UACnBA,KAAA,CAAI,qBAAA,CAAsB,0BAAyB,CAAE,KAAA;AAIvD,IAAA,MAAM,aAAa,KAAA,CAChB,MAAA,EAAO,CACP,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,MAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,IAAA,EAAK,CAAE,UAAU,CAAA;AAClD,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,CAAA;AACnD,MAAA,MAAM,WAAW,kBAAA,CAAmB,KAAA,CAAM,KAAI,CAAE,QAAA,IAAY,CAAC,CAAA;AAC7D,MAAA,MAAM,QAAA,GACJ,mBACA,KAAA,CAAM,QAAA,GAAW,KAAA,KACfA,KAAA,CAAI,0BAAA,CAA2B,4BAAA,EAA6B,CAAE,KAAA;AAElE,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,SAAS,GAAG,QAAA,GAAW,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,CAAA;AAAA,IACxE,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,iBAAA,EAAoB,IAAI,CAAA;AAAA,SAAA,EAC9B,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA;AAAA,EAErC,UAAU;AAAA;AAAA,CAAA,CAAA;AAAA,EAGV;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAAA,GAAqC;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,MACrC,CAAC,KAAA,KAAU,KAAA,CAAM,QAAO,KAAMA,KAAA,CAAI,gBAAgB,kBAAA;AAAmB,KACvE;AAEA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,YAAA,CAAa,GAAA;AAAA,MAAI,CAAC,OAAO,UAAA,KACrC,IAAA,CAAK,mBAAmB,KAAA,CAAM,OAAA,IAAW,UAAU;AAAA,KACrD;AAEA,IAAA,OAAO,CAAA,4BAAA,EAA+B,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACzD;AAAA,EAEQ,oBAAoB,SAAA,EAA0C;AACpE,IAAA,MAAM,OAAO,kBAAA,CAAmB,SAAA,CAAU,IAAA,EAAK,CAAE,UAAU,CAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,UAAU,GAAA,EAAI,CAAE,QAAA,EAAS,IAAK,iBAAiB,IAAI,CAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CACX,MAAA,EAAO,CACP,IAAI,CAAC,KAAA,KAAU,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA,CACjD,KAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,EAAe,IAAI,gBAAgB,KAAK,CAAA,EAAA,CAAA;AAAA,EACvD;AACF;;;;"}
@@ -50,4 +50,14 @@ export declare function formatImports(imports: BindingImports, options?: FormatI
50
50
  * Format a comment string as JSDoc with proper escaping
51
51
  */
52
52
  export declare function formatJSDocComment(comment: string, indentLevel?: number): string;
53
+ /**
54
+ * Convert a sanitized identifier (snake_case, kebab-case, etc.) to PascalCase.
55
+ * Intended to be applied after {@link sanitizeIdentifier}.
56
+ */
57
+ export declare function toPascalCase(identifier: string): string;
58
+ /**
59
+ * Convert a sanitized identifier (snake_case, kebab-case, etc.) to camelCase.
60
+ * Intended to be applied after {@link sanitizeIdentifier}.
61
+ */
62
+ export declare function toCamelCase(identifier: string): string;
53
63
  export declare function isTupleStruct(udtStruct: xdr.ScSpecUdtStructV0): boolean;
@@ -302,6 +302,14 @@ ${lines.join("\n")}
302
302
  ${indent} */
303
303
  `;
304
304
  }
305
+ function toPascalCase(identifier) {
306
+ const pascal = identifier.split(/[_$]+/).filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
307
+ return pascal === "" ? "Unnamed" : pascal;
308
+ }
309
+ function toCamelCase(identifier) {
310
+ const pascal = toPascalCase(identifier);
311
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
312
+ }
305
313
  function isTupleStruct(udtStruct) {
306
314
  const fields = udtStruct.fields();
307
315
  return fields.every(
@@ -309,5 +317,5 @@ function isTupleStruct(udtStruct) {
309
317
  );
310
318
  }
311
319
 
312
- export { escapeStringLiteral, formatImports, formatJSDocComment, generateTypeImports, isNameReserved, isTupleStruct, parseTypeFromTypeDef, sanitizeIdentifier };
320
+ export { escapeStringLiteral, formatImports, formatJSDocComment, generateTypeImports, isNameReserved, isTupleStruct, parseTypeFromTypeDef, sanitizeIdentifier, toCamelCase, toPascalCase };
313
321
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/bindings/utils.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nexport function isNameReserved(name: string): boolean {\n const reservedNames = [\n // Keywords\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"export\",\n \"extends\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n // Future reserved words\n \"enum\",\n // Strict mode reserved words\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n // Contextual keywords\n \"async\",\n \"await\",\n \"constructor\",\n // Literals\n \"null\",\n \"true\",\n \"false\",\n ];\n return reservedNames.includes(name);\n}\n/**\n * Sanitize a name to avoid reserved keywords\n * @param identifier - The identifier to sanitize\n * @returns The sanitized identifier\n */\nexport function sanitizeIdentifier(identifier: string): string {\n // Strip any characters outside the ASCII identifier-safe set [a-zA-Z0-9_$]\n const sanitized = identifier.replace(/[^a-zA-Z0-9_$]/g, \"_\");\n\n if (isNameReserved(sanitized)) {\n return sanitized + \"_\";\n }\n\n if (/^\\d/.test(sanitized)) {\n return \"_\" + sanitized;\n }\n\n // If the identifier was entirely special characters, provide a fallback\n if (sanitized === \"\" || /^_+$/.test(sanitized)) {\n return \"_unnamed\";\n }\n\n return sanitized;\n}\n\n/**\n * Escape a string for safe interpolation inside a double-quoted JavaScript string literal.\n */\nexport function escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\n/**\n * Generate TypeScript type from XDR type definition\n */\nexport function parseTypeFromTypeDef(\n typeDef: xdr.ScSpecTypeDef,\n isFunctionInput = false,\n): string {\n switch (typeDef.switch()) {\n case xdr.ScSpecType.scSpecTypeVal():\n return \"any\";\n case xdr.ScSpecType.scSpecTypeBool():\n return \"boolean\";\n case xdr.ScSpecType.scSpecTypeVoid():\n return \"null\";\n case xdr.ScSpecType.scSpecTypeError():\n return \"Error\";\n case xdr.ScSpecType.scSpecTypeU32():\n case xdr.ScSpecType.scSpecTypeI32():\n return \"number\";\n case xdr.ScSpecType.scSpecTypeU64():\n case xdr.ScSpecType.scSpecTypeI64():\n case xdr.ScSpecType.scSpecTypeTimepoint():\n case xdr.ScSpecType.scSpecTypeDuration():\n case xdr.ScSpecType.scSpecTypeU128():\n case xdr.ScSpecType.scSpecTypeI128():\n case xdr.ScSpecType.scSpecTypeU256():\n case xdr.ScSpecType.scSpecTypeI256():\n return \"bigint\";\n case xdr.ScSpecType.scSpecTypeBytes():\n case xdr.ScSpecType.scSpecTypeBytesN():\n return \"Buffer\";\n case xdr.ScSpecType.scSpecTypeString():\n return \"string\";\n case xdr.ScSpecType.scSpecTypeSymbol():\n return \"string\";\n case xdr.ScSpecType.scSpecTypeAddress():\n case xdr.ScSpecType.scSpecTypeMuxedAddress(): {\n // function inputs can accept either string or Address\n if (isFunctionInput) {\n return \"string | Address\";\n }\n // Otherwise for backward compatibility use string\n return \"string\";\n }\n case xdr.ScSpecType.scSpecTypeVec(): {\n const vecType = parseTypeFromTypeDef(\n typeDef.vec().elementType(),\n isFunctionInput,\n );\n return `Array<${vecType}>`;\n }\n case xdr.ScSpecType.scSpecTypeMap(): {\n const keyType = parseTypeFromTypeDef(\n typeDef.map().keyType(),\n isFunctionInput,\n );\n const valueType = parseTypeFromTypeDef(\n typeDef.map().valueType(),\n isFunctionInput,\n );\n return `Map<${keyType}, ${valueType}>`;\n }\n case xdr.ScSpecType.scSpecTypeTuple(): {\n const tupleTypes = typeDef\n .tuple()\n .valueTypes()\n .map((t: xdr.ScSpecTypeDef) =>\n parseTypeFromTypeDef(t, isFunctionInput),\n );\n return `[${tupleTypes.join(\", \")}]`;\n }\n case xdr.ScSpecType.scSpecTypeOption(): {\n // Handle nested options\n while (\n typeDef.option().valueType().switch() ===\n xdr.ScSpecType.scSpecTypeOption()\n ) {\n typeDef = typeDef.option().valueType();\n }\n const optionType = parseTypeFromTypeDef(\n typeDef.option().valueType(),\n isFunctionInput,\n );\n\n return `${optionType} | null`;\n }\n case xdr.ScSpecType.scSpecTypeResult(): {\n const okType = parseTypeFromTypeDef(\n typeDef.result().okType(),\n isFunctionInput,\n );\n const errorType = parseTypeFromTypeDef(\n typeDef.result().errorType(),\n isFunctionInput,\n );\n return `Result<${okType}, ${errorType}>`;\n }\n case xdr.ScSpecType.scSpecTypeUdt(): {\n const udtName = sanitizeIdentifier(typeDef.udt().name().toString());\n return udtName;\n }\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Imports needed for generating bindings\n */\nexport interface BindingImports {\n /** Imports needed from type definitions */\n typeFileImports: Set<string>;\n /** Imports needed from the Stellar SDK in the contract namespace */\n stellarContractImports: Set<string>;\n /** Imports needed from Stellar SDK in the global namespace */\n stellarImports: Set<string>;\n /** Whether Buffer import is needed */\n needsBufferImport: boolean;\n}\n\n/**\n * Extract nested type definitions from container types\n */\nfunction extractNestedTypes(typeDef: xdr.ScSpecTypeDef): xdr.ScSpecTypeDef[] {\n switch (typeDef.switch()) {\n case xdr.ScSpecType.scSpecTypeVec():\n return [typeDef.vec().elementType()];\n\n case xdr.ScSpecType.scSpecTypeMap():\n return [typeDef.map().keyType(), typeDef.map().valueType()];\n\n case xdr.ScSpecType.scSpecTypeTuple():\n return typeDef.tuple().valueTypes();\n\n case xdr.ScSpecType.scSpecTypeOption():\n return [typeDef.option().valueType()];\n\n case xdr.ScSpecType.scSpecTypeResult():\n return [typeDef.result().okType(), typeDef.result().errorType()];\n\n default:\n return [];\n }\n}\n\n/**\n * Visitor to collect imports from a single type definition\n */\nfunction visitTypeDef(\n typeDef: xdr.ScSpecTypeDef,\n accumulator: BindingImports,\n): void {\n const typeSwitch = typeDef.switch();\n\n // Handle leaf types (no nested types)\n switch (typeSwitch) {\n case xdr.ScSpecType.scSpecTypeUdt():\n accumulator.typeFileImports.add(\n sanitizeIdentifier(typeDef.udt().name().toString()),\n );\n return;\n\n case xdr.ScSpecType.scSpecTypeAddress():\n case xdr.ScSpecType.scSpecTypeMuxedAddress():\n accumulator.stellarImports.add(\"Address\");\n return;\n\n case xdr.ScSpecType.scSpecTypeBytes():\n case xdr.ScSpecType.scSpecTypeBytesN():\n accumulator.needsBufferImport = true;\n return;\n\n case xdr.ScSpecType.scSpecTypeVal():\n accumulator.stellarImports.add(\"xdr\");\n return;\n\n case xdr.ScSpecType.scSpecTypeResult():\n accumulator.stellarContractImports.add(\"Result\");\n // Fall through to handle nested types\n break;\n\n // Primitive types that need no imports\n case xdr.ScSpecType.scSpecTypeBool():\n case xdr.ScSpecType.scSpecTypeVoid():\n case xdr.ScSpecType.scSpecTypeError():\n case xdr.ScSpecType.scSpecTypeU32():\n case xdr.ScSpecType.scSpecTypeI32():\n case xdr.ScSpecType.scSpecTypeU64():\n case xdr.ScSpecType.scSpecTypeI64():\n case xdr.ScSpecType.scSpecTypeTimepoint():\n case xdr.ScSpecType.scSpecTypeDuration():\n case xdr.ScSpecType.scSpecTypeU128():\n case xdr.ScSpecType.scSpecTypeI128():\n case xdr.ScSpecType.scSpecTypeU256():\n case xdr.ScSpecType.scSpecTypeI256():\n case xdr.ScSpecType.scSpecTypeString():\n case xdr.ScSpecType.scSpecTypeSymbol():\n return;\n }\n\n // Handle container types (have nested types)\n const nestedTypes = extractNestedTypes(typeDef);\n nestedTypes.forEach((nested) => visitTypeDef(nested, accumulator));\n}\n\n/**\n * Generate imports needed for a list of type definitions\n */\nexport function generateTypeImports(\n typeDefs: xdr.ScSpecTypeDef[],\n): BindingImports {\n const imports: BindingImports = {\n typeFileImports: new Set<string>(),\n stellarContractImports: new Set<string>(),\n stellarImports: new Set<string>(),\n needsBufferImport: false,\n };\n\n // Visit each type definition\n typeDefs.forEach((typeDef) => visitTypeDef(typeDef, imports));\n\n return imports;\n}\n\n/**\n * Options for formatting imports\n */\nexport interface FormatImportsOptions {\n /** Whether to include imports from types.ts */\n includeTypeFileImports?: boolean;\n /** Additional imports needed from stellar/stellar-sdk/contract */\n additionalStellarContractImports?: string[];\n /** Additional imports needed from stellar/stellar-sdk */\n additionalStellarImports?: string[];\n}\n\n/**\n * Format imports into import statement strings\n */\nexport function formatImports(\n imports: BindingImports,\n options?: FormatImportsOptions,\n): string {\n const importLines: string[] = [];\n\n const typeFileImports = imports.typeFileImports;\n const stellarContractImports = [\n ...imports.stellarContractImports,\n ...(options?.additionalStellarContractImports || []),\n ];\n const stellarImports = [\n ...imports.stellarImports,\n ...(options?.additionalStellarImports || []),\n ];\n // Type file imports (only if enabled)\n if (options?.includeTypeFileImports && typeFileImports.size > 0) {\n importLines.push(\n `import {${Array.from(typeFileImports).join(\", \")}} from './types.js';`,\n );\n }\n\n // Stellar contract imports\n if (stellarContractImports.length > 0) {\n const uniqueContractImports = Array.from(new Set(stellarContractImports));\n importLines.push(\n `import {${uniqueContractImports.join(\", \")}} from '@stellar/stellar-sdk/contract';`,\n );\n }\n\n // Stellar SDK imports\n if (stellarImports.length > 0) {\n const uniqueStellarImports = Array.from(new Set(stellarImports));\n importLines.push(\n `import {${uniqueStellarImports.join(\", \")}} from '@stellar/stellar-sdk';`,\n );\n }\n\n // Buffer import\n if (imports.needsBufferImport) {\n importLines.push(`import { Buffer } from 'buffer';`);\n }\n\n return importLines.join(\"\\n\");\n}\n\n/**\n * Escape special characters in JSDoc comment content\n */\nfunction escapeJSDocContent(text: string): string {\n return (\n text\n // Escape closing comment sequences that would break the JSDoc block\n .replace(/\\*\\//g, \"* /\")\n // Escape @ symbols at word boundaries to prevent accidental JSDoc tags\n // We allow common JSDoc tags to pass through\n .replace(\n /@(?!(param|returns?|type|throws?|example|deprecated|see|link|since|author|version|description|summary)\\b)/g,\n \"\\\\@\",\n )\n );\n}\n\n/**\n * Format a comment string as JSDoc with proper escaping\n */\nexport function formatJSDocComment(comment: string, indentLevel = 0): string {\n if (comment.trim() === \"\") {\n return \"\";\n }\n const indent = \" \".repeat(indentLevel);\n\n // Escape special characters and split into lines\n const escapedComment = escapeJSDocContent(comment);\n const lines = escapedComment\n .split(\"\\n\")\n .map((line) => `${indent} * ${line}`.trimEnd());\n\n return `${indent}/**\\n${lines.join(\"\\n\")}\\n${indent} */\\n`;\n}\n\nexport function isTupleStruct(udtStruct: xdr.ScSpecUdtStructV0): boolean {\n const fields = udtStruct.fields();\n // A tuple struct has unnamed fields\n return fields.every(\n (field, index) => field.name().toString().trim() === index.toString(),\n );\n}\n"],"names":["xdr"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/bindings/utils.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nexport function isNameReserved(name: string): boolean {\n const reservedNames = [\n // Keywords\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"export\",\n \"extends\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n // Future reserved words\n \"enum\",\n // Strict mode reserved words\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n // Contextual keywords\n \"async\",\n \"await\",\n \"constructor\",\n // Literals\n \"null\",\n \"true\",\n \"false\",\n ];\n return reservedNames.includes(name);\n}\n/**\n * Sanitize a name to avoid reserved keywords\n * @param identifier - The identifier to sanitize\n * @returns The sanitized identifier\n */\nexport function sanitizeIdentifier(identifier: string): string {\n // Strip any characters outside the ASCII identifier-safe set [a-zA-Z0-9_$]\n const sanitized = identifier.replace(/[^a-zA-Z0-9_$]/g, \"_\");\n\n if (isNameReserved(sanitized)) {\n return sanitized + \"_\";\n }\n\n if (/^\\d/.test(sanitized)) {\n return \"_\" + sanitized;\n }\n\n // If the identifier was entirely special characters, provide a fallback\n if (sanitized === \"\" || /^_+$/.test(sanitized)) {\n return \"_unnamed\";\n }\n\n return sanitized;\n}\n\n/**\n * Escape a string for safe interpolation inside a double-quoted JavaScript string literal.\n */\nexport function escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\n/**\n * Generate TypeScript type from XDR type definition\n */\nexport function parseTypeFromTypeDef(\n typeDef: xdr.ScSpecTypeDef,\n isFunctionInput = false,\n): string {\n switch (typeDef.switch()) {\n case xdr.ScSpecType.scSpecTypeVal():\n return \"any\";\n case xdr.ScSpecType.scSpecTypeBool():\n return \"boolean\";\n case xdr.ScSpecType.scSpecTypeVoid():\n return \"null\";\n case xdr.ScSpecType.scSpecTypeError():\n return \"Error\";\n case xdr.ScSpecType.scSpecTypeU32():\n case xdr.ScSpecType.scSpecTypeI32():\n return \"number\";\n case xdr.ScSpecType.scSpecTypeU64():\n case xdr.ScSpecType.scSpecTypeI64():\n case xdr.ScSpecType.scSpecTypeTimepoint():\n case xdr.ScSpecType.scSpecTypeDuration():\n case xdr.ScSpecType.scSpecTypeU128():\n case xdr.ScSpecType.scSpecTypeI128():\n case xdr.ScSpecType.scSpecTypeU256():\n case xdr.ScSpecType.scSpecTypeI256():\n return \"bigint\";\n case xdr.ScSpecType.scSpecTypeBytes():\n case xdr.ScSpecType.scSpecTypeBytesN():\n return \"Buffer\";\n case xdr.ScSpecType.scSpecTypeString():\n return \"string\";\n case xdr.ScSpecType.scSpecTypeSymbol():\n return \"string\";\n case xdr.ScSpecType.scSpecTypeAddress():\n case xdr.ScSpecType.scSpecTypeMuxedAddress(): {\n // function inputs can accept either string or Address\n if (isFunctionInput) {\n return \"string | Address\";\n }\n // Otherwise for backward compatibility use string\n return \"string\";\n }\n case xdr.ScSpecType.scSpecTypeVec(): {\n const vecType = parseTypeFromTypeDef(\n typeDef.vec().elementType(),\n isFunctionInput,\n );\n return `Array<${vecType}>`;\n }\n case xdr.ScSpecType.scSpecTypeMap(): {\n const keyType = parseTypeFromTypeDef(\n typeDef.map().keyType(),\n isFunctionInput,\n );\n const valueType = parseTypeFromTypeDef(\n typeDef.map().valueType(),\n isFunctionInput,\n );\n return `Map<${keyType}, ${valueType}>`;\n }\n case xdr.ScSpecType.scSpecTypeTuple(): {\n const tupleTypes = typeDef\n .tuple()\n .valueTypes()\n .map((t: xdr.ScSpecTypeDef) =>\n parseTypeFromTypeDef(t, isFunctionInput),\n );\n return `[${tupleTypes.join(\", \")}]`;\n }\n case xdr.ScSpecType.scSpecTypeOption(): {\n // Handle nested options\n while (\n typeDef.option().valueType().switch() ===\n xdr.ScSpecType.scSpecTypeOption()\n ) {\n typeDef = typeDef.option().valueType();\n }\n const optionType = parseTypeFromTypeDef(\n typeDef.option().valueType(),\n isFunctionInput,\n );\n\n return `${optionType} | null`;\n }\n case xdr.ScSpecType.scSpecTypeResult(): {\n const okType = parseTypeFromTypeDef(\n typeDef.result().okType(),\n isFunctionInput,\n );\n const errorType = parseTypeFromTypeDef(\n typeDef.result().errorType(),\n isFunctionInput,\n );\n return `Result<${okType}, ${errorType}>`;\n }\n case xdr.ScSpecType.scSpecTypeUdt(): {\n const udtName = sanitizeIdentifier(typeDef.udt().name().toString());\n return udtName;\n }\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Imports needed for generating bindings\n */\nexport interface BindingImports {\n /** Imports needed from type definitions */\n typeFileImports: Set<string>;\n /** Imports needed from the Stellar SDK in the contract namespace */\n stellarContractImports: Set<string>;\n /** Imports needed from Stellar SDK in the global namespace */\n stellarImports: Set<string>;\n /** Whether Buffer import is needed */\n needsBufferImport: boolean;\n}\n\n/**\n * Extract nested type definitions from container types\n */\nfunction extractNestedTypes(typeDef: xdr.ScSpecTypeDef): xdr.ScSpecTypeDef[] {\n switch (typeDef.switch()) {\n case xdr.ScSpecType.scSpecTypeVec():\n return [typeDef.vec().elementType()];\n\n case xdr.ScSpecType.scSpecTypeMap():\n return [typeDef.map().keyType(), typeDef.map().valueType()];\n\n case xdr.ScSpecType.scSpecTypeTuple():\n return typeDef.tuple().valueTypes();\n\n case xdr.ScSpecType.scSpecTypeOption():\n return [typeDef.option().valueType()];\n\n case xdr.ScSpecType.scSpecTypeResult():\n return [typeDef.result().okType(), typeDef.result().errorType()];\n\n default:\n return [];\n }\n}\n\n/**\n * Visitor to collect imports from a single type definition\n */\nfunction visitTypeDef(\n typeDef: xdr.ScSpecTypeDef,\n accumulator: BindingImports,\n): void {\n const typeSwitch = typeDef.switch();\n\n // Handle leaf types (no nested types)\n switch (typeSwitch) {\n case xdr.ScSpecType.scSpecTypeUdt():\n accumulator.typeFileImports.add(\n sanitizeIdentifier(typeDef.udt().name().toString()),\n );\n return;\n\n case xdr.ScSpecType.scSpecTypeAddress():\n case xdr.ScSpecType.scSpecTypeMuxedAddress():\n accumulator.stellarImports.add(\"Address\");\n return;\n\n case xdr.ScSpecType.scSpecTypeBytes():\n case xdr.ScSpecType.scSpecTypeBytesN():\n accumulator.needsBufferImport = true;\n return;\n\n case xdr.ScSpecType.scSpecTypeVal():\n accumulator.stellarImports.add(\"xdr\");\n return;\n\n case xdr.ScSpecType.scSpecTypeResult():\n accumulator.stellarContractImports.add(\"Result\");\n // Fall through to handle nested types\n break;\n\n // Primitive types that need no imports\n case xdr.ScSpecType.scSpecTypeBool():\n case xdr.ScSpecType.scSpecTypeVoid():\n case xdr.ScSpecType.scSpecTypeError():\n case xdr.ScSpecType.scSpecTypeU32():\n case xdr.ScSpecType.scSpecTypeI32():\n case xdr.ScSpecType.scSpecTypeU64():\n case xdr.ScSpecType.scSpecTypeI64():\n case xdr.ScSpecType.scSpecTypeTimepoint():\n case xdr.ScSpecType.scSpecTypeDuration():\n case xdr.ScSpecType.scSpecTypeU128():\n case xdr.ScSpecType.scSpecTypeI128():\n case xdr.ScSpecType.scSpecTypeU256():\n case xdr.ScSpecType.scSpecTypeI256():\n case xdr.ScSpecType.scSpecTypeString():\n case xdr.ScSpecType.scSpecTypeSymbol():\n return;\n }\n\n // Handle container types (have nested types)\n const nestedTypes = extractNestedTypes(typeDef);\n nestedTypes.forEach((nested) => visitTypeDef(nested, accumulator));\n}\n\n/**\n * Generate imports needed for a list of type definitions\n */\nexport function generateTypeImports(\n typeDefs: xdr.ScSpecTypeDef[],\n): BindingImports {\n const imports: BindingImports = {\n typeFileImports: new Set<string>(),\n stellarContractImports: new Set<string>(),\n stellarImports: new Set<string>(),\n needsBufferImport: false,\n };\n\n // Visit each type definition\n typeDefs.forEach((typeDef) => visitTypeDef(typeDef, imports));\n\n return imports;\n}\n\n/**\n * Options for formatting imports\n */\nexport interface FormatImportsOptions {\n /** Whether to include imports from types.ts */\n includeTypeFileImports?: boolean;\n /** Additional imports needed from stellar/stellar-sdk/contract */\n additionalStellarContractImports?: string[];\n /** Additional imports needed from stellar/stellar-sdk */\n additionalStellarImports?: string[];\n}\n\n/**\n * Format imports into import statement strings\n */\nexport function formatImports(\n imports: BindingImports,\n options?: FormatImportsOptions,\n): string {\n const importLines: string[] = [];\n\n const typeFileImports = imports.typeFileImports;\n const stellarContractImports = [\n ...imports.stellarContractImports,\n ...(options?.additionalStellarContractImports || []),\n ];\n const stellarImports = [\n ...imports.stellarImports,\n ...(options?.additionalStellarImports || []),\n ];\n // Type file imports (only if enabled)\n if (options?.includeTypeFileImports && typeFileImports.size > 0) {\n importLines.push(\n `import {${Array.from(typeFileImports).join(\", \")}} from './types.js';`,\n );\n }\n\n // Stellar contract imports\n if (stellarContractImports.length > 0) {\n const uniqueContractImports = Array.from(new Set(stellarContractImports));\n importLines.push(\n `import {${uniqueContractImports.join(\", \")}} from '@stellar/stellar-sdk/contract';`,\n );\n }\n\n // Stellar SDK imports\n if (stellarImports.length > 0) {\n const uniqueStellarImports = Array.from(new Set(stellarImports));\n importLines.push(\n `import {${uniqueStellarImports.join(\", \")}} from '@stellar/stellar-sdk';`,\n );\n }\n\n // Buffer import\n if (imports.needsBufferImport) {\n importLines.push(`import { Buffer } from 'buffer';`);\n }\n\n return importLines.join(\"\\n\");\n}\n\n/**\n * Escape special characters in JSDoc comment content\n */\nfunction escapeJSDocContent(text: string): string {\n return (\n text\n // Escape closing comment sequences that would break the JSDoc block\n .replace(/\\*\\//g, \"* /\")\n // Escape @ symbols at word boundaries to prevent accidental JSDoc tags\n // We allow common JSDoc tags to pass through\n .replace(\n /@(?!(param|returns?|type|throws?|example|deprecated|see|link|since|author|version|description|summary)\\b)/g,\n \"\\\\@\",\n )\n );\n}\n\n/**\n * Format a comment string as JSDoc with proper escaping\n */\nexport function formatJSDocComment(comment: string, indentLevel = 0): string {\n if (comment.trim() === \"\") {\n return \"\";\n }\n const indent = \" \".repeat(indentLevel);\n\n // Escape special characters and split into lines\n const escapedComment = escapeJSDocContent(comment);\n const lines = escapedComment\n .split(\"\\n\")\n .map((line) => `${indent} * ${line}`.trimEnd());\n\n return `${indent}/**\\n${lines.join(\"\\n\")}\\n${indent} */\\n`;\n}\n\n/**\n * Convert a sanitized identifier (snake_case, kebab-case, etc.) to PascalCase.\n * Intended to be applied after {@link sanitizeIdentifier}.\n */\nexport function toPascalCase(identifier: string): string {\n const pascal = identifier\n .split(/[_$]+/)\n .filter((part) => part.length > 0)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n return pascal === \"\" ? \"Unnamed\" : pascal;\n}\n\n/**\n * Convert a sanitized identifier (snake_case, kebab-case, etc.) to camelCase.\n * Intended to be applied after {@link sanitizeIdentifier}.\n */\nexport function toCamelCase(identifier: string): string {\n const pascal = toPascalCase(identifier);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function isTupleStruct(udtStruct: xdr.ScSpecUdtStructV0): boolean {\n const fields = udtStruct.fields();\n // A tuple struct has unnamed fields\n return fields.every(\n (field, index) => field.name().toString().trim() === index.toString(),\n );\n}\n"],"names":["xdr"],"mappings":"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"}