@tambo-ai/react 0.68.0 → 0.69.1

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 +56 -43
  92. package/dist/providers/tambo-thread-provider.js.map +1 -1
  93. package/dist/providers/tambo-thread-provider.test.js +456 -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 +56 -43
  250. package/esm/providers/tambo-thread-provider.js.map +1 -1
  251. package/esm/providers/tambo-thread-provider.test.js +456 -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
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const react_1 = __importDefault(require("react"));
40
+ const useCurrentMessage = __importStar(require("../hooks/use-current-message"));
41
+ const generate_component_1 = require("./generate-component");
42
+ // Track calls to wrapWithTamboMessageProvider
43
+ let wrapWithTamboMessageProviderSpy;
44
+ beforeEach(() => {
45
+ wrapWithTamboMessageProviderSpy = jest.spyOn(useCurrentMessage, "wrapWithTamboMessageProvider");
46
+ });
47
+ afterEach(() => {
48
+ wrapWithTamboMessageProviderSpy.mockRestore();
49
+ });
50
+ // Simple test component
51
+ const TestComponent = ({ title, count, }) => (react_1.default.createElement("div", { "data-testid": "test-component" },
52
+ react_1.default.createElement("span", null, title),
53
+ count !== undefined && react_1.default.createElement("span", null, count)));
54
+ // Create a mock Standard Schema for testing
55
+ const createMockStandardSchema = (validate) => ({
56
+ "~standard": {
57
+ version: 1,
58
+ vendor: "test",
59
+ validate: (data) => ({ value: validate(data) }),
60
+ },
61
+ });
62
+ describe("renderComponentIntoMessage", () => {
63
+ const baseMessage = {
64
+ id: "msg-123",
65
+ threadId: "thread-456",
66
+ role: "assistant",
67
+ content: [{ type: "text", text: "Here is your component" }],
68
+ createdAt: "2024-01-01T00:00:00Z",
69
+ componentState: {},
70
+ component: {
71
+ componentName: "TestComponent",
72
+ props: { title: "Hello" },
73
+ componentState: {},
74
+ message: "",
75
+ },
76
+ };
77
+ const baseRegistry = {
78
+ TestComponent: {
79
+ name: "TestComponent",
80
+ description: "A test component",
81
+ component: TestComponent,
82
+ props: { type: "object" }, // JSON Schema
83
+ contextTools: [],
84
+ },
85
+ };
86
+ describe("component lookup", () => {
87
+ it("throws error when component has no componentName", () => {
88
+ const messageWithoutComponentName = {
89
+ ...baseMessage,
90
+ component: {
91
+ componentName: "",
92
+ props: {},
93
+ componentState: {},
94
+ message: "",
95
+ },
96
+ };
97
+ expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithoutComponentName, baseRegistry)).toThrow("Component not found");
98
+ });
99
+ it("throws error when component is null", () => {
100
+ const messageWithNullComponent = {
101
+ ...baseMessage,
102
+ component: null,
103
+ };
104
+ expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithNullComponent, baseRegistry)).toThrow();
105
+ });
106
+ it("throws error when componentName not in registry", () => {
107
+ const messageWithUnknownComponent = {
108
+ ...baseMessage,
109
+ component: {
110
+ componentName: "UnknownComponent",
111
+ props: {},
112
+ componentState: {},
113
+ message: "",
114
+ },
115
+ };
116
+ expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithUnknownComponent, baseRegistry)).toThrow("Tambo tried to use Component UnknownComponent, but it was not found");
117
+ });
118
+ it("successfully finds and renders registered component", () => {
119
+ const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
120
+ expect(result.component?.componentName).toBe("TestComponent");
121
+ expect(result.renderedComponent).toBeDefined();
122
+ });
123
+ });
124
+ describe("props handling", () => {
125
+ it("passes props to component from message", () => {
126
+ const messageWithProps = {
127
+ ...baseMessage,
128
+ component: {
129
+ componentName: "TestComponent",
130
+ props: { title: "Test Title", count: 42 },
131
+ componentState: {},
132
+ message: "",
133
+ },
134
+ };
135
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithProps, baseRegistry);
136
+ expect(result.component?.props).toEqual({
137
+ title: "Test Title",
138
+ count: 42,
139
+ });
140
+ });
141
+ it("handles empty props object", () => {
142
+ const messageWithEmptyProps = {
143
+ ...baseMessage,
144
+ component: {
145
+ componentName: "TestComponent",
146
+ props: {},
147
+ componentState: {},
148
+ message: "",
149
+ },
150
+ };
151
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithEmptyProps, baseRegistry);
152
+ expect(result.component?.props).toEqual({});
153
+ });
154
+ it("handles nested object props", () => {
155
+ const messageWithNestedProps = {
156
+ ...baseMessage,
157
+ component: {
158
+ componentName: "TestComponent",
159
+ props: {
160
+ title: "Nested",
161
+ config: { nested: { deeply: { value: 123 } } },
162
+ },
163
+ componentState: {},
164
+ message: "",
165
+ },
166
+ };
167
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithNestedProps, baseRegistry);
168
+ expect(result.component?.props).toEqual({
169
+ title: "Nested",
170
+ config: { nested: { deeply: { value: 123 } } },
171
+ });
172
+ });
173
+ it("handles array props", () => {
174
+ const messageWithArrayProps = {
175
+ ...baseMessage,
176
+ component: {
177
+ componentName: "TestComponent",
178
+ props: { title: "Array Test", items: [1, 2, 3] },
179
+ componentState: {},
180
+ message: "",
181
+ },
182
+ };
183
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithArrayProps, baseRegistry);
184
+ expect(result.component?.props).toEqual({
185
+ title: "Array Test",
186
+ items: [1, 2, 3],
187
+ });
188
+ });
189
+ });
190
+ describe("Standard Schema validation", () => {
191
+ it("validates props through Standard Schema when present", () => {
192
+ const mockValidate = jest.fn((data) => ({
193
+ ...data,
194
+ validated: true,
195
+ }));
196
+ const registryWithStandardSchema = {
197
+ TestComponent: {
198
+ name: "TestComponent",
199
+ description: "A test component",
200
+ component: TestComponent,
201
+ props: createMockStandardSchema(mockValidate),
202
+ contextTools: [],
203
+ },
204
+ };
205
+ const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithStandardSchema);
206
+ expect(mockValidate).toHaveBeenCalled();
207
+ // Standard Schema validate returns { value: T }, we extract the value
208
+ expect(result.component?.props).toEqual({
209
+ title: "Hello",
210
+ validated: true,
211
+ });
212
+ });
213
+ it("throws error when validation returns issues", () => {
214
+ const registryWithFailingSchema = {
215
+ TestComponent: {
216
+ name: "TestComponent",
217
+ description: "A test component",
218
+ component: TestComponent,
219
+ props: {
220
+ "~standard": {
221
+ version: 1,
222
+ vendor: "test",
223
+ validate: () => ({
224
+ issues: [{ message: "title is required", path: ["title"] }],
225
+ }),
226
+ },
227
+ },
228
+ contextTools: [],
229
+ },
230
+ };
231
+ expect(() => (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithFailingSchema)).toThrow("Component props validation failed: title is required");
232
+ });
233
+ it("throws error when validation returns async promise", () => {
234
+ const registryWithAsyncSchema = {
235
+ TestComponent: {
236
+ name: "TestComponent",
237
+ description: "A test component",
238
+ component: TestComponent,
239
+ props: {
240
+ "~standard": {
241
+ version: 1,
242
+ vendor: "test",
243
+ validate: async () => await Promise.resolve({ value: {} }),
244
+ },
245
+ },
246
+ contextTools: [],
247
+ },
248
+ };
249
+ expect(() => (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithAsyncSchema)).toThrow("Async schema validation is not supported for component props");
250
+ });
251
+ it("uses raw props when props is JSON Schema (not Standard Schema)", () => {
252
+ const jsonSchemaRegistry = {
253
+ TestComponent: {
254
+ name: "TestComponent",
255
+ description: "A test component",
256
+ component: TestComponent,
257
+ props: {
258
+ type: "object",
259
+ properties: {
260
+ title: { type: "string" },
261
+ },
262
+ },
263
+ contextTools: [],
264
+ },
265
+ };
266
+ const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, jsonSchemaRegistry);
267
+ // Should pass through without validation
268
+ expect(result.component?.props).toEqual({ title: "Hello" });
269
+ });
270
+ });
271
+ describe("message structure", () => {
272
+ it("preserves original message properties", () => {
273
+ const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
274
+ expect(result.id).toBe("msg-123");
275
+ expect(result.threadId).toBe("thread-456");
276
+ expect(result.role).toBe("assistant");
277
+ expect(result.content).toEqual([
278
+ { type: "text", text: "Here is your component" },
279
+ ]);
280
+ expect(result.createdAt).toBe("2024-01-01T00:00:00Z");
281
+ });
282
+ it("includes renderedComponent in result", () => {
283
+ const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
284
+ expect(result.renderedComponent).toBeDefined();
285
+ expect(react_1.default.isValidElement(result.renderedComponent)).toBe(true);
286
+ });
287
+ it("wraps component with TamboMessageProvider", () => {
288
+ (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
289
+ expect(wrapWithTamboMessageProviderSpy).toHaveBeenCalled();
290
+ // Check that the message passed to the wrapper has the correct structure
291
+ const callArgs = wrapWithTamboMessageProviderSpy.mock.calls[0];
292
+ expect(callArgs[1].id).toBe("msg-123");
293
+ });
294
+ });
295
+ describe("edge cases", () => {
296
+ it("handles special characters in props", () => {
297
+ const messageWithSpecialChars = {
298
+ ...baseMessage,
299
+ component: {
300
+ componentName: "TestComponent",
301
+ props: { title: "Hello <script>alert('xss')</script>" },
302
+ componentState: {},
303
+ message: "",
304
+ },
305
+ };
306
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithSpecialChars, baseRegistry);
307
+ expect(result.component?.props.title).toBe("Hello <script>alert('xss')</script>");
308
+ });
309
+ it("handles unicode in props", () => {
310
+ const messageWithUnicode = {
311
+ ...baseMessage,
312
+ component: {
313
+ componentName: "TestComponent",
314
+ props: { title: "Hello \u4e16\u754c" }, // "Hello 世界"
315
+ componentState: {},
316
+ message: "",
317
+ },
318
+ };
319
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithUnicode, baseRegistry);
320
+ expect(result.component?.props.title).toBe("Hello \u4e16\u754c");
321
+ });
322
+ it("handles null values in props", () => {
323
+ const messageWithNullProp = {
324
+ ...baseMessage,
325
+ component: {
326
+ componentName: "TestComponent",
327
+ props: { title: "Test", nullValue: null },
328
+ componentState: {},
329
+ message: "",
330
+ },
331
+ };
332
+ const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithNullProp, baseRegistry);
333
+ expect(result.component?.props).toEqual({
334
+ title: "Test",
335
+ nullValue: null,
336
+ });
337
+ });
338
+ });
339
+ });
340
+ //# sourceMappingURL=generate-component.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-component.test.js","sourceRoot":"","sources":["../../src/util/generate-component.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React from \"react\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport * as useCurrentMessage from \"../hooks/use-current-message\";\nimport { renderComponentIntoMessage } from \"./generate-component\";\n\n// Track calls to wrapWithTamboMessageProvider\nlet wrapWithTamboMessageProviderSpy: jest.SpyInstance;\n\nbeforeEach(() => {\n wrapWithTamboMessageProviderSpy = jest.spyOn(\n useCurrentMessage,\n \"wrapWithTamboMessageProvider\",\n );\n});\n\nafterEach(() => {\n wrapWithTamboMessageProviderSpy.mockRestore();\n});\n\n// Simple test component\nconst TestComponent: React.FC<{ title: string; count?: number }> = ({\n title,\n count,\n}) => (\n <div data-testid=\"test-component\">\n <span>{title}</span>\n {count !== undefined && <span>{count}</span>}\n </div>\n);\n\n// Create a mock Standard Schema for testing\nconst createMockStandardSchema = (validate: (data: unknown) => unknown) => ({\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: (data: unknown) => ({ value: validate(data) }),\n },\n});\n\ndescribe(\"renderComponentIntoMessage\", () => {\n const baseMessage = {\n id: \"msg-123\",\n threadId: \"thread-456\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Here is your component\" }],\n createdAt: \"2024-01-01T00:00:00Z\",\n componentState: {},\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello\" },\n componentState: {},\n message: \"\",\n },\n } as unknown as TamboAI.Beta.Threads.ThreadMessage;\n\n const baseRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" }, // JSON Schema\n contextTools: [],\n },\n };\n\n describe(\"component lookup\", () => {\n it(\"throws error when component has no componentName\", () => {\n const messageWithoutComponentName = {\n ...baseMessage,\n component: {\n componentName: \"\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithoutComponentName, baseRegistry),\n ).toThrow(\"Component not found\");\n });\n\n it(\"throws error when component is null\", () => {\n const messageWithNullComponent = {\n ...baseMessage,\n component: null as any,\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithNullComponent, baseRegistry),\n ).toThrow();\n });\n\n it(\"throws error when componentName not in registry\", () => {\n const messageWithUnknownComponent = {\n ...baseMessage,\n component: {\n componentName: \"UnknownComponent\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithUnknownComponent, baseRegistry),\n ).toThrow(\n \"Tambo tried to use Component UnknownComponent, but it was not found\",\n );\n });\n\n it(\"successfully finds and renders registered component\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.component?.componentName).toBe(\"TestComponent\");\n expect(result.renderedComponent).toBeDefined();\n });\n });\n\n describe(\"props handling\", () => {\n it(\"passes props to component from message\", () => {\n const messageWithProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Test Title\", count: 42 },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(messageWithProps, baseRegistry);\n\n expect(result.component?.props).toEqual({\n title: \"Test Title\",\n count: 42,\n });\n });\n\n it(\"handles empty props object\", () => {\n const messageWithEmptyProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithEmptyProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({});\n });\n\n it(\"handles nested object props\", () => {\n const messageWithNestedProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: {\n title: \"Nested\",\n config: { nested: { deeply: { value: 123 } } },\n },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithNestedProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Nested\",\n config: { nested: { deeply: { value: 123 } } },\n });\n });\n\n it(\"handles array props\", () => {\n const messageWithArrayProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Array Test\", items: [1, 2, 3] },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithArrayProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Array Test\",\n items: [1, 2, 3],\n });\n });\n });\n\n describe(\"Standard Schema validation\", () => {\n it(\"validates props through Standard Schema when present\", () => {\n const mockValidate = jest.fn((data) => ({\n ...data,\n validated: true,\n }));\n\n const registryWithStandardSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: createMockStandardSchema(mockValidate),\n contextTools: [],\n },\n };\n\n const result = renderComponentIntoMessage(\n baseMessage,\n registryWithStandardSchema,\n );\n\n expect(mockValidate).toHaveBeenCalled();\n // Standard Schema validate returns { value: T }, we extract the value\n expect(result.component?.props).toEqual({\n title: \"Hello\",\n validated: true,\n });\n });\n\n it(\"throws error when validation returns issues\", () => {\n const registryWithFailingSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: () => ({\n issues: [{ message: \"title is required\", path: [\"title\"] }],\n }),\n },\n },\n contextTools: [],\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(baseMessage, registryWithFailingSchema),\n ).toThrow(\"Component props validation failed: title is required\");\n });\n\n it(\"throws error when validation returns async promise\", () => {\n const registryWithAsyncSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: async () => await Promise.resolve({ value: {} }),\n },\n },\n contextTools: [],\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(baseMessage, registryWithAsyncSchema),\n ).toThrow(\"Async schema validation is not supported for component props\");\n });\n\n it(\"uses raw props when props is JSON Schema (not Standard Schema)\", () => {\n const jsonSchemaRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n contextTools: [],\n },\n };\n\n const result = renderComponentIntoMessage(\n baseMessage,\n jsonSchemaRegistry,\n );\n\n // Should pass through without validation\n expect(result.component?.props).toEqual({ title: \"Hello\" });\n });\n });\n\n describe(\"message structure\", () => {\n it(\"preserves original message properties\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.id).toBe(\"msg-123\");\n expect(result.threadId).toBe(\"thread-456\");\n expect(result.role).toBe(\"assistant\");\n expect(result.content).toEqual([\n { type: \"text\", text: \"Here is your component\" },\n ]);\n expect(result.createdAt).toBe(\"2024-01-01T00:00:00Z\");\n });\n\n it(\"includes renderedComponent in result\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.renderedComponent).toBeDefined();\n expect(React.isValidElement(result.renderedComponent)).toBe(true);\n });\n\n it(\"wraps component with TamboMessageProvider\", () => {\n renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(wrapWithTamboMessageProviderSpy).toHaveBeenCalled();\n // Check that the message passed to the wrapper has the correct structure\n const callArgs = wrapWithTamboMessageProviderSpy.mock.calls[0];\n expect(callArgs[1].id).toBe(\"msg-123\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"handles special characters in props\", () => {\n const messageWithSpecialChars = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello <script>alert('xss')</script>\" },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithSpecialChars,\n baseRegistry,\n );\n\n expect(result.component?.props.title).toBe(\n \"Hello <script>alert('xss')</script>\",\n );\n });\n\n it(\"handles unicode in props\", () => {\n const messageWithUnicode = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello \\u4e16\\u754c\" }, // \"Hello 世界\"\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithUnicode,\n baseRegistry,\n );\n\n expect(result.component?.props.title).toBe(\"Hello \\u4e16\\u754c\");\n });\n\n it(\"handles null values in props\", () => {\n const messageWithNullProp = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Test\", nullValue: null },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithNullProp,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Test\",\n nullValue: null,\n });\n });\n });\n});\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ */
4
+ /**
5
+ * Checks whether a value is a Promise/thenable.
6
+ * @returns True if the value has a callable `then()` function.
7
+ */
8
+ export declare function isPromise(value: unknown): value is Promise<unknown>;
9
+ //# sourceMappingURL=is-promise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-promise.d.ts","sourceRoot":"","sources":["../../src/util/is-promise.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAUnE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPromise = isPromise;
4
+ /**
5
+ *
6
+ */
7
+ /**
8
+ * Checks whether a value is a Promise/thenable.
9
+ * @returns True if the value has a callable `then()` function.
10
+ */
11
+ function isPromise(value) {
12
+ if (value === null) {
13
+ return false;
14
+ }
15
+ if (typeof value !== "object" && typeof value !== "function") {
16
+ return false;
17
+ }
18
+ return typeof value.then === "function";
19
+ }
20
+ //# sourceMappingURL=is-promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-promise.js","sourceRoot":"","sources":["../../src/util/is-promise.ts"],"names":[],"mappings":";;AAOA,8BAUC;AAjBD;;GAEG;AACH;;;GAGG;AACH,SAAgB,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAQ,KAAqC,CAAC,IAAI,KAAK,UAAU,CAAC;AAC3E,CAAC","sourcesContent":["/**\n *\n */\n/**\n * Checks whether a value is a Promise/thenable.\n * @returns True if the value has a callable `then()` function.\n */\nexport function isPromise(value: unknown): value is Promise<unknown> {\n if (value === null) {\n return false;\n }\n\n if (typeof value !== \"object\" && typeof value !== \"function\") {\n return false;\n }\n\n return typeof (value as { readonly then?: unknown }).then === \"function\";\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=is-promise.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-promise.test.d.ts","sourceRoot":"","sources":["../../src/util/is-promise.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const is_promise_1 = require("../util/is-promise");
4
+ describe("isPromise", () => {
5
+ it("should return true for real Promise instances", () => {
6
+ expect((0, is_promise_1.isPromise)(Promise.resolve(1))).toBe(true);
7
+ expect((0, is_promise_1.isPromise)(new Promise(() => { }))).toBe(true);
8
+ });
9
+ it("should return true for custom thenables", () => {
10
+ const thenable = {
11
+ then: () => { },
12
+ };
13
+ expect((0, is_promise_1.isPromise)(thenable)).toBe(true);
14
+ });
15
+ it("should return true for function with a then method", () => {
16
+ const fn = () => { };
17
+ fn.then = () => { };
18
+ expect((0, is_promise_1.isPromise)(fn)).toBe(true);
19
+ });
20
+ it("should return false for null", () => {
21
+ expect((0, is_promise_1.isPromise)(null)).toBe(false);
22
+ });
23
+ it("should return false for primitive values", () => {
24
+ expect((0, is_promise_1.isPromise)(0)).toBe(false);
25
+ expect((0, is_promise_1.isPromise)("text")).toBe(false);
26
+ expect((0, is_promise_1.isPromise)(true)).toBe(false);
27
+ expect((0, is_promise_1.isPromise)(undefined)).toBe(false);
28
+ expect((0, is_promise_1.isPromise)(Symbol("sym"))).toBe(false);
29
+ expect((0, is_promise_1.isPromise)(10n)).toBe(false);
30
+ });
31
+ it("should return false for object without then method", () => {
32
+ expect((0, is_promise_1.isPromise)({})).toBe(false);
33
+ expect((0, is_promise_1.isPromise)({ status: "active" })).toBe(false);
34
+ });
35
+ it("should return false when then exists but is not a function", () => {
36
+ expect((0, is_promise_1.isPromise)({ then: 123 })).toBe(false);
37
+ expect((0, is_promise_1.isPromise)({ then: "not-a-function" })).toBe(false);
38
+ });
39
+ it("should handle Promise-like object created via Promise.resolve", () => {
40
+ const value = Promise.resolve("ok");
41
+ expect((0, is_promise_1.isPromise)(value)).toBe(true);
42
+ });
43
+ it("should not throw for unexpected input types", () => {
44
+ expect(() => (0, is_promise_1.isPromise)(Object.create(null))).not.toThrow();
45
+ expect((0, is_promise_1.isPromise)(Object.create(null))).toBe(false);
46
+ });
47
+ });
48
+ //# sourceMappingURL=is-promise.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-promise.test.js","sourceRoot":"","sources":["../../src/util/is-promise.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPromise } from \"../util/is-promise\";\n\ndescribe(\"isPromise\", () => {\n it(\"should return true for real Promise instances\", () => {\n expect(isPromise(Promise.resolve(1))).toBe(true);\n expect(isPromise(new Promise(() => {}))).toBe(true);\n });\n\n it(\"should return true for custom thenables\", () => {\n const thenable = {\n then: () => {},\n };\n\n expect(isPromise(thenable)).toBe(true);\n });\n\n it(\"should return true for function with a then method\", () => {\n const fn = () => {};\n fn.then = () => {};\n\n expect(isPromise(fn)).toBe(true);\n });\n\n it(\"should return false for null\", () => {\n expect(isPromise(null)).toBe(false);\n });\n\n it(\"should return false for primitive values\", () => {\n expect(isPromise(0)).toBe(false);\n expect(isPromise(\"text\")).toBe(false);\n expect(isPromise(true)).toBe(false);\n expect(isPromise(undefined)).toBe(false);\n expect(isPromise(Symbol(\"sym\"))).toBe(false);\n expect(isPromise(10n)).toBe(false);\n });\n\n it(\"should return false for object without then method\", () => {\n expect(isPromise({})).toBe(false);\n expect(isPromise({ status: \"active\" })).toBe(false);\n });\n\n it(\"should return false when then exists but is not a function\", () => {\n expect(isPromise({ then: 123 })).toBe(false);\n expect(isPromise({ then: \"not-a-function\" })).toBe(false);\n });\n\n it(\"should handle Promise-like object created via Promise.resolve\", () => {\n const value = Promise.resolve(\"ok\");\n expect(isPromise(value)).toBe(true);\n });\n\n it(\"should not throw for unexpected input types\", () => {\n expect(() => isPromise(Object.create(null))).not.toThrow();\n expect(isPromise(Object.create(null))).toBe(false);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-utils.test.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.test.ts"],"names":[],"mappings":""}