convex 1.34.1 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +8 -2
  3. package/dist/browser.bundle.js.map +3 -3
  4. package/dist/cjs/browser/index-node.js +3 -1
  5. package/dist/cjs/browser/index.js +3 -1
  6. package/dist/cjs/browser/index.js.map +2 -2
  7. package/dist/cjs/browser/query_options.js.map +2 -2
  8. package/dist/cjs/cli/aiFiles.js +31 -13
  9. package/dist/cjs/cli/aiFiles.js.map +3 -3
  10. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  11. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  12. package/dist/cjs/cli/configure.js +21 -24
  13. package/dist/cjs/cli/configure.js.map +2 -2
  14. package/dist/cjs/cli/deploy.js +7 -8
  15. package/dist/cjs/cli/deploy.js.map +2 -2
  16. package/dist/cjs/cli/deploymentCreate.js +225 -40
  17. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  18. package/dist/cjs/cli/deploymentSelect.js +14 -13
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +30 -11
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/docs.js +1 -1
  23. package/dist/cjs/cli/docs.js.map +2 -2
  24. package/dist/cjs/cli/init.js +1 -1
  25. package/dist/cjs/cli/init.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  27. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  28. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  29. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  31. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  32. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  33. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  37. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  39. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  40. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  41. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  42. package/dist/cjs/cli/lib/api.js +70 -7
  43. package/dist/cjs/cli/lib/api.js.map +2 -2
  44. package/dist/cjs/cli/lib/command.js +4 -5
  45. package/dist/cjs/cli/lib/command.js.map +2 -2
  46. package/dist/cjs/cli/lib/config.js +41 -4
  47. package/dist/cjs/cli/lib/config.js.map +3 -3
  48. package/dist/cjs/cli/lib/deploy2.js +9 -26
  49. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  51. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  52. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  53. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  55. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +162 -117
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/env.js +1 -13
  59. package/dist/cjs/cli/lib/env.js.map +2 -2
  60. package/dist/cjs/cli/lib/expiration.js +104 -0
  61. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  62. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  63. package/dist/cjs/cli/lib/init.js +4 -3
  64. package/dist/cjs/cli/lib/init.js.map +2 -2
  65. package/dist/cjs/cli/lib/insights.js +1 -1
  66. package/dist/cjs/cli/lib/insights.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  68. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  70. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  72. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  75. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  76. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  77. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  78. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  79. package/dist/cjs/cli/lib/updates.js +8 -9
  80. package/dist/cjs/cli/lib/updates.js.map +2 -2
  81. package/dist/cjs/cli/lib/usage.js +2 -1
  82. package/dist/cjs/cli/lib/usage.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  84. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  86. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  87. package/dist/cjs/index.js +1 -1
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/react/client.js +43 -6
  90. package/dist/cjs/react/client.js.map +2 -2
  91. package/dist/cjs/react/index.js +2 -0
  92. package/dist/cjs/react/index.js.map +2 -2
  93. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  94. package/dist/cjs/server/api.js.map +2 -2
  95. package/dist/cjs/server/components/definition.js.map +1 -1
  96. package/dist/cjs/server/components/index.js +40 -4
  97. package/dist/cjs/server/components/index.js.map +2 -2
  98. package/dist/cjs/server/data_model.js.map +1 -1
  99. package/dist/cjs/server/impl/meta_impl.js +78 -0
  100. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  101. package/dist/cjs/server/impl/registration_impl.js +16 -11
  102. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js.map +2 -2
  104. package/dist/cjs/server/meta.js +17 -0
  105. package/dist/cjs/server/meta.js.map +7 -0
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs-types/browser/index.d.ts +1 -0
  108. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  109. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  110. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  112. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  114. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  115. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  116. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  118. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  120. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  121. package/dist/cjs-types/cli/dev.d.ts +3 -1
  122. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  124. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  126. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  128. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  130. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  132. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  134. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  135. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  136. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  138. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  140. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  141. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  143. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  144. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  147. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  148. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  150. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  151. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  152. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  153. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  154. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  155. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  156. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  159. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  162. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  164. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  166. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  173. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  176. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  178. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  179. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  180. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  181. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  183. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/react/client.d.ts +54 -2
  188. package/dist/cjs-types/react/client.d.ts.map +1 -1
  189. package/dist/cjs-types/react/index.d.ts +7 -2
  190. package/dist/cjs-types/react/index.d.ts.map +1 -1
  191. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  192. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  193. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  194. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  195. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  196. package/dist/cjs-types/server/api.d.ts +5 -1
  197. package/dist/cjs-types/server/api.d.ts.map +1 -1
  198. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  199. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +5 -1
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/data_model.d.ts +2 -1
  203. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  205. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  206. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/index.d.ts +1 -0
  208. package/dist/cjs-types/server/index.d.ts.map +1 -1
  209. package/dist/cjs-types/server/meta.d.ts +72 -0
  210. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  211. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +1670 -1214
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/browser/index-node.js +1 -0
  215. package/dist/esm/browser/index.js +1 -0
  216. package/dist/esm/browser/index.js.map +2 -2
  217. package/dist/esm/browser/query_options.js.map +2 -2
  218. package/dist/esm/cli/aiFiles.js +33 -15
  219. package/dist/esm/cli/aiFiles.js.map +2 -2
  220. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  221. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  222. package/dist/esm/cli/configure.js +23 -26
  223. package/dist/esm/cli/configure.js.map +2 -2
  224. package/dist/esm/cli/deploy.js +11 -10
  225. package/dist/esm/cli/deploy.js.map +2 -2
  226. package/dist/esm/cli/deploymentCreate.js +238 -42
  227. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +13 -12
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +34 -13
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/docs.js +1 -1
  233. package/dist/esm/cli/docs.js.map +2 -2
  234. package/dist/esm/cli/init.js +2 -2
  235. package/dist/esm/cli/init.js.map +2 -2
  236. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  237. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  238. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  239. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  240. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  241. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  242. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  243. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  244. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  245. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  246. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  247. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  248. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  249. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  250. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  251. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  252. package/dist/esm/cli/lib/api.js +70 -7
  253. package/dist/esm/cli/lib/api.js.map +2 -2
  254. package/dist/esm/cli/lib/command.js +4 -5
  255. package/dist/esm/cli/lib/command.js.map +2 -2
  256. package/dist/esm/cli/lib/config.js +39 -3
  257. package/dist/esm/cli/lib/config.js.map +2 -2
  258. package/dist/esm/cli/lib/deploy2.js +13 -26
  259. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  260. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  261. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  262. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  264. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  265. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  266. package/dist/esm/cli/lib/dev.js +162 -118
  267. package/dist/esm/cli/lib/dev.js.map +2 -2
  268. package/dist/esm/cli/lib/env.js +0 -11
  269. package/dist/esm/cli/lib/env.js.map +2 -2
  270. package/dist/esm/cli/lib/expiration.js +80 -0
  271. package/dist/esm/cli/lib/expiration.js.map +7 -0
  272. package/dist/esm/cli/lib/init.js +4 -3
  273. package/dist/esm/cli/lib/init.js.map +2 -2
  274. package/dist/esm/cli/lib/insights.js +1 -1
  275. package/dist/esm/cli/lib/insights.js.map +2 -2
  276. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  277. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  278. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  279. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  280. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  287. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  288. package/dist/esm/cli/lib/updates.js +11 -9
  289. package/dist/esm/cli/lib/updates.js.map +2 -2
  290. package/dist/esm/cli/lib/usage.js +2 -1
  291. package/dist/esm/cli/lib/usage.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  293. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +45 -20
  295. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  296. package/dist/esm/index.js +1 -1
  297. package/dist/esm/index.js.map +1 -1
  298. package/dist/esm/react/client.js +43 -6
  299. package/dist/esm/react/client.js.map +2 -2
  300. package/dist/esm/react/index.js +1 -0
  301. package/dist/esm/react/index.js.map +2 -2
  302. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  303. package/dist/esm/server/api.js.map +2 -2
  304. package/dist/esm/server/components/index.js +40 -4
  305. package/dist/esm/server/components/index.js.map +2 -2
  306. package/dist/esm/server/impl/meta_impl.js +54 -0
  307. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  308. package/dist/esm/server/impl/registration_impl.js +20 -11
  309. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  310. package/dist/esm/server/index.js.map +2 -2
  311. package/dist/esm/server/meta.js +2 -0
  312. package/dist/esm/server/meta.js.map +7 -0
  313. package/dist/esm-types/browser/index.d.ts +1 -0
  314. package/dist/esm-types/browser/index.d.ts.map +1 -1
  315. package/dist/esm-types/browser/query_options.d.ts +12 -9
  316. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  317. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  318. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  319. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  320. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  321. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  322. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  323. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  324. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  325. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  326. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  327. package/dist/esm-types/cli/dev.d.ts +3 -1
  328. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  330. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  331. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  332. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  333. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  334. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  335. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  336. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  338. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  340. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  341. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  342. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  343. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  344. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  345. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  346. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  348. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  349. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  350. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  351. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  352. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  353. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  354. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  355. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  356. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  358. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  359. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  360. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  361. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  362. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  363. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  365. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  366. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  367. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  368. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  369. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  370. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  371. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  372. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  374. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  375. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  377. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  379. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  382. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  384. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  385. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  386. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  387. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  389. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  391. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  392. package/dist/esm-types/index.d.ts +1 -1
  393. package/dist/esm-types/react/client.d.ts +54 -2
  394. package/dist/esm-types/react/client.d.ts.map +1 -1
  395. package/dist/esm-types/react/index.d.ts +7 -2
  396. package/dist/esm-types/react/index.d.ts.map +1 -1
  397. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  398. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  399. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  400. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  401. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  402. package/dist/esm-types/server/api.d.ts +5 -1
  403. package/dist/esm-types/server/api.d.ts.map +1 -1
  404. package/dist/esm-types/server/components/definition.d.ts +1 -0
  405. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  406. package/dist/esm-types/server/components/index.d.ts +5 -1
  407. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  408. package/dist/esm-types/server/data_model.d.ts +2 -1
  409. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  410. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  411. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  412. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  413. package/dist/esm-types/server/index.d.ts +1 -0
  414. package/dist/esm-types/server/index.d.ts.map +1 -1
  415. package/dist/esm-types/server/meta.d.ts +72 -0
  416. package/dist/esm-types/server/meta.d.ts.map +1 -0
  417. package/dist/esm-types/server/registration.d.ts.map +1 -1
  418. package/dist/react.bundle.js +50 -7
  419. package/dist/react.bundle.js.map +3 -3
  420. package/package.json +11 -7
  421. package/schemas/convex.schema.json +15 -2
  422. package/src/browser/index.ts +3 -0
  423. package/src/browser/query_options.test.ts +0 -9
  424. package/src/browser/query_options.ts +36 -15
  425. package/src/cli/aiFiles.ts +44 -14
  426. package/src/cli/codegen_templates/readme.ts +14 -1
  427. package/src/cli/configure.test.ts +138 -0
  428. package/src/cli/configure.ts +48 -47
  429. package/src/cli/deploy.ts +12 -9
  430. package/src/cli/deploymentCreate.test.ts +349 -14
  431. package/src/cli/deploymentCreate.ts +268 -41
  432. package/src/cli/deploymentSelect.test.ts +136 -27
  433. package/src/cli/deploymentSelect.ts +50 -41
  434. package/src/cli/deploymentSelection.test.ts +343 -35
  435. package/src/cli/dev.ts +49 -14
  436. package/src/cli/docs.ts +1 -1
  437. package/src/cli/init.ts +2 -2
  438. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  439. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  440. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  441. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  442. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  443. package/src/cli/lib/aiFiles/index.ts +119 -125
  444. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  445. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  446. package/src/cli/lib/aiFiles/skills.ts +46 -16
  447. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  448. package/src/cli/lib/aiFiles/state.ts +82 -0
  449. package/src/cli/lib/aiFiles/status.ts +45 -39
  450. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  451. package/src/cli/lib/aiFiles/utils.ts +38 -10
  452. package/src/cli/lib/api.ts +88 -7
  453. package/src/cli/lib/command.ts +12 -7
  454. package/src/cli/lib/config.test.ts +184 -7
  455. package/src/cli/lib/config.ts +67 -7
  456. package/src/cli/lib/deploy2.ts +14 -27
  457. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  458. package/src/cli/lib/deploymentSelection.ts +59 -6
  459. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  460. package/src/cli/lib/deploymentSelector.ts +2 -0
  461. package/src/cli/lib/dev.ts +202 -153
  462. package/src/cli/lib/env.ts +0 -15
  463. package/src/cli/lib/expiration.test.ts +159 -0
  464. package/src/cli/lib/expiration.ts +124 -0
  465. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  466. package/src/cli/lib/init.ts +6 -2
  467. package/src/cli/lib/insights.ts +1 -1
  468. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  469. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  470. package/src/cli/lib/localDeployment/run.ts +1 -1
  471. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  472. package/src/cli/lib/localDeployment/utils.ts +12 -0
  473. package/src/cli/lib/mcp/tools/status.ts +1 -1
  474. package/src/cli/lib/updates.test.ts +102 -75
  475. package/src/cli/lib/updates.ts +14 -12
  476. package/src/cli/lib/usage.ts +3 -1
  477. package/src/cli/lib/utils/prompts.ts +2 -0
  478. package/src/cli/lib/utils/utils.test.ts +6 -6
  479. package/src/cli/lib/utils/utils.ts +66 -27
  480. package/src/index.ts +1 -1
  481. package/src/react/client.test.tsx +65 -0
  482. package/src/react/client.ts +129 -13
  483. package/src/react/index.ts +9 -1
  484. package/src/react/use_query_object_options.test.ts +50 -0
  485. package/src/react/use_query_result.test.ts +41 -0
  486. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  487. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  488. package/src/server/api.ts +5 -1
  489. package/src/server/components/definition.ts +3 -0
  490. package/src/server/components/index.ts +62 -5
  491. package/src/server/data_model.ts +2 -1
  492. package/src/server/impl/meta_impl.ts +74 -0
  493. package/src/server/impl/registration_impl.ts +21 -9
  494. package/src/server/index.ts +8 -0
  495. package/src/server/meta.ts +76 -0
  496. package/src/server/registration.ts +10 -0
  497. package/src/server/schema.test.ts +78 -1
  498. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  499. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  500. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  501. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  502. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  503. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  504. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  505. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  506. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  507. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  508. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  509. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  510. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  511. package/src/cli/lib/aiFiles/config.ts +0 -188
  512. package/src/values/.claude/settings.local.json +0 -10
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deploymentSelection.ts"],
4
- "sourcesContent": ["import { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport { parseDeploymentSelector } from \"./deploymentSelector.js\";\nimport { getBuildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n processDeployKeyValue,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = config[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const rawDeployKey = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref or a\n // deployment name), we don't need a current project context \u2014 handle it\n // before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n }\n\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n // Check if they're logged in\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn || process.env.CONVEX_AGENT_MODE === \"anonymous\") &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const deployKey = await processDeployKeyValue(\n ctx,\n rawDeployKey === null ? undefined : rawDeployKey,\n );\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<PlatformProjectDetails> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n getTeamAndProjectSlugForDeployment,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport { parseDeploymentSelector } from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { getBuildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n processDeployKeyValue,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = config[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const rawDeployKey = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref,\n // deployment name, or \"local\"), we don't need a current project context\n // \u2192 handle it before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"local\") {\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig !== null) {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: localConfig.deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject,\n };\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n }\n\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n !process.stdin.isTTY) &&\n !cliArgs.implicitProd &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const deployKey = await processDeployKeyValue(\n ctx,\n rawDeployKey === null ? undefined : rawDeployKey,\n );\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n // Overwrite the selection within project\n const newSelectionWithinProject =\n selectionWithinProject.kind === \"unspecified\" &&\n // Fetching local deployment credentials uses the \"unspecified\" code path\n targetDeploymentType !== \"local\"\n ? {\n kind: \"deploymentName\" as const,\n deploymentName: targetDeploymentName,\n }\n : selectionWithinProject;\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject: newSelectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<PlatformProjectDetails> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n });\n }\n\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["rawDeployKey", "deployKey", "result"]
7
7
  }
