convex 1.34.1 → 1.35.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 (512) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +8 -2
  3. package/dist/browser.bundle.js.map +3 -3
  4. package/dist/cjs/browser/index-node.js +3 -1
  5. package/dist/cjs/browser/index.js +3 -1
  6. package/dist/cjs/browser/index.js.map +2 -2
  7. package/dist/cjs/browser/query_options.js.map +2 -2
  8. package/dist/cjs/cli/aiFiles.js +31 -13
  9. package/dist/cjs/cli/aiFiles.js.map +3 -3
  10. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  11. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  12. package/dist/cjs/cli/configure.js +21 -24
  13. package/dist/cjs/cli/configure.js.map +2 -2
  14. package/dist/cjs/cli/deploy.js +7 -8
  15. package/dist/cjs/cli/deploy.js.map +2 -2
  16. package/dist/cjs/cli/deploymentCreate.js +225 -40
  17. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  18. package/dist/cjs/cli/deploymentSelect.js +14 -13
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +30 -11
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/docs.js +1 -1
  23. package/dist/cjs/cli/docs.js.map +2 -2
  24. package/dist/cjs/cli/init.js +1 -1
  25. package/dist/cjs/cli/init.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  27. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  28. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  29. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  31. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  32. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  33. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  37. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  39. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  40. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  41. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  42. package/dist/cjs/cli/lib/api.js +70 -7
  43. package/dist/cjs/cli/lib/api.js.map +2 -2
  44. package/dist/cjs/cli/lib/command.js +4 -5
  45. package/dist/cjs/cli/lib/command.js.map +2 -2
  46. package/dist/cjs/cli/lib/config.js +41 -4
  47. package/dist/cjs/cli/lib/config.js.map +3 -3
  48. package/dist/cjs/cli/lib/deploy2.js +9 -26
  49. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  51. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  52. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  53. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  55. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +162 -117
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/env.js +1 -13
  59. package/dist/cjs/cli/lib/env.js.map +2 -2
  60. package/dist/cjs/cli/lib/expiration.js +104 -0
  61. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  62. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  63. package/dist/cjs/cli/lib/init.js +4 -3
  64. package/dist/cjs/cli/lib/init.js.map +2 -2
  65. package/dist/cjs/cli/lib/insights.js +1 -1
  66. package/dist/cjs/cli/lib/insights.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  68. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  70. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  72. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  75. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  76. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  77. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  78. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  79. package/dist/cjs/cli/lib/updates.js +8 -9
  80. package/dist/cjs/cli/lib/updates.js.map +2 -2
  81. package/dist/cjs/cli/lib/usage.js +2 -1
  82. package/dist/cjs/cli/lib/usage.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  84. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  86. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  87. package/dist/cjs/index.js +1 -1
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/react/client.js +43 -6
  90. package/dist/cjs/react/client.js.map +2 -2
  91. package/dist/cjs/react/index.js +2 -0
  92. package/dist/cjs/react/index.js.map +2 -2
  93. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  94. package/dist/cjs/server/api.js.map +2 -2
  95. package/dist/cjs/server/components/definition.js.map +1 -1
  96. package/dist/cjs/server/components/index.js +40 -4
  97. package/dist/cjs/server/components/index.js.map +2 -2
  98. package/dist/cjs/server/data_model.js.map +1 -1
  99. package/dist/cjs/server/impl/meta_impl.js +78 -0
  100. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  101. package/dist/cjs/server/impl/registration_impl.js +16 -11
  102. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js.map +2 -2
  104. package/dist/cjs/server/meta.js +17 -0
  105. package/dist/cjs/server/meta.js.map +7 -0
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs-types/browser/index.d.ts +1 -0
  108. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  109. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  110. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  112. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  114. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  115. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  116. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  118. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  120. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  121. package/dist/cjs-types/cli/dev.d.ts +3 -1
  122. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  124. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  126. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  128. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  130. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  132. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  134. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  135. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  136. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  138. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  140. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  141. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  143. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  144. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  147. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  148. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  150. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  151. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  152. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  153. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  154. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  155. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  156. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  159. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  162. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  164. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  166. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  173. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  176. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  178. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  179. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  180. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  181. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  183. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/react/client.d.ts +54 -2
  188. package/dist/cjs-types/react/client.d.ts.map +1 -1
  189. package/dist/cjs-types/react/index.d.ts +7 -2
  190. package/dist/cjs-types/react/index.d.ts.map +1 -1
  191. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  192. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  193. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  194. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  195. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  196. package/dist/cjs-types/server/api.d.ts +5 -1
  197. package/dist/cjs-types/server/api.d.ts.map +1 -1
  198. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  199. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +5 -1
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/data_model.d.ts +2 -1
  203. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  205. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  206. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/index.d.ts +1 -0
  208. package/dist/cjs-types/server/index.d.ts.map +1 -1
  209. package/dist/cjs-types/server/meta.d.ts +72 -0
  210. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  211. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +1670 -1214
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/browser/index-node.js +1 -0
  215. package/dist/esm/browser/index.js +1 -0
  216. package/dist/esm/browser/index.js.map +2 -2
  217. package/dist/esm/browser/query_options.js.map +2 -2
  218. package/dist/esm/cli/aiFiles.js +33 -15
  219. package/dist/esm/cli/aiFiles.js.map +2 -2
  220. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  221. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  222. package/dist/esm/cli/configure.js +23 -26
  223. package/dist/esm/cli/configure.js.map +2 -2
  224. package/dist/esm/cli/deploy.js +11 -10
  225. package/dist/esm/cli/deploy.js.map +2 -2
  226. package/dist/esm/cli/deploymentCreate.js +238 -42
  227. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +13 -12
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +34 -13
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/docs.js +1 -1
  233. package/dist/esm/cli/docs.js.map +2 -2
  234. package/dist/esm/cli/init.js +2 -2
  235. package/dist/esm/cli/init.js.map +2 -2
  236. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  237. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  238. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  239. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  240. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  241. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  242. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  243. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  244. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  245. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  246. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  247. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  248. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  249. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  250. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  251. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  252. package/dist/esm/cli/lib/api.js +70 -7
  253. package/dist/esm/cli/lib/api.js.map +2 -2
  254. package/dist/esm/cli/lib/command.js +4 -5
  255. package/dist/esm/cli/lib/command.js.map +2 -2
  256. package/dist/esm/cli/lib/config.js +39 -3
  257. package/dist/esm/cli/lib/config.js.map +2 -2
  258. package/dist/esm/cli/lib/deploy2.js +13 -26
  259. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  260. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  261. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  262. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  264. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  265. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  266. package/dist/esm/cli/lib/dev.js +162 -118
  267. package/dist/esm/cli/lib/dev.js.map +2 -2
  268. package/dist/esm/cli/lib/env.js +0 -11
  269. package/dist/esm/cli/lib/env.js.map +2 -2
  270. package/dist/esm/cli/lib/expiration.js +80 -0
  271. package/dist/esm/cli/lib/expiration.js.map +7 -0
  272. package/dist/esm/cli/lib/init.js +4 -3
  273. package/dist/esm/cli/lib/init.js.map +2 -2
  274. package/dist/esm/cli/lib/insights.js +1 -1
  275. package/dist/esm/cli/lib/insights.js.map +2 -2
  276. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  277. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  278. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  279. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  280. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  287. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  288. package/dist/esm/cli/lib/updates.js +11 -9
  289. package/dist/esm/cli/lib/updates.js.map +2 -2
  290. package/dist/esm/cli/lib/usage.js +2 -1
  291. package/dist/esm/cli/lib/usage.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  293. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +45 -20
  295. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  296. package/dist/esm/index.js +1 -1
  297. package/dist/esm/index.js.map +1 -1
  298. package/dist/esm/react/client.js +43 -6
  299. package/dist/esm/react/client.js.map +2 -2
  300. package/dist/esm/react/index.js +1 -0
  301. package/dist/esm/react/index.js.map +2 -2
  302. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  303. package/dist/esm/server/api.js.map +2 -2
  304. package/dist/esm/server/components/index.js +40 -4
  305. package/dist/esm/server/components/index.js.map +2 -2
  306. package/dist/esm/server/impl/meta_impl.js +54 -0
  307. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  308. package/dist/esm/server/impl/registration_impl.js +20 -11
  309. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  310. package/dist/esm/server/index.js.map +2 -2
  311. package/dist/esm/server/meta.js +2 -0
  312. package/dist/esm/server/meta.js.map +7 -0
  313. package/dist/esm-types/browser/index.d.ts +1 -0
  314. package/dist/esm-types/browser/index.d.ts.map +1 -1
  315. package/dist/esm-types/browser/query_options.d.ts +12 -9
  316. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  317. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  318. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  319. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  320. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  321. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  322. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  323. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  324. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  325. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  326. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  327. package/dist/esm-types/cli/dev.d.ts +3 -1
  328. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  330. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  331. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  332. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  333. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  334. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  335. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  336. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  338. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  340. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  341. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  342. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  343. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  344. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  345. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  346. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  348. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  349. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  350. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  351. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  352. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  353. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  354. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  355. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  356. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  358. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  359. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  360. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  361. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  362. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  363. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  365. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  366. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  367. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  368. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  369. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  370. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  371. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  372. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  374. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  375. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  377. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  379. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  382. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  384. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  385. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  386. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  387. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  389. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  391. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  392. package/dist/esm-types/index.d.ts +1 -1
  393. package/dist/esm-types/react/client.d.ts +54 -2
  394. package/dist/esm-types/react/client.d.ts.map +1 -1
  395. package/dist/esm-types/react/index.d.ts +7 -2
  396. package/dist/esm-types/react/index.d.ts.map +1 -1
  397. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  398. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  399. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  400. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  401. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  402. package/dist/esm-types/server/api.d.ts +5 -1
  403. package/dist/esm-types/server/api.d.ts.map +1 -1
  404. package/dist/esm-types/server/components/definition.d.ts +1 -0
  405. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  406. package/dist/esm-types/server/components/index.d.ts +5 -1
  407. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  408. package/dist/esm-types/server/data_model.d.ts +2 -1
  409. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  410. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  411. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  412. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  413. package/dist/esm-types/server/index.d.ts +1 -0
  414. package/dist/esm-types/server/index.d.ts.map +1 -1
  415. package/dist/esm-types/server/meta.d.ts +72 -0
  416. package/dist/esm-types/server/meta.d.ts.map +1 -0
  417. package/dist/esm-types/server/registration.d.ts.map +1 -1
  418. package/dist/react.bundle.js +50 -7
  419. package/dist/react.bundle.js.map +3 -3
  420. package/package.json +11 -7
  421. package/schemas/convex.schema.json +15 -2
  422. package/src/browser/index.ts +3 -0
  423. package/src/browser/query_options.test.ts +0 -9
  424. package/src/browser/query_options.ts +36 -15
  425. package/src/cli/aiFiles.ts +44 -14
  426. package/src/cli/codegen_templates/readme.ts +14 -1
  427. package/src/cli/configure.test.ts +138 -0
  428. package/src/cli/configure.ts +48 -47
  429. package/src/cli/deploy.ts +12 -9
  430. package/src/cli/deploymentCreate.test.ts +349 -14
  431. package/src/cli/deploymentCreate.ts +268 -41
  432. package/src/cli/deploymentSelect.test.ts +136 -27
  433. package/src/cli/deploymentSelect.ts +50 -41
  434. package/src/cli/deploymentSelection.test.ts +343 -35
  435. package/src/cli/dev.ts +49 -14
  436. package/src/cli/docs.ts +1 -1
  437. package/src/cli/init.ts +2 -2
  438. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  439. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  440. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  441. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  442. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  443. package/src/cli/lib/aiFiles/index.ts +119 -125
  444. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  445. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  446. package/src/cli/lib/aiFiles/skills.ts +46 -16
  447. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  448. package/src/cli/lib/aiFiles/state.ts +82 -0
  449. package/src/cli/lib/aiFiles/status.ts +45 -39
  450. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  451. package/src/cli/lib/aiFiles/utils.ts +38 -10
  452. package/src/cli/lib/api.ts +88 -7
  453. package/src/cli/lib/command.ts +12 -7
  454. package/src/cli/lib/config.test.ts +184 -7
  455. package/src/cli/lib/config.ts +67 -7
  456. package/src/cli/lib/deploy2.ts +14 -27
  457. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  458. package/src/cli/lib/deploymentSelection.ts +59 -6
  459. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  460. package/src/cli/lib/deploymentSelector.ts +2 -0
  461. package/src/cli/lib/dev.ts +202 -153
  462. package/src/cli/lib/env.ts +0 -15
  463. package/src/cli/lib/expiration.test.ts +159 -0
  464. package/src/cli/lib/expiration.ts +124 -0
  465. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  466. package/src/cli/lib/init.ts +6 -2
  467. package/src/cli/lib/insights.ts +1 -1
  468. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  469. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  470. package/src/cli/lib/localDeployment/run.ts +1 -1
  471. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  472. package/src/cli/lib/localDeployment/utils.ts +12 -0
  473. package/src/cli/lib/mcp/tools/status.ts +1 -1
  474. package/src/cli/lib/updates.test.ts +102 -75
  475. package/src/cli/lib/updates.ts +14 -12
  476. package/src/cli/lib/usage.ts +3 -1
  477. package/src/cli/lib/utils/prompts.ts +2 -0
  478. package/src/cli/lib/utils/utils.test.ts +6 -6
  479. package/src/cli/lib/utils/utils.ts +66 -27
  480. package/src/index.ts +1 -1
  481. package/src/react/client.test.tsx +65 -0
  482. package/src/react/client.ts +129 -13
  483. package/src/react/index.ts +9 -1
  484. package/src/react/use_query_object_options.test.ts +50 -0
  485. package/src/react/use_query_result.test.ts +41 -0
  486. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  487. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  488. package/src/server/api.ts +5 -1
  489. package/src/server/components/definition.ts +3 -0
  490. package/src/server/components/index.ts +62 -5
  491. package/src/server/data_model.ts +2 -1
  492. package/src/server/impl/meta_impl.ts +74 -0
  493. package/src/server/impl/registration_impl.ts +21 -9
  494. package/src/server/index.ts +8 -0
  495. package/src/server/meta.ts +76 -0
  496. package/src/server/registration.ts +10 -0
  497. package/src/server/schema.test.ts +78 -1
  498. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  499. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  500. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  501. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  502. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  503. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  504. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  505. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  506. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  507. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  508. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  509. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  510. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  511. package/src/cli/lib/aiFiles/config.ts +0 -188
  512. package/src/values/.claude/settings.local.json +0 -10
