@tambo-ai/react 0.68.0 → 0.69.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 (326) hide show
  1. package/README.md +1 -1
  2. package/dist/context-helpers/context-helpers.test.js +16 -4
  3. package/dist/context-helpers/context-helpers.test.js.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
  5. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  6. package/dist/context-helpers/current-interactables-context-helper.js +31 -15
  7. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  8. package/dist/context-helpers/registry.d.ts +2 -2
  9. package/dist/context-helpers/registry.d.ts.map +1 -1
  10. package/dist/context-helpers/registry.js.map +1 -1
  11. package/dist/context-helpers/types.d.ts +2 -2
  12. package/dist/context-helpers/types.d.ts.map +1 -1
  13. package/dist/context-helpers/types.js.map +1 -1
  14. package/dist/hooks/use-message-images.test.js +174 -37
  15. package/dist/hooks/use-message-images.test.js.map +1 -1
  16. package/dist/hooks/use-tambo-voice.d.ts +1 -1
  17. package/dist/hooks/use-tambo-voice.js +1 -1
  18. package/dist/hooks/use-tambo-voice.js.map +1 -1
  19. package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
  20. package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
  21. package/dist/hooks/use-tambo-voice.test.js +239 -0
  22. package/dist/hooks/use-tambo-voice.test.js.map +1 -0
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/mcp/elicitation.d.ts.map +1 -1
  27. package/dist/mcp/elicitation.js +12 -0
  28. package/dist/mcp/elicitation.js.map +1 -1
  29. package/dist/mcp/elicitation.test.js +8 -1
  30. package/dist/mcp/elicitation.test.js.map +1 -1
  31. package/dist/mcp/mcp-client.d.ts +6 -10
  32. package/dist/mcp/mcp-client.d.ts.map +1 -1
  33. package/dist/mcp/mcp-client.js.map +1 -1
  34. package/dist/mcp/mcp-hooks.d.ts +12 -60
  35. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  36. package/dist/mcp/mcp-hooks.js +90 -10
  37. package/dist/mcp/mcp-hooks.js.map +1 -1
  38. package/dist/mcp/mcp-hooks.test.js +423 -0
  39. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  40. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  41. package/dist/mcp/tambo-mcp-provider.js +3 -0
  42. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  43. package/dist/mcp/tambo-mcp-provider.test.js +37 -0
  44. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  45. package/dist/model/component-metadata.d.ts +53 -20
  46. package/dist/model/component-metadata.d.ts.map +1 -1
  47. package/dist/model/component-metadata.js.map +1 -1
  48. package/dist/model/tambo-interactable.d.ts +6 -0
  49. package/dist/model/tambo-interactable.d.ts.map +1 -1
  50. package/dist/model/tambo-interactable.js.map +1 -1
  51. package/dist/providers/index.d.ts +1 -1
  52. package/dist/providers/index.d.ts.map +1 -1
  53. package/dist/providers/index.js.map +1 -1
  54. package/dist/providers/tambo-client-provider.d.ts +8 -0
  55. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  56. package/dist/providers/tambo-client-provider.js +10 -11
  57. package/dist/providers/tambo-client-provider.js.map +1 -1
  58. package/dist/providers/tambo-client-provider.test.d.ts +2 -0
  59. package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
  60. package/dist/providers/tambo-client-provider.test.js +208 -0
  61. package/dist/providers/tambo-client-provider.test.js.map +1 -0
  62. package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
  63. package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  64. package/dist/providers/tambo-context-attachment-provider.js +62 -105
  65. package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
  66. package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
  67. package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
  68. package/dist/providers/tambo-interactable-provider.d.ts +2 -0
  69. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  70. package/dist/providers/tambo-interactable-provider.js +29 -4
  71. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  72. package/dist/providers/tambo-interactable-provider.test.js +1 -1
  73. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  74. package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
  75. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  76. package/dist/providers/tambo-provider.d.ts +2 -3
  77. package/dist/providers/tambo-provider.d.ts.map +1 -1
  78. package/dist/providers/tambo-provider.js +5 -6
  79. package/dist/providers/tambo-provider.js.map +1 -1
  80. package/dist/providers/tambo-registry-provider.test.js +16 -0
  81. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  82. package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
  83. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  84. package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
  85. package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
  86. package/dist/providers/tambo-thread-input-provider.js +5 -1
  87. package/dist/providers/tambo-thread-input-provider.js.map +1 -1
  88. package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  89. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  90. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  91. package/dist/providers/tambo-thread-provider.js +53 -42
  92. package/dist/providers/tambo-thread-provider.js.map +1 -1
  93. package/dist/providers/tambo-thread-provider.test.js +368 -262
  94. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  95. package/dist/schema/json-schema.js +29 -29
  96. package/dist/schema/json-schema.js.map +1 -1
  97. package/dist/schema/schema.test.js +237 -0
  98. package/dist/schema/schema.test.js.map +1 -1
  99. package/dist/schema/standard-schema.d.ts +1 -0
  100. package/dist/schema/standard-schema.d.ts.map +1 -1
  101. package/dist/schema/standard-schema.js +18 -13
  102. package/dist/schema/standard-schema.js.map +1 -1
  103. package/dist/schema/standard-schema.test.d.ts +2 -0
  104. package/dist/schema/standard-schema.test.d.ts.map +1 -0
  105. package/dist/schema/standard-schema.test.js +165 -0
  106. package/dist/schema/standard-schema.test.js.map +1 -0
  107. package/dist/schema/validate.test.js +149 -0
  108. package/dist/schema/validate.test.js.map +1 -1
  109. package/dist/schema/zod.d.ts +7 -4
  110. package/dist/schema/zod.d.ts.map +1 -1
  111. package/dist/schema/zod.js +65 -22
  112. package/dist/schema/zod.js.map +1 -1
  113. package/dist/schema/zod.test.js +112 -0
  114. package/dist/schema/zod.test.js.map +1 -1
  115. package/dist/testing/tools.d.ts +4 -1
  116. package/dist/testing/tools.d.ts.map +1 -1
  117. package/dist/testing/tools.js +6 -1
  118. package/dist/testing/tools.js.map +1 -1
  119. package/dist/util/generate-component.d.ts.map +1 -1
  120. package/dist/util/generate-component.js +18 -3
  121. package/dist/util/generate-component.js.map +1 -1
  122. package/dist/util/generate-component.test.d.ts +2 -0
  123. package/dist/util/generate-component.test.d.ts.map +1 -0
  124. package/dist/util/generate-component.test.js +340 -0
  125. package/dist/util/generate-component.test.js.map +1 -0
  126. package/dist/util/is-promise.d.ts +9 -0
  127. package/dist/util/is-promise.d.ts.map +1 -0
  128. package/dist/util/is-promise.js +20 -0
  129. package/dist/util/is-promise.js.map +1 -0
  130. package/dist/util/is-promise.test.d.ts +2 -0
  131. package/dist/util/is-promise.test.d.ts.map +1 -0
  132. package/dist/util/is-promise.test.js +48 -0
  133. package/dist/util/is-promise.test.js.map +1 -0
  134. package/dist/util/query-utils.test.d.ts +2 -0
  135. package/dist/util/query-utils.test.d.ts.map +1 -0
  136. package/dist/util/query-utils.test.js +382 -0
  137. package/dist/util/query-utils.test.js.map +1 -0
  138. package/dist/util/registry-validators.d.ts.map +1 -1
  139. package/dist/util/registry-validators.js +7 -0
  140. package/dist/util/registry-validators.js.map +1 -1
  141. package/dist/util/registry-validators.test.js +57 -0
  142. package/dist/util/registry-validators.test.js.map +1 -1
  143. package/dist/util/registry.d.ts.map +1 -1
  144. package/dist/util/registry.js +9 -0
  145. package/dist/util/registry.js.map +1 -1
  146. package/dist/util/registry.test.js +323 -1
  147. package/dist/util/registry.test.js.map +1 -1
  148. package/dist/util/resource-validators.test.d.ts +2 -0
  149. package/dist/util/resource-validators.test.d.ts.map +1 -0
  150. package/dist/util/resource-validators.test.js +90 -0
  151. package/dist/util/resource-validators.test.js.map +1 -0
  152. package/dist/util/tool-caller.d.ts +2 -2
  153. package/dist/util/tool-caller.d.ts.map +1 -1
  154. package/dist/util/tool-caller.js +8 -8
  155. package/dist/util/tool-caller.js.map +1 -1
  156. package/dist/util/validate-component-name.test.d.ts +2 -0
  157. package/dist/util/validate-component-name.test.d.ts.map +1 -0
  158. package/dist/util/validate-component-name.test.js +35 -0
  159. package/dist/util/validate-component-name.test.js.map +1 -0
  160. package/esm/context-helpers/context-helpers.test.js +16 -4
  161. package/esm/context-helpers/context-helpers.test.js.map +1 -1
  162. package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
  163. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  164. package/esm/context-helpers/current-interactables-context-helper.js +31 -15
  165. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  166. package/esm/context-helpers/registry.d.ts +2 -2
  167. package/esm/context-helpers/registry.d.ts.map +1 -1
  168. package/esm/context-helpers/registry.js.map +1 -1
  169. package/esm/context-helpers/types.d.ts +2 -2
  170. package/esm/context-helpers/types.d.ts.map +1 -1
  171. package/esm/context-helpers/types.js.map +1 -1
  172. package/esm/hooks/use-message-images.test.js +174 -37
  173. package/esm/hooks/use-message-images.test.js.map +1 -1
  174. package/esm/hooks/use-tambo-voice.d.ts +1 -1
  175. package/esm/hooks/use-tambo-voice.js +1 -1
  176. package/esm/hooks/use-tambo-voice.js.map +1 -1
  177. package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
  178. package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
  179. package/esm/hooks/use-tambo-voice.test.js +234 -0
  180. package/esm/hooks/use-tambo-voice.test.js.map +1 -0
  181. package/esm/index.d.ts +2 -2
  182. package/esm/index.d.ts.map +1 -1
  183. package/esm/index.js.map +1 -1
  184. package/esm/mcp/elicitation.d.ts.map +1 -1
  185. package/esm/mcp/elicitation.js +12 -0
  186. package/esm/mcp/elicitation.js.map +1 -1
  187. package/esm/mcp/elicitation.test.js +8 -1
  188. package/esm/mcp/elicitation.test.js.map +1 -1
  189. package/esm/mcp/mcp-client.d.ts +6 -10
  190. package/esm/mcp/mcp-client.d.ts.map +1 -1
  191. package/esm/mcp/mcp-client.js.map +1 -1
  192. package/esm/mcp/mcp-hooks.d.ts +12 -60
  193. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  194. package/esm/mcp/mcp-hooks.js +57 -10
  195. package/esm/mcp/mcp-hooks.js.map +1 -1
  196. package/esm/mcp/mcp-hooks.test.js +423 -0
  197. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  198. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  199. package/esm/mcp/tambo-mcp-provider.js +3 -0
  200. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  201. package/esm/mcp/tambo-mcp-provider.test.js +37 -0
  202. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  203. package/esm/model/component-metadata.d.ts +53 -20
  204. package/esm/model/component-metadata.d.ts.map +1 -1
  205. package/esm/model/component-metadata.js.map +1 -1
  206. package/esm/model/tambo-interactable.d.ts +6 -0
  207. package/esm/model/tambo-interactable.d.ts.map +1 -1
  208. package/esm/model/tambo-interactable.js.map +1 -1
  209. package/esm/providers/index.d.ts +1 -1
  210. package/esm/providers/index.d.ts.map +1 -1
  211. package/esm/providers/index.js.map +1 -1
  212. package/esm/providers/tambo-client-provider.d.ts +8 -0
  213. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  214. package/esm/providers/tambo-client-provider.js +11 -12
  215. package/esm/providers/tambo-client-provider.js.map +1 -1
  216. package/esm/providers/tambo-client-provider.test.d.ts +2 -0
  217. package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
  218. package/esm/providers/tambo-client-provider.test.js +203 -0
  219. package/esm/providers/tambo-client-provider.test.js.map +1 -0
  220. package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
  221. package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  222. package/esm/providers/tambo-context-attachment-provider.js +63 -106
  223. package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
  224. package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
  225. package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
  226. package/esm/providers/tambo-interactable-provider.d.ts +2 -0
  227. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  228. package/esm/providers/tambo-interactable-provider.js +29 -4
  229. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  230. package/esm/providers/tambo-interactable-provider.test.js +1 -1
  231. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  232. package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
  233. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  234. package/esm/providers/tambo-provider.d.ts +2 -3
  235. package/esm/providers/tambo-provider.d.ts.map +1 -1
  236. package/esm/providers/tambo-provider.js +5 -6
  237. package/esm/providers/tambo-provider.js.map +1 -1
  238. package/esm/providers/tambo-registry-provider.test.js +16 -0
  239. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  240. package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
  241. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  242. package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
  243. package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
  244. package/esm/providers/tambo-thread-input-provider.js +5 -1
  245. package/esm/providers/tambo-thread-input-provider.js.map +1 -1
  246. package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  247. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  248. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  249. package/esm/providers/tambo-thread-provider.js +53 -42
  250. package/esm/providers/tambo-thread-provider.js.map +1 -1
  251. package/esm/providers/tambo-thread-provider.test.js +368 -262
  252. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  253. package/esm/schema/json-schema.js +1 -1
  254. package/esm/schema/json-schema.js.map +1 -1
  255. package/esm/schema/schema.test.js +238 -1
  256. package/esm/schema/schema.test.js.map +1 -1
  257. package/esm/schema/standard-schema.d.ts +1 -0
  258. package/esm/schema/standard-schema.d.ts.map +1 -1
  259. package/esm/schema/standard-schema.js +18 -13
  260. package/esm/schema/standard-schema.js.map +1 -1
  261. package/esm/schema/standard-schema.test.d.ts +2 -0
  262. package/esm/schema/standard-schema.test.d.ts.map +1 -0
  263. package/esm/schema/standard-schema.test.js +130 -0
  264. package/esm/schema/standard-schema.test.js.map +1 -0
  265. package/esm/schema/validate.test.js +149 -0
  266. package/esm/schema/validate.test.js.map +1 -1
  267. package/esm/schema/zod.d.ts +7 -4
  268. package/esm/schema/zod.d.ts.map +1 -1
  269. package/esm/schema/zod.js +65 -22
  270. package/esm/schema/zod.js.map +1 -1
  271. package/esm/schema/zod.test.js +113 -1
  272. package/esm/schema/zod.test.js.map +1 -1
  273. package/esm/testing/tools.d.ts +4 -1
  274. package/esm/testing/tools.d.ts.map +1 -1
  275. package/esm/testing/tools.js +6 -1
  276. package/esm/testing/tools.js.map +1 -1
  277. package/esm/util/generate-component.d.ts.map +1 -1
  278. package/esm/util/generate-component.js +18 -3
  279. package/esm/util/generate-component.js.map +1 -1
  280. package/esm/util/generate-component.test.d.ts +2 -0
  281. package/esm/util/generate-component.test.d.ts.map +1 -0
  282. package/esm/util/generate-component.test.js +302 -0
  283. package/esm/util/generate-component.test.js.map +1 -0
  284. package/esm/util/is-promise.d.ts +9 -0
  285. package/esm/util/is-promise.d.ts.map +1 -0
  286. package/esm/util/is-promise.js +17 -0
  287. package/esm/util/is-promise.js.map +1 -0
  288. package/esm/util/is-promise.test.d.ts +2 -0
  289. package/esm/util/is-promise.test.d.ts.map +1 -0
  290. package/esm/util/is-promise.test.js +46 -0
  291. package/esm/util/is-promise.test.js.map +1 -0
  292. package/esm/util/query-utils.test.d.ts +2 -0
  293. package/esm/util/query-utils.test.d.ts.map +1 -0
  294. package/esm/util/query-utils.test.js +380 -0
  295. package/esm/util/query-utils.test.js.map +1 -0
  296. package/esm/util/registry-validators.d.ts.map +1 -1
  297. package/esm/util/registry-validators.js +7 -0
  298. package/esm/util/registry-validators.js.map +1 -1
  299. package/esm/util/registry-validators.test.js +57 -0
  300. package/esm/util/registry-validators.test.js.map +1 -1
  301. package/esm/util/registry.d.ts.map +1 -1
  302. package/esm/util/registry.js +9 -0
  303. package/esm/util/registry.js.map +1 -1
  304. package/esm/util/registry.test.js +324 -2
  305. package/esm/util/registry.test.js.map +1 -1
  306. package/esm/util/resource-validators.test.d.ts +2 -0
  307. package/esm/util/resource-validators.test.d.ts.map +1 -0
  308. package/esm/util/resource-validators.test.js +88 -0
  309. package/esm/util/resource-validators.test.js.map +1 -0
  310. package/esm/util/tool-caller.d.ts +2 -2
  311. package/esm/util/tool-caller.d.ts.map +1 -1
  312. package/esm/util/tool-caller.js +8 -8
  313. package/esm/util/tool-caller.js.map +1 -1
  314. package/esm/util/validate-component-name.test.d.ts +2 -0
  315. package/esm/util/validate-component-name.test.d.ts.map +1 -0
  316. package/esm/util/validate-component-name.test.js +33 -0
  317. package/esm/util/validate-component-name.test.js.map +1 -0
  318. package/package.json +15 -23
  319. package/dist/schema/alias.d.ts +0 -3
  320. package/dist/schema/alias.d.ts.map +0 -1
  321. package/dist/schema/alias.js +0 -6
  322. package/dist/schema/alias.js.map +0 -1
  323. package/esm/schema/alias.d.ts +0 -3
  324. package/esm/schema/alias.d.ts.map +0 -1
  325. package/esm/schema/alias.js +0 -13
  326. package/esm/schema/alias.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as z3 from "zod/v3";
