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
@@ -1,4 +1,5 @@
1
1
  import { chalkStderr } from "chalk";
2
+ import { spawn, ChildProcess } from "child_process";
2
3
  import { OneoffCtx } from "../../bundler/context.js";
3
4
  import {
4
5
  logError,
@@ -17,7 +18,6 @@ import { PushOptions } from "./components.js";
17
18
  import {
18
19
  formatDuration,
19
20
  getCurrentTimeString,
20
- spawnAsync,
21
21
  waitForever,
22
22
  waitUntilCalled,
23
23
  } from "./utils/utils.js";
@@ -137,186 +137,235 @@ export async function watchAndPush(
137
137
  let numFailures = 0;
138
138
  let ran = false;
139
139
  let pushed = false;
140
+ let shellChild: ChildProcess | undefined;
141
+ let shellExited: Promise<void> | undefined;
142
+ let shellCleanupHandle: string | undefined;
140
143
  let tableNameTriggeringRetry;
141
144
  let shouldRetryOnDeploymentEnvVarChange;
142
145
  let isFirstPush = true; // Track if this is the first push in the session
143
146
 
144
- while (true) {
145
- const start = performance.now();
146
- tableNameTriggeringRetry = null;
147
- shouldRetryOnDeploymentEnvVarChange = false;
147
+ try {
148
+ while (true) {
149
+ const start = performance.now();
150
+ tableNameTriggeringRetry = null;
151
+ shouldRetryOnDeploymentEnvVarChange = false;
148
152
 
149
- const ctx = new WatchContext(
150
- cmdOptions.traceEvents,
151
- outerCtx.bigBrainAuth(),
152
- isFirstPush,
153
- );
154
- options.logManager?.beginDeploy();
155
- showSpinner("Preparing Convex functions...");
156
- try {
157
- await runPush(ctx, options);
158
- const end = performance.now();
159
- // NOTE: If `runPush` throws, `endDeploy` will not be called.
160
- // This allows you to see the output from the failed deploy without
161
- // logs getting in the way.
162
- options.logManager?.endDeploy();
163
- numFailures = 0;
164
- logFinishedStep(
165
- `${getCurrentTimeString()} Convex functions ready! (${formatDuration(
166
- end - start,
167
- )})`,
153
+ const ctx = new WatchContext(
154
+ cmdOptions.traceEvents,
155
+ outerCtx.bigBrainAuth(),
156
+ isFirstPush,
168
157
  );
158
+ options.logManager?.beginDeploy();
159
+ showSpinner("Preparing Convex functions...");
160
+ try {
161
+ await runPush(ctx, options);
162
+ const end = performance.now();
163
+ // NOTE: If `runPush` throws, `endDeploy` will not be called.
164
+ // This allows you to see the output from the failed deploy without
165
+ // logs getting in the way.
166
+ options.logManager?.endDeploy();
167
+ numFailures = 0;
168
+ logFinishedStep(
169
+ `${getCurrentTimeString()} Convex functions ready! (${formatDuration(
170
+ end - start,
171
+ )})`,
172
+ );
169
173
 
170
- // Sync AuthKit configuration if it has changed
171
- const { projectConfig } = await readProjectConfig(ctx);
172
- const authKitConfig = await getAuthKitConfig(ctx, projectConfig);
174
+ // Sync AuthKit configuration if it has changed
175
+ const { projectConfig } = await readProjectConfig(ctx);
176
+ const authKitConfig = await getAuthKitConfig(ctx, projectConfig);
173
177
 
174
- // Check if config has changed by comparing stringified versions
175
- const currentConfigString = authKitConfig
176
- ? JSON.stringify(authKitConfig)
177
- : undefined;
178
+ // Check if config has changed by comparing stringified versions
179
+ const currentConfigString = authKitConfig
180
+ ? JSON.stringify(authKitConfig)
181
+ : undefined;
178
182
 
179
- // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS
180
- if (
181
- !isFirstPush &&
182
- currentConfigString !== authKitCache.lastAppliedConfig
183
- ) {
184
- // Config has changed, sync it
185
- await syncAuthKitConfigAfterPush(ctx, projectConfig, {
186
- deploymentUrl: options.url,
187
- adminKey: options.adminKey,
188
- });
189
- }
183
+ // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS
184
+ if (
185
+ !isFirstPush &&
186
+ currentConfigString !== authKitCache.lastAppliedConfig
187
+ ) {
188
+ // Config has changed, sync it
189
+ await syncAuthKitConfigAfterPush(ctx, projectConfig, {
190
+ deploymentUrl: options.url,
191
+ adminKey: options.adminKey,
192
+ });
193
+ }
190
194
 
191
- // Always update cache after push (even if we skipped sync)
192
- authKitCache.lastAppliedConfig = currentConfigString;
193
- isFirstPush = false;
194
- if (cmdOptions.run !== undefined && !ran) {
195
- switch (cmdOptions.run.kind) {
196
- case "function":
197
- await runFunctionInDev(
198
- ctx,
199
- options,
200
- cmdOptions.run.name,
201
- cmdOptions.run.component,
202
- );
203
- break;
204
- case "shell":
205
- try {
206
- await spawnAsync(ctx, cmdOptions.run.command, [], {
207
- stdio: "inherit",
195
+ // Always update cache after push (even if we skipped sync)
196
+ authKitCache.lastAppliedConfig = currentConfigString;
197
+ isFirstPush = false;
198
+ if (cmdOptions.run !== undefined && !ran) {
199
+ switch (cmdOptions.run.kind) {
200
+ case "function":
201
+ await runFunctionInDev(
202
+ ctx,
203
+ options,
204
+ cmdOptions.run.name,
205
+ cmdOptions.run.component,
206
+ );
207
+ break;
208
+ case "shell": {
209
+ // Spawn the shell command as a long-running child process,
210
+ // piping stdin/stdout/stderr. It runs alongside dev and is
211
+ // waited on during clean exit or killed on signal exit.
212
+ const shellCommand = cmdOptions.run.command;
213
+ shellChild = spawn(shellCommand, [], {
208
214
  shell: true,
215
+ stdio: "inherit",
216
+ detached: true,
217
+ });
218
+ shellCleanupHandle = outerCtx.registerCleanup(async () => {
219
+ if (shellChild) {
220
+ const child = shellChild;
221
+ shellChild = undefined;
222
+ // Kill the entire process group so children of the shell
223
+ // are also killed.
224
+ if (child.pid !== undefined) {
225
+ try {
226
+ process.kill(-child.pid, "SIGTERM");
227
+ } catch {
228
+ // Process group may already be dead.
229
+ child.kill();
230
+ }
231
+ } else {
232
+ child.kill();
233
+ }
234
+ }
235
+ await shellExited;
236
+ });
237
+ shellExited = new Promise<void>((resolve) => {
238
+ shellChild!.on("error", (error) => {
239
+ logError(
240
+ `Failed to run command \`${shellCommand}\`: ${error.message}`,
241
+ );
242
+ shellChild = undefined;
243
+ resolve();
244
+ void outerCtx.flushAndExit(1);
245
+ });
246
+ shellChild!.on("exit", (code, signal) => {
247
+ shellChild = undefined;
248
+ resolve();
249
+ // If killed by a signal (e.g. from cleanup on shutdown),
250
+ // don't treat it as a failure — convex dev is already
251
+ // shutting down.
252
+ if (signal) {
253
+ return;
254
+ }
255
+ if (code !== null && code !== 0) {
256
+ logError(
257
+ `Command \`${shellCommand}\` exited with code ${code}`,
258
+ );
259
+ void outerCtx.flushAndExit(1);
260
+ }
261
+ });
209
262
  });
210
- } catch (e) {
211
- // `spawnAsync` throws an error like `{ status: 1, error: Error }`
212
- // when the command fails.
213
- const errorMessage =
214
- e === null || e === undefined
215
- ? null
216
- : (e as any).error instanceof Error
217
- ? ((e as any).error.message ?? null)
218
- : null;
219
- const printedMessage = `Failed to run command \`${cmdOptions.run.command}\`: ${errorMessage ?? "Unknown error"}`;
263
+ break;
264
+ }
265
+ default: {
266
+ cmdOptions.run satisfies never;
220
267
  // Don't return this since it'll bypass the `catch` below.
221
268
  await ctx.crash({
222
269
  exitCode: 1,
223
270
  errorType: "fatal",
224
- printedMessage,
271
+ printedMessage: `Unexpected arguments for --run`,
272
+ errForSentry: `Unexpected arguments for --run: ${JSON.stringify(
273
+ cmdOptions.run,
274
+ )}`,
225
275
  });
226
276
  }
227
- break;
228
- default: {
229
- cmdOptions.run satisfies never;
230
- // Don't return this since it'll bypass the `catch` below.
231
- await ctx.crash({
232
- exitCode: 1,
233
- errorType: "fatal",
234
- printedMessage: `Unexpected arguments for --run`,
235
- errForSentry: `Unexpected arguments for --run: ${JSON.stringify(
236
- cmdOptions.run,
237
- )}`,
238
- });
239
277
  }
278
+ ran = true;
240
279
  }
241
- ran = true;
242
- }
243
- pushed = true;
244
- } catch (e: any) {
245
- // Crash the app on unexpected errors.
246
- if (!(e instanceof Crash) || !e.errorType) {
247
- // eslint-disable-next-line no-restricted-syntax
248
- throw e;
249
- }
250
- if (e.errorType === "fatal") {
251
- break;
252
- }
253
- // Retry after an exponential backoff if we hit a transient error.
254
- if (e.errorType === "transient" || e.errorType === "already handled") {
255
- const delay = nextBackoff(numFailures);
256
- numFailures += 1;
257
- if (e.errorType === "transient") {
258
- logWarning(
259
- chalkStderr.yellow(
260
- `Failed due to network error, retrying in ${formatDuration(
261
- delay,
262
- )}...`,
263
- ),
264
- );
280
+ pushed = true;
281
+ } catch (e: any) {
282
+ // Crash the app on unexpected errors.
283
+ if (!(e instanceof Crash) || !e.errorType) {
284
+ // eslint-disable-next-line no-restricted-syntax
285
+ throw e;
286
+ }
287
+ if (e.errorType === "fatal") {
288
+ break;
289
+ }
290
+ // Retry after an exponential backoff if we hit a transient error.
291
+ if (e.errorType === "transient" || e.errorType === "already handled") {
292
+ const delay = nextBackoff(numFailures);
293
+ numFailures += 1;
294
+ if (e.errorType === "transient") {
295
+ logWarning(
296
+ chalkStderr.yellow(
297
+ `Failed due to network error, retrying in ${formatDuration(
298
+ delay,
299
+ )}...`,
300
+ ),
301
+ );
302
+ }
303
+ await new Promise((resolve) => setTimeout(resolve, delay));
304
+ continue;
265
305
  }
266
- await new Promise((resolve) => setTimeout(resolve, delay));
267
- continue;
268
- }
269
306
 
270
- // Fall through if we had a filesystem-based error.
271
- // TODO(sarah): Replace this with `logError`.
272
- // eslint-disable-next-line no-console
273
- console.assert(
274
- e.errorType === "invalid filesystem data" ||
275
- e.errorType === "invalid filesystem or env vars" ||
276
- e.errorType["invalid filesystem or db data"] !== undefined,
277
- );
278
- if (e.errorType === "invalid filesystem or env vars") {
279
- shouldRetryOnDeploymentEnvVarChange = true;
280
- } else if (
281
- e.errorType !== "invalid filesystem data" &&
282
- e.errorType["invalid filesystem or db data"] !== undefined
283
- ) {
284
- tableNameTriggeringRetry = e.errorType["invalid filesystem or db data"];
307
+ // Fall through if we had a filesystem-based error.
308
+ // TODO(sarah): Replace this with `logError`.
309
+ // eslint-disable-next-line no-console
310
+ console.assert(
311
+ e.errorType === "invalid filesystem data" ||
312
+ e.errorType === "invalid filesystem or env vars" ||
313
+ e.errorType["invalid filesystem or db data"] !== undefined,
314
+ );
315
+ if (e.errorType === "invalid filesystem or env vars") {
316
+ shouldRetryOnDeploymentEnvVarChange = true;
317
+ } else if (
318
+ e.errorType !== "invalid filesystem data" &&
319
+ e.errorType["invalid filesystem or db data"] !== undefined
320
+ ) {
321
+ tableNameTriggeringRetry =
322
+ e.errorType["invalid filesystem or db data"];
323
+ }
324
+ if (cmdOptions.once) {
325
+ await outerCtx.flushAndExit(1, e.errorType);
326
+ }
327
+ // Make sure that we don't spin if this push failed
328
+ // in any edge cases that didn't call `logFailure`
329
+ // before throwing.
330
+ stopSpinner();
285
331
  }
286
332
  if (cmdOptions.once) {
287
- await outerCtx.flushAndExit(1, e.errorType);
333
+ return;
334
+ }
335
+ if (pushed && cmdOptions.untilSuccess) {
336
+ return;
288
337
  }
289
- // Make sure that we don't spin if this push failed
290
- // in any edge cases that didn't call `logFailure`
291
- // before throwing.
292
- stopSpinner();
338
+ const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);
339
+ const tableWatch = getTableWatch(
340
+ ctx,
341
+ options,
342
+ tableNameTriggeringRetry?.tableName ?? null,
343
+ tableNameTriggeringRetry?.componentPath,
344
+ );
345
+ const envVarWatch = getDeplymentEnvVarWatch(
346
+ ctx,
347
+ options,
348
+ shouldRetryOnDeploymentEnvVarChange,
349
+ );
350
+ await Promise.race([
351
+ fileSystemWatch.watch(),
352
+ tableWatch.watch(),
353
+ envVarWatch.watch(),
354
+ ]);
355
+ fileSystemWatch.stop();
356
+ void tableWatch.stop();
357
+ void envVarWatch.stop();
293
358
  }
294
- if (cmdOptions.once) {
295
- return;
359
+ } finally {
360
+ // On clean exit (e.g. --once, --until-success), wait for the shell
361
+ // command to finish naturally. On signal exit (e.g. Ctrl+C), the
362
+ // registered cleanup handler will have already killed it.
363
+ if (shellExited) {
364
+ await shellExited;
296
365
  }
297
- if (pushed && cmdOptions.untilSuccess) {
298
- return;
366
+ if (shellCleanupHandle) {
367
+ outerCtx.removeCleanup(shellCleanupHandle);
299
368
  }
300
- const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);
301
- const tableWatch = getTableWatch(
302
- ctx,
303
- options,
304
- tableNameTriggeringRetry?.tableName ?? null,
305
- tableNameTriggeringRetry?.componentPath,
306
- );
307
- const envVarWatch = getDeplymentEnvVarWatch(
308
- ctx,
309
- options,
310
- shouldRetryOnDeploymentEnvVarChange,
311
- );
312
- await Promise.race([
313
- fileSystemWatch.watch(),
314
- tableWatch.watch(),
315
- envVarWatch.watch(),
316
- ]);
317
- fileSystemWatch.stop();
318
- void tableWatch.stop();
319
- void envVarWatch.stop();
320
369
  }
321
370
  }
322
371
 
@@ -373,18 +373,3 @@ export async function callUpdateEnvironmentVariables(
373
373
  return await logAndHandleFetchError(ctx, e);
374
374
  }
375
375
  }
376
-
377
- export async function fetchDeploymentCanonicalSiteUrl(
378
- ctx: Context,
379
- options: { deploymentUrl: string; adminKey: string },
380
- ): Promise<string> {
381
- const result = await envGetInDeployment(ctx, options, "CONVEX_SITE_URL");
382
- if (typeof result !== "string") {
383
- return await ctx.crash({
384
- exitCode: 1,
385
- errorType: "invalid filesystem or env vars",
386
- printedMessage: "Invalid process.env.CONVEX_SITE_URL",
387
- });
388
- }
389
- return result;
390
- }
@@ -0,0 +1,159 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import {
3
+ parseExpiration,
4
+ resolveExpiration,
5
+ validateExpiration,
6
+ } from "./expiration.js";
7
+
8
+ describe("parseExpiration", () => {
9
+ test('"none" returns kind "none"', () => {
10
+ expect(parseExpiration("none")).toEqual({ kind: "none" });
11
+ });
12
+
13
+ test("Unix seconds (< 1e12) converts to ms", () => {
14
+ const result = parseExpiration("1711828382");
15
+ expect(result).toEqual({ kind: "absolute", timestampMs: 1711828382000 });
16
+ });
17
+
18
+ test("Unix milliseconds (>= 1e12) used as-is", () => {
19
+ const result = parseExpiration("1711828382000");
20
+ expect(result).toEqual({ kind: "absolute", timestampMs: 1711828382000 });
21
+ });
22
+
23
+ test("UTC datetime", () => {
24
+ const result = parseExpiration("2026-03-30T18:53:02Z");
25
+ expect(result).toEqual({
26
+ kind: "absolute",
27
+ timestampMs: new Date("2026-03-30T18:53:02Z").getTime(),
28
+ });
29
+ });
30
+
31
+ test("rejects datetime without Z suffix", () => {
32
+ const result = parseExpiration("2026-03-30T18:53:02");
33
+ expect(result.kind).toBe("error");
34
+ });
35
+
36
+ test("rejects datetime with timezone offset", () => {
37
+ const result = parseExpiration("2026-03-30T18:53:02+01:00");
38
+ expect(result.kind).toBe("error");
39
+ });
40
+
41
+ test("rejects bare date without time", () => {
42
+ const result = parseExpiration("2026-03-30");
43
+ expect(result.kind).toBe("error");
44
+ });
45
+
46
+ test('relative: "in 1 hour"', () => {
47
+ expect(parseExpiration("in 1 hour")).toEqual({
48
+ kind: "relative",
49
+ amount: 1,
50
+ unit: "hour",
51
+ });
52
+ });
53
+
54
+ test('relative: "in 3 hours"', () => {
55
+ expect(parseExpiration("in 3 hours")).toEqual({
56
+ kind: "relative",
57
+ amount: 3,
58
+ unit: "hour",
59
+ });
60
+ });
61
+
62
+ test('relative: "in 7 days"', () => {
63
+ expect(parseExpiration("in 7 days")).toEqual({
64
+ kind: "relative",
65
+ amount: 7,
66
+ unit: "day",
67
+ });
68
+ });
69
+
70
+ test('relative: "in 45 minutes"', () => {
71
+ expect(parseExpiration("in 45 minutes")).toEqual({
72
+ kind: "relative",
73
+ amount: 45,
74
+ unit: "minute",
75
+ });
76
+ });
77
+
78
+ test("invalid input returns error", () => {
79
+ const result = parseExpiration("yesterday");
80
+ expect(result).toEqual({
81
+ kind: "error",
82
+ message: expect.stringContaining("Invalid expiration format"),
83
+ });
84
+ });
85
+
86
+ test("empty string returns error", () => {
87
+ const result = parseExpiration("");
88
+ expect(result).toEqual({
89
+ kind: "error",
90
+ message: expect.stringContaining("Invalid expiration format"),
91
+ });
92
+ });
93
+ });
94
+
95
+ describe("resolveExpiration", () => {
96
+ const now = 1700000000000;
97
+
98
+ test('"none" resolves to null', () => {
99
+ expect(resolveExpiration({ kind: "none" }, now)).toBeNull();
100
+ });
101
+
102
+ test("absolute resolves to timestampMs", () => {
103
+ expect(
104
+ resolveExpiration({ kind: "absolute", timestampMs: 1711828382000 }, now),
105
+ ).toBe(1711828382000);
106
+ });
107
+
108
+ test("relative hours", () => {
109
+ expect(
110
+ resolveExpiration({ kind: "relative", amount: 3, unit: "hour" }, now),
111
+ ).toBe(now + 3 * 60 * 60 * 1000);
112
+ });
113
+
114
+ test("relative days", () => {
115
+ expect(
116
+ resolveExpiration({ kind: "relative", amount: 7, unit: "day" }, now),
117
+ ).toBe(now + 7 * 24 * 60 * 60 * 1000);
118
+ });
119
+
120
+ test("relative minutes", () => {
121
+ expect(
122
+ resolveExpiration({ kind: "relative", amount: 45, unit: "minute" }, now),
123
+ ).toBe(now + 45 * 60 * 1000);
124
+ });
125
+ });
126
+
127
+ describe("validateExpiration", () => {
128
+ const now = 1700000000000;
129
+
130
+ test("past timestamp returns error", () => {
131
+ const result = validateExpiration(now - 1000, now);
132
+ expect(result).toEqual({
133
+ kind: "error",
134
+ message: expect.stringContaining("in the future"),
135
+ });
136
+ });
137
+
138
+ test("less than 30 minutes from now returns error", () => {
139
+ const result = validateExpiration(now + 10 * 60 * 1000, now);
140
+ expect(result).toEqual({
141
+ kind: "error",
142
+ message: expect.stringContaining("at least 30 minutes"),
143
+ });
144
+ });
145
+
146
+ test("more than 1 year from now returns error", () => {
147
+ const overOneYear = now + 366 * 24 * 60 * 60 * 1000;
148
+ const result = validateExpiration(overOneYear, now);
149
+ expect(result).toEqual({
150
+ kind: "error",
151
+ message: expect.stringContaining("at most 1 year"),
152
+ });
153
+ });
154
+
155
+ test("valid timestamp returns success", () => {
156
+ const twoHours = now + 2 * 60 * 60 * 1000;
157
+ expect(validateExpiration(twoHours, now)).toEqual({ kind: "success" });
158
+ });
159
+ });