@@ -3,6 +3,7 @@ import { Context } from "../../bundler/context.js";
3
3
  import { logWarning } from "../../bundler/log.js";
4
4
  import { teamDashboardUrl } from "./dashboard.js";
5
5
  import { fetchTeamAndProject } from "./api.js";
6
+ import { isAnonymousDeployment } from "./deployment.js";
6
7
  import { bigBrainAPI } from "./utils/utils.js";
7
8
 
8
9
  async function warn(
@@ -53,7 +54,8 @@ export async function usageStateWarning(
53
54
  auth === null ||
54
55
  auth.kind === "projectKey" ||
55
56
  auth.kind === "deploymentKey" ||
56
- process.env.CONVEX_AGENT_MODE === "anonymous"
57
+ process.env.CONVEX_AGENT_MODE === "anonymous" ||
58
+ isAnonymousDeployment(targetDeployment)
57
59
  ) {
58
60
  return;
59
61
  }
@@ -30,12 +30,14 @@ export const promptString = async (
30
30
  options: {
31
31
  message: string;
32
32
  default?: string;
33
+ validate?: (value: string) => boolean | string | Promise<string | boolean>;
33
34
  },
34
35
  ): Promise<string> => {
35
36
  if (process.stdin.isTTY) {
36
37
  return input({
37
38
  message: options.message,
38
39
  ...(options.default !== undefined ? { default: options.default } : {}),
40
+ ...(options.validate !== undefined ? { validate: options.validate } : {}),
39
41
  }).catch(handlePromptError(ctx));
40
42
  } else {
41
43
  return ctx.crash({
@@ -65,7 +65,7 @@ describe("bigBrainFetch", () => {
65
65
  const mockFetch = stubFetch();
66
66
  const ctx = makeContext(null);
67
67
 
68
- const fetch = await bigBrainFetch(ctx);
68
+ const fetch = bigBrainFetch(ctx);
69
69
  await fetch("https://api.convex.dev/api/test", { method: "GET" });
70
70
 
71
71
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -82,7 +82,7 @@ describe("bigBrainFetch", () => {
82
82
  accessToken: "test-token",
83
83
  });
84
84
 
85
- const fetch = await bigBrainFetch(ctx);
85
+ const fetch = bigBrainFetch(ctx);
86
86
  await fetch("https://api.convex.dev/api/test", { method: "GET" });
87
87
 
88
88
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -99,7 +99,7 @@ describe("bigBrainFetch", () => {
99
99
  accessToken: "original-token",
100
100
  });
101
101
 
102
- const fetch = await bigBrainFetch(ctx);
102
+ const fetch = bigBrainFetch(ctx);
103
103
  await fetch("https://api.convex.dev/api/test", {
104
104
  method: "POST",
105
105
  headers: {
@@ -124,7 +124,7 @@ describe("bigBrainFetch", () => {
124
124
  headers: { "X-Custom-Header": "custom-value" },
125
125
  });
126
126
 
127
- const fetch = await bigBrainFetch(ctx);
127
+ const fetch = bigBrainFetch(ctx);
128
128
  await fetch(request, undefined);
129
129
 
130
130
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -143,7 +143,7 @@ describe("bigBrainFetch", () => {
143
143
  headers: { "X-Custom-Header": "from-request" },
144
144
  });
145
145
 
146
- const fetch = await bigBrainFetch(ctx);
146
+ const fetch = bigBrainFetch(ctx);
147
147
  await fetch(request, {
148
148
  headers: { "X-Custom-Header": "from-options" },
149
149
  });
@@ -160,7 +160,7 @@ describe("bigBrainFetch", () => {
160
160
  method: "POST",
161
161
  });
162
162
 
163
- const fetch = await bigBrainFetch(ctx);
163
+ const fetch = bigBrainFetch(ctx);
164
164
  await fetch(request);
165
165
 
166
166
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -1,3 +1,4 @@
1
+ import { paths as PlatformDeploymentPaths } from "@convex-dev/platform/deploymentApi";
1
2
  import { paths as PlatformManagementPaths } from "@convex-dev/platform/managementApi";
2
3
  import { chalkStderr } from "chalk";
3
4
  import os from "os";
@@ -692,7 +693,7 @@ export function cacheDir() {
692
693
  *
693
694
  * This fetch() also has retries and throws if the response is not ok.
694
695
  */
695
- export async function bigBrainFetch(ctx: Context): Promise<typeof fetch> {
696
+ export function bigBrainFetch(ctx: Context): typeof fetch {
696
697
  const authHeader = ctx.bigBrainAuth()?.header;
697
698
  const bigBrainHeaders: Record<string, string> = authHeader
698
699
  ? {
@@ -758,26 +759,25 @@ export async function bigBrainAPI<T = any>({
758
759
  *
759
760
  * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.
760
761
  */
761
- function typedBigBrainClientFactory<T>(baseUrl: string) {
762
+ function typedApiClientFactory<T>(
763
+ baseUrl: string,
764
+ fetchBuilder: (ctx: Context) => typeof fetch,
765
+ ) {
762
766
  return (ctx: Context, options: { throw?: boolean } = {}) => {
763
767
  type Paths = T extends CliManagementPaths
764
768
  ? CliManagementPaths
765
769
  : T extends PlatformManagementPaths
766
770
  ? PlatformManagementPaths
767
- : never;
768
- const bigBrainClient = createClient<Paths>({
771
+ : T extends PlatformDeploymentPaths
772
+ ? PlatformDeploymentPaths
773
+ : never;
774
+ const client = createClient<Paths>({
769
775
  baseUrl,
770
- fetch: async (
771
- resource: Request,
772
- options?: RequestInit,
773
- ): Promise<Response> => {
774
- const fetch = await bigBrainFetch(ctx);
775
- return fetch(resource, options);
776
- },
776
+ fetch: fetchBuilder(ctx),
777
777
  });
778
778
 
779
779
  // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors
780
- return new Proxy(bigBrainClient, {
780
+ return new Proxy(client, {
781
781
  get(target, prop) {
782
782
  const originalMethod = target[prop as keyof typeof target];
783
783
 
@@ -810,13 +810,31 @@ function typedBigBrainClientFactory<T>(baseUrl: string) {
810
810
  };
811
811
  }
812
812
 
813
- export const typedBigBrainClient =
814
- typedBigBrainClientFactory<CliManagementPaths>(BIG_BRAIN_URL);
813
+ export const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(
814
+ BIG_BRAIN_URL,
815
+ bigBrainFetch,
816
+ );
815
817
  export const typedPlatformClient =
816
- typedBigBrainClientFactory<PlatformManagementPaths>(
818
+ typedApiClientFactory<PlatformManagementPaths>(
817
819
  PLATFORM_MANAGEMENT_API_URL,
820
+ bigBrainFetch,
818
821
  );
819
822
 
823
+ export function typedDeploymentClient(
824
+ ctx: Context,
825
+ args: { deploymentUrl: string; adminKey: string },
826
+ options: { throw?: boolean } = {},
827
+ ) {
828
+ return typedApiClientFactory<PlatformDeploymentPaths>(
829
+ `${args.deploymentUrl}/api/v1`,
830
+ (ctx) =>
831
+ deploymentFetch(ctx, {
832
+ deploymentUrl: args.deploymentUrl,
833
+ adminKey: args.adminKey,
834
+ }),
835
+ )(ctx, options);
836
+ }
837
+
820
838
  export async function bigBrainAPIMaybeThrows({
821
839
  ctx,
822
840
  method,
@@ -828,7 +846,7 @@ export async function bigBrainAPIMaybeThrows({
828
846
  path: string;
829
847
  data?: any;
830
848
  }): Promise<any> {
831
- const fetch = await bigBrainFetch(ctx);
849
+ const fetch = bigBrainFetch(ctx);
832
850
  const dataString =
833
851
  data === undefined
834
852
  ? method === "POST"
@@ -894,19 +912,40 @@ export function waitUntilCalled(): [Promise<unknown>, () => void] {
894
912
  return [waitPromise, () => onCalled(null)];
895
913
  }
896
914
 
897
- // We can eventually switch to something like `filesize` for i18n and
898
- // more robust formatting, but let's keep our CLI bundle small for now.
915
+ const BYTE_UNITS: [number, string][] = [
916
+ [1 << 30, "GiB"],
917
+ [1_000_000_000, "GB"],
918
+ [1 << 20, "MiB"],
919
+ [1_000_000, "MB"],
920
+ [1 << 10, "KiB"],
921
+ [1_000, "KB"],
922
+ ];
923
+
924
+ /**
925
+ * Format a byte count into a human-friendly string.
926
+ *
927
+ * Picks the unit (binary or decimal) that divides most cleanly.
928
+ * Shows one decimal place only when it divides exactly (e.g. "4.1 MiB").
929
+ * Falls back to raw bytes when no unit divides cleanly.
930
+ */
899
931
  export function formatSize(n: number): string {
900
- if (n < 1024) {
901
- return `${n} B`;
932
+ if (n === 0) {
933
+ return "0 bytes";
902
934
  }
903
- if (n < 1024 * 1024) {
904
- return `${(n / 1024).toFixed(1)} KB`;
905
- }
906
- if (n < 1024 * 1024 * 1024) {
907
- return `${(n / 1024 / 1024).toFixed(1)} MB`;
935
+ for (const [unitSize, unitName] of BYTE_UNITS) {
936
+ if (n < unitSize) {
937
+ continue;
938
+ }
939
+ if (n % unitSize === 0) {
940
+ return `${n / unitSize} ${unitName}`;
941
+ }
942
+ if ((n * 10) % unitSize === 0) {
943
+ const whole = Math.floor(n / unitSize);
944
+ const frac = Math.floor((n * 10) / unitSize) % 10;
945
+ return `${whole}.${frac} ${unitName}`;
946
+ }
908
947
  }
909
- return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
948
+ return `${n} bytes`;
910
949
  }
911
950
 
912
951
  export function formatDuration(ms: number): string {
@@ -1236,7 +1275,7 @@ export function deploymentFetch(
1236
1275
  adminKey: string;
1237
1276
  onError?: (err: any) => void;
1238
1277
  },
1239
- ): typeof throwingFetch {
1278
+ ): typeof fetch {
1240
1279
  const { deploymentUrl, adminKey, onError } = options;
1241
1280
  const onErrorWithAttempt = (err: any, attempt: number) => {
1242
1281
  onError?.(err);
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export const version = "1.34.1";
1
+ export const version = "1.35.0";
@@ -5,6 +5,7 @@ import { test, expect, describe, vi } from "vitest";
5
5
  import ws from "ws";
6
6
 
7
7
  import { ConvexReactClient, createMutation, useQuery } from "./client.js";
8
+ import { convexQueryOptions } from "../browser/query_options.js";
8
9
  import { ConvexProvider } from "./index.js";
9
10
  import React from "react";
10
11
  import { renderHook } from "@testing-library/react";
@@ -113,6 +114,46 @@ describe("useQuery", () => {
113
114
  expect(result.current).toStrictEqual(undefined);
114
115
  });
115
116
 
117
+ test("object form returns success result", () => {
118
+ const client = createClientWithQuery();
119
+ const wrapper = ({ children }: any) => (
120
+ <ConvexProvider client={client}>{children}</ConvexProvider>
121
+ );
122
+ const { result } = renderHook(
123
+ () =>
124
+ useQuery({
125
+ query: anyApi.myQuery.default,
126
+ args: {},
127
+ }),
128
+ { wrapper },
129
+ );
130
+ expect(result.current).toStrictEqual({
131
+ data: "queryResult",
132
+ error: undefined,
133
+ status: "success",
134
+ });
135
+ });
136
+
137
+ test("object form returns pending when skipped", () => {
138
+ const client = createClientWithQuery();
139
+ const wrapper = ({ children }: any) => (
140
+ <ConvexProvider client={client}>{children}</ConvexProvider>
141
+ );
142
+ const { result } = renderHook(
143
+ () =>
144
+ useQuery({
145
+ query: anyApi.myQuery.default,
146
+ args: "skip",
147
+ }),
148
+ { wrapper },
149
+ );
150
+ expect(result.current).toStrictEqual({
151
+ data: undefined,
152
+ error: undefined,
153
+ status: "pending",
154
+ });
155
+ });
156
+
116
157
  test("Optimistic update handlers can’t be async", () => {
117
158
  const client = testConvexReactClient();
118
159
  const mutation = createMutation(
@@ -192,3 +233,27 @@ describe("async query fetch", () => {
192
233
  expect(await queryResult).toStrictEqual("queryResult");
193
234
  });
194
235
  });
236
+
237
+ describe("prewarmQuery types", () => {
238
+ test("accepts QueryOptions shape", () => {
239
+ const client = testConvexReactClient();
240
+ const opts = convexQueryOptions({
241
+ query: makeFunctionReference<"query", { name: string }, string>(
242
+ "myQuery",
243
+ ),
244
+ args: { name: "hi" },
245
+ });
246
+ client.prewarmQuery(opts);
247
+ });
248
+
249
+ test("accepts extendSubscriptionFor on prewarmQuery", () => {
250
+ const client = testConvexReactClient();
251
+ client.prewarmQuery({
252
+ query: makeFunctionReference<"query", { name: string }, string>(
253
+ "myQuery",
254
+ ),
255
+ args: { name: "hi" },
256
+ extendSubscriptionFor: 10_000,
257
+ });
258
+ });
259
+ });
@@ -32,7 +32,7 @@ import {
32
32
  instantiateNoopLogger,
33
33
  Logger,
34
34
  } from "../browser/logging.js";
35
- import { ConvexQueryOptions } from "../browser/query_options.js";
35
+ import type { QueryOptions } from "../browser/query_options.js";
36
36
  import { LoadMoreOfPaginatedQuery } from "../browser/sync/pagination.js";
37
37
  import {
38
38
  PaginatedQueryClient,
@@ -537,9 +537,7 @@ export class ConvexReactClient {
537
537
  * an optional extendSubscriptionFor for how long to subscribe to the query.
538
538
  */
539
539
  prewarmQuery<Query extends FunctionReference<"query">>(
540
- queryOptions: ConvexQueryOptions<Query> & {
541
- extendSubscriptionFor?: number;
542
- },
540
+ queryOptions: QueryOptions<Query> & { extendSubscriptionFor?: number },
543
541
  ) {
544
542
  const extendSubscriptionFor =
545
543
  queryOptions.extendSubscriptionFor ?? DEFAULT_EXTEND_SUBSCRIPTION_FOR;
@@ -801,6 +799,34 @@ export type OptionalRestArgsOrSkip<FuncRef extends FunctionReference<any>> =
801
799
  ? [args?: EmptyObject | "skip"]
802
800
  : [args: FuncRef["_args"] | "skip"];
803
801
 
802
+ /**
803
+ * Result returned by object-form {@link useQuery}.
804
+ *
805
+ * @public
806
+ */
807
+ export type UseQueryResult<QueryResult> =
808
+ | {
809
+ data: QueryResult;
810
+ error: undefined;
811
+ status: "success";
812
+ }
813
+ | {
814
+ data: undefined;
815
+ error: Error;
816
+ status: "error";
817
+ }
818
+ | {
819
+ data: undefined;
820
+ error: undefined;
821
+ status: "pending";
822
+ };
823
+
824
+ type UseQueryOptions<Query extends FunctionReference<"query">> = {
825
+ query: Query;
826
+ args: FunctionArgs<Query> | "skip";
827
+ throwOnError?: boolean;
828
+ };
829
+
804
830
  /**
805
831
  * Load a reactive query within a React component.
806
832
  *
@@ -847,20 +873,82 @@ export type OptionalRestArgsOrSkip<FuncRef extends FunctionReference<any>> =
847
873
  export function useQuery<Query extends FunctionReference<"query">>(
848
874
  query: Query,
849
875
  ...args: OptionalRestArgsOrSkip<Query>
850
- ): Query["_returnType"] | undefined {
851
- const skip = args[0] === "skip";
852
- const argsObject = args[0] === "skip" ? {} : parseArgs(args[0]);
876
+ ): Query["_returnType"] | undefined;
877
+
878
+ /**
879
+ * Load a reactive query within a React component using an options object.
880
+ *
881
+ * This is an alternative form of {@link useQuery} that accepts a single
882
+ * {@link UseQueryOptions} object instead of positional arguments.
883
+ * Errors are returned in the result object unless `throwOnError` is set.
884
+ *
885
+ * @example
886
+ * ```tsx
887
+ * import { useQuery } from "convex/react";
888
+ * import { api } from "../convex/_generated/api";
889
+ *
890
+ * function TaskList() {
891
+ * const state = useQuery({ query: api.tasks.list, args: { completed: false } });
892
+ *
893
+ * if (state.status === "pending") return <div>Loading...</div>;
894
+ * if (state.status === "error") return <div>Error: {state.error.message}</div>;
895
+ * return state.data.map((task) => <div key={task._id}>{task.text}</div>);
896
+ * }
897
+ * ```
898
+ *
899
+ * @param options - Query options. Pass `args: "skip"` to disable the query.
900
+ * @returns the current query state as a {@link UseQueryResult} object.
901
+ *
902
+ * @see https://docs.convex.dev/client/react#fetching-data
903
+ * @public
904
+ */
905
+ export function useQuery<Query extends FunctionReference<"query">>(
906
+ options: UseQueryOptions<Query>,
907
+ ): UseQueryResult<Query["_returnType"]>;
853
908
 
854
- const queryReference =
855
- typeof query === "string"
856
- ? makeFunctionReference<"query", any, any>(query)
857
- : query;
909
+ export function useQuery<Query extends FunctionReference<"query">>(
910
+ queryOrOptions: Query | UseQueryOptions<Query>,
911
+ ...args: OptionalRestArgsOrSkip<Query>
912
+ ): Query["_returnType"] | undefined | UseQueryResult<Query["_returnType"]> {
913
+ const isObjectOptions =
914
+ typeof queryOrOptions === "object" &&
915
+ queryOrOptions !== null &&
916
+ "query" in queryOrOptions;
917
+ const throwOnError = isObjectOptions
918
+ ? (queryOrOptions.throwOnError ?? false)
919
+ : true;
920
+
921
+ let queryReference: Query | undefined;
922
+ let argsObject: Record<string, Value> = {};
923
+
924
+ if (isObjectOptions) {
925
+ const query = queryOrOptions.query;
926
+ queryReference =
927
+ typeof query === "string"
928
+ ? (makeFunctionReference<"query", any, any>(query) as Query)
929
+ : query;
930
+ if (queryOrOptions.args !== "skip") {
931
+ argsObject = parseArgs(queryOrOptions.args as Record<string, Value>);
932
+ }
933
+ } else {
934
+ const query = queryOrOptions;
935
+ queryReference =
936
+ typeof query === "string"
937
+ ? (makeFunctionReference<"query", any, any>(query) as Query)
938
+ : query;
939
+ argsObject = args[0] === "skip" ? {} : parseArgs(args[0] as Query["_args"]);
940
+ }
858
941
 
859
- const queryName = getFunctionName(queryReference);
942
+ const queryName = queryReference
943
+ ? getFunctionName(queryReference)
944
+ : undefined;
945
+ const skip =
946
+ (isObjectOptions && queryOrOptions.args === "skip") ||
947
+ (!isObjectOptions && args[0] === "skip");
860
948
 
861
949
  const queries = useMemo(
862
950
  () =>
863
- skip
951
+ skip || !queryReference
864
952
  ? ({} as RequestForQueries)
865
953
  : { query: { query: queryReference, args: argsObject } },
866
954
  // Stringify args so args that are semantically the same don't trigger a
@@ -871,6 +959,34 @@ export function useQuery<Query extends FunctionReference<"query">>(
871
959
 
872
960
  const results = useQueries(queries);
873
961
  const result = results["query"];
962
+
963
+ if (isObjectOptions) {
964
+ if (result instanceof Error) {
965
+ if (throwOnError) {
966
+ throw result;
967
+ }
968
+ return {
969
+ data: undefined,
970
+ error: result,
971
+ status: "error",
972
+ };
973
+ }
974
+
975
+ if (result === undefined) {
976
+ return {
977
+ data: undefined,
978
+ error: undefined,
979
+ status: "pending",
980
+ };
981
+ }
982
+
983
+ return {
984
+ data: result,
985
+ error: undefined,
986
+ status: "success",
987
+ };
988
+ }
989
+
874
990
  if (result instanceof Error) {
875
991
  throw result;
876
992
  }
@@ -53,7 +53,11 @@
53
53
  * import { api } from "../convex/_generated/api";
54
54
  *
55
55
  * function App() {
56
- * const counter = useQuery(api.getCounter.default);
56
+ * const counter = useQuery({
57
+ * query: api.getCounter.default,
58
+ * args: {},
59
+ * throwOnError: true,
60
+ * }).data;
57
61
  * const increment = useMutation(api.incrementCounter.default);
58
62
  * // Your component here!
59
63
  * }
@@ -78,6 +82,7 @@ export {
78
82
  type MutationOptions,
79
83
  type ConvexReactClientOptions,
80
84
  type OptionalRestArgsOrSkip,
85
+ type UseQueryResult,
81
86
  ConvexReactClient,
82
87
  useConvex,
83
88
  ConvexProvider,
@@ -86,3 +91,6 @@ export {
86
91
  useAction,
87
92
  useConvexConnectionState,
88
93
  } from "./client.js";
94
+ /** @internal */
95
+ export { convexQueryOptions } from "../browser/query_options.js";
96
+ export type { QueryOptions } from "../browser/query_options.js";
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @vitest-environment custom-vitest-environment.ts
3
+ */
4
+
5
+ /* eslint-disable @typescript-eslint/no-unused-vars */
6
+ import { test, describe } from "vitest";
7
+ import { anyApi } from "../server/api.js";
8
+
9
+ import type { ApiFromModules, QueryBuilder } from "../server/index.js";
10
+ import { useQuery as useQueryReal } from "./client.js";
11
+
12
+ const useQuery = (() => {}) as unknown as typeof useQueryReal;
13
+ const query: QueryBuilder<any, "public"> = (() => {}) as any;
14
+
15
+ const module = {
16
+ noArgs: query(() => "result"),
17
+ args: query((_ctx, { _arg }: { _arg: string }) => "result"),
18
+ };
19
+ type API = ApiFromModules<{ module: typeof module }>;
20
+ const api = anyApi as unknown as API;
21
+
22
+ describe("useQuery object options", () => {
23
+ test("supports object options and skip sentinel", () => {
24
+ useQuery({
25
+ query: api.module.noArgs,
26
+ args: {},
27
+ });
28
+
29
+ useQuery({
30
+ query: api.module.args,
31
+ args: { _arg: "asdf" },
32
+ });
33
+
34
+ const _arg: string | undefined = undefined;
35
+ useQuery({
36
+ query: api.module.args,
37
+ args: _arg ? { _arg } : "skip",
38
+ });
39
+
40
+ useQuery({
41
+ query: api.module.args,
42
+ args: { _arg: "asdf" },
43
+ });
44
+
45
+ useQuery({
46
+ query: api.module.noArgs,
47
+ args: "skip",
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @vitest-environment custom-vitest-environment.ts
3
+ */
4
+
5
+ /* eslint-disable @typescript-eslint/no-unused-vars */
6
+ import { test, describe } from "vitest";
7
+ import { anyApi } from "../server/api.js";
8
+
9
+ import type { ApiFromModules, QueryBuilder } from "../server/index.js";
10
+ import { useQuery as useQueryReal } from "./client.js";
11
+
12
+ const useQuery = (() => {}) as unknown as typeof useQueryReal;
13
+ const query: QueryBuilder<any, "public"> = (() => {}) as any;
14
+
15
+ const module = {
16
+ noArgs: query(() => "result"),
17
+ args: query((_ctx, { _arg }: { _arg: string }) => "result"),
18
+ };
19
+ type API = ApiFromModules<{ module: typeof module }>;
20
+ const api = anyApi as unknown as API;
21
+
22
+ describe("useQuery object-form result types", () => {
23
+ test("supports object-form result usage", () => {
24
+ useQuery({
25
+ query: api.module.args,
26
+ args: { _arg: "asdf" },
27
+ });
28
+
29
+ useQuery({
30
+ query: api.module.args,
31
+ args: { _arg: "asdf" },
32
+ throwOnError: true,
33
+ });
34
+
35
+ const _arg: string | undefined = undefined;
36
+ useQuery({
37
+ query: api.module.args,
38
+ args: _arg ? { _arg } : "skip",
39
+ });
40
+ });
41
+ });
@@ -5,7 +5,7 @@ import { test } from "vitest";
5
5
  import React from "react";
6
6
  import { ConvexProviderWithClerk } from "./ConvexProviderWithClerk.js";
7
7
  import { ConvexReactClient } from "../react/index.js";
8
- import { useAuth } from "@clerk/clerk-react";
8
+ import { useAuth } from "@clerk/react";
9
9
 
10
10
  test("Helpers are valid children", () => {
11
11
  const convex = new ConvexReactClient("https://localhost:3001");
@@ -30,7 +30,7 @@ type UseAuth = () => {
30
30
  * authenticated with Clerk.
31
31
  *
32
32
  * It must be wrapped by a configured `ClerkProvider`, from
33
- * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or
33
+ * `@clerk/react`, `@clerk/clerk-expo`, `@clerk/nextjs` or
34
34
  * another React-based Clerk client library and have the corresponding
35
35
  * `useAuth` hook passed in.
36
36
  *
package/src/server/api.ts CHANGED
@@ -39,7 +39,11 @@ export type FunctionType = "query" | "mutation" | "action";
39
39
  * Function references can be used to invoke functions from the client. For
40
40
  * example, in React you can pass references to the {@link react.useQuery} hook:
41
41
  * ```js
42
- * const result = useQuery(api.myModule.myFunction);
42
+ * const result = useQuery({
43
+ * query: api.myModule.myFunction,
44
+ * args: {},
45
+ * throwOnError: true,
46
+ * }).data;
43
47
  * ```
44
48
  *
45
49
  * @typeParam Type - The type of the function ("query", "mutation", or "action").
@@ -45,6 +45,9 @@ export type ComponentDefinitionAnalysis = {
45
45
  };
46
46
  export type AppDefinitionAnalysis = {
47
47
  definitionType: AppDefinitionType;
48
+ // Top-level field (not inside definitionType) to match Rust's
49
+ // SerializedComponentDefinitionMetadata.http_prefix field.
50
+ httpPrefix?: string;
48
51
  childComponents: ComponentInstantiation[];
49
52
  httpMounts: Record<string, HttpMount>;
50
53
  exports: ComponentExport;