2
2
  import * as z4 from "zod/v4";
3
- import { handleZodSchemaToJson, isZod3Schema, isZod4Schema } from "./zod";
3
+ import { getZodFunctionArgs, getZodFunctionReturns, handleZodSchemaToJson, isZod3FunctionSchema, isZod3Schema, isZod4FunctionSchema, isZod4Schema, isZodFunctionSchema, isZodSchema, } from "./zod";
4
4
  // Test helper: assumes `value` is JSON-serializable (plain objects/arrays/primitives).
5
5
  // Conservative helper: returns true if any object in the tree has an own `key`
6
6
  // property at any depth. This lets us assert against JSON Schema `$ref` keys
@@ -95,6 +95,60 @@ describe("zod schema utilities", () => {
95
95
  expect(isZod4Schema("string")).toBe(false);
96
96
  });
97
97
  });
98
+ describe("isZodSchema", () => {
99
+ it("returns true for Zod 3 schemas", () => {
100
+ expect(isZodSchema(z3.string())).toBe(true);
101
+ expect(isZodSchema(z3.object({ a: z3.string() }))).toBe(true);
102
+ });
103
+ it("returns true for Zod 4 schemas", () => {
104
+ expect(isZodSchema(z4.string())).toBe(true);
105
+ expect(isZodSchema(z4.object({ a: z4.string() }))).toBe(true);
106
+ });
107
+ it("returns false for non-objects", () => {
108
+ expect(isZodSchema(null)).toBe(false);
109
+ expect(isZodSchema(undefined)).toBe(false);
110
+ expect(isZodSchema("string")).toBe(false);
111
+ expect(isZodSchema(123)).toBe(false);
112
+ });
113
+ it("returns false for objects without ~standard", () => {
114
+ expect(isZodSchema({})).toBe(false);
115
+ expect(isZodSchema({ foo: "bar" })).toBe(false);
116
+ });
117
+ it("returns false for objects with invalid ~standard", () => {
118
+ expect(isZodSchema({ "~standard": null })).toBe(false);
119
+ expect(isZodSchema({ "~standard": "not-object" })).toBe(false);
120
+ expect(isZodSchema({ "~standard": {} })).toBe(false);
121
+ expect(isZodSchema({ "~standard": { vendor: "not-zod" } })).toBe(false);
122
+ });
123
+ });
124
+ describe("isZodFunctionSchema", () => {
125
+ it("returns true for Zod 3 function schemas", () => {
126
+ const schema = z3.function().args(z3.string()).returns(z3.void());
127
+ expect(isZodFunctionSchema(schema)).toBe(true);
128
+ expect(isZod3FunctionSchema(schema)).toBe(true);
129
+ expect(isZod4FunctionSchema(schema)).toBe(false);
130
+ });
131
+ it("returns true for Zod 4 function schemas", () => {
132
+ const schema = z4.function({
133
+ input: z4.tuple([z4.string()]),
134
+ output: z4.void(),
135
+ });
136
+ expect(isZodFunctionSchema(schema)).toBe(true);
137
+ expect(isZod3FunctionSchema(schema)).toBe(false);
138
+ expect(isZod4FunctionSchema(schema)).toBe(true);
139
+ });
140
+ it("returns false for non-function Zod schemas", () => {
141
+ expect(isZodFunctionSchema(z3.string())).toBe(false);
142
+ expect(isZodFunctionSchema(z3.object({ a: z3.string() }))).toBe(false);
143
+ expect(isZodFunctionSchema(z4.string())).toBe(false);
144
+ expect(isZodFunctionSchema(z4.object({ a: z4.string() }))).toBe(false);
145
+ });
146
+ it("returns false for non-Zod values", () => {
147
+ expect(isZodFunctionSchema(null)).toBe(false);
148
+ expect(isZodFunctionSchema({})).toBe(false);
149
+ expect(isZodFunctionSchema("function")).toBe(false);
150
+ });
151
+ });
98
152
  describe("handleZodSchemaToJson", () => {
99
153
  describe("basic conversion", () => {
100
154
  it("converts Zod 3 schema to JSON Schema", () => {
@@ -512,5 +566,63 @@ describe("zod schema utilities", () => {
512
566
  });
513
567
  });
514
568
  });
569
+ describe("getZodFunctionArgs", () => {
570
+ it("extracts args from Zod 3 function schema", () => {
571
+ const schema = z3
572
+ .function()
573
+ .args(z3.string(), z3.number())
574
+ .returns(z3.boolean());
575
+ const args = getZodFunctionArgs(schema);
576
+ expect(args).toBeDefined();
577
+ // Zod 3 args is a ZodTuple - check the _def property exists
578
+ expect(args._def.typeName).toBe("ZodTuple");
579
+ });
580
+ it("extracts args from Zod 4 function schema", () => {
581
+ const schema = z4.function({
582
+ input: z4.tuple([z4.string(), z4.number()]),
583
+ output: z4.boolean(),
584
+ });
585
+ const args = getZodFunctionArgs(schema);
586
+ expect(args).toBeDefined();
587
+ // Zod 4 args is accessed via .def.input - it's the tuple schema
588
+ expect(args).toHaveProperty("def");
589
+ });
590
+ it("throws for non-function schemas", () => {
591
+ expect(() => getZodFunctionArgs(z3.string())).toThrow("Unable to determine parameters from zod function schema");
592
+ expect(() => getZodFunctionArgs(z4.string())).toThrow("Unable to determine parameters from zod function schema");
593
+ });
594
+ it("throws for non-Zod values", () => {
595
+ expect(() => getZodFunctionArgs({})).toThrow("Unable to determine parameters from zod function schema");
596
+ });
597
+ });
598
+ describe("getZodFunctionReturns", () => {
599
+ it("extracts returns from Zod 3 function schema", () => {
600
+ const schema = z3
601
+ .function()
602
+ .args(z3.string())
603
+ .returns(z3.object({ result: z3.boolean() }));
604
+ const returns = getZodFunctionReturns(schema);
605
+ expect(returns).toBeDefined();
606
+ // Cast to access _def property on Zod 3 schema
607
+ expect(returns._def.typeName).toBe("ZodObject");
608
+ });
609
+ it("extracts returns from Zod 4 function schema", () => {
610
+ const schema = z4.function({
611
+ input: z4.tuple([z4.string()]),
612
+ output: z4.object({ result: z4.boolean() }),
613
+ });
614
+ const returns = getZodFunctionReturns(schema);
615
+ expect(returns).toBeDefined();
616
+ // Zod 4 returns is accessed via .def.output - it's the object schema
617
+ expect(returns).toHaveProperty("def");
618
+ });
619
+ it("throws for non-function schemas", () => {
620
+ expect(() => getZodFunctionReturns(z3.string())).toThrow("Unable to determine return type from zod function schema");
621
+ expect(() => getZodFunctionReturns(z4.string())).toThrow("Unable to determine return type from zod function schema");
622
+ });
623
+ it("throws for non-Zod values", () => {
624
+ expect(() => getZodFunctionReturns({})).toThrow("Unable to determine return type from zod function schema");
625
+ });
626
+ });
515
627
  });
