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,23 +3,25 @@ import path from "path";
3
3
  import { logMessage } from "../../bundler/log.js";
4
4
  import { readProjectConfig } from "./config.js";
5
5
  import { functionsDir } from "./utils/utils.js";
6
- import { checkAiFilesStaleness } from "./aiFiles/index.js";
6
+ import {
7
+ checkAiFilesStalenessAndLog,
8
+ isAiFilesDisabled
9
+ } from "./aiFiles/index.js";
7
10
  import { getVersion } from "./versionApi.js";
8
- export async function checkVersion(ctx) {
11
+ export async function checkVersionAndAiFilesStaleness(ctx) {
9
12
  const version = await getVersion();
10
- if (version.kind === "error") {
11
- return;
12
- }
13
- if (version.data.message) {
14
- logMessage(version.data.message);
15
- }
13
+ if (version.kind === "error") return;
14
+ if (version.data.message) logMessage(version.data.message);
16
15
  try {
17
16
  const { configPath, projectConfig } = await readProjectConfig(ctx);
17
+ const aiFilesConfig = projectConfig.aiFiles;
18
+ if (isAiFilesDisabled(aiFilesConfig)) return;
18
19
  const convexDir = path.resolve(functionsDir(configPath, projectConfig));
19
20
  const projectDir = path.resolve(path.dirname(configPath));
20
- await checkAiFilesStaleness({
21
+ await checkAiFilesStalenessAndLog({
21
22
  canonicalGuidelinesHash: version.data.guidelinesHash,
22
23
  canonicalAgentSkillsSha: version.data.agentSkillsSha,
24
+ aiFilesConfig,
23
25
  projectDir,
24
26
  convexDir
25
27
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/updates.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { checkAiFilesStaleness } from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Check the version of the `convex` NPM package and nag if Convex AI files\n * are out of date.\n */\nexport async function checkVersion(ctx: Context) {\n const version = await getVersion();\n\n if (version.kind === \"error\") {\n return;\n }\n\n if (version.data.message) {\n logMessage(version.data.message);\n }\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStaleness({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
5
- "mappings": ";AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAE3B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAM3B,sBAAsB,aAAa,KAAc;AAC/C,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,QAAQ,SAAS,SAAS;AAC5B;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS;AACxB,eAAW,QAAQ,KAAK,OAAO;AAAA,EACjC;AAEA,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,UAAM,YAAY,KAAK,QAAQ,aAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,UAAU,CAAC;AACxD,UAAM,sBAAsB;AAAA,MAC1B,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport {\n checkAiFilesStalenessAndLog,\n isAiFilesDisabled,\n} from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Fetch the latest version data, log any server nag message, and warn if\n * Convex AI files are out of date. Both checks share the one getVersion()\n * round-trip.\n */\nexport async function checkVersionAndAiFilesStaleness(ctx: Context) {\n const version = await getVersion();\n if (version.kind === \"error\") return;\n\n if (version.data.message) logMessage(version.data.message);\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const aiFilesConfig = projectConfig.aiFiles;\n if (isAiFilesDisabled(aiFilesConfig)) return;\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStalenessAndLog({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n aiFilesConfig,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
5
+ "mappings": ";AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAE3B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAO3B,sBAAsB,gCAAgC,KAAc;AAClE,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,QAAQ,SAAS,QAAS;AAE9B,MAAI,QAAQ,KAAK,QAAS,YAAW,QAAQ,KAAK,OAAO;AAEzD,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,UAAM,gBAAgB,cAAc;AACpC,QAAI,kBAAkB,aAAa,EAAG;AACtC,UAAM,YAAY,KAAK,QAAQ,aAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,UAAU,CAAC;AACxD,UAAM,4BAA4B;AAAA,MAChC,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { chalkStderr } from "chalk";
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
  async function warn(ctx, options) {
8
9
  const { title, subtitle, teamSlug } = options;
@@ -30,7 +31,7 @@ async function teamSpendingLimitsState(ctx, teamId) {
30
31
  }
31
32
  export async function usageStateWarning(ctx, targetDeployment) {
32
33
  const auth = ctx.bigBrainAuth();
33
- if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous") {
34
+ if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous" || isAnonymousDeployment(targetDeployment)) {
34
35
  return;
35
36
  }
36
37
  const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/usage.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\"\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
5
- "mappings": ";AAAA,SAAS,mBAAmB;AAE5B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,aAAW,YAAY,KAAK,OAAO,KAAK,CAAC;AACzC,aAAW,YAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,YAAY,OAAO,SAAS,iBAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,MAAM,YAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,MAAM,YAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,sBAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,aAClC;AACA;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,oBAAoB,KAAK,gBAAgB;AAExE,QAAM,CAAC,YAAY,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,eAAe,KAAK,MAAM;AAAA,IAC1B,wBAAwB,KAAK,MAAM;AAAA,EACrC,CAAC;AACD,MAAI,wBAAwB,YAAY;AACtC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,eAAe;AACvC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,UAAU;AAClC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { isAnonymousDeployment } from \"./deployment.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n isAnonymousDeployment(targetDeployment)\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,mBAAmB;AAE5B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,aAAW,YAAY,KAAK,OAAO,KAAK,CAAC;AACzC,aAAW,YAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,YAAY,OAAO,SAAS,iBAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,MAAM,YAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,MAAM,YAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,sBAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,eAClC,sBAAsB,gBAAgB,GACtC;AACA;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,oBAAoB,KAAK,gBAAgB;AAExE,QAAM,CAAC,YAAY,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,eAAe,KAAK,MAAM;AAAA,IAC1B,wBAAwB,KAAK,MAAM;AAAA,EACrC,CAAC;AACD,MAAI,wBAAwB,YAAY;AACtC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,eAAe;AACvC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,UAAU;AAClC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -21,7 +21,8 @@ export const promptString = async (ctx, options) => {
21
21
  if (process.stdin.isTTY) {
22
22
  return input({
23
23
  message: options.message,
24
- ...options.default !== void 0 ? { default: options.default } : {}
24
+ ...options.default !== void 0 ? { default: options.default } : {},
25
+ ...options.validate !== void 0 ? { validate: options.validate } : {}
25
26
  }).catch(handlePromptError(ctx));
26
27
  } else {
27
28
  return ctx.crash({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/utils/prompts.ts"],
4
- "sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n validate?: (value: string) => boolean | string | Promise<string | boolean>;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.validate !== undefined ? { validate: options.validate } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["input"]
7
7
  }
@@ -480,7 +480,7 @@ export function cacheDir() {
480
480
  }
481
481
  return path.join(os.homedir(), ".cache", name);
482
482
  }
483
- export async function bigBrainFetch(ctx) {
483
+ export function bigBrainFetch(ctx) {
484
484
  const authHeader = ctx.bigBrainAuth()?.header;
485
485
  const bigBrainHeaders = authHeader ? {
486
486
  Authorization: authHeader,
@@ -521,16 +521,13 @@ export async function bigBrainAPI({
521
521
  return await logAndHandleFetchError(ctx, err);
522
522
  }
523
523
  }
524
- function typedBigBrainClientFactory(baseUrl) {
524
+ function typedApiClientFactory(baseUrl, fetchBuilder) {
525
525
  return (ctx, options = {}) => {
526
- const bigBrainClient = createClient({
526
+ const client = createClient({
527
527
  baseUrl,
528
- fetch: async (resource, options2) => {
529
- const fetch2 = await bigBrainFetch(ctx);
530
- return fetch2(resource, options2);
531
- }
528
+ fetch: fetchBuilder(ctx)
532
529
  });
533
- return new Proxy(bigBrainClient, {
530
+ return new Proxy(client, {
534
531
  get(target, prop) {
535
532
  const originalMethod = target[prop];
536
533
  if (prop === "GET" || prop === "POST" || prop === "HEAD" || prop === "OPTIONS" || prop === "PUT" || prop === "DELETE" || prop === "PATCH" || prop === "TRACE") {
@@ -550,17 +547,30 @@ function typedBigBrainClientFactory(baseUrl) {
550
547
  });
551
548
  };
552
549
  }
553
- export const typedBigBrainClient = typedBigBrainClientFactory(BIG_BRAIN_URL);
554
- export const typedPlatformClient = typedBigBrainClientFactory(
555
- PLATFORM_MANAGEMENT_API_URL
550
+ export const typedBigBrainClient = typedApiClientFactory(
551
+ BIG_BRAIN_URL,
552
+ bigBrainFetch
553
+ );
554
+ export const typedPlatformClient = typedApiClientFactory(
555
+ PLATFORM_MANAGEMENT_API_URL,
556
+ bigBrainFetch
556
557
  );
558
+ export function typedDeploymentClient(ctx, args, options = {}) {
559
+ return typedApiClientFactory(
560
+ `${args.deploymentUrl}/api/v1`,
561
+ (ctx2) => deploymentFetch(ctx2, {
562
+ deploymentUrl: args.deploymentUrl,
563
+ adminKey: args.adminKey
564
+ })
565
+ )(ctx, options);
566
+ }
557
567
  export async function bigBrainAPIMaybeThrows({
558
568
  ctx,
559
569
  method,
560
570
  path: path2,
561
571
  data
562
572
  }) {
563
- const fetch2 = await bigBrainFetch(ctx);
573
+ const fetch2 = bigBrainFetch(ctx);
564
574
  const dataString = data === void 0 ? method === "POST" ? JSON.stringify({}) : void 0 : typeof data === "string" ? data : JSON.stringify(data);
565
575
  const res = await fetch2(new URL(path2, BIG_BRAIN_URL), {
566
576
  method,
@@ -596,17 +606,32 @@ export function waitUntilCalled() {
596
606
  const waitPromise = new Promise((resolve) => onCalled = resolve);
597
607
  return [waitPromise, () => onCalled(null)];
598
608
  }
609
+ const BYTE_UNITS = [
610
+ [1 << 30, "GiB"],
611
+ [1e9, "GB"],
612
+ [1 << 20, "MiB"],
613
+ [1e6, "MB"],
614
+ [1 << 10, "KiB"],
615
+ [1e3, "KB"]
616
+ ];
599
617
  export function formatSize(n) {
600
- if (n < 1024) {
601
- return `${n} B`;
602
- }
603
- if (n < 1024 * 1024) {
604
- return `${(n / 1024).toFixed(1)} KB`;
618
+ if (n === 0) {
619
+ return "0 bytes";
605
620
  }
606
- if (n < 1024 * 1024 * 1024) {
607
- return `${(n / 1024 / 1024).toFixed(1)} MB`;
621
+ for (const [unitSize, unitName] of BYTE_UNITS) {
622
+ if (n < unitSize) {
623
+ continue;
624
+ }
625
+ if (n % unitSize === 0) {
626
+ return `${n / unitSize} ${unitName}`;
627
+ }
628
+ if (n * 10 % unitSize === 0) {
629
+ const whole = Math.floor(n / unitSize);
630
+ const frac = Math.floor(n * 10 / unitSize) % 10;
631
+ return `${whole}.${frac} ${unitName}`;
632
+ }
608
633
  }
609
- return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
634
+ return `${n} bytes`;
610
635
  }
611
636
  export function formatDuration(ms) {
612
637
  const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/utils/utils.ts"],
4
- "sourcesContent": ["import { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n // from `--cloud or --local`\n forceDevDeployment,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n forceDevDeployment: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n forceDevDeployment: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (forceDevDeployment) return { devDeployment: forceDevDeployment };\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport function logNoDefaultRegionMessage(teamSlug: string) {\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`https://dashboard.convex.dev/t/${teamSlug}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<string> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n const nonDemoProjects = projects.filter((project) => !project.isDemo);\n if (nonDemoProjects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing non-demo projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n // Prompt the user to select project.\n switch (nonDemoProjects.length) {\n case 1: {\n const project = nonDemoProjects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return nonDemoProjects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: nonDemoProjects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport async function bigBrainFetch(ctx: Context): Promise<typeof fetch> {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedBigBrainClientFactory<T>(baseUrl: string) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : never;\n const bigBrainClient = createClient<Paths>({\n baseUrl,\n fetch: async (\n resource: Request,\n options?: RequestInit,\n ): Promise<Response> => {\n const fetch = await bigBrainFetch(ctx);\n return fetch(resource, options);\n },\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(bigBrainClient, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient =\n typedBigBrainClientFactory<CliManagementPaths>(BIG_BRAIN_URL);\nexport const typedPlatformClient =\n typedBigBrainClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n );\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = await bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\n// We can eventually switch to something like `filesize` for i18n and\n// more robust formatting, but let's keep our CLI bundle small for now.\nexport function formatSize(n: number): string {\n if (n < 1024) {\n return `${n} B`;\n }\n if (n < 1024 * 1024) {\n return `${(n / 1024).toFixed(1)} KB`;\n }\n if (n < 1024 * 1024 * 1024) {\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n }\n return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
5
- "mappings": "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",
6
- "names": ["teamSlug", "team", "path", "options", "fetch"]
4
+ "sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n // from `--cloud or --local`\n forceDevDeployment,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n forceDevDeployment: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n forceDevDeployment: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (forceDevDeployment) return { devDeployment: forceDevDeployment };\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport function logNoDefaultRegionMessage(teamSlug: string) {\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`https://dashboard.convex.dev/t/${teamSlug}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<string> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n const nonDemoProjects = projects.filter((project) => !project.isDemo);\n if (nonDemoProjects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing non-demo projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n // Prompt the user to select project.\n switch (nonDemoProjects.length) {\n case 1: {\n const project = nonDemoProjects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return nonDemoProjects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: nonDemoProjects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["teamSlug", "team", "path", "ctx", "fetch", "options"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
- export const version = "1.34.1";
2
+ export const version = "1.35.0";
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export const version = \"1.34.1\";\n"],
4
+ "sourcesContent": ["export const version = \"1.35.0\";\n"],
5
5
  "mappings": ";AAAO,aAAM,UAAU;",
6
6
  "names": []
7
7
  }