convex 1.44.0 → 1.45.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 (594) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/convexExport.js +1 -1
  5. package/dist/cjs/cli/convexExport.js.map +1 -1
  6. package/dist/cjs/cli/index.js +2 -32
  7. package/dist/cjs/cli/index.js.map +2 -2
  8. package/dist/cjs/cli/lib/api.js +11 -5
  9. package/dist/cjs/cli/lib/api.js.map +2 -2
  10. package/dist/cjs/cli/lib/convexExport.js +12 -1
  11. package/dist/cjs/cli/lib/convexExport.js.map +2 -2
  12. package/dist/cjs/cli/lib/dashboard.js.map +2 -2
  13. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  14. package/dist/cjs/cli/lib/indexes.js +1 -1
  15. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  16. package/dist/cjs/cli/lib/localDeployment/upgrade.js +23 -188
  17. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  18. package/dist/cjs/cli/lib/mcp/tools/index.js.map +1 -1
  19. package/dist/cjs/cli/mcp.js +76 -69
  20. package/dist/cjs/cli/mcp.js.map +2 -2
  21. package/dist/cjs/index.js +1 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  24. package/dist/cjs/server/index.js.map +2 -2
  25. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  26. package/dist/cjs-types/cli/lib/convexExport.d.ts +1 -0
  27. package/dist/cjs-types/cli/lib/convexExport.d.ts.map +1 -1
  28. package/dist/cjs-types/cli/lib/dashboard.d.ts.map +1 -1
  29. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  30. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  31. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
  32. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  33. package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts +1 -1
  34. package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
  35. package/dist/cjs-types/cli/mcp.d.ts +3 -0
  36. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  37. package/dist/cjs-types/index.d.ts +1 -1
  38. package/dist/cjs-types/server/impl/actions_impl.d.ts +14 -0
  39. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  40. package/dist/cjs-types/server/index.d.ts +1 -0
  41. package/dist/cjs-types/server/index.d.ts.map +1 -1
  42. package/dist/cli.bundle.cjs +31210 -25495
  43. package/dist/cli.bundle.cjs.map +4 -4
  44. package/dist/esm/cli/convexExport.js +1 -1
  45. package/dist/esm/cli/convexExport.js.map +1 -1
  46. package/dist/esm/cli/index.js +2 -32
  47. package/dist/esm/cli/index.js.map +2 -2
  48. package/dist/esm/cli/lib/api.js +11 -5
  49. package/dist/esm/cli/lib/api.js.map +2 -2
  50. package/dist/esm/cli/lib/convexExport.js +16 -3
  51. package/dist/esm/cli/lib/convexExport.js.map +2 -2
  52. package/dist/esm/cli/lib/dashboard.js.map +2 -2
  53. package/dist/esm/cli/lib/indexes.js +1 -1
  54. package/dist/esm/cli/lib/indexes.js.map +1 -1
  55. package/dist/esm/cli/lib/localDeployment/upgrade.js +22 -190
  56. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  57. package/dist/esm/cli/lib/mcp/tools/index.js.map +1 -1
  58. package/dist/esm/cli/mcp.js +75 -72
  59. package/dist/esm/cli/mcp.js.map +2 -2
  60. package/dist/esm/index.js +1 -1
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  63. package/dist/esm/server/index.js.map +2 -2
  64. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  65. package/dist/esm-types/cli/lib/convexExport.d.ts +1 -0
  66. package/dist/esm-types/cli/lib/convexExport.d.ts.map +1 -1
  67. package/dist/esm-types/cli/lib/dashboard.d.ts.map +1 -1
  68. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  69. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  70. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
  71. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  72. package/dist/esm-types/cli/lib/mcp/tools/index.d.ts +1 -1
  73. package/dist/esm-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
  74. package/dist/esm-types/cli/mcp.d.ts +3 -0
  75. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  76. package/dist/esm-types/index.d.ts +1 -1
  77. package/dist/esm-types/server/impl/actions_impl.d.ts +14 -0
  78. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  79. package/dist/esm-types/server/index.d.ts +1 -0
  80. package/dist/esm-types/server/index.d.ts.map +1 -1
  81. package/dist/react.bundle.js +1 -1
  82. package/dist/react.bundle.js.map +1 -1
  83. package/package.json +3 -3
  84. package/src/cli/convexExport.ts +1 -1
  85. package/src/cli/index.ts +2 -35
  86. package/src/cli/lib/api.ts +11 -5
  87. package/src/cli/lib/convexExport.ts +21 -0
  88. package/src/cli/lib/dashboard.ts +2 -0
  89. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  90. package/src/cli/lib/indexes.ts +1 -1
  91. package/src/cli/lib/localDeployment/upgrade.ts +34 -207
  92. package/src/cli/lib/mcp/tools/index.ts +1 -1
  93. package/src/cli/mcp.ts +91 -77
  94. package/src/index.ts +1 -1
  95. package/src/server/impl/actions_impl.ts +3 -1
  96. package/src/server/index.ts +0 -3
  97. package/dist/cjs-types/browser/http_client.test.d.ts +0 -2
  98. package/dist/cjs-types/browser/http_client.test.d.ts.map +0 -1
  99. package/dist/cjs-types/browser/query_options.test.d.ts +0 -2
  100. package/dist/cjs-types/browser/query_options.test.d.ts.map +0 -1
  101. package/dist/cjs-types/browser/simple_client.test.d.ts +0 -2
  102. package/dist/cjs-types/browser/simple_client.test.d.ts.map +0 -1
  103. package/dist/cjs-types/browser/sync/client.test.d.ts +0 -5
  104. package/dist/cjs-types/browser/sync/client.test.d.ts.map +0 -1
  105. package/dist/cjs-types/browser/sync/client_node.test.d.ts +0 -2
  106. package/dist/cjs-types/browser/sync/client_node.test.d.ts.map +0 -1
  107. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts +0 -44
  108. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
  109. package/dist/cjs-types/browser/sync/local_state.test.d.ts +0 -2
  110. package/dist/cjs-types/browser/sync/local_state.test.d.ts.map +0 -1
  111. package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
  112. package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
  113. package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts +0 -2
  114. package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
  115. package/dist/cjs-types/browser/sync/protocol.test.d.ts +0 -5
  116. package/dist/cjs-types/browser/sync/protocol.test.d.ts.map +0 -1
  117. package/dist/cjs-types/browser/sync/request_manager.test.d.ts +0 -2
  118. package/dist/cjs-types/browser/sync/request_manager.test.d.ts.map +0 -1
  119. package/dist/cjs-types/bundler/fs.test.d.ts +0 -2
  120. package/dist/cjs-types/bundler/fs.test.d.ts.map +0 -1
  121. package/dist/cjs-types/bundler/index.test.d.ts +0 -2
  122. package/dist/cjs-types/bundler/index.test.d.ts.map +0 -1
  123. package/dist/cjs-types/cli/codegen_templates/api.test.d.ts +0 -2
  124. package/dist/cjs-types/cli/codegen_templates/api.test.d.ts.map +0 -1
  125. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +0 -2
  126. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +0 -1
  127. package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts +0 -2
  128. package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
  129. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
  130. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
  131. package/dist/cjs-types/cli/configure.test.d.ts +0 -2
  132. package/dist/cjs-types/cli/configure.test.d.ts.map +0 -1
  133. package/dist/cjs-types/cli/deploymentCreate.test.d.ts +0 -2
  134. package/dist/cjs-types/cli/deploymentCreate.test.d.ts.map +0 -1
  135. package/dist/cjs-types/cli/deploymentSelect.test.d.ts +0 -2
  136. package/dist/cjs-types/cli/deploymentSelect.test.d.ts.map +0 -1
  137. package/dist/cjs-types/cli/deploymentSelection.test.d.ts +0 -2
  138. package/dist/cjs-types/cli/deploymentSelection.test.d.ts.map +0 -1
  139. package/dist/cjs-types/cli/deploymentToken.test.d.ts +0 -2
  140. package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +0 -1
  141. package/dist/cjs-types/cli/dev.test.d.ts +0 -2
  142. package/dist/cjs-types/cli/dev.test.d.ts.map +0 -1
  143. package/dist/cjs-types/cli/envDefault.test.d.ts +0 -2
  144. package/dist/cjs-types/cli/envDefault.test.d.ts.map +0 -1
  145. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
  146. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
  147. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
  148. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
  149. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
  150. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
  151. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts +0 -2
  152. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
  153. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
  154. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
  155. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
  156. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
  157. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +0 -2
  158. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
  159. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
  160. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
  161. package/dist/cjs-types/cli/lib/codegen.test.d.ts +0 -2
  162. package/dist/cjs-types/cli/lib/codegen.test.d.ts.map +0 -1
  163. package/dist/cjs-types/cli/lib/components.test.d.ts +0 -2
  164. package/dist/cjs-types/cli/lib/components.test.d.ts.map +0 -1
  165. package/dist/cjs-types/cli/lib/config.test.d.ts +0 -2
  166. package/dist/cjs-types/cli/lib/config.test.d.ts.map +0 -1
  167. package/dist/cjs-types/cli/lib/deployment.test.d.ts +0 -2
  168. package/dist/cjs-types/cli/lib/deployment.test.d.ts.map +0 -1
  169. package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts +0 -2
  170. package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
  171. package/dist/cjs-types/cli/lib/env.test.d.ts +0 -2
  172. package/dist/cjs-types/cli/lib/env.test.d.ts.map +0 -1
  173. package/dist/cjs-types/cli/lib/expiration.test.d.ts +0 -2
  174. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +0 -1
  175. package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
  176. package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
  177. package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
  178. package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
  179. package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
  180. package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
  181. package/dist/cjs-types/cli/lib/fsUtils.test.d.ts +0 -2
  182. package/dist/cjs-types/cli/lib/fsUtils.test.d.ts.map +0 -1
  183. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +0 -2
  184. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +0 -1
  185. package/dist/cjs-types/cli/lib/indexes.test.d.ts +0 -2
  186. package/dist/cjs-types/cli/lib/indexes.test.d.ts.map +0 -1
  187. package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts +0 -2
  188. package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
  189. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
  190. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
  191. package/dist/cjs-types/cli/lib/run.test.d.ts +0 -2
  192. package/dist/cjs-types/cli/lib/run.test.d.ts.map +0 -1
  193. package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts +0 -2
  194. package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
  195. package/dist/cjs-types/cli/lib/typecheck.test.d.ts +0 -2
  196. package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +0 -1
  197. package/dist/cjs-types/cli/lib/updates.test.d.ts +0 -2
  198. package/dist/cjs-types/cli/lib/updates.test.d.ts.map +0 -1
  199. package/dist/cjs-types/cli/lib/utils/hash.test.d.ts +0 -2
  200. package/dist/cjs-types/cli/lib/utils/hash.test.d.ts.map +0 -1
  201. package/dist/cjs-types/cli/lib/utils/utils.test.d.ts +0 -2
  202. package/dist/cjs-types/cli/lib/utils/utils.test.d.ts.map +0 -1
  203. package/dist/cjs-types/cli/lib/versionApi.test.d.ts +0 -2
  204. package/dist/cjs-types/cli/lib/versionApi.test.d.ts.map +0 -1
  205. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
  206. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
  207. package/dist/cjs-types/cli/lib/workos/workos.test.d.ts +0 -2
  208. package/dist/cjs-types/cli/lib/workos/workos.test.d.ts.map +0 -1
  209. package/dist/cjs-types/cli/login.test.d.ts +0 -2
  210. package/dist/cjs-types/cli/login.test.d.ts.map +0 -1
  211. package/dist/cjs-types/common/index.test.d.ts +0 -2
  212. package/dist/cjs-types/common/index.test.d.ts.map +0 -1
  213. package/dist/cjs-types/nextjs/nextjs.test.d.ts +0 -2
  214. package/dist/cjs-types/nextjs/nextjs.test.d.ts.map +0 -1
  215. package/dist/cjs-types/react/ConvexAuthState.test.d.ts +0 -2
  216. package/dist/cjs-types/react/ConvexAuthState.test.d.ts.map +0 -1
  217. package/dist/cjs-types/react/auth_helpers.test.d.ts +0 -2
  218. package/dist/cjs-types/react/auth_helpers.test.d.ts.map +0 -1
  219. package/dist/cjs-types/react/auth_websocket.test.d.ts +0 -2
  220. package/dist/cjs-types/react/auth_websocket.test.d.ts.map +0 -1
  221. package/dist/cjs-types/react/client.test.d.ts +0 -2
  222. package/dist/cjs-types/react/client.test.d.ts.map +0 -1
  223. package/dist/cjs-types/react/client_provided_base_client.test.d.ts +0 -2
  224. package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +0 -1
  225. package/dist/cjs-types/react/queries_observer.test.d.ts +0 -2
  226. package/dist/cjs-types/react/queries_observer.test.d.ts.map +0 -1
  227. package/dist/cjs-types/react/react_node.test.d.ts +0 -2
  228. package/dist/cjs-types/react/react_node.test.d.ts.map +0 -1
  229. package/dist/cjs-types/react/use_paginated_query.test.d.ts +0 -2
  230. package/dist/cjs-types/react/use_paginated_query.test.d.ts.map +0 -1
  231. package/dist/cjs-types/react/use_queries.test.d.ts +0 -5
  232. package/dist/cjs-types/react/use_queries.test.d.ts.map +0 -1
  233. package/dist/cjs-types/react/use_query.test.d.ts +0 -5
  234. package/dist/cjs-types/react/use_query.test.d.ts.map +0 -1
  235. package/dist/cjs-types/react/use_query_object_options.test.d.ts +0 -5
  236. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +0 -1
  237. package/dist/cjs-types/react/use_query_result.test.d.ts +0 -5
  238. package/dist/cjs-types/react/use_query_result.test.d.ts.map +0 -1
  239. package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
  240. package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
  241. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
  242. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
  243. package/dist/cjs-types/server/api.intersect.test.d.ts +0 -2
  244. package/dist/cjs-types/server/api.intersect.test.d.ts.map +0 -1
  245. package/dist/cjs-types/server/api.test.d.ts +0 -2
  246. package/dist/cjs-types/server/api.test.d.ts.map +0 -1
  247. package/dist/cjs-types/server/audit_logging.test.d.ts +0 -2
  248. package/dist/cjs-types/server/audit_logging.test.d.ts.map +0 -1
  249. package/dist/cjs-types/server/components/index.test.d.ts +0 -2
  250. package/dist/cjs-types/server/components/index.test.d.ts.map +0 -1
  251. package/dist/cjs-types/server/cron.test.d.ts +0 -2
  252. package/dist/cjs-types/server/cron.test.d.ts.map +0 -1
  253. package/dist/cjs-types/server/data_model.test.d.ts +0 -2
  254. package/dist/cjs-types/server/data_model.test.d.ts.map +0 -1
  255. package/dist/cjs-types/server/database.test.d.ts +0 -2
  256. package/dist/cjs-types/server/database.test.d.ts.map +0 -1
  257. package/dist/cjs-types/server/database_api.test.d.ts +0 -2
  258. package/dist/cjs-types/server/database_api.test.d.ts.map +0 -1
  259. package/dist/cjs-types/server/filter_builder.test.d.ts +0 -2
  260. package/dist/cjs-types/server/filter_builder.test.d.ts.map +0 -1
  261. package/dist/cjs-types/server/impl/actions_impl.test.d.ts +0 -2
  262. package/dist/cjs-types/server/impl/actions_impl.test.d.ts.map +0 -1
  263. package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts +0 -2
  264. package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
  265. package/dist/cjs-types/server/impl/query_impl.test.d.ts +0 -2
  266. package/dist/cjs-types/server/impl/query_impl.test.d.ts.map +0 -1
  267. package/dist/cjs-types/server/pagination.test.d.ts +0 -2
  268. package/dist/cjs-types/server/pagination.test.d.ts.map +0 -1
  269. package/dist/cjs-types/server/query.test.d.ts +0 -2
  270. package/dist/cjs-types/server/query.test.d.ts.map +0 -1
  271. package/dist/cjs-types/server/registration.test.d.ts +0 -2
  272. package/dist/cjs-types/server/registration.test.d.ts.map +0 -1
  273. package/dist/cjs-types/server/router.test.d.ts +0 -2
  274. package/dist/cjs-types/server/router.test.d.ts.map +0 -1
  275. package/dist/cjs-types/server/scheduler.test.d.ts +0 -2
  276. package/dist/cjs-types/server/scheduler.test.d.ts.map +0 -1
  277. package/dist/cjs-types/server/schema.test.d.ts +0 -2
  278. package/dist/cjs-types/server/schema.test.d.ts.map +0 -1
  279. package/dist/cjs-types/test/fake_watch.d.ts +0 -16
  280. package/dist/cjs-types/test/fake_watch.d.ts.map +0 -1
  281. package/dist/cjs-types/test/type_testing.d.ts +0 -9
  282. package/dist/cjs-types/test/type_testing.d.ts.map +0 -1
  283. package/dist/cjs-types/type_utils.test.d.ts +0 -2
  284. package/dist/cjs-types/type_utils.test.d.ts.map +0 -1
  285. package/dist/cjs-types/values/size.test.d.ts +0 -2
  286. package/dist/cjs-types/values/size.test.d.ts.map +0 -1
  287. package/dist/cjs-types/values/validator.test.d.ts +0 -2
  288. package/dist/cjs-types/values/validator.test.d.ts.map +0 -1
  289. package/dist/cjs-types/values/value.test.d.ts +0 -2
  290. package/dist/cjs-types/values/value.test.d.ts.map +0 -1
  291. package/dist/esm-types/browser/http_client.test.d.ts +0 -2
  292. package/dist/esm-types/browser/http_client.test.d.ts.map +0 -1
  293. package/dist/esm-types/browser/query_options.test.d.ts +0 -2
  294. package/dist/esm-types/browser/query_options.test.d.ts.map +0 -1
  295. package/dist/esm-types/browser/simple_client.test.d.ts +0 -2
  296. package/dist/esm-types/browser/simple_client.test.d.ts.map +0 -1
  297. package/dist/esm-types/browser/sync/client.test.d.ts +0 -5
  298. package/dist/esm-types/browser/sync/client.test.d.ts.map +0 -1
  299. package/dist/esm-types/browser/sync/client_node.test.d.ts +0 -2
  300. package/dist/esm-types/browser/sync/client_node.test.d.ts.map +0 -1
  301. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts +0 -44
  302. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
  303. package/dist/esm-types/browser/sync/local_state.test.d.ts +0 -2
  304. package/dist/esm-types/browser/sync/local_state.test.d.ts.map +0 -1
  305. package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
  306. package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
  307. package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts +0 -2
  308. package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
  309. package/dist/esm-types/browser/sync/protocol.test.d.ts +0 -5
  310. package/dist/esm-types/browser/sync/protocol.test.d.ts.map +0 -1
  311. package/dist/esm-types/browser/sync/request_manager.test.d.ts +0 -2
  312. package/dist/esm-types/browser/sync/request_manager.test.d.ts.map +0 -1
  313. package/dist/esm-types/bundler/fs.test.d.ts +0 -2
  314. package/dist/esm-types/bundler/fs.test.d.ts.map +0 -1
  315. package/dist/esm-types/bundler/index.test.d.ts +0 -2
  316. package/dist/esm-types/bundler/index.test.d.ts.map +0 -1
  317. package/dist/esm-types/cli/codegen_templates/api.test.d.ts +0 -2
  318. package/dist/esm-types/cli/codegen_templates/api.test.d.ts.map +0 -1
  319. package/dist/esm-types/cli/codegen_templates/common.test.d.ts +0 -2
  320. package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +0 -1
  321. package/dist/esm-types/cli/codegen_templates/templates.test.d.ts +0 -2
  322. package/dist/esm-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
  323. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
  324. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
  325. package/dist/esm-types/cli/configure.test.d.ts +0 -2
  326. package/dist/esm-types/cli/configure.test.d.ts.map +0 -1
  327. package/dist/esm-types/cli/deploymentCreate.test.d.ts +0 -2
  328. package/dist/esm-types/cli/deploymentCreate.test.d.ts.map +0 -1
  329. package/dist/esm-types/cli/deploymentSelect.test.d.ts +0 -2
  330. package/dist/esm-types/cli/deploymentSelect.test.d.ts.map +0 -1
  331. package/dist/esm-types/cli/deploymentSelection.test.d.ts +0 -2
  332. package/dist/esm-types/cli/deploymentSelection.test.d.ts.map +0 -1
  333. package/dist/esm-types/cli/deploymentToken.test.d.ts +0 -2
  334. package/dist/esm-types/cli/deploymentToken.test.d.ts.map +0 -1
  335. package/dist/esm-types/cli/dev.test.d.ts +0 -2
  336. package/dist/esm-types/cli/dev.test.d.ts.map +0 -1
  337. package/dist/esm-types/cli/envDefault.test.d.ts +0 -2
  338. package/dist/esm-types/cli/envDefault.test.d.ts.map +0 -1
  339. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
  340. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
  341. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
  342. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
  343. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
  344. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
  345. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts +0 -2
  346. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
  347. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
  348. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
  349. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
  350. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
  351. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +0 -2
  352. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
  353. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
  354. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
  355. package/dist/esm-types/cli/lib/codegen.test.d.ts +0 -2
  356. package/dist/esm-types/cli/lib/codegen.test.d.ts.map +0 -1
  357. package/dist/esm-types/cli/lib/components.test.d.ts +0 -2
  358. package/dist/esm-types/cli/lib/components.test.d.ts.map +0 -1
  359. package/dist/esm-types/cli/lib/config.test.d.ts +0 -2
  360. package/dist/esm-types/cli/lib/config.test.d.ts.map +0 -1
  361. package/dist/esm-types/cli/lib/deployment.test.d.ts +0 -2
  362. package/dist/esm-types/cli/lib/deployment.test.d.ts.map +0 -1
  363. package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts +0 -2
  364. package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
  365. package/dist/esm-types/cli/lib/env.test.d.ts +0 -2
  366. package/dist/esm-types/cli/lib/env.test.d.ts.map +0 -1
  367. package/dist/esm-types/cli/lib/expiration.test.d.ts +0 -2
  368. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +0 -1
  369. package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
  370. package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
  371. package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
  372. package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
  373. package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
  374. package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
  375. package/dist/esm-types/cli/lib/fsUtils.test.d.ts +0 -2
  376. package/dist/esm-types/cli/lib/fsUtils.test.d.ts.map +0 -1
  377. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +0 -2
  378. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +0 -1
  379. package/dist/esm-types/cli/lib/indexes.test.d.ts +0 -2
  380. package/dist/esm-types/cli/lib/indexes.test.d.ts.map +0 -1
  381. package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts +0 -2
  382. package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
  383. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
  384. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
  385. package/dist/esm-types/cli/lib/run.test.d.ts +0 -2
  386. package/dist/esm-types/cli/lib/run.test.d.ts.map +0 -1
  387. package/dist/esm-types/cli/lib/runTestFunction.test.d.ts +0 -2
  388. package/dist/esm-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
  389. package/dist/esm-types/cli/lib/typecheck.test.d.ts +0 -2
  390. package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +0 -1
  391. package/dist/esm-types/cli/lib/updates.test.d.ts +0 -2
  392. package/dist/esm-types/cli/lib/updates.test.d.ts.map +0 -1
  393. package/dist/esm-types/cli/lib/utils/hash.test.d.ts +0 -2
  394. package/dist/esm-types/cli/lib/utils/hash.test.d.ts.map +0 -1
  395. package/dist/esm-types/cli/lib/utils/utils.test.d.ts +0 -2
  396. package/dist/esm-types/cli/lib/utils/utils.test.d.ts.map +0 -1
  397. package/dist/esm-types/cli/lib/versionApi.test.d.ts +0 -2
  398. package/dist/esm-types/cli/lib/versionApi.test.d.ts.map +0 -1
  399. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
  400. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
  401. package/dist/esm-types/cli/lib/workos/workos.test.d.ts +0 -2
  402. package/dist/esm-types/cli/lib/workos/workos.test.d.ts.map +0 -1
  403. package/dist/esm-types/cli/login.test.d.ts +0 -2
  404. package/dist/esm-types/cli/login.test.d.ts.map +0 -1
  405. package/dist/esm-types/common/index.test.d.ts +0 -2
  406. package/dist/esm-types/common/index.test.d.ts.map +0 -1
  407. package/dist/esm-types/nextjs/nextjs.test.d.ts +0 -2
  408. package/dist/esm-types/nextjs/nextjs.test.d.ts.map +0 -1
  409. package/dist/esm-types/react/ConvexAuthState.test.d.ts +0 -2
  410. package/dist/esm-types/react/ConvexAuthState.test.d.ts.map +0 -1
  411. package/dist/esm-types/react/auth_helpers.test.d.ts +0 -2
  412. package/dist/esm-types/react/auth_helpers.test.d.ts.map +0 -1
  413. package/dist/esm-types/react/auth_websocket.test.d.ts +0 -2
  414. package/dist/esm-types/react/auth_websocket.test.d.ts.map +0 -1
  415. package/dist/esm-types/react/client.test.d.ts +0 -2
  416. package/dist/esm-types/react/client.test.d.ts.map +0 -1
  417. package/dist/esm-types/react/client_provided_base_client.test.d.ts +0 -2
  418. package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +0 -1
  419. package/dist/esm-types/react/queries_observer.test.d.ts +0 -2
  420. package/dist/esm-types/react/queries_observer.test.d.ts.map +0 -1
  421. package/dist/esm-types/react/react_node.test.d.ts +0 -2
  422. package/dist/esm-types/react/react_node.test.d.ts.map +0 -1
  423. package/dist/esm-types/react/use_paginated_query.test.d.ts +0 -2
  424. package/dist/esm-types/react/use_paginated_query.test.d.ts.map +0 -1
  425. package/dist/esm-types/react/use_queries.test.d.ts +0 -5
  426. package/dist/esm-types/react/use_queries.test.d.ts.map +0 -1
  427. package/dist/esm-types/react/use_query.test.d.ts +0 -5
  428. package/dist/esm-types/react/use_query.test.d.ts.map +0 -1
  429. package/dist/esm-types/react/use_query_object_options.test.d.ts +0 -5
  430. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +0 -1
  431. package/dist/esm-types/react/use_query_result.test.d.ts +0 -5
  432. package/dist/esm-types/react/use_query_result.test.d.ts.map +0 -1
  433. package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
  434. package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
  435. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
  436. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
  437. package/dist/esm-types/server/api.intersect.test.d.ts +0 -2
  438. package/dist/esm-types/server/api.intersect.test.d.ts.map +0 -1
  439. package/dist/esm-types/server/api.test.d.ts +0 -2
  440. package/dist/esm-types/server/api.test.d.ts.map +0 -1
  441. package/dist/esm-types/server/audit_logging.test.d.ts +0 -2
  442. package/dist/esm-types/server/audit_logging.test.d.ts.map +0 -1
  443. package/dist/esm-types/server/components/index.test.d.ts +0 -2
  444. package/dist/esm-types/server/components/index.test.d.ts.map +0 -1
  445. package/dist/esm-types/server/cron.test.d.ts +0 -2
  446. package/dist/esm-types/server/cron.test.d.ts.map +0 -1
  447. package/dist/esm-types/server/data_model.test.d.ts +0 -2
  448. package/dist/esm-types/server/data_model.test.d.ts.map +0 -1
  449. package/dist/esm-types/server/database.test.d.ts +0 -2
  450. package/dist/esm-types/server/database.test.d.ts.map +0 -1
  451. package/dist/esm-types/server/database_api.test.d.ts +0 -2
  452. package/dist/esm-types/server/database_api.test.d.ts.map +0 -1
  453. package/dist/esm-types/server/filter_builder.test.d.ts +0 -2
  454. package/dist/esm-types/server/filter_builder.test.d.ts.map +0 -1
  455. package/dist/esm-types/server/impl/actions_impl.test.d.ts +0 -2
  456. package/dist/esm-types/server/impl/actions_impl.test.d.ts.map +0 -1
  457. package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts +0 -2
  458. package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
  459. package/dist/esm-types/server/impl/query_impl.test.d.ts +0 -2
  460. package/dist/esm-types/server/impl/query_impl.test.d.ts.map +0 -1
  461. package/dist/esm-types/server/pagination.test.d.ts +0 -2
  462. package/dist/esm-types/server/pagination.test.d.ts.map +0 -1
  463. package/dist/esm-types/server/query.test.d.ts +0 -2
  464. package/dist/esm-types/server/query.test.d.ts.map +0 -1
  465. package/dist/esm-types/server/registration.test.d.ts +0 -2
  466. package/dist/esm-types/server/registration.test.d.ts.map +0 -1
  467. package/dist/esm-types/server/router.test.d.ts +0 -2
  468. package/dist/esm-types/server/router.test.d.ts.map +0 -1
  469. package/dist/esm-types/server/scheduler.test.d.ts +0 -2
  470. package/dist/esm-types/server/scheduler.test.d.ts.map +0 -1
  471. package/dist/esm-types/server/schema.test.d.ts +0 -2
  472. package/dist/esm-types/server/schema.test.d.ts.map +0 -1
  473. package/dist/esm-types/test/fake_watch.d.ts +0 -16
  474. package/dist/esm-types/test/fake_watch.d.ts.map +0 -1
  475. package/dist/esm-types/test/type_testing.d.ts +0 -9
  476. package/dist/esm-types/test/type_testing.d.ts.map +0 -1
  477. package/dist/esm-types/type_utils.test.d.ts +0 -2
  478. package/dist/esm-types/type_utils.test.d.ts.map +0 -1
  479. package/dist/esm-types/values/size.test.d.ts +0 -2
  480. package/dist/esm-types/values/size.test.d.ts.map +0 -1
  481. package/dist/esm-types/values/validator.test.d.ts +0 -2
  482. package/dist/esm-types/values/validator.test.d.ts.map +0 -1
  483. package/dist/esm-types/values/value.test.d.ts +0 -2
  484. package/dist/esm-types/values/value.test.d.ts.map +0 -1
  485. package/src/browser/http_client.test.ts +0 -202
  486. package/src/browser/query_options.test.ts +0 -43
  487. package/src/browser/simple_client.test.ts +0 -104
  488. package/src/browser/sync/client.test.ts +0 -44
  489. package/src/browser/sync/client_node.test.ts +0 -1207
  490. package/src/browser/sync/client_node_test_helpers.ts +0 -200
  491. package/src/browser/sync/local_state.test.ts +0 -128
  492. package/src/browser/sync/optimistic_query_set.test.ts +0 -253
  493. package/src/browser/sync/paginated_query_client.test.ts +0 -597
  494. package/src/browser/sync/protocol.test.ts +0 -14
  495. package/src/browser/sync/request_manager.test.ts +0 -273
  496. package/src/bundler/fs.test.ts +0 -86
  497. package/src/bundler/index.test.ts +0 -210
  498. package/src/bundler/test_fixtures/js/project01/bar.js +0 -4
  499. package/src/bundler/test_fixtures/js/project01/file with spaces.js +0 -1
  500. package/src/bundler/test_fixtures/js/project01/foo.js +0 -9
  501. package/src/bundler/test_fixtures/js/project_with_https/https.js +0 -9
  502. package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/default.js +0 -3
  503. package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/more_code/https.js +0 -5
  504. package/src/bundler/test_fixtures/js/project_with_https_without_router/https.js +0 -1
  505. package/src/bundler/test_fixtures/js/project_with_node_shims/uses_node_shims.js +0 -4
  506. package/src/cli/codegen_templates/api.test.ts +0 -18
  507. package/src/cli/codegen_templates/common.test.ts +0 -52
  508. package/src/cli/codegen_templates/templates.test.ts +0 -16
  509. package/src/cli/codegen_templates/validator_helpers.test.ts +0 -31
  510. package/src/cli/configure.test.ts +0 -138
  511. package/src/cli/deploymentCreate.test.ts +0 -1376
  512. package/src/cli/deploymentSelect.test.ts +0 -1291
  513. package/src/cli/deploymentSelection.test.ts +0 -2546
  514. package/src/cli/deploymentToken.test.ts +0 -397
  515. package/src/cli/dev.test.ts +0 -157
  516. package/src/cli/envDefault.test.ts +0 -495
  517. package/src/cli/lib/__snapshots__/formatTargetedDeployment.test.ts.snap +0 -94
  518. package/src/cli/lib/aiFiles/agentsmd.test.ts +0 -133
  519. package/src/cli/lib/aiFiles/claudemd.test.ts +0 -92
  520. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +0 -50
  521. package/src/cli/lib/aiFiles/index.test.ts +0 -986
  522. package/src/cli/lib/aiFiles/integration.test.ts +0 -692
  523. package/src/cli/lib/aiFiles/prompt.test.ts +0 -202
  524. package/src/cli/lib/aiFiles/state.test.ts +0 -305
  525. package/src/cli/lib/aiFiles/utils.test.ts +0 -50
  526. package/src/cli/lib/codegen.test.ts +0 -49
  527. package/src/cli/lib/components.test.ts +0 -227
  528. package/src/cli/lib/config.test.ts +0 -1026
  529. package/src/cli/lib/deployment.test.ts +0 -85
  530. package/src/cli/lib/deploymentSelector.test.ts +0 -107
  531. package/src/cli/lib/env.test.ts +0 -60
  532. package/src/cli/lib/expiration.test.ts +0 -159
  533. package/src/cli/lib/extractDeploymentNameForWorkOS.test.ts +0 -30
  534. package/src/cli/lib/formatEnvValueForDotfile.test.ts +0 -294
  535. package/src/cli/lib/formatTargetedDeployment.test.ts +0 -281
  536. package/src/cli/lib/fsUtils.test.ts +0 -67
  537. package/src/cli/lib/generateDocs.test.ts +0 -326
  538. package/src/cli/lib/indexes.test.ts +0 -77
  539. package/src/cli/lib/localDeployment/run.test.ts +0 -104
  540. package/src/cli/lib/localDeployment/secrets.test.ts +0 -53
  541. package/src/cli/lib/run.test.ts +0 -54
  542. package/src/cli/lib/runTestFunction.test.ts +0 -84
  543. package/src/cli/lib/typecheck.test.ts +0 -71
  544. package/src/cli/lib/updates.test.ts +0 -157
  545. package/src/cli/lib/utils/hash.test.ts +0 -25
  546. package/src/cli/lib/utils/utils.test.ts +0 -340
  547. package/src/cli/lib/versionApi.test.ts +0 -471
  548. package/src/cli/lib/workos/environmentApi.test.ts +0 -107
  549. package/src/cli/lib/workos/workos.test.ts +0 -242
  550. package/src/cli/login.test.ts +0 -261
  551. package/src/common/README.md +0 -2
  552. package/src/common/index.test.ts +0 -35
  553. package/src/nextjs/nextjs.test.tsx +0 -94
  554. package/src/react/ConvexAuthState.test.tsx +0 -702
  555. package/src/react/auth_helpers.test.tsx +0 -45
  556. package/src/react/auth_websocket.test.tsx +0 -1177
  557. package/src/react/client.test.tsx +0 -261
  558. package/src/react/client_provided_base_client.test.tsx +0 -174
  559. package/src/react/queries_observer.test.ts +0 -176
  560. package/src/react/react_node.test.ts +0 -78
  561. package/src/react/use_paginated_query.test.tsx +0 -1420
  562. package/src/react/use_queries.test.ts +0 -140
  563. package/src/react/use_query.test.ts +0 -71
  564. package/src/react/use_query_object_options.test.ts +0 -51
  565. package/src/react/use_query_result.test.ts +0 -75
  566. package/src/react-auth0/ConvexProviderWithAuth0.test.tsx +0 -17
  567. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +0 -18
  568. package/src/server/README.md +0 -15
  569. package/src/server/api.intersect.test.ts +0 -109
  570. package/src/server/api.test.ts +0 -447
  571. package/src/server/audit_logging.test.ts +0 -131
  572. package/src/server/components/index.test.ts +0 -48
  573. package/src/server/cron.test.ts +0 -58
  574. package/src/server/data_model.test.ts +0 -221
  575. package/src/server/database.test.ts +0 -184
  576. package/src/server/database_api.test.ts +0 -439
  577. package/src/server/filter_builder.test.ts +0 -102
  578. package/src/server/impl/actions_impl.test.ts +0 -59
  579. package/src/server/impl/filter_builder_impl.test.ts +0 -13
  580. package/src/server/impl/query_impl.test.ts +0 -46
  581. package/src/server/pagination.test.ts +0 -49
  582. package/src/server/query.test.ts +0 -112
  583. package/src/server/registration.test.ts +0 -589
  584. package/src/server/router.test.ts +0 -148
  585. package/src/server/scheduler.test.ts +0 -31
  586. package/src/server/schema.test.ts +0 -1081
  587. package/src/test/fake_watch.ts +0 -54
  588. package/src/test/type_testing.ts +0 -21
  589. package/src/type_utils.test.ts +0 -62
  590. package/src/values/size.test.ts +0 -95
  591. package/src/values/validator.test.ts +0 -619
  592. package/src/values/value.test.ts +0 -232
  593. package/src/vendor/README.md +0 -18
  594. package/src/vendor/jwt-decode/README.md +0 -1