@@ -5,6 +5,7 @@ function parseInProjectSelector(s) {
5
5
  return { kind: "reference", reference: s };
6
6
  }
7
7
  export function parseDeploymentSelector(selector) {
8
+ if (selector === "local") return { kind: "local" };
8
9
  if (/^[a-z]+-[a-z]+-[0-9]+$/.test(selector)) {
9
10
  return { kind: "deploymentName", deploymentName: selector };
10
11
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deploymentSelector.ts"],
4
- "sourcesContent": ["export type InProjectSelector =\n | { kind: \"dev\" }\n | { kind: \"prod\" }\n | { kind: \"reference\"; reference: string };\n\nexport type ParsedDeploymentSelector =\n | { kind: \"deploymentName\"; deploymentName: string }\n | { kind: \"inCurrentProject\"; selector: InProjectSelector }\n | { kind: \"inProject\"; projectSlug: string; selector: InProjectSelector }\n | {\n kind: \"inTeamProject\";\n teamSlug: string;\n projectSlug: string;\n selector: InProjectSelector;\n };\n\nfunction parseInProjectSelector(s: string): InProjectSelector {\n if (s === \"dev\") return { kind: \"dev\" };\n if (s === \"prod\") return { kind: \"prod\" };\n return { kind: \"reference\", reference: s };\n}\n\n/**\n * Parses the value of the `--deployment` CLI flag\n */\nexport function parseDeploymentSelector(\n selector: string,\n): ParsedDeploymentSelector {\n if (/^[a-z]+-[a-z]+-[0-9]+$/.test(selector)) {\n return { kind: \"deploymentName\", deploymentName: selector };\n }\n const parts = selector.split(\":\");\n if (parts.length === 3) {\n return {\n kind: \"inTeamProject\",\n teamSlug: parts[0],\n projectSlug: parts[1],\n selector: parseInProjectSelector(parts[2]),\n };\n }\n if (parts.length === 2) {\n return {\n kind: \"inProject\",\n projectSlug: parts[0],\n selector: parseInProjectSelector(parts[1]),\n };\n }\n return {\n kind: \"inCurrentProject\",\n selector: parseInProjectSelector(selector),\n };\n}\n"],
5
- "mappings": ";AAgBA,SAAS,uBAAuB,GAA8B;AAC5D,MAAI,MAAM,MAAO,QAAO,EAAE,MAAM,MAAM;AACtC,MAAI,MAAM,OAAQ,QAAO,EAAE,MAAM,OAAO;AACxC,SAAO,EAAE,MAAM,aAAa,WAAW,EAAE;AAC3C;AAKO,gBAAS,wBACd,UAC0B;AAC1B,MAAI,yBAAyB,KAAK,QAAQ,GAAG;AAC3C,WAAO,EAAE,MAAM,kBAAkB,gBAAgB,SAAS;AAAA,EAC5D;AACA,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM,CAAC;AAAA,MACjB,aAAa,MAAM,CAAC;AAAA,MACpB,UAAU,uBAAuB,MAAM,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,MAAM,CAAC;AAAA,MACpB,UAAU,uBAAuB,MAAM,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,uBAAuB,QAAQ;AAAA,EAC3C;AACF;",
4
+ "sourcesContent": ["export type InProjectSelector =\n | { kind: \"dev\" }\n | { kind: \"prod\" }\n | { kind: \"reference\"; reference: string };\n\nexport type ParsedDeploymentSelector =\n | { kind: \"deploymentName\"; deploymentName: string }\n | { kind: \"local\" }\n | { kind: \"inCurrentProject\"; selector: InProjectSelector }\n | { kind: \"inProject\"; projectSlug: string; selector: InProjectSelector }\n | {\n kind: \"inTeamProject\";\n teamSlug: string;\n projectSlug: string;\n selector: InProjectSelector;\n };\n\nfunction parseInProjectSelector(s: string): InProjectSelector {\n if (s === \"dev\") return { kind: \"dev\" };\n if (s === \"prod\") return { kind: \"prod\" };\n return { kind: \"reference\", reference: s };\n}\n\n/**\n * Parses the value of the `--deployment` CLI flag\n */\nexport function parseDeploymentSelector(\n selector: string,\n): ParsedDeploymentSelector {\n if (selector === \"local\") return { kind: \"local\" };\n if (/^[a-z]+-[a-z]+-[0-9]+$/.test(selector)) {\n return { kind: \"deploymentName\", deploymentName: selector };\n }\n const parts = selector.split(\":\");\n if (parts.length === 3) {\n return {\n kind: \"inTeamProject\",\n teamSlug: parts[0],\n projectSlug: parts[1],\n selector: parseInProjectSelector(parts[2]),\n };\n }\n if (parts.length === 2) {\n return {\n kind: \"inProject\",\n projectSlug: parts[0],\n selector: parseInProjectSelector(parts[1]),\n };\n }\n return {\n kind: \"inCurrentProject\",\n selector: parseInProjectSelector(selector),\n };\n}\n"],
5
+ "mappings": ";AAiBA,SAAS,uBAAuB,GAA8B;AAC5D,MAAI,MAAM,MAAO,QAAO,EAAE,MAAM,MAAM;AACtC,MAAI,MAAM,OAAQ,QAAO,EAAE,MAAM,OAAO;AACxC,SAAO,EAAE,MAAM,aAAa,WAAW,EAAE;AAC3C;AAKO,gBAAS,wBACd,UAC0B;AAC1B,MAAI,aAAa,QAAS,QAAO,EAAE,MAAM,QAAQ;AACjD,MAAI,yBAAyB,KAAK,QAAQ,GAAG;AAC3C,WAAO,EAAE,MAAM,kBAAkB,gBAAgB,SAAS;AAAA,EAC5D;AACA,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM,CAAC;AAAA,MACjB,aAAa,MAAM,CAAC;AAAA,MACpB,UAAU,uBAAuB,MAAM,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,MAAM,CAAC;AAAA,MACpB,UAAU,uBAAuB,MAAM,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,uBAAuB,QAAQ;AAAA,EAC3C;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  import { chalkStderr } from "chalk";
3
+ import { spawn } from "child_process";
3
4
  import {
4
5
  logError,
5
6
  logFinishedStep,
@@ -16,7 +17,6 @@ import { LogManager, watchLogs } from "./logs.js";
16
17
  import {
17
18
  formatDuration,
18
19
  getCurrentTimeString,
19
- spawnAsync,
20
20
  waitForever,
21
21
  waitUntilCalled
22
22
  } from "./utils/utils.js";
@@ -85,143 +85,187 @@ export async function watchAndPush(outerCtx, options, cmdOptions) {
85
85
  let numFailures = 0;
86
86
  let ran = false;
87
87
  let pushed = false;
88
+ let shellChild;
89
+ let shellExited;
90
+ let shellCleanupHandle;
88
91
  let tableNameTriggeringRetry;
89
92
  let shouldRetryOnDeploymentEnvVarChange;
90
93
  let isFirstPush = true;
91
- while (true) {
92
- const start = performance.now();
93
- tableNameTriggeringRetry = null;
94
- shouldRetryOnDeploymentEnvVarChange = false;
95
- const ctx = new WatchContext(
96
- cmdOptions.traceEvents,
97
- outerCtx.bigBrainAuth(),
98
- isFirstPush
99
- );
100
- options.logManager?.beginDeploy();
101
- showSpinner("Preparing Convex functions...");
102
- try {
103
- await runPush(ctx, options);
104
- const end = performance.now();
105
- options.logManager?.endDeploy();
106
- numFailures = 0;
107
- logFinishedStep(
108
- `${getCurrentTimeString()} Convex functions ready! (${formatDuration(
109
- end - start
110
- )})`
94
+ try {
95
+ while (true) {
96
+ const start = performance.now();
97
+ tableNameTriggeringRetry = null;
98
+ shouldRetryOnDeploymentEnvVarChange = false;
99
+ const ctx = new WatchContext(
100
+ cmdOptions.traceEvents,
101
+ outerCtx.bigBrainAuth(),
102
+ isFirstPush
111
103
  );
112
- const { projectConfig } = await readProjectConfig(ctx);
113
- const authKitConfig = await getAuthKitConfig(ctx, projectConfig);
114
- const currentConfigString = authKitConfig ? JSON.stringify(authKitConfig) : void 0;
115
- if (!isFirstPush && currentConfigString !== authKitCache.lastAppliedConfig) {
116
- await syncAuthKitConfigAfterPush(ctx, projectConfig, {
117
- deploymentUrl: options.url,
118
- adminKey: options.adminKey
119
- });
120
- }
121
- authKitCache.lastAppliedConfig = currentConfigString;
122
- isFirstPush = false;
123
- if (cmdOptions.run !== void 0 && !ran) {
124
- switch (cmdOptions.run.kind) {
125
- case "function":
126
- await runFunctionInDev(
127
- ctx,
128
- options,
129
- cmdOptions.run.name,
130
- cmdOptions.run.component
131
- );
132
- break;
133
- case "shell":
134
- try {
135
- await spawnAsync(ctx, cmdOptions.run.command, [], {
104
+ options.logManager?.beginDeploy();
105
+ showSpinner("Preparing Convex functions...");
106
+ try {
107
+ await runPush(ctx, options);
108
+ const end = performance.now();
109
+ options.logManager?.endDeploy();
110
+ numFailures = 0;
111
+ logFinishedStep(
112
+ `${getCurrentTimeString()} Convex functions ready! (${formatDuration(
113
+ end - start
114
+ )})`
115
+ );
116
+ const { projectConfig } = await readProjectConfig(ctx);
117
+ const authKitConfig = await getAuthKitConfig(ctx, projectConfig);
118
+ const currentConfigString = authKitConfig ? JSON.stringify(authKitConfig) : void 0;
119
+ if (!isFirstPush && currentConfigString !== authKitCache.lastAppliedConfig) {
120
+ await syncAuthKitConfigAfterPush(ctx, projectConfig, {
121
+ deploymentUrl: options.url,
122
+ adminKey: options.adminKey
123
+ });
124
+ }
125
+ authKitCache.lastAppliedConfig = currentConfigString;
126
+ isFirstPush = false;
127
+ if (cmdOptions.run !== void 0 && !ran) {
128
+ switch (cmdOptions.run.kind) {
129
+ case "function":
130
+ await runFunctionInDev(
131
+ ctx,
132
+ options,
133
+ cmdOptions.run.name,
134
+ cmdOptions.run.component
135
+ );
136
+ break;
137
+ case "shell": {
138
+ const shellCommand = cmdOptions.run.command;
139
+ shellChild = spawn(shellCommand, [], {
140
+ shell: true,
136
141
  stdio: "inherit",
137
- shell: true
142
+ detached: true
143
+ });
144
+ shellCleanupHandle = outerCtx.registerCleanup(async () => {
145
+ if (shellChild) {
146
+ const child = shellChild;
147
+ shellChild = void 0;
148
+ if (child.pid !== void 0) {
149
+ try {
150
+ process.kill(-child.pid, "SIGTERM");
151
+ } catch {
152
+ child.kill();
153
+ }
154
+ } else {
155
+ child.kill();
156
+ }
157
+ }
158
+ await shellExited;
138
159
  });
139
- } catch (e) {
140
- const errorMessage = e === null || e === void 0 ? null : e.error instanceof Error ? e.error.message ?? null : null;
141
- const printedMessage = `Failed to run command \`${cmdOptions.run.command}\`: ${errorMessage ?? "Unknown error"}`;
160
+ shellExited = new Promise((resolve) => {
161
+ shellChild.on("error", (error) => {
162
+ logError(
163
+ `Failed to run command \`${shellCommand}\`: ${error.message}`
164
+ );
165
+ shellChild = void 0;
166
+ resolve();
167
+ void outerCtx.flushAndExit(1);
168
+ });
169
+ shellChild.on("exit", (code, signal) => {
170
+ shellChild = void 0;
171
+ resolve();
172
+ if (signal) {
173
+ return;
174
+ }
175
+ if (code !== null && code !== 0) {
176
+ logError(
177
+ `Command \`${shellCommand}\` exited with code ${code}`
178
+ );
179
+ void outerCtx.flushAndExit(1);
180
+ }
181
+ });
182
+ });
183
+ break;
184
+ }
185
+ default: {
186
+ cmdOptions.run;
142
187
  await ctx.crash({
143
188
  exitCode: 1,
144
189
  errorType: "fatal",
145
- printedMessage
190
+ printedMessage: `Unexpected arguments for --run`,
191
+ errForSentry: `Unexpected arguments for --run: ${JSON.stringify(
192
+ cmdOptions.run
193
+ )}`
146
194
  });
147
195
  }
148
- break;
149
- default: {
150
- cmdOptions.run;
151
- await ctx.crash({
152
- exitCode: 1,
153
- errorType: "fatal",
154
- printedMessage: `Unexpected arguments for --run`,
155
- errForSentry: `Unexpected arguments for --run: ${JSON.stringify(
156
- cmdOptions.run
157
- )}`
158
- });
159
196
  }
197
+ ran = true;
160
198
  }
161
- ran = true;
162
- }
163
- pushed = true;
164
- } catch (e) {
165
- if (!(e instanceof Crash) || !e.errorType) {
166
- throw e;
167
- }
168
- if (e.errorType === "fatal") {
169
- break;
170
- }
171
- if (e.errorType === "transient" || e.errorType === "already handled") {
172
- const delay = nextBackoff(numFailures);
173
- numFailures += 1;
174
- if (e.errorType === "transient") {
175
- logWarning(
176
- chalkStderr.yellow(
177
- `Failed due to network error, retrying in ${formatDuration(
178
- delay
179
- )}...`
180
- )
181
- );
199
+ pushed = true;
200
+ } catch (e) {
201
+ if (!(e instanceof Crash) || !e.errorType) {
202
+ throw e;
182
203
  }
183
- await new Promise((resolve) => setTimeout(resolve, delay));
184
- continue;
185
- }
186
- console.assert(
187
- e.errorType === "invalid filesystem data" || e.errorType === "invalid filesystem or env vars" || e.errorType["invalid filesystem or db data"] !== void 0
188
- );
189
- if (e.errorType === "invalid filesystem or env vars") {
190
- shouldRetryOnDeploymentEnvVarChange = true;
191
- } else if (e.errorType !== "invalid filesystem data" && e.errorType["invalid filesystem or db data"] !== void 0) {
192
- tableNameTriggeringRetry = e.errorType["invalid filesystem or db data"];
204
+ if (e.errorType === "fatal") {
205
+ break;
206
+ }
207
+ if (e.errorType === "transient" || e.errorType === "already handled") {
208
+ const delay = nextBackoff(numFailures);
209
+ numFailures += 1;
210
+ if (e.errorType === "transient") {
211
+ logWarning(
212
+ chalkStderr.yellow(
213
+ `Failed due to network error, retrying in ${formatDuration(
214
+ delay
215
+ )}...`
216
+ )
217
+ );
218
+ }
219
+ await new Promise((resolve) => setTimeout(resolve, delay));
220
+ continue;
221
+ }
222
+ console.assert(
223
+ e.errorType === "invalid filesystem data" || e.errorType === "invalid filesystem or env vars" || e.errorType["invalid filesystem or db data"] !== void 0
224
+ );
225
+ if (e.errorType === "invalid filesystem or env vars") {
226
+ shouldRetryOnDeploymentEnvVarChange = true;
227
+ } else if (e.errorType !== "invalid filesystem data" && e.errorType["invalid filesystem or db data"] !== void 0) {
228
+ tableNameTriggeringRetry = e.errorType["invalid filesystem or db data"];
229
+ }
230
+ if (cmdOptions.once) {
231
+ await outerCtx.flushAndExit(1, e.errorType);
232
+ }
233
+ stopSpinner();
193
234
  }
194
235
  if (cmdOptions.once) {
195
- await outerCtx.flushAndExit(1, e.errorType);
236
+ return;
237
+ }
238
+ if (pushed && cmdOptions.untilSuccess) {
239
+ return;
196
240
  }
197
- stopSpinner();
241
+ const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);
242
+ const tableWatch = getTableWatch(
243
+ ctx,
244
+ options,
245
+ tableNameTriggeringRetry?.tableName ?? null,
246
+ tableNameTriggeringRetry?.componentPath
247
+ );
248
+ const envVarWatch = getDeplymentEnvVarWatch(
249
+ ctx,
250
+ options,
251
+ shouldRetryOnDeploymentEnvVarChange
252
+ );
253
+ await Promise.race([
254
+ fileSystemWatch.watch(),
255
+ tableWatch.watch(),
256
+ envVarWatch.watch()
257
+ ]);
258
+ fileSystemWatch.stop();
259
+ void tableWatch.stop();
260
+ void envVarWatch.stop();
198
261
  }
199
- if (cmdOptions.once) {
200
- return;
262
+ } finally {
263
+ if (shellExited) {
264
+ await shellExited;
201
265
  }
202
- if (pushed && cmdOptions.untilSuccess) {
203
- return;
266
+ if (shellCleanupHandle) {
267
+ outerCtx.removeCleanup(shellCleanupHandle);
204
268
  }
205
- const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);
206
- const tableWatch = getTableWatch(
207
- ctx,
208
- options,
209
- tableNameTriggeringRetry?.tableName ?? null,
210
- tableNameTriggeringRetry?.componentPath
211
- );
212
- const envVarWatch = getDeplymentEnvVarWatch(
213
- ctx,
214
- options,
215
- shouldRetryOnDeploymentEnvVarChange
216
- );
217
- await Promise.race([
218
- fileSystemWatch.watch(),
219
- tableWatch.watch(),
220
- envVarWatch.watch()
221
- ]);
222
- fileSystemWatch.stop();
223
- void tableWatch.stop();
224
- void envVarWatch.stop();
225
269
  }
226
270
  }
227
271
  async function runFunctionInDev(ctx, credentials, functionName, componentPath) {