516
628
  //# sourceMappingURL=zod.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.test.js","sourceRoot":"","sources":["../../src/schema/zod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport { handleZodSchemaToJson, isZod3Schema, isZod4Schema } from \"./zod\";\n\n// Test helper: assumes `value` is JSON-serializable (plain objects/arrays/primitives).\n// Conservative helper: returns true if any object in the tree has an own `key`\n// property at any depth. This lets us assert against JSON Schema `$ref` keys\n// structurally (not via incidental substrings in string values).\nfunction hasKeyDeep(value: unknown, key: string): boolean {\n const seen = new Set<object>();\n\n function isPlainObject(v: unknown): v is Record<string, unknown> {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n }\n\n function visit(node: unknown): boolean {\n if (!node || typeof node !== \"object\") return false;\n if (seen.has(node)) return false;\n seen.add(node);\n\n if (Array.isArray(node)) {\n return node.some(visit);\n }\n\n if (!isPlainObject(node)) return false;\n\n if (Object.prototype.hasOwnProperty.call(node, key)) return true;\n return Object.values(node).some(visit);\n }\n\n return visit(value);\n}\n\nfunction resolveJsonPointer(doc: unknown, pointer: string): unknown {\n if (!pointer.startsWith(\"#\")) return undefined;\n if (pointer === \"#\") return doc;\n if (!pointer.startsWith(\"#/\")) return undefined;\n\n return pointer\n .slice(2)\n .split(\"/\")\n .map((segment) => segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"))\n .reduce<unknown>((current, segment) => {\n if (!current || typeof current !== \"object\") return undefined;\n\n if (Array.isArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index)) return undefined;\n return current[index];\n }\n\n return (current as Record<string, unknown>)[segment];\n }, doc);\n}\n\nfunction createRecursiveZod4NodeSchema(): z4.ZodTypeAny {\n // Placeholder schema so we can self-reference via `z4.lazy` without\n // fighting ESLint `prefer-const`.\n let nodeSchema: z4.ZodTypeAny = z4.any();\n nodeSchema = z4.object({ next: z4.lazy(() => nodeSchema).optional() });\n return nodeSchema;\n}\n\ndescribe(\"zod schema utilities\", () => {\n describe(\"isZod3Schema\", () => {\n it(\"returns true for Zod 3 schemas\", () => {\n const schema = z3.object({ name: z3.string() });\n expect(isZod3Schema(schema)).toBe(true);\n expect(isZod4Schema(schema)).toBe(false);\n });\n\n it(\"returns true for Zod 4 schemas (they also have _def)\", () => {\n // Note: Zod 4 schemas have both _def and _zod, so isZod3Schema returns true.\n // This is fine because handleZodSchemaToJson checks isZod4Schema first.\n const schema = z4.object({ name: z4.string() });\n expect(isZod4Schema(schema)).toBe(true);\n expect(isZod3Schema(schema)).toBe(false);\n });\n\n it(\"returns false for non-Zod values\", () => {\n expect(isZod3Schema({})).toBe(false);\n expect(isZod3Schema(null)).toBe(false);\n expect(isZod3Schema(\"string\")).toBe(false);\n });\n });\n\n describe(\"isZod4Schema\", () => {\n it(\"returns true for Zod 4 schemas\", () => {\n const schema = z4.object({ name: z4.string() });\n expect(isZod4Schema(schema)).toBe(true);\n });\n\n it(\"returns false for Zod 3 schemas\", () => {\n const schema = z3.object({ name: z3.string() });\n expect(isZod4Schema(schema)).toBe(false);\n });\n\n it(\"returns false for non-Zod values\", () => {\n expect(isZod4Schema({})).toBe(false);\n expect(isZod4Schema(null)).toBe(false);\n expect(isZod4Schema(\"string\")).toBe(false);\n });\n });\n\n describe(\"handleZodSchemaToJson\", () => {\n describe(\"basic conversion\", () => {\n it(\"converts Zod 3 schema to JSON Schema\", () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n });\n });\n\n it(\"converts Zod 4 schema to JSON Schema\", () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n });\n });\n });\n\n describe(\"reused schemas - no $ref references\", () => {\n it(\"inlines reused Zod 3 schemas without any $ref in output\", () => {\n // Define a shared schema that will be reused\n const dataSchema = z3.object({\n name: z3.string(),\n value: z3.number(),\n });\n\n // Use the same schema in multiple places\n const props = z3.object({\n data: z3.array(dataSchema),\n historicalData: z3.array(dataSchema),\n });\n\n const result = handleZodSchemaToJson(props);\n\n // Ensure there are no JSON Schema `$ref` keys anywhere in the produced schema.\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n\n // Both arrays should have the full schema inline\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n data: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n historicalData: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n },\n });\n });\n\n it(\"inlines reused Zod 4 schemas without any $ref in output\", () => {\n // Define a shared schema that will be reused\n const dataSchema = z4.object({\n name: z4.string(),\n value: z4.number(),\n });\n\n // Use the same schema in multiple places\n const props = z4.object({\n data: z4.array(dataSchema),\n historicalData: z4.array(dataSchema),\n });\n\n const result = handleZodSchemaToJson(props);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n\n // Both arrays should have the full schema inline\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n data: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n historicalData: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n },\n });\n });\n\n it(\"handles deeply nested reused Zod 3 schemas without any $ref\", () => {\n const addressSchema = z3.object({\n street: z3.string(),\n city: z3.string(),\n });\n\n const personSchema = z3.object({\n name: z3.string(),\n homeAddress: addressSchema,\n workAddress: addressSchema,\n });\n\n const result = handleZodSchemaToJson(personSchema);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n homeAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n workAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n },\n });\n });\n\n it(\"handles deeply nested reused Zod 4 schemas without any $ref\", () => {\n const addressSchema = z4.object({\n street: z4.string(),\n city: z4.string(),\n });\n\n const personSchema = z4.object({\n name: z4.string(),\n homeAddress: addressSchema,\n workAddress: addressSchema,\n });\n\n const result = handleZodSchemaToJson(personSchema);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n homeAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n workAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n },\n });\n });\n\n it(\"handles triple-nested reused Zod 4 schemas without any $ref\", () => {\n const pointSchema = z4.object({\n x: z4.number(),\n y: z4.number(),\n });\n\n const lineSchema = z4.object({\n start: pointSchema,\n end: pointSchema,\n });\n\n const shapeSchema = z4.object({\n outline: z4.array(lineSchema),\n boundingBox: z4.object({\n topLeft: pointSchema,\n bottomRight: pointSchema,\n }),\n });\n\n const result = handleZodSchemaToJson(shapeSchema);\n\n expect(result).toMatchInlineSnapshot(`\n {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"additionalProperties\": false,\n \"properties\": {\n \"boundingBox\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"bottomRight\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n \"topLeft\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n },\n \"required\": [\n \"topLeft\",\n \"bottomRight\",\n ],\n \"type\": \"object\",\n },\n \"outline\": {\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"end\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n \"start\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n },\n \"required\": [\n \"start\",\n \"end\",\n ],\n \"type\": \"object\",\n },\n \"type\": \"array\",\n },\n },\n \"required\": [\n \"outline\",\n \"boundingBox\",\n ],\n \"type\": \"object\",\n }\n `);\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n });\n });\n\n describe(\"recursive schemas\", () => {\n it(\"represents Zod 4 recursive schemas using $ref\", () => {\n const nodeSchema = createRecursiveZod4NodeSchema();\n const result = handleZodSchemaToJson(nodeSchema);\n const schema = result as Record<string, unknown>;\n const properties = schema.properties as\n | Record<string, unknown>\n | undefined;\n const next = properties?.next as Record<string, unknown> | undefined;\n const ref = next?.$ref;\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(true);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n next: {\n $ref: expect.stringMatching(/^#(\\/.*)?$/),\n },\n },\n });\n expect(ref).toEqual(expect.stringMatching(/^#(\\/.*)?$/));\n\n const resolved =\n typeof ref === \"string\" ? resolveJsonPointer(result, ref) : undefined;\n expect(resolved).toBe(result);\n expect(resolved).toMatchObject({\n type: \"object\",\n });\n });\n });\n\n describe(\"complex schemas\", () => {\n it(\"handles optional fields in Zod 3\", () => {\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n required: { type: \"string\" },\n optional: { type: \"string\" },\n },\n required: [\"required\"],\n });\n });\n\n it(\"handles optional fields in Zod 4\", () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n required: { type: \"string\" },\n optional: { type: \"string\" },\n },\n required: [\"required\"],\n });\n });\n\n it(\"handles enums in Zod 3\", () => {\n const schema = z3.object({\n status: z3.enum([\"active\", \"inactive\", \"pending\"]),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"inactive\", \"pending\"],\n },\n },\n });\n });\n\n it(\"handles enums in Zod 4\", () => {\n const schema = z4.object({\n status: z4.enum([\"active\", \"inactive\", \"pending\"]),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"inactive\", \"pending\"],\n },\n },\n });\n });\n\n it(\"handles descriptions in Zod 3\", () => {\n const schema = z3.object({\n name: z3.string().describe(\"The user name\"),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The user name\",\n },\n },\n });\n });\n\n it(\"handles descriptions in Zod 4\", () => {\n const schema = z4.object({\n name: z4.string().describe(\"The user name\"),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The user name\",\n },\n },\n });\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"zod.test.js","sourceRoot":"","sources":["../../src/schema/zod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport {\n getZodFunctionArgs,\n getZodFunctionReturns,\n handleZodSchemaToJson,\n isZod3FunctionSchema,\n isZod3Schema,\n isZod4FunctionSchema,\n isZod4Schema,\n isZodFunctionSchema,\n isZodSchema,\n} from \"./zod\";\n\n// Test helper: assumes `value` is JSON-serializable (plain objects/arrays/primitives).\n// Conservative helper: returns true if any object in the tree has an own `key`\n// property at any depth. This lets us assert against JSON Schema `$ref` keys\n// structurally (not via incidental substrings in string values).\nfunction hasKeyDeep(value: unknown, key: string): boolean {\n const seen = new Set<object>();\n\n function isPlainObject(v: unknown): v is Record<string, unknown> {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n }\n\n function visit(node: unknown): boolean {\n if (!node || typeof node !== \"object\") return false;\n if (seen.has(node)) return false;\n seen.add(node);\n\n if (Array.isArray(node)) {\n return node.some(visit);\n }\n\n if (!isPlainObject(node)) return false;\n\n if (Object.prototype.hasOwnProperty.call(node, key)) return true;\n return Object.values(node).some(visit);\n }\n\n return visit(value);\n}\n\nfunction resolveJsonPointer(doc: unknown, pointer: string): unknown {\n if (!pointer.startsWith(\"#\")) return undefined;\n if (pointer === \"#\") return doc;\n if (!pointer.startsWith(\"#/\")) return undefined;\n\n return pointer\n .slice(2)\n .split(\"/\")\n .map((segment) => segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"))\n .reduce<unknown>((current, segment) => {\n if (!current || typeof current !== \"object\") return undefined;\n\n if (Array.isArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index)) return undefined;\n return current[index];\n }\n\n return (current as Record<string, unknown>)[segment];\n }, doc);\n}\n\nfunction createRecursiveZod4NodeSchema(): z4.ZodTypeAny {\n // Placeholder schema so we can self-reference via `z4.lazy` without\n // fighting ESLint `prefer-const`.\n let nodeSchema: z4.ZodTypeAny = z4.any();\n nodeSchema = z4.object({ next: z4.lazy(() => nodeSchema).optional() });\n return nodeSchema;\n}\n\ndescribe(\"zod schema utilities\", () => {\n describe(\"isZod3Schema\", () => {\n it(\"returns true for Zod 3 schemas\", () => {\n const schema = z3.object({ name: z3.string() });\n expect(isZod3Schema(schema)).toBe(true);\n expect(isZod4Schema(schema)).toBe(false);\n });\n\n it(\"returns true for Zod 4 schemas (they also have _def)\", () => {\n // Note: Zod 4 schemas have both _def and _zod, so isZod3Schema returns true.\n // This is fine because handleZodSchemaToJson checks isZod4Schema first.\n const schema = z4.object({ name: z4.string() });\n expect(isZod4Schema(schema)).toBe(true);\n expect(isZod3Schema(schema)).toBe(false);\n });\n\n it(\"returns false for non-Zod values\", () => {\n expect(isZod3Schema({})).toBe(false);\n expect(isZod3Schema(null)).toBe(false);\n expect(isZod3Schema(\"string\")).toBe(false);\n });\n });\n\n describe(\"isZod4Schema\", () => {\n it(\"returns true for Zod 4 schemas\", () => {\n const schema = z4.object({ name: z4.string() });\n expect(isZod4Schema(schema)).toBe(true);\n });\n\n it(\"returns false for Zod 3 schemas\", () => {\n const schema = z3.object({ name: z3.string() });\n expect(isZod4Schema(schema)).toBe(false);\n });\n\n it(\"returns false for non-Zod values\", () => {\n expect(isZod4Schema({})).toBe(false);\n expect(isZod4Schema(null)).toBe(false);\n expect(isZod4Schema(\"string\")).toBe(false);\n });\n });\n\n describe(\"isZodSchema\", () => {\n it(\"returns true for Zod 3 schemas\", () => {\n expect(isZodSchema(z3.string())).toBe(true);\n expect(isZodSchema(z3.object({ a: z3.string() }))).toBe(true);\n });\n\n it(\"returns true for Zod 4 schemas\", () => {\n expect(isZodSchema(z4.string())).toBe(true);\n expect(isZodSchema(z4.object({ a: z4.string() }))).toBe(true);\n });\n\n it(\"returns false for non-objects\", () => {\n expect(isZodSchema(null)).toBe(false);\n expect(isZodSchema(undefined)).toBe(false);\n expect(isZodSchema(\"string\")).toBe(false);\n expect(isZodSchema(123)).toBe(false);\n });\n\n it(\"returns false for objects without ~standard\", () => {\n expect(isZodSchema({})).toBe(false);\n expect(isZodSchema({ foo: \"bar\" })).toBe(false);\n });\n\n it(\"returns false for objects with invalid ~standard\", () => {\n expect(isZodSchema({ \"~standard\": null })).toBe(false);\n expect(isZodSchema({ \"~standard\": \"not-object\" })).toBe(false);\n expect(isZodSchema({ \"~standard\": {} })).toBe(false);\n expect(isZodSchema({ \"~standard\": { vendor: \"not-zod\" } })).toBe(false);\n });\n });\n\n describe(\"isZodFunctionSchema\", () => {\n it(\"returns true for Zod 3 function schemas\", () => {\n const schema = z3.function().args(z3.string()).returns(z3.void());\n expect(isZodFunctionSchema(schema)).toBe(true);\n expect(isZod3FunctionSchema(schema)).toBe(true);\n expect(isZod4FunctionSchema(schema)).toBe(false);\n });\n\n it(\"returns true for Zod 4 function schemas\", () => {\n const schema = z4.function({\n input: z4.tuple([z4.string()]),\n output: z4.void(),\n });\n expect(isZodFunctionSchema(schema)).toBe(true);\n expect(isZod3FunctionSchema(schema)).toBe(false);\n expect(isZod4FunctionSchema(schema)).toBe(true);\n });\n\n it(\"returns false for non-function Zod schemas\", () => {\n expect(isZodFunctionSchema(z3.string())).toBe(false);\n expect(isZodFunctionSchema(z3.object({ a: z3.string() }))).toBe(false);\n expect(isZodFunctionSchema(z4.string())).toBe(false);\n expect(isZodFunctionSchema(z4.object({ a: z4.string() }))).toBe(false);\n });\n\n it(\"returns false for non-Zod values\", () => {\n expect(isZodFunctionSchema(null)).toBe(false);\n expect(isZodFunctionSchema({})).toBe(false);\n expect(isZodFunctionSchema(\"function\")).toBe(false);\n });\n });\n\n describe(\"handleZodSchemaToJson\", () => {\n describe(\"basic conversion\", () => {\n it(\"converts Zod 3 schema to JSON Schema\", () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n });\n });\n\n it(\"converts Zod 4 schema to JSON Schema\", () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n });\n });\n });\n\n describe(\"reused schemas - no $ref references\", () => {\n it(\"inlines reused Zod 3 schemas without any $ref in output\", () => {\n // Define a shared schema that will be reused\n const dataSchema = z3.object({\n name: z3.string(),\n value: z3.number(),\n });\n\n // Use the same schema in multiple places\n const props = z3.object({\n data: z3.array(dataSchema),\n historicalData: z3.array(dataSchema),\n });\n\n const result = handleZodSchemaToJson(props);\n\n // Ensure there are no JSON Schema `$ref` keys anywhere in the produced schema.\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n\n // Both arrays should have the full schema inline\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n data: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n historicalData: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n },\n });\n });\n\n it(\"inlines reused Zod 4 schemas without any $ref in output\", () => {\n // Define a shared schema that will be reused\n const dataSchema = z4.object({\n name: z4.string(),\n value: z4.number(),\n });\n\n // Use the same schema in multiple places\n const props = z4.object({\n data: z4.array(dataSchema),\n historicalData: z4.array(dataSchema),\n });\n\n const result = handleZodSchemaToJson(props);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n\n // Both arrays should have the full schema inline\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n data: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n historicalData: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n value: { type: \"number\" },\n },\n },\n },\n },\n });\n });\n\n it(\"handles deeply nested reused Zod 3 schemas without any $ref\", () => {\n const addressSchema = z3.object({\n street: z3.string(),\n city: z3.string(),\n });\n\n const personSchema = z3.object({\n name: z3.string(),\n homeAddress: addressSchema,\n workAddress: addressSchema,\n });\n\n const result = handleZodSchemaToJson(personSchema);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n homeAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n workAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n },\n });\n });\n\n it(\"handles deeply nested reused Zod 4 schemas without any $ref\", () => {\n const addressSchema = z4.object({\n street: z4.string(),\n city: z4.string(),\n });\n\n const personSchema = z4.object({\n name: z4.string(),\n homeAddress: addressSchema,\n workAddress: addressSchema,\n });\n\n const result = handleZodSchemaToJson(personSchema);\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n homeAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n workAddress: {\n type: \"object\",\n properties: {\n street: { type: \"string\" },\n city: { type: \"string\" },\n },\n },\n },\n });\n });\n\n it(\"handles triple-nested reused Zod 4 schemas without any $ref\", () => {\n const pointSchema = z4.object({\n x: z4.number(),\n y: z4.number(),\n });\n\n const lineSchema = z4.object({\n start: pointSchema,\n end: pointSchema,\n });\n\n const shapeSchema = z4.object({\n outline: z4.array(lineSchema),\n boundingBox: z4.object({\n topLeft: pointSchema,\n bottomRight: pointSchema,\n }),\n });\n\n const result = handleZodSchemaToJson(shapeSchema);\n\n expect(result).toMatchInlineSnapshot(`\n {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"additionalProperties\": false,\n \"properties\": {\n \"boundingBox\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"bottomRight\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n \"topLeft\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n },\n \"required\": [\n \"topLeft\",\n \"bottomRight\",\n ],\n \"type\": \"object\",\n },\n \"outline\": {\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"end\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n \"start\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"x\": {\n \"type\": \"number\",\n },\n \"y\": {\n \"type\": \"number\",\n },\n },\n \"required\": [\n \"x\",\n \"y\",\n ],\n \"type\": \"object\",\n },\n },\n \"required\": [\n \"start\",\n \"end\",\n ],\n \"type\": \"object\",\n },\n \"type\": \"array\",\n },\n },\n \"required\": [\n \"outline\",\n \"boundingBox\",\n ],\n \"type\": \"object\",\n }\n `);\n expect(hasKeyDeep(result, \"$ref\")).toBe(false);\n });\n });\n\n describe(\"recursive schemas\", () => {\n it(\"represents Zod 4 recursive schemas using $ref\", () => {\n const nodeSchema = createRecursiveZod4NodeSchema();\n const result = handleZodSchemaToJson(nodeSchema);\n const schema = result as Record<string, unknown>;\n const properties = schema.properties as\n | Record<string, unknown>\n | undefined;\n const next = properties?.next as Record<string, unknown> | undefined;\n const ref = next?.$ref;\n\n expect(hasKeyDeep(result, \"$ref\")).toBe(true);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n next: {\n $ref: expect.stringMatching(/^#(\\/.*)?$/),\n },\n },\n });\n expect(ref).toEqual(expect.stringMatching(/^#(\\/.*)?$/));\n\n const resolved =\n typeof ref === \"string\" ? resolveJsonPointer(result, ref) : undefined;\n expect(resolved).toBe(result);\n expect(resolved).toMatchObject({\n type: \"object\",\n });\n });\n });\n\n describe(\"complex schemas\", () => {\n it(\"handles optional fields in Zod 3\", () => {\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n required: { type: \"string\" },\n optional: { type: \"string\" },\n },\n required: [\"required\"],\n });\n });\n\n it(\"handles optional fields in Zod 4\", () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n required: { type: \"string\" },\n optional: { type: \"string\" },\n },\n required: [\"required\"],\n });\n });\n\n it(\"handles enums in Zod 3\", () => {\n const schema = z3.object({\n status: z3.enum([\"active\", \"inactive\", \"pending\"]),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"inactive\", \"pending\"],\n },\n },\n });\n });\n\n it(\"handles enums in Zod 4\", () => {\n const schema = z4.object({\n status: z4.enum([\"active\", \"inactive\", \"pending\"]),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"inactive\", \"pending\"],\n },\n },\n });\n });\n\n it(\"handles descriptions in Zod 3\", () => {\n const schema = z3.object({\n name: z3.string().describe(\"The user name\"),\n });\n\n const result = handleZodSchemaToJson(schema);\n\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The user name\",\n },\n },\n });\n });\n\n it(\"handles descriptions in Zod 4\", () => {\n const schema = z4.object({\n name: z4.string().describe(\"The user name\"),\n });\n\n const result = handleZodSchemaToJson(schema);\n expect(result).toMatchObject({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The user name\",\n },\n },\n });\n });\n });\n });\n\n describe(\"getZodFunctionArgs\", () => {\n it(\"extracts args from Zod 3 function schema\", () => {\n const schema = z3\n .function()\n .args(z3.string(), z3.number())\n .returns(z3.boolean());\n\n const args = getZodFunctionArgs(schema);\n\n expect(args).toBeDefined();\n // Zod 3 args is a ZodTuple - check the _def property exists\n expect(\n (args as z3.ZodTuple<[z3.ZodString, z3.ZodNumber]>)._def.typeName,\n ).toBe(\"ZodTuple\");\n });\n\n it(\"extracts args from Zod 4 function schema\", () => {\n const schema = z4.function({\n input: z4.tuple([z4.string(), z4.number()]),\n output: z4.boolean(),\n });\n\n const args = getZodFunctionArgs(schema);\n\n expect(args).toBeDefined();\n // Zod 4 args is accessed via .def.input - it's the tuple schema\n expect(args).toHaveProperty(\"def\");\n });\n\n it(\"throws for non-function schemas\", () => {\n expect(() => getZodFunctionArgs(z3.string())).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n expect(() => getZodFunctionArgs(z4.string())).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n\n it(\"throws for non-Zod values\", () => {\n expect(() => getZodFunctionArgs({})).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n });\n\n describe(\"getZodFunctionReturns\", () => {\n it(\"extracts returns from Zod 3 function schema\", () => {\n const schema = z3\n .function()\n .args(z3.string())\n .returns(z3.object({ result: z3.boolean() }));\n\n const returns = getZodFunctionReturns(schema);\n\n expect(returns).toBeDefined();\n // Cast to access _def property on Zod 3 schema\n expect(\n (returns as z3.ZodObject<{ result: z3.ZodBoolean }>)._def.typeName,\n ).toBe(\"ZodObject\");\n });\n\n it(\"extracts returns from Zod 4 function schema\", () => {\n const schema = z4.function({\n input: z4.tuple([z4.string()]),\n output: z4.object({ result: z4.boolean() }),\n });\n\n const returns = getZodFunctionReturns(schema);\n\n expect(returns).toBeDefined();\n // Zod 4 returns is accessed via .def.output - it's the object schema\n expect(returns).toHaveProperty(\"def\");\n });\n\n it(\"throws for non-function schemas\", () => {\n expect(() => getZodFunctionReturns(z3.string())).toThrow(\n \"Unable to determine return type from zod function schema\",\n );\n expect(() => getZodFunctionReturns(z4.string())).toThrow(\n \"Unable to determine return type from zod function schema\",\n );\n });\n\n it(\"throws for non-Zod values\", () => {\n expect(() => getZodFunctionReturns({})).toThrow(\n \"Unable to determine return type from zod function schema\",\n );\n });\n });\n});\n"]}