@@ -1,1376 +0,0 @@
1
- import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
2
- // @inquirer/testing/vitest must be imported before modules that use @inquirer/*
3
- import { screen } from "@inquirer/testing/vitest";
4
- import { fileURLToPath } from "url";
5
- import path from "path";
6
- import {
7
- typedPlatformClient,
8
- typedBigBrainClient,
9
- selectRegion,
10
- logNoDefaultRegionMessage,
11
- } from "./lib/utils/utils.js";
12
- import { ProjectResponse } from "@convex-dev/platform/managementApi";
13
- import {
14
- DeploymentSelection,
15
- getDeploymentSelection,
16
- getProjectDetails,
17
- deploymentNameFromSelection,
18
- initializeBigBrainAuth,
19
- } from "./lib/deploymentSelection.js";
20
- import type { Context } from "../bundler/context.js";
21
- import { saveSelectedDeployment } from "./deploymentSelect.js";
22
- import {
23
- deploymentCreate,
24
- resolveRegionDetails,
25
- resolveClassDetails,
26
- } from "./deploymentCreate.js";
27
- import { ensureBackendBinaryDownloaded } from "./lib/localDeployment/download.js";
28
- import {
29
- loadProjectLocalConfig,
30
- saveDeploymentConfig,
31
- } from "./lib/localDeployment/filePaths.js";
32
- import { chooseLocalBackendPorts } from "./lib/localDeployment/utils.js";
33
- import { bigBrainStart } from "./lib/localDeployment/bigBrain.js";
34
-
35
- vi.mock("@sentry/node", () => ({
36
- captureException: vi.fn(),
37
- close: vi.fn(),
38
- }));
39
-
40
- vi.mock("./lib/utils/utils.js", async (importOriginal) => {
41
- const actual = await importOriginal<typeof import("./lib/utils/utils.js")>();
42
- return {
43
- ...actual,
44
- typedPlatformClient: vi.fn(),
45
- typedBigBrainClient: vi.fn(),
46
- selectRegion: vi.fn(),
47
- logNoDefaultRegionMessage: vi.fn(),
48
- };
49
- });
50
-
51
- vi.mock("./lib/deploymentSelection.js", async (importOriginal) => {
52
- const actual =
53
- await importOriginal<typeof import("./lib/deploymentSelection.js")>();
54
- return {
55
- ...actual,
56
- initializeBigBrainAuth: vi.fn(),
57
- getDeploymentSelection: vi.fn(),
58
- getProjectDetails: vi.fn(),
59
- deploymentNameFromSelection: vi.fn().mockReturnValue(null),
60
- };
61
- });
62
-
63
- vi.mock("./deploymentSelect.js", () => ({
64
- saveSelectedDeployment: vi.fn(),
65
- }));
66
-
67
- vi.mock("./lib/localDeployment/download.js", () => ({
68
- ensureBackendBinaryDownloaded: vi.fn(),
69
- }));
70
-
71
- vi.mock("./lib/localDeployment/filePaths.js", () => ({
72
- loadProjectLocalConfig: vi.fn(),
73
- saveDeploymentConfig: vi.fn(),
74
- }));
75
-
76
- vi.mock("./lib/localDeployment/utils.js", () => ({
77
- chooseLocalBackendPorts: vi.fn(),
78
- }));
79
-
80
- vi.mock("./lib/localDeployment/bigBrain.js", () => ({
81
- bigBrainStart: vi.fn(),
82
- }));
83
-
84
- const fakeLocalDevBinary = path.join(
85
- path.dirname(fileURLToPath(import.meta.url)),
86
- "lib/localDeployment/tests/keygenSuccess.mjs",
87
- );
88
-
89
- const mockRegions = [
90
- {
91
- name: "aws-us-east-1" as const,
92
- displayName: "US East (Virginia)",
93
- available: true,
94
- },
95
- {
96
- name: "aws-eu-west-1" as const,
97
- displayName: "EU West (Ireland)",
98
- available: true,
99
- },
100
- ];
101
-
102
- const mockClasses = [
103
- {
104
- type: "s16" as const,
105
- available: true,
106
- },
107
- {
108
- type: "s256" as const,
109
- available: true,
110
- },
111
- {
112
- type: "d1024" as const,
113
- available: false,
114
- },
115
- ];
116
-
117
- const mockPlatformGet = vi.fn();
118
- const mockPlatformPost = vi.fn();
119
- const mockBigBrainGet = vi.fn();
120
-
121
- function setAuthKind(
122
- kind: "accessToken" | "deploymentKey" | "projectKey" | "previewDeployKey",
123
- ) {
124
- vi.mocked(initializeBigBrainAuth).mockImplementation(async (ctx) => {
125
- const fakeAuth =
126
- kind === "accessToken"
127
- ? {
128
- kind: "accessToken" as const,
129
- accessToken: "test-token",
130
- header: "Bearer test-token",
131
- }
132
- : kind === "deploymentKey"
133
- ? {
134
- kind: "deploymentKey" as const,
135
- deploymentKey: "dev:foo|secret",
136
- header: "Bearer dev:foo|secret",
137
- }
138
- : kind === "projectKey"
139
- ? {
140
- kind: "projectKey" as const,
141
- projectKey: "project:foo|secret",
142
- header: "Bearer project:foo|secret",
143
- }
144
- : {
145
- kind: "previewDeployKey" as const,
146
- previewDeployKey: "preview:t:p|secret",
147
- header: "Bearer preview:t:p|secret",
148
- };
149
- (ctx as Context)._updateBigBrainAuth(fakeAuth);
150
- });
151
- }
152
-
153
- function setNoAuth() {
154
- vi.mocked(initializeBigBrainAuth).mockImplementation(async (ctx) => {
155
- (ctx as Context)._updateBigBrainAuth(null);
156
- });
157
- }
158
-
159
- function setupPlatformClient() {
160
- vi.mocked(typedPlatformClient).mockReturnValue({
161
- GET: mockPlatformGet,
162
- POST: mockPlatformPost,
163
- } as any);
164
- vi.mocked(typedBigBrainClient).mockReturnValue({
165
- GET: mockBigBrainGet,
166
- } as any);
167
- }
168
-
169
- // Suppress process.exit and stderr
170
- beforeEach(() => {
171
- vi.spyOn(process, "exit").mockImplementation((() => {
172
- throw new Error("process.exit called");
173
- }) as any);
174
- vi.spyOn(process.stderr, "write").mockImplementation(() => true);
175
- mockPlatformGet.mockReset();
176
- mockPlatformPost.mockReset();
177
- mockBigBrainGet.mockReset();
178
- // Default to a logged-in personal access token; guard tests override this.
179
- setAuthKind("accessToken");
180
- });
181
-
182
- afterEach(() => {
183
- vi.restoreAllMocks();
184
- });
185
-
186
- const fakeProject = {
187
- id: 123,
188
- teamId: 456,
189
- slug: "my-project",
190
- createTime: 0,
191
- name: "My Project",
192
- teamSlug: "my-team",
193
- } satisfies ProjectResponse;
194
-
195
- const createdDeployment = {
196
- kind: "cloud" as const,
197
- reference: "dev/my-deployment",
198
- deploymentType: "dev" as const,
199
- isDefault: false,
200
- };
201
-
202
- function setupPlatformForCreate(overrides?: Record<string, unknown>) {
203
- setupPlatformClient();
204
- mockPlatformGet.mockImplementation((path: string) => {
205
- if (path === "/teams/{team_id}/list_deployment_regions") {
206
- return { data: { items: mockRegions } };
207
- }
208
- if (path === "/teams/{team_id}/list_deployment_classes") {
209
- return { data: { items: mockClasses } };
210
- }
211
- throw new Error(`Unmocked GET route: ${path}`);
212
- });
213
- mockPlatformPost.mockResolvedValue({
214
- data: { ...createdDeployment, ...overrides },
215
- });
216
- }
217
-
218
- describe("deploy key guard", () => {
219
- test.each(["deploymentKey", "previewDeployKey"] as const)(
220
- "crashes before any platform call when authed with a %s",
221
- async (kind) => {
222
- setAuthKind(kind);
223
- setupPlatformClient();
224
-
225
- await expect(
226
- deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
227
- from: "user",
228
- }),
229
- ).rejects.toThrow();
230
-
231
- expect(process.stderr.write).toHaveBeenCalledWith(
232
- expect.stringContaining("isn't supported with a deploy key"),
233
- );
234
- expect(mockPlatformGet).not.toHaveBeenCalled();
235
- expect(mockPlatformPost).not.toHaveBeenCalled();
236
- },
237
- );
238
-
239
- test("crashes when no auth is configured at all", async () => {
240
- setNoAuth();
241
- setupPlatformClient();
242
-
243
- await expect(
244
- deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
245
- from: "user",
246
- }),
247
- ).rejects.toThrow();
248
-
249
- expect(process.stderr.write).toHaveBeenCalledWith(
250
- expect.stringContaining("Creating a deployment requires logging in"),
251
- );
252
- expect(mockPlatformGet).not.toHaveBeenCalled();
253
- expect(mockPlatformPost).not.toHaveBeenCalled();
254
- });
255
-
256
- test("also guards local deployment creation", async () => {
257
- setAuthKind("deploymentKey");
258
- setupPlatformClient();
259
-
260
- await expect(
261
- deploymentCreate.parseAsync(["local"], { from: "user" }),
262
- ).rejects.toThrow();
263
-
264
- expect(process.stderr.write).toHaveBeenCalledWith(
265
- expect.stringContaining("isn't supported with a deploy key"),
266
- );
267
- expect(mockPlatformGet).not.toHaveBeenCalled();
268
- expect(mockPlatformPost).not.toHaveBeenCalled();
269
- });
270
- });
271
-
272
- describe("non-interactive create flow", () => {
273
- beforeEach(() => {
274
- vi.mocked(getDeploymentSelection).mockReset();
275
- vi.mocked(getProjectDetails).mockReset();
276
- vi.mocked(saveSelectedDeployment).mockReset();
277
- vi.mocked(deploymentNameFromSelection).mockReset();
278
- vi.mocked(deploymentNameFromSelection).mockReturnValue(null);
279
- });
280
-
281
- describe("validation errors", () => {
282
- test("crashes when no ref and no --default", async () => {
283
- await expect(
284
- deploymentCreate.parseAsync(["--type", "dev"], { from: "user" }),
285
- ).rejects.toThrow();
286
- expect(process.stderr.write).toHaveBeenCalledWith(
287
- expect.stringContaining("Specify a deployment ref"),
288
- );
289
- });
290
-
291
- test("crashes when --type is missing", async () => {
292
- await expect(
293
- deploymentCreate.parseAsync(["my-deployment"], { from: "user" }),
294
- ).rejects.toThrow();
295
- expect(process.stderr.write).toHaveBeenCalledWith(
296
- expect.stringContaining("--type is required"),
297
- );
298
- });
299
-
300
- test("creates a local deployment: downloads binary, chooses ports, registers with Big Brain, saves config", async () => {
301
- vi.mocked(getDeploymentSelection).mockResolvedValue({
302
- kind: "existingDeployment",
303
- deploymentToActOn: {
304
- url: "https://joyful-capybara-123.convex.cloud",
305
- adminKey: "admin-key",
306
- deploymentFields: {
307
- deploymentName: "joyful-capybara-123",
308
- deploymentType: "dev",
309
- teamSlug: "my-team",
310
- projectSlug: "my-project",
311
- reference: "dev/nicolas",
312
- isDefault: true,
313
- },
314
- source: "deployKey" as const,
315
- },
316
- });
317
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
318
- vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
319
- vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
320
- binaryPath: fakeLocalDevBinary,
321
- version: "1.0.0",
322
- });
323
- vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
324
- cloudPort: 3210,
325
- sitePort: 3211,
326
- });
327
- vi.mocked(bigBrainStart).mockResolvedValue({
328
- deploymentName: "local-test-123",
329
- adminKey: "test-key",
330
- projectId: 42,
331
- });
332
- setupPlatformClient();
333
- mockPlatformGet.mockResolvedValue({ data: { items: [] } });
334
-
335
- await deploymentCreate.parseAsync(["local"], { from: "user" });
336
-
337
- expect(saveDeploymentConfig).toHaveBeenCalledWith(
338
- expect.anything(),
339
- "local",
340
- "local-test-123",
341
- {
342
- backendVersion: "1.0.0",
343
- ports: { cloud: 3210, site: 3211 },
344
- adminKey: "local-test-123|mock_admin_key",
345
- instanceSecret: expect.anything(),
346
- cloudProjectId: fakeProject.id,
347
- },
348
- );
349
- expect(mockPlatformPost).not.toHaveBeenCalled();
350
- });
351
-
352
- test("creates a local deployment with --select and selects it", async () => {
353
- vi.mocked(getDeploymentSelection).mockResolvedValue({
354
- kind: "existingDeployment",
355
- deploymentToActOn: {
356
- url: "https://joyful-capybara-123.convex.cloud",
357
- adminKey: "admin-key",
358
- deploymentFields: {
359
- deploymentName: "joyful-capybara-123",
360
- deploymentType: "dev",
361
- teamSlug: "my-team",
362
- projectSlug: "my-project",
363
- reference: "dev/nicolas",
364
- isDefault: true,
365
- },
366
- source: "deployKey" as const,
367
- },
368
- });
369
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
370
- vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
371
- vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
372
- binaryPath: fakeLocalDevBinary,
373
- version: "1.0.0",
374
- });
375
- vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
376
- cloudPort: 3210,
377
- sitePort: 3211,
378
- });
379
- vi.mocked(bigBrainStart).mockResolvedValue({
380
- deploymentName: "local-test-123",
381
- adminKey: "test-key",
382
- projectId: 42,
383
- });
384
- setupPlatformClient();
385
- mockPlatformGet.mockResolvedValue({ data: { items: [] } });
386
-
387
- await deploymentCreate.parseAsync(["local", "--select"], {
388
- from: "user",
389
- });
390
-
391
- expect(saveSelectedDeployment).toHaveBeenCalledWith(
392
- expect.anything(),
393
- "local",
394
- {
395
- kind: "deploymentWithinProject",
396
- targetProject: {
397
- kind: "deploymentName",
398
- deploymentName: "local-test-123",
399
- deploymentType: "local",
400
- },
401
- selectionWithinProject: {
402
- kind: "deploymentSelector",
403
- selector: "local",
404
- },
405
- },
406
- null,
407
- );
408
- });
409
-
410
- test("crashes when creating a local deployment with --type", async () => {
411
- await expect(
412
- deploymentCreate.parseAsync(["local", "--type", "dev"], {
413
- from: "user",
414
- }),
415
- ).rejects.toThrow();
416
- expect(process.stderr.write).toHaveBeenCalledWith(
417
- expect.stringContaining(
418
- "--type cannot be used when creating a local deployment",
419
- ),
420
- );
421
- expect(mockPlatformPost).not.toHaveBeenCalled();
422
- });
423
-
424
- test("errors when local deployment already exists", async () => {
425
- vi.mocked(getDeploymentSelection).mockResolvedValue({
426
- kind: "existingDeployment",
427
- deploymentToActOn: {
428
- url: "https://joyful-capybara-123.convex.cloud",
429
- adminKey: "admin-key",
430
- deploymentFields: {
431
- deploymentName: "joyful-capybara-123",
432
- deploymentType: "dev",
433
- teamSlug: "my-team",
434
- projectSlug: "my-project",
435
- reference: "dev/nicolas",
436
- isDefault: true,
437
- },
438
- source: "deployKey" as const,
439
- },
440
- });
441
- vi.mocked(loadProjectLocalConfig).mockReturnValue({
442
- deploymentName: "existing-local-123",
443
- config: {} as any,
444
- });
445
-
446
- await expect(
447
- deploymentCreate.parseAsync(["local"], { from: "user" }),
448
- ).rejects.toThrow();
449
- expect(process.stderr.write).toHaveBeenCalledWith(
450
- expect.stringContaining("A local deployment already exists"),
451
- );
452
- });
453
-
454
- test.each(["region", "class", "default", "expiration"] as const)(
455
- "rejects --%s with local",
456
- async (flag) => {
457
- const args = ["local", `--${flag}`];
458
- if (flag === "region") args.push("us");
459
- if (flag === "class") args.push("s16");
460
- if (flag === "expiration") args.push("none");
461
-
462
- await expect(
463
- deploymentCreate.parseAsync(args, { from: "user" }),
464
- ).rejects.toThrow();
465
- expect(process.stderr.write).toHaveBeenCalledWith(
466
- expect.stringContaining(
467
- `--${flag} cannot be used when creating a local deployment`,
468
- ),
469
- );
470
- },
471
- );
472
- });
473
-
474
- describe("with project configured", () => {
475
- beforeEach(() => {
476
- vi.mocked(getDeploymentSelection).mockResolvedValue({
477
- kind: "existingDeployment",
478
- deploymentToActOn: {
479
- url: "https://joyful-capybara-123.convex.cloud",
480
- adminKey: "admin-key",
481
- deploymentFields: {
482
- deploymentName: "joyful-capybara-123",
483
- deploymentType: "dev",
484
- teamSlug: "my-team",
485
- projectSlug: "my-project",
486
- reference: "dev/nicolas",
487
- isDefault: true,
488
- },
489
- source: "deployKey" as const,
490
- },
491
- });
492
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
493
- });
494
-
495
- test("creates a dev deployment with ref and --type dev", async () => {
496
- setupPlatformForCreate();
497
-
498
- await deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
499
- from: "user",
500
- });
501
-
502
- expect(mockPlatformPost).toHaveBeenCalledWith(
503
- "/projects/{project_id}/create_deployment",
504
- expect.objectContaining({
505
- params: { path: { project_id: 123 } },
506
- body: {
507
- type: "dev",
508
- region: null,
509
- reference: "my-deployment",
510
- isDefault: null,
511
- },
512
- }),
513
- );
514
- });
515
-
516
- test("allows a project key (creates the deployment)", async () => {
517
- setAuthKind("projectKey");
518
- setupPlatformForCreate();
519
-
520
- await deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
521
- from: "user",
522
- });
523
-
524
- expect(mockPlatformPost).toHaveBeenCalledWith(
525
- "/projects/{project_id}/create_deployment",
526
- expect.objectContaining({
527
- body: expect.objectContaining({
528
- type: "dev",
529
- reference: "my-deployment",
530
- }),
531
- }),
532
- );
533
- });
534
-
535
- test("creates a prod deployment with ref and --type prod", async () => {
536
- setupPlatformForCreate({
537
- deploymentType: "prod",
538
- reference: "staging",
539
- });
540
-
541
- await deploymentCreate.parseAsync(["staging", "--type", "prod"], {
542
- from: "user",
543
- });
544
-
545
- expect(mockPlatformPost).toHaveBeenCalledWith(
546
- "/projects/{project_id}/create_deployment",
547
- expect.objectContaining({
548
- body: expect.objectContaining({
549
- type: "prod",
550
- reference: "staging",
551
- }),
552
- }),
553
- );
554
- });
555
-
556
- test("creates a deployment with --default flag", async () => {
557
- setupPlatformForCreate({ isDefault: true });
558
-
559
- await deploymentCreate.parseAsync(
560
- ["my-deployment", "--type", "dev", "--default"],
561
- { from: "user" },
562
- );
563
-
564
- expect(mockPlatformPost).toHaveBeenCalledWith(
565
- "/projects/{project_id}/create_deployment",
566
- expect.objectContaining({
567
- body: expect.objectContaining({
568
- isDefault: true,
569
- }),
570
- }),
571
- );
572
- });
573
-
574
- test("creates a default deployment without a ref", async () => {
575
- setupPlatformForCreate({ isDefault: true, reference: null });
576
-
577
- await deploymentCreate.parseAsync(["--type", "dev", "--default"], {
578
- from: "user",
579
- });
580
-
581
- expect(mockPlatformPost).toHaveBeenCalledWith(
582
- "/projects/{project_id}/create_deployment",
583
- expect.objectContaining({
584
- body: {
585
- type: "dev",
586
- region: null,
587
- reference: null,
588
- isDefault: true,
589
- },
590
- }),
591
- );
592
- });
593
-
594
- test("creates a deployment with --region full name", async () => {
595
- setupPlatformForCreate();
596
-
597
- await deploymentCreate.parseAsync(
598
- ["my-deployment", "--type", "dev", "--region", "aws-eu-west-1"],
599
- { from: "user" },
600
- );
601
-
602
- expect(mockPlatformGet).toHaveBeenCalledWith(
603
- "/teams/{team_id}/list_deployment_regions",
604
- expect.objectContaining({
605
- params: { path: { team_id: "456" } },
606
- }),
607
- );
608
- expect(mockPlatformPost).toHaveBeenCalledWith(
609
- "/projects/{project_id}/create_deployment",
610
- expect.objectContaining({
611
- body: expect.objectContaining({
612
- region: "aws-eu-west-1",
613
- }),
614
- }),
615
- );
616
- });
617
-
618
- test("creates a deployment with --region alias", async () => {
619
- setupPlatformForCreate();
620
-
621
- await deploymentCreate.parseAsync(
622
- ["my-deployment", "--type", "dev", "--region", "us"],
623
- { from: "user" },
624
- );
625
-
626
- expect(mockPlatformPost).toHaveBeenCalledWith(
627
- "/projects/{project_id}/create_deployment",
628
- expect.objectContaining({
629
- body: expect.objectContaining({
630
- region: "aws-us-east-1",
631
- }),
632
- }),
633
- );
634
- });
635
-
636
- test("fails with invalid --region", async () => {
637
- setupPlatformForCreate();
638
-
639
- await expect(
640
- deploymentCreate.parseAsync(
641
- ["my-deployment", "--type", "dev", "--region", "invalid-region"],
642
- { from: "user" },
643
- ),
644
- ).rejects.toThrow();
645
- expect(process.stderr.write).toHaveBeenCalledWith(
646
- expect.stringContaining('Invalid region "invalid-region"'),
647
- );
648
- });
649
-
650
- test("creates a deployment with --class", async () => {
651
- setupPlatformForCreate();
652
-
653
- await deploymentCreate.parseAsync(
654
- ["my-deployment", "--type", "dev", "--class", "s256"],
655
- { from: "user" },
656
- );
657
-
658
- expect(mockPlatformGet).toHaveBeenCalledWith(
659
- "/teams/{team_id}/list_deployment_classes",
660
- expect.objectContaining({
661
- params: { path: { team_id: "456" } },
662
- }),
663
- );
664
- expect(mockPlatformPost).toHaveBeenCalledWith(
665
- "/projects/{project_id}/create_deployment",
666
- expect.objectContaining({
667
- body: expect.objectContaining({
668
- class: "s256",
669
- }),
670
- }),
671
- );
672
- });
673
-
674
- test("fails with invalid --class", async () => {
675
- setupPlatformForCreate();
676
-
677
- await expect(
678
- deploymentCreate.parseAsync(
679
- ["my-deployment", "--type", "dev", "--class", "invalid-class"],
680
- { from: "user" },
681
- ),
682
- ).rejects.toThrow();
683
- expect(process.stderr.write).toHaveBeenCalledWith(
684
- expect.stringContaining('Invalid class "invalid-class"'),
685
- );
686
- });
687
-
688
- test("fails with unavailable --class", async () => {
689
- setupPlatformForCreate();
690
-
691
- await expect(
692
- deploymentCreate.parseAsync(
693
- ["my-deployment", "--type", "dev", "--class", "d1024"],
694
- { from: "user" },
695
- ),
696
- ).rejects.toThrow();
697
- expect(process.stderr.write).toHaveBeenCalledWith(
698
- expect.stringContaining('Invalid class "d1024"'),
699
- );
700
- });
701
-
702
- test("no --class flag does not include class in body", async () => {
703
- setupPlatformForCreate();
704
-
705
- await deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
706
- from: "user",
707
- });
708
-
709
- const call = mockPlatformPost.mock.calls[0];
710
- expect(call[1].body).not.toHaveProperty("class");
711
- });
712
-
713
- test("creates a deployment with --select calls saveSelectedDeployment", async () => {
714
- setupPlatformForCreate({
715
- reference: "dev/my-deployment",
716
- });
717
-
718
- await deploymentCreate.parseAsync(
719
- ["my-deployment", "--type", "dev", "--select"],
720
- { from: "user" },
721
- );
722
-
723
- expect(saveSelectedDeployment).toHaveBeenCalledWith(
724
- expect.anything(),
725
- "dev/my-deployment",
726
- {
727
- kind: "deploymentWithinProject",
728
- targetProject: {
729
- kind: "teamAndProjectSlugs",
730
- teamSlug: "my-team",
731
- projectSlug: "my-project",
732
- },
733
- selectionWithinProject: {
734
- kind: "deploymentSelector",
735
- selector: "dev/my-deployment",
736
- },
737
- },
738
- null,
739
- );
740
- });
741
- });
742
-
743
- describe("with team:project:ref syntax", () => {
744
- test("uses getProjectDetails with teamAndProjectSlugs", async () => {
745
- vi.mocked(getProjectDetails).mockResolvedValue({
746
- ...fakeProject,
747
- slug: "other-project",
748
- teamSlug: "other-team",
749
- });
750
- setupPlatformForCreate();
751
-
752
- await deploymentCreate.parseAsync(
753
- ["other-team:other-project:my-deployment", "--type", "dev"],
754
- { from: "user" },
755
- );
756
-
757
- expect(getProjectDetails).toHaveBeenCalledWith(expect.anything(), {
758
- kind: "teamAndProjectSlugs",
759
- teamSlug: "other-team",
760
- projectSlug: "other-project",
761
- });
762
- expect(mockPlatformPost).toHaveBeenCalledWith(
763
- "/projects/{project_id}/create_deployment",
764
- expect.objectContaining({
765
- body: expect.objectContaining({
766
- reference: "my-deployment",
767
- }),
768
- }),
769
- );
770
- });
771
- });
772
-
773
- describe("project-scoped local deployment creation", () => {
774
- const chooseProjectSelection: DeploymentSelection = {
775
- kind: "chooseProject",
776
- selectionWithinProject: { kind: "unspecified" },
777
- };
778
-
779
- test("creates a local deployment with team:project:local", async () => {
780
- vi.mocked(getDeploymentSelection).mockResolvedValue(
781
- chooseProjectSelection,
782
- );
783
- vi.mocked(getProjectDetails).mockResolvedValue({
784
- ...fakeProject,
785
- id: 999,
786
- teamSlug: "other-team",
787
- slug: "other-project",
788
- });
789
- vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
790
- vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
791
- binaryPath: fakeLocalDevBinary,
792
- version: "1.0.0",
793
- });
794
- vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
795
- cloudPort: 3210,
796
- sitePort: 3211,
797
- });
798
- vi.mocked(bigBrainStart).mockResolvedValue({
799
- deploymentName: "local-other_team-other_project-xyz",
800
- adminKey: "other-key",
801
- projectId: 42,
802
- });
803
- setupPlatformClient();
804
- mockPlatformGet.mockResolvedValue({ data: { items: [] } });
805
-
806
- await deploymentCreate.parseAsync(["other-team:other-project:local"], {
807
- from: "user",
808
- });
809
-
810
- expect(getProjectDetails).toHaveBeenCalledWith(expect.anything(), {
811
- kind: "teamAndProjectSlugs",
812
- teamSlug: "other-team",
813
- projectSlug: "other-project",
814
- });
815
- expect(bigBrainStart).toHaveBeenCalledWith(
816
- expect.anything(),
817
- expect.objectContaining({
818
- teamSlug: "other-team",
819
- projectSlug: "other-project",
820
- }),
821
- );
822
- expect(saveDeploymentConfig).toHaveBeenCalledWith(
823
- expect.anything(),
824
- "local",
825
- "local-other_team-other_project-xyz",
826
- expect.objectContaining({
827
- adminKey: "local-other_team-other_project-xyz|mock_admin_key",
828
- cloudProjectId: 999,
829
- }),
830
- );
831
- });
832
-
833
- test("rejects project:local without team prefix", async () => {
834
- vi.mocked(getDeploymentSelection).mockResolvedValue(
835
- chooseProjectSelection,
836
- );
837
-
838
- await expect(
839
- deploymentCreate.parseAsync(["other-project:local"], { from: "user" }),
840
- ).rejects.toThrow();
841
- expect(process.stderr.write).toHaveBeenCalledWith(
842
- expect.stringContaining(
843
- "Please use `team:project:local` to specify the team",
844
- ),
845
- );
846
- });
847
-
848
- test("team:project:local with --select selects the new local deployment", async () => {
849
- vi.mocked(getDeploymentSelection).mockResolvedValue(
850
- chooseProjectSelection,
851
- );
852
- vi.mocked(getProjectDetails).mockResolvedValue({
853
- ...fakeProject,
854
- id: 999,
855
- teamSlug: "other-team",
856
- slug: "other-project",
857
- });
858
- vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
859
- vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
860
- binaryPath: fakeLocalDevBinary,
861
- version: "1.0.0",
862
- });
863
- vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
864
- cloudPort: 3210,
865
- sitePort: 3211,
866
- });
867
- vi.mocked(bigBrainStart).mockResolvedValue({
868
- deploymentName: "local-other_team-other_project-xyz",
869
- adminKey: "other-key",
870
- projectId: 42,
871
- });
872
- setupPlatformClient();
873
- mockPlatformGet.mockResolvedValue({ data: { items: [] } });
874
-
875
- await deploymentCreate.parseAsync(
876
- ["other-team:other-project:local", "--select"],
877
- { from: "user" },
878
- );
879
-
880
- expect(saveSelectedDeployment).toHaveBeenCalledWith(
881
- expect.anything(),
882
- "local",
883
- expect.objectContaining({
884
- targetProject: {
885
- kind: "deploymentName",
886
- deploymentName: "local-other_team-other_project-xyz",
887
- deploymentType: "local",
888
- },
889
- }),
890
- null,
891
- );
892
- });
893
-
894
- test("plain `local` fails when no project context is available", async () => {
895
- vi.mocked(getDeploymentSelection).mockResolvedValue(
896
- chooseProjectSelection,
897
- );
898
- vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
899
-
900
- await expect(
901
- deploymentCreate.parseAsync(["local"], { from: "user" }),
902
- ).rejects.toThrow();
903
- expect(process.stderr.write).toHaveBeenCalledWith(
904
- expect.stringContaining("No project configured yet"),
905
- );
906
- });
907
- });
908
-
909
- describe("--expiration flag", () => {
910
- beforeEach(() => {
911
- vi.mocked(getDeploymentSelection).mockResolvedValue({
912
- kind: "existingDeployment",
913
- deploymentToActOn: {
914
- url: "https://joyful-capybara-123.convex.cloud",
915
- adminKey: "admin-key",
916
- deploymentFields: {
917
- deploymentName: "joyful-capybara-123",
918
- deploymentType: "dev",
919
- teamSlug: "my-team",
920
- projectSlug: "my-project",
921
- reference: "dev/nicolas",
922
- isDefault: true,
923
- },
924
- source: "deployKey" as const,
925
- },
926
- });
927
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
928
- });
929
-
930
- test("--expiration none sends expiresAt: null", async () => {
931
- setupPlatformForCreate();
932
-
933
- await deploymentCreate.parseAsync(
934
- ["my-deployment", "--type", "dev", "--expiration", "none"],
935
- { from: "user" },
936
- );
937
-
938
- expect(mockPlatformPost).toHaveBeenCalledWith(
939
- "/projects/{project_id}/create_deployment",
940
- expect.objectContaining({
941
- body: expect.objectContaining({
942
- expiresAt: null,
943
- }),
944
- }),
945
- );
946
- });
947
-
948
- test("--expiration with timestamp sends correct ms value", async () => {
949
- setupPlatformForCreate();
950
-
951
- // Use a timestamp far enough in the future to pass validation
952
- const futureMs = Date.now() + 2 * 60 * 60 * 1000; // 2 hours from now
953
- const futureSec = Math.floor(futureMs / 1000);
954
-
955
- await deploymentCreate.parseAsync(
956
- [
957
- "my-deployment",
958
- "--type",
959
- "dev",
960
- "--expiration",
961
- futureSec.toString(),
962
- ],
963
- { from: "user" },
964
- );
965
-
966
- expect(mockPlatformPost).toHaveBeenCalledWith(
967
- "/projects/{project_id}/create_deployment",
968
- expect.objectContaining({
969
- body: expect.objectContaining({
970
- expiresAt: futureSec * 1000,
971
- }),
972
- }),
973
- );
974
- });
975
-
976
- test("no --expiration flag does not include expiresAt in body", async () => {
977
- setupPlatformForCreate();
978
-
979
- await deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
980
- from: "user",
981
- });
982
-
983
- const call = mockPlatformPost.mock.calls[0];
984
- expect(call[1].body).not.toHaveProperty("expiresAt");
985
- });
986
- });
987
-
988
- describe("without project configured", () => {
989
- beforeEach(() => {
990
- vi.mocked(getDeploymentSelection).mockResolvedValue({
991
- kind: "chooseProject",
992
- } as any);
993
- });
994
-
995
- test("fails with bare ref when no project context", async () => {
996
- await expect(
997
- deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
998
- from: "user",
999
- }),
1000
- ).rejects.toThrow();
1001
- expect(process.stderr.write).toHaveBeenCalledWith(
1002
- expect.stringContaining("No project configured yet"),
1003
- );
1004
- });
1005
-
1006
- test("succeeds with team:project:ref syntax", async () => {
1007
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
1008
- setupPlatformForCreate();
1009
-
1010
- await deploymentCreate.parseAsync(
1011
- ["my-team:my-project:my-deployment", "--type", "dev"],
1012
- { from: "user" },
1013
- );
1014
-
1015
- expect(getProjectDetails).toHaveBeenCalledWith(expect.anything(), {
1016
- kind: "teamAndProjectSlugs",
1017
- teamSlug: "my-team",
1018
- projectSlug: "my-project",
1019
- });
1020
- expect(mockPlatformPost).toHaveBeenCalled();
1021
- });
1022
-
1023
- test("hint includes full team:project:ref when no project configured in current directory", async () => {
1024
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
1025
- setupPlatformForCreate();
1026
-
1027
- await deploymentCreate.parseAsync(
1028
- ["my-team:my-project:my-deployment", "--type", "dev"],
1029
- { from: "user" },
1030
- );
1031
-
1032
- expect(process.stderr.write).toHaveBeenCalledWith(
1033
- expect.stringContaining(
1034
- "npx convex deployment select my-team:my-project:dev/my-deployment",
1035
- ),
1036
- );
1037
- });
1038
- });
1039
- });
1040
-
1041
- describe("interactive create flow", () => {
1042
- beforeEach(() => {
1043
- process.stdin.isTTY = true;
1044
- vi.mocked(getDeploymentSelection).mockReset();
1045
- vi.mocked(getProjectDetails).mockReset();
1046
- vi.mocked(saveSelectedDeployment).mockReset();
1047
- vi.mocked(selectRegion).mockReset();
1048
- vi.mocked(deploymentNameFromSelection).mockReset();
1049
- vi.mocked(deploymentNameFromSelection).mockReturnValue(null);
1050
-
1051
- // Default: project configured via deployment selection
1052
- vi.mocked(getDeploymentSelection).mockResolvedValue({
1053
- kind: "existingDeployment",
1054
- deploymentToActOn: {
1055
- url: "https://joyful-capybara-123.convex.cloud",
1056
- adminKey: "admin-key",
1057
- deploymentFields: {
1058
- deploymentName: "joyful-capybara-123",
1059
- deploymentType: "dev",
1060
- teamSlug: "my-team",
1061
- projectSlug: "my-project",
1062
- reference: "dev/nicolas",
1063
- isDefault: true,
1064
- },
1065
- source: "deployKey" as const,
1066
- },
1067
- });
1068
- vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
1069
- });
1070
-
1071
- afterEach(() => {
1072
- process.stdin.isTTY = false;
1073
- });
1074
-
1075
- function setupPlatformRoutes(routes: Record<string, (args: any) => any>) {
1076
- setupPlatformClient();
1077
- mockPlatformGet.mockImplementation((path: string, args: any) => {
1078
- for (const [routePath, handler] of Object.entries(routes)) {
1079
- if (path === routePath || path.startsWith(routePath)) {
1080
- return { data: handler(args) };
1081
- }
1082
- }
1083
- throw new Error(`Unmocked GET route: ${path}`);
1084
- });
1085
- mockPlatformPost.mockResolvedValue({
1086
- data: { ...createdDeployment },
1087
- });
1088
- }
1089
-
1090
- function setupDefaultRoutes() {
1091
- setupPlatformRoutes({
1092
- "/teams/{team_id}/list_deployment_regions": () => ({
1093
- items: mockRegions,
1094
- }),
1095
- "/teams/{team_id}/list_deployment_classes": () => ({
1096
- items: mockClasses,
1097
- }),
1098
- });
1099
- mockBigBrainGet.mockResolvedValue({
1100
- data: [{ id: 456, slug: "my-team", defaultRegion: "aws-us-east-1" }],
1101
- });
1102
- }
1103
-
1104
- test.each([
1105
- { deploymentType: "dev" as const, downPresses: 0 },
1106
- { deploymentType: "preview" as const, downPresses: 1 },
1107
- { deploymentType: "prod" as const, downPresses: 2 },
1108
- ])(
1109
- "selecting $deploymentType calls endpoint with type=$deploymentType",
1110
- async ({ deploymentType, downPresses }) => {
1111
- setupDefaultRoutes();
1112
-
1113
- const promise = deploymentCreate.parseAsync([], { from: "user" });
1114
-
1115
- // Type prompt (select)
1116
- await screen.next();
1117
- expect(screen.getScreen()).toContain("Deployment type?");
1118
- for (let i = 0; i < downPresses; i++) {
1119
- screen.keypress("down");
1120
- }
1121
- screen.keypress("enter");
1122
-
1123
- // Ref prompt (input)
1124
- await screen.next();
1125
- expect(screen.getScreen()).toContain(
1126
- "What do you want to call this deployment",
1127
- );
1128
- screen.type("my-feature");
1129
- screen.keypress("enter");
1130
-
1131
- await promise;
1132
-
1133
- expect(mockPlatformPost).toHaveBeenCalledWith(
1134
- "/projects/{project_id}/create_deployment",
1135
- expect.objectContaining({
1136
- body: expect.objectContaining({
1137
- type: deploymentType,
1138
- }),
1139
- }),
1140
- );
1141
- },
1142
- );
1143
-
1144
- test("full prompt flow: select type, enter ref", async () => {
1145
- setupDefaultRoutes();
1146
-
1147
- const promise = deploymentCreate.parseAsync([], { from: "user" });
1148
-
1149
- // Type prompt (select) — "dev" is first choice, just press enter
1150
- await screen.next();
1151
- expect(screen.getScreen()).toContain("Deployment type?");
1152
- screen.keypress("enter");
1153
-
1154
- // Ref prompt (input)
1155
- await screen.next();
1156
- expect(screen.getScreen()).toContain(
1157
- "What do you want to call this deployment",
1158
- );
1159
- screen.type("my-feature");
1160
- screen.keypress("enter");
1161
-
1162
- await promise;
1163
-
1164
- expect(mockPlatformPost).toHaveBeenCalledWith(
1165
- "/projects/{project_id}/create_deployment",
1166
- expect.objectContaining({
1167
- body: {
1168
- type: "dev",
1169
- region: "aws-us-east-1",
1170
- reference: "my-feature",
1171
- isDefault: null,
1172
- },
1173
- }),
1174
- );
1175
- });
1176
-
1177
- test("partial flags: --type dev and ref provided, no prompts needed", async () => {
1178
- setupDefaultRoutes();
1179
-
1180
- const promise = deploymentCreate.parseAsync(
1181
- ["my-feature", "--type", "dev"],
1182
- { from: "user" },
1183
- );
1184
-
1185
- await promise;
1186
-
1187
- expect(mockPlatformPost).toHaveBeenCalledWith(
1188
- "/projects/{project_id}/create_deployment",
1189
- expect.objectContaining({
1190
- body: expect.objectContaining({
1191
- type: "dev",
1192
- reference: "my-feature",
1193
- isDefault: null,
1194
- }),
1195
- }),
1196
- );
1197
- });
1198
-
1199
- test("invalid ref retry: user enters invalid ref, then valid ref", async () => {
1200
- setupDefaultRoutes();
1201
-
1202
- const promise = deploymentCreate.parseAsync(["--type", "dev"], {
1203
- from: "user",
1204
- });
1205
-
1206
- // Ref prompt — enter invalid ref "dev"
1207
- await screen.next();
1208
- expect(screen.getScreen()).toContain(
1209
- "What do you want to call this deployment",
1210
- );
1211
- screen.type("dev");
1212
- screen.keypress("enter");
1213
-
1214
- // Inline validation error, then edit input
1215
- await screen.next();
1216
- expect(screen.getScreen()).toContain(
1217
- '"dev" is reserved as an alias for your default dev deployment.',
1218
- );
1219
- screen.type("/my-feature");
1220
- screen.keypress("enter");
1221
-
1222
- await promise;
1223
-
1224
- expect(mockPlatformPost).toHaveBeenCalledWith(
1225
- "/projects/{project_id}/create_deployment",
1226
- expect.objectContaining({
1227
- body: expect.objectContaining({
1228
- reference: "dev/my-feature",
1229
- isDefault: null,
1230
- }),
1231
- }),
1232
- );
1233
- });
1234
-
1235
- test("interactive ref prompt rejects 'local' as a deployment reference", async () => {
1236
- setupDefaultRoutes();
1237
-
1238
- const promise = deploymentCreate.parseAsync(["--type", "dev"], {
1239
- from: "user",
1240
- });
1241
-
1242
- // Ref prompt — enter "local"
1243
- await screen.next();
1244
- expect(screen.getScreen()).toContain(
1245
- "What do you want to call this deployment",
1246
- );
1247
- screen.type("local");
1248
- screen.keypress("enter");
1249
-
1250
- // Inline validation error
1251
- await screen.next();
1252
- expect(screen.getScreen()).toContain(
1253
- '"local" is reserved as an alias for your local deployment',
1254
- );
1255
-
1256
- // Fix the input
1257
- screen.type("ization-improvements");
1258
- screen.keypress("enter");
1259
-
1260
- await promise;
1261
-
1262
- expect(mockPlatformPost).toHaveBeenCalledWith(
1263
- "/projects/{project_id}/create_deployment",
1264
- expect.objectContaining({
1265
- body: expect.objectContaining({
1266
- reference: "localization-improvements",
1267
- }),
1268
- }),
1269
- );
1270
- });
1271
-
1272
- test("--region invalid crashes", async () => {
1273
- setupDefaultRoutes();
1274
-
1275
- await expect(
1276
- deploymentCreate.parseAsync(
1277
- ["my-feature", "--type", "dev", "--region", "invalid-region"],
1278
- { from: "user" },
1279
- ),
1280
- ).rejects.toThrow();
1281
- expect(process.stderr.write).toHaveBeenCalledWith(
1282
- expect.stringContaining('Invalid region "invalid-region"'),
1283
- );
1284
- });
1285
-
1286
- test("no team default region: falls through to selectRegion", async () => {
1287
- setupDefaultRoutes();
1288
- // Override BigBrain to return team without defaultRegion
1289
- mockBigBrainGet.mockResolvedValue({
1290
- data: [{ id: 456, slug: "my-team" }],
1291
- });
1292
- vi.mocked(selectRegion).mockResolvedValue("aws-us-east-1");
1293
-
1294
- await deploymentCreate.parseAsync(["my-feature", "--type", "dev"], {
1295
- from: "user",
1296
- });
1297
-
1298
- expect(selectRegion).toHaveBeenCalledWith(expect.anything(), 456, "dev");
1299
- expect(logNoDefaultRegionMessage).toHaveBeenCalledWith("my-team");
1300
- });
1301
-
1302
- test("uses team default region when no --region provided", async () => {
1303
- setupDefaultRoutes();
1304
-
1305
- const promise = deploymentCreate.parseAsync(
1306
- ["my-feature", "--type", "dev"],
1307
- { from: "user" },
1308
- );
1309
-
1310
- await promise;
1311
-
1312
- expect(selectRegion).not.toHaveBeenCalled();
1313
- expect(mockPlatformPost).toHaveBeenCalledWith(
1314
- "/projects/{project_id}/create_deployment",
1315
- expect.objectContaining({
1316
- body: expect.objectContaining({
1317
- region: "aws-us-east-1",
1318
- }),
1319
- }),
1320
- );
1321
- });
1322
- });
1323
-
1324
- const availableRegions = mockRegions.filter((r) => r.available);
1325
-
1326
- describe("resolveRegionDetails", () => {
1327
- test("resolves region by alias", () => {
1328
- const result = resolveRegionDetails(availableRegions, "us");
1329
- expect(result).not.toBeNull();
1330
- expect(result!.name).toBe("aws-us-east-1");
1331
- expect(result!.displayName).toBe("US East (Virginia)");
1332
- });
1333
-
1334
- test("resolves region by full name", () => {
1335
- const result = resolveRegionDetails(availableRegions, "aws-eu-west-1");
1336
- expect(result).not.toBeNull();
1337
- expect(result!.name).toBe("aws-eu-west-1");
1338
- expect(result!.displayName).toBe("EU West (Ireland)");
1339
- });
1340
-
1341
- test("returns null on unknown region", () => {
1342
- const result = resolveRegionDetails(availableRegions, "invalid-region");
1343
- expect(result).toBeNull();
1344
- });
1345
-
1346
- test("returns null on unavailable region", () => {
1347
- const result = resolveRegionDetails(availableRegions, "aws-ap-southeast-1");
1348
- expect(result).toBeNull();
1349
- });
1350
- });
1351
-
1352
- const availableClasses = mockClasses.filter((c) => c.available);
1353
-
1354
- describe("resolveClassDetails", () => {
1355
- test("resolves class by type", () => {
1356
- const result = resolveClassDetails(availableClasses, "s16");
1357
- expect(result).not.toBeNull();
1358
- expect(result!.type).toBe("s16");
1359
- });
1360
-
1361
- test("resolves another class by type", () => {
1362
- const result = resolveClassDetails(availableClasses, "s256");
1363
- expect(result).not.toBeNull();
1364
- expect(result!.type).toBe("s256");
1365
- });
1366
-
1367
- test("returns null on unknown class", () => {
1368
- const result = resolveClassDetails(availableClasses, "invalid-class");
1369
- expect(result).toBeNull();
1370
- });
1371
-
1372
- test("returns null on unavailable class", () => {
1373
- const result = resolveClassDetails(availableClasses, "d1024");
1374
- expect(result).toBeNull();
1375
- });
1376
- });