@@ -14,10 +14,12 @@ export declare function serializeRegistry(mockRegistry: TamboComponent[]): {
14
14
  description: string;
15
15
  propsDefinition?: any;
16
16
  loadingComponent?: import("react").ComponentType<any>;
17
+ annotations?: import("../model/component-metadata").ToolAnnotations;
17
18
  }[];
18
19
  interface CreateMockToolOptions {
19
20
  inputSchema: TamboTool["inputSchema"];
20
21
  outputSchema?: TamboTool["outputSchema"];
22
+ maxCalls?: number;
21
23
  }
22
24
  /**
23
25
  * Creates a mock TamboTool with the given input schema for testing purposes.
@@ -31,9 +33,10 @@ export declare function createMockTool(schemaOrOptions: TamboTool["inputSchema"]
31
33
  * Creates a mock TamboToolWithToolSchema for testing purposes.
32
34
  * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.
33
35
  * @param toolSchema - The tool schema for the tool
36
+ * @param maxCalls - Optional max calls override
34
37
  * @returns A mock TamboToolWithToolSchema instance (NOT adapted)
35
38
  * @internal
36
39
  */
37
- export declare function createMockToolWithToolSchema(toolSchema: TamboToolWithToolSchema["toolSchema"]): TamboToolWithToolSchema;
40
+ export declare function createMockToolWithToolSchema(toolSchema: TamboToolWithToolSchema["toolSchema"], maxCalls?: number): TamboToolWithToolSchema;
38
41
  export {};
39
42
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,cAAc,EAAE;;;;;;;IAiB/D;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CAC1C;AAGD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,qBAAqB,GAChE,SAAS,CAiCX;AAGD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,GAChD,uBAAuB,CAOzB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,cAAc,EAAE;;;;;;;;IAiB/D;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,qBAAqB,GAChE,SAAS,CAoCX;AAGD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,EACjD,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAQzB"}
@@ -42,6 +42,9 @@ export function createMockTool(schemaOrOptions) {
42
42
  type: "object",
43
43
  properties: {},
44
44
  },
45
+ ...(schemaOrOptions.maxCalls !== undefined
46
+ ? { maxCalls: schemaOrOptions.maxCalls }
47
+ : {}),
45
48
  };
46
49
  }
47
50
  return {
@@ -57,15 +60,17 @@ export function createMockTool(schemaOrOptions) {
57
60
  * Creates a mock TamboToolWithToolSchema for testing purposes.
58
61
  * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.
59
62
  * @param toolSchema - The tool schema for the tool
63
+ * @param maxCalls - Optional max calls override
60
64
  * @returns A mock TamboToolWithToolSchema instance (NOT adapted)
61
65
  * @internal
62
66
  */
63
- export function createMockToolWithToolSchema(toolSchema) {
67
+ export function createMockToolWithToolSchema(toolSchema, maxCalls) {
64
68
  return {
65
69
  name: "testTool",
66
70
  description: "A test tool",
67
71
  tool: jest.fn().mockImplementation(() => { }),
68
72
  toolSchema,
73
+ ...(maxCalls !== undefined ? { maxCalls } : {}),
69
74
  };
70
75
  }
71
76
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAA8B;IAC9D,OAAO,YAAY,CAAC,GAAG,CACrB,CAAC,EACC,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,eAAe,EACf,GAAG,cAAc,EAClB,EAAE,EAAE,CAAC,CAAC;QACL,GAAG,cAAc;QACjB,KAAK,EAAE,gBAAgB,CAAC,WAAW,CAAC;YAClC,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC;YACrC,CAAC,CAAC,WAAW;QACf,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,yBAAyB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CACvD;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAOD,mDAAmD;AACnD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,eAAiE;IAEjE,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,CAC7B,GAAY,EACkB,EAAE;QAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;YACvB,GAAG,KAAK,IAAI;YACZ,aAAa,IAAI,GAAG;YACpB,GAAG,CAAC,WAAW,IAAI,IAAI,CACxB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,yBAAyB;YACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;YACxC,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI;gBAC5C,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,+GAA+G;AAC/G;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAAiD;IAEjD,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["import { TamboToolWithToolSchema } from \"../model/component-metadata\";\nimport { TamboComponent, TamboTool } from \"../providers\";\nimport { isStandardSchema, safeSchemaToJsonSchema } from \"../schema\";\nimport {\n adaptToolFromFnSchema,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\n\n/**\n * Serializes the registry for testing purposes.\n * Converts Standard Schema validators to JSON Schema format.\n * Uses the same logic as production code via mapTamboToolToContextTool.\n * @param mockRegistry - The registry to serialize\n * @returns The serialized registry with JSON Schema representations\n */\nexport function serializeRegistry(mockRegistry: TamboComponent[]) {\n return mockRegistry.map(\n ({\n component: _component,\n propsSchema,\n associatedTools,\n ...componentEntry\n }) => ({\n ...componentEntry,\n props: isStandardSchema(propsSchema)\n ? safeSchemaToJsonSchema(propsSchema)\n : propsSchema,\n contextTools: associatedTools?.map((tool) =>\n mapTamboToolToContextTool(adaptToolFromFnSchema(tool)),\n ),\n }),\n );\n}\n\ninterface CreateMockToolOptions {\n inputSchema: TamboTool[\"inputSchema\"];\n outputSchema?: TamboTool[\"outputSchema\"];\n}\n\n// Helper to create a minimal TamboTool for testing\n/**\n * Creates a mock TamboTool with the given input schema for testing purposes.\n * Accepts either an inputSchema directly or an options object with inputSchema and outputSchema.\n * @param schemaOrOptions - The input schema or options object\n * @returns A mock TamboTool instance\n * @internal\n */\nexport function createMockTool(\n schemaOrOptions: TamboTool[\"inputSchema\"] | CreateMockToolOptions,\n): TamboTool {\n // Check if options object was passed\n const hasInputSchemaProperty = (\n obj: unknown,\n ): obj is CreateMockToolOptions => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"inputSchema\" in obj &&\n obj.inputSchema != null\n );\n };\n\n if (hasInputSchemaProperty(schemaOrOptions)) {\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions.inputSchema,\n outputSchema: schemaOrOptions.outputSchema ?? {\n type: \"object\",\n properties: {},\n },\n };\n }\n\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions,\n outputSchema: { type: \"object\", properties: {} },\n };\n}\n\n// Helper to create a minimal TamboTool for testing -- uses toolSchema field as function instead of inputSchema\n/**\n * Creates a mock TamboToolWithToolSchema for testing purposes.\n * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.\n * @param toolSchema - The tool schema for the tool\n * @returns A mock TamboToolWithToolSchema instance (NOT adapted)\n * @internal\n */\nexport function createMockToolWithToolSchema(\n toolSchema: TamboToolWithToolSchema[\"toolSchema\"],\n): TamboToolWithToolSchema {\n return {\n name: \"testTool\",\n description: \"A test tool\",\n tool: jest.fn().mockImplementation(() => {}),\n toolSchema,\n };\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAA8B;IAC9D,OAAO,YAAY,CAAC,GAAG,CACrB,CAAC,EACC,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,eAAe,EACf,GAAG,cAAc,EAClB,EAAE,EAAE,CAAC,CAAC;QACL,GAAG,cAAc;QACjB,KAAK,EAAE,gBAAgB,CAAC,WAAW,CAAC;YAClC,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC;YACrC,CAAC,CAAC,WAAW;QACf,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,yBAAyB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CACvD;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAQD,mDAAmD;AACnD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,eAAiE;IAEjE,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,CAC7B,GAAY,EACkB,EAAE;QAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;YACvB,GAAG,KAAK,IAAI;YACZ,aAAa,IAAI,GAAG;YACpB,GAAG,CAAC,WAAW,IAAI,IAAI,CACxB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,yBAAyB;YACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;YACxC,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI;gBAC5C,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,GAAG,CAAC,eAAe,CAAC,QAAQ,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,+GAA+G;AAC/G;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAAiD,EACjD,QAAiB;IAEjB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,UAAU;QACV,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrB,CAAC;AAC/B,CAAC","sourcesContent":["import { TamboToolWithToolSchema } from \"../model/component-metadata\";\nimport { TamboComponent, TamboTool } from \"../providers\";\nimport { isStandardSchema, safeSchemaToJsonSchema } from \"../schema\";\nimport {\n adaptToolFromFnSchema,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\n\n/**\n * Serializes the registry for testing purposes.\n * Converts Standard Schema validators to JSON Schema format.\n * Uses the same logic as production code via mapTamboToolToContextTool.\n * @param mockRegistry - The registry to serialize\n * @returns The serialized registry with JSON Schema representations\n */\nexport function serializeRegistry(mockRegistry: TamboComponent[]) {\n return mockRegistry.map(\n ({\n component: _component,\n propsSchema,\n associatedTools,\n ...componentEntry\n }) => ({\n ...componentEntry,\n props: isStandardSchema(propsSchema)\n ? safeSchemaToJsonSchema(propsSchema)\n : propsSchema,\n contextTools: associatedTools?.map((tool) =>\n mapTamboToolToContextTool(adaptToolFromFnSchema(tool)),\n ),\n }),\n );\n}\n\ninterface CreateMockToolOptions {\n inputSchema: TamboTool[\"inputSchema\"];\n outputSchema?: TamboTool[\"outputSchema\"];\n maxCalls?: number;\n}\n\n// Helper to create a minimal TamboTool for testing\n/**\n * Creates a mock TamboTool with the given input schema for testing purposes.\n * Accepts either an inputSchema directly or an options object with inputSchema and outputSchema.\n * @param schemaOrOptions - The input schema or options object\n * @returns A mock TamboTool instance\n * @internal\n */\nexport function createMockTool(\n schemaOrOptions: TamboTool[\"inputSchema\"] | CreateMockToolOptions,\n): TamboTool {\n // Check if options object was passed\n const hasInputSchemaProperty = (\n obj: unknown,\n ): obj is CreateMockToolOptions => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"inputSchema\" in obj &&\n obj.inputSchema != null\n );\n };\n\n if (hasInputSchemaProperty(schemaOrOptions)) {\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions.inputSchema,\n outputSchema: schemaOrOptions.outputSchema ?? {\n type: \"object\",\n properties: {},\n },\n ...(schemaOrOptions.maxCalls !== undefined\n ? { maxCalls: schemaOrOptions.maxCalls }\n : {}),\n };\n }\n\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions,\n outputSchema: { type: \"object\", properties: {} },\n };\n}\n\n// Helper to create a minimal TamboTool for testing -- uses toolSchema field as function instead of inputSchema\n/**\n * Creates a mock TamboToolWithToolSchema for testing purposes.\n * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.\n * @param toolSchema - The tool schema for the tool\n * @param maxCalls - Optional max calls override\n * @returns A mock TamboToolWithToolSchema instance (NOT adapted)\n * @internal\n */\nexport function createMockToolWithToolSchema(\n toolSchema: TamboToolWithToolSchema[\"toolSchema\"],\n maxCalls?: number,\n): TamboToolWithToolSchema {\n return {\n name: \"testTool\",\n description: \"A test tool\",\n tool: jest.fn().mockImplementation(() => {}),\n toolSchema,\n ...(maxCalls !== undefined ? { maxCalls } : {}),\n } as TamboToolWithToolSchema;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAI/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAI1E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAqCpB"}
1
+ {"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAI/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAK1E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAwDpB"}
@@ -2,6 +2,7 @@ import { parse } from "partial-json";
2
2
  import React from "react";
3
3
  import { wrapWithTamboMessageProvider } from "../hooks/use-current-message";
4
4
  import { isStandardSchema } from "../schema";
5
+ import { isPromise } from "../util/is-promise";
5
6
  import { getComponentFromRegistry } from "../util/registry";
6
7
  /**
7
8
  * Generate a message that has a component rendered into it, if the message
@@ -16,9 +17,23 @@ export function renderComponentIntoMessage(message, componentList) {
16
17
  }
17
18
  const parsedProps = parse(JSON.stringify(message.component.props));
18
19
  const registeredComponent = getComponentFromRegistry(message.component.componentName, componentList);
19
- const validatedProps = isStandardSchema(registeredComponent.props)
20
- ? registeredComponent.props["~standard"].validate(parsedProps)
21
- : parsedProps;
20
+ let validatedProps = parsedProps;
21
+ if (isStandardSchema(registeredComponent.props)) {
22
+ const result = registeredComponent.props["~standard"].validate(parsedProps);
23
+ // Standard Schema validate() returns { value: T } on success or { issues: [...] } on failure
24
+ // Async validation is not supported for component rendering
25
+ if (isPromise(result)) {
26
+ throw new Error("Async schema validation is not supported for component props");
27
+ }
28
+ if ("value" in result) {
29
+ validatedProps = result.value;
30
+ }
31
+ else {
32
+ // Validation failed - throw with first issue message
33
+ const issueMessage = result.issues?.[0]?.message ?? "Schema validation failed";
34
+ throw new Error(`Component props validation failed: ${issueMessage}`);
35
+ }
36
+ }
22
37
  const renderedComponent = React.createElement(registeredComponent.component, validatedProps);
23
38
  // Create the full message object first so we can pass it to the provider
24
39
  const fullMessage = {
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAG5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,MAAM,cAAc,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC9D,CAAC,CAAC,WAAW,CAAC;IAEhB,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IAEF,yEAAyE;IACzE,MAAM,WAAW,GAAuB;QACtC,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,4BAA4B,CACnD,iBAAiB,EACjB,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,GAAG,WAAW;QACd,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { isStandardSchema } from \"../schema\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message\n * came with one.\n * @param message - The message that may contain a component\n * @param componentList - the list of available components\n * @returns The updated message with the component rendered into it\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps = isStandardSchema(registeredComponent.props)\n ? registeredComponent.props[\"~standard\"].validate(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n\n // Create the full message object first so we can pass it to the provider\n const fullMessage: TamboThreadMessage = {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n };\n\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n fullMessage,\n );\n\n return {\n ...fullMessage,\n renderedComponent: wrappedComponent,\n };\n}\n"]}
1
+ {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAG5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,IAAI,cAAc,GAA4B,WAG7C,CAAC;IACF,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5E,6FAA6F;QAC7F,4DAA4D;QAC5D,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,cAAc,GAAG,MAAM,CAAC,KAAgC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,MAAM,YAAY,GAChB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,0BAA0B,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IAEF,yEAAyE;IACzE,MAAM,WAAW,GAAuB;QACtC,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,4BAA4B,CACnD,iBAAiB,EACjB,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,GAAG,WAAW;QACd,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { isStandardSchema } from \"../schema\";\nimport { isPromise } from \"../util/is-promise\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message\n * came with one.\n * @param message - The message that may contain a component\n * @param componentList - the list of available components\n * @returns The updated message with the component rendered into it\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n let validatedProps: Record<string, unknown> = parsedProps as Record<\n string,\n unknown\n >;\n if (isStandardSchema(registeredComponent.props)) {\n const result = registeredComponent.props[\"~standard\"].validate(parsedProps);\n // Standard Schema validate() returns { value: T } on success or { issues: [...] } on failure\n // Async validation is not supported for component rendering\n if (isPromise(result)) {\n throw new Error(\n \"Async schema validation is not supported for component props\",\n );\n }\n if (\"value\" in result) {\n validatedProps = result.value as Record<string, unknown>;\n } else {\n // Validation failed - throw with first issue message\n const issueMessage =\n result.issues?.[0]?.message ?? \"Schema validation failed\";\n throw new Error(`Component props validation failed: ${issueMessage}`);\n }\n }\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n\n // Create the full message object first so we can pass it to the provider\n const fullMessage: TamboThreadMessage = {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n };\n\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n fullMessage,\n );\n\n return {\n ...fullMessage,\n renderedComponent: wrappedComponent,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-component.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-component.test.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.test.tsx"],"names":[],"mappings":""}