convex 1.46.0 → 1.48.0-alpha.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 (479) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/browser.bundle.js +7 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/bundler/context.js +7 -5
  5. package/dist/cjs/bundler/context.js.map +2 -2
  6. package/dist/cjs/bundler/fs.js +47 -6
  7. package/dist/cjs/bundler/fs.js.map +2 -2
  8. package/dist/cjs/bundler/index.js +5 -4
  9. package/dist/cjs/bundler/index.js.map +2 -2
  10. package/dist/cjs/cli/account.js +237 -0
  11. package/dist/cjs/cli/account.js.map +7 -0
  12. package/dist/cjs/cli/codegen.js +0 -4
  13. package/dist/cjs/cli/codegen.js.map +2 -2
  14. package/dist/cjs/cli/configure.js +28 -6
  15. package/dist/cjs/cli/configure.js.map +2 -2
  16. package/dist/cjs/cli/deploy.js +27 -2
  17. package/dist/cjs/cli/deploy.js.map +2 -2
  18. package/dist/cjs/cli/deploymentSelect.js +2 -2
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +6 -0
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/env.js +10 -5
  23. package/dist/cjs/cli/env.js.map +2 -2
  24. package/dist/cjs/cli/envDefault.js +7 -2
  25. package/dist/cjs/cli/envDefault.js.map +2 -2
  26. package/dist/cjs/cli/generatedApi.js.map +1 -1
  27. package/dist/cjs/cli/lib/api.js +2 -0
  28. package/dist/cjs/cli/lib/api.js.map +2 -2
  29. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  30. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  31. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +36 -47
  32. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  33. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +58 -39
  34. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  35. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  36. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  37. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +2 -1
  39. package/dist/cjs/cli/lib/command.js.map +2 -2
  40. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  41. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  42. package/dist/cjs/cli/lib/components.js +48 -5
  43. package/dist/cjs/cli/lib/components.js.map +2 -2
  44. package/dist/cjs/cli/lib/config.js +56 -17
  45. package/dist/cjs/cli/lib/config.js.map +2 -2
  46. package/dist/cjs/cli/lib/deploy2.js +3 -1
  47. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  48. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +30 -2
  49. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
  51. package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
  52. package/dist/cjs/cli/lib/deployment.js +2 -0
  53. package/dist/cjs/cli/lib/deployment.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
  55. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +5 -0
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/envvars.js +32 -0
  59. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  60. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  61. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  62. package/dist/cjs/cli/lib/fsUtils.js +1 -1
  63. package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
  64. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  65. package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
  66. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  67. package/dist/cjs/cli/lib/login.js +28 -4
  68. package/dist/cjs/cli/lib/login.js.map +2 -2
  69. package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
  70. package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
  71. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  72. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  73. package/dist/cjs/cli/lib/profileManagement.js +196 -0
  74. package/dist/cjs/cli/lib/profileManagement.js.map +7 -0
  75. package/dist/cjs/cli/lib/profiles.js +333 -0
  76. package/dist/cjs/cli/lib/profiles.js.map +7 -0
  77. package/dist/cjs/cli/lib/run.js +4 -0
  78. package/dist/cjs/cli/lib/run.js.map +2 -2
  79. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  80. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  81. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  82. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  84. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +66 -27
  86. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  87. package/dist/cjs/cli/login.js +213 -114
  88. package/dist/cjs/cli/login.js.map +3 -3
  89. package/dist/cjs/cli/logout.js +113 -12
  90. package/dist/cjs/cli/logout.js.map +3 -3
  91. package/dist/cjs/cli/mcp.js +43 -10
  92. package/dist/cjs/cli/mcp.js.map +3 -3
  93. package/dist/cjs/cli/program.js +2 -1
  94. package/dist/cjs/cli/program.js.map +2 -2
  95. package/dist/cjs/cli/projectCreate.js +1 -1
  96. package/dist/cjs/cli/projectCreate.js.map +1 -1
  97. package/dist/cjs/index.js +1 -1
  98. package/dist/cjs/index.js.map +1 -1
  99. package/dist/cjs/server/impl/actions_impl.js +8 -3
  100. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  101. package/dist/cjs/server/impl/storage_impl.js +29 -0
  102. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js +1 -0
  104. package/dist/cjs/server/index.js.map +2 -2
  105. package/dist/cjs/server/meta.js.map +1 -1
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs/server/schema.js +34 -12
  108. package/dist/cjs/server/schema.js.map +2 -2
  109. package/dist/cjs/server/storage.js.map +1 -1
  110. package/dist/cjs/values/validators.js +1 -1
  111. package/dist/cjs/values/validators.js.map +2 -2
  112. package/dist/cjs/values/value.js +6 -0
  113. package/dist/cjs/values/value.js.map +2 -2
  114. package/dist/cjs-types/bundler/context.d.ts +5 -0
  115. package/dist/cjs-types/bundler/context.d.ts.map +1 -1
  116. package/dist/cjs-types/bundler/fs.d.ts +7 -2
  117. package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
  118. package/dist/cjs-types/bundler/index.d.ts +9 -2
  119. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  120. package/dist/cjs-types/cli/account.d.ts +6 -0
  121. package/dist/cjs-types/cli/account.d.ts.map +1 -0
  122. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/configure.d.ts +6 -0
  124. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  126. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  128. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/dev.d.ts +1 -0
  130. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  134. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  137. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  138. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  139. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  140. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  141. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  142. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  143. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  144. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -3
  145. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  147. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  149. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/components.d.ts +4 -0
  151. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  153. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/lib/deploy2.d.ts +2 -0
  155. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  157. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
  159. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  160. package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
  161. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  162. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
  163. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  164. package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
  165. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
  167. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  168. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
  169. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  170. package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
  171. package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/login.d.ts +3 -1
  173. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts +8 -5
  176. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  178. package/dist/cjs-types/cli/lib/profileManagement.d.ts +10 -0
  179. package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +1 -0
  180. package/dist/cjs-types/cli/lib/profiles.d.ts +59 -0
  181. package/dist/cjs-types/cli/lib/profiles.d.ts.map +1 -0
  182. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  183. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  184. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  185. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  186. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  187. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  188. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  189. package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -2
  190. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  191. package/dist/cjs-types/cli/login.d.ts +21 -0
  192. package/dist/cjs-types/cli/login.d.ts.map +1 -1
  193. package/dist/cjs-types/cli/logout.d.ts +8 -1
  194. package/dist/cjs-types/cli/logout.d.ts.map +1 -1
  195. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  196. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  197. package/dist/cjs-types/index.d.ts +1 -1
  198. package/dist/cjs-types/index.d.ts.map +1 -1
  199. package/dist/cjs-types/server/impl/actions_impl.d.ts +18 -3
  200. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  201. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  202. package/dist/cjs-types/server/index.d.ts +1 -1
  203. package/dist/cjs-types/server/index.d.ts.map +1 -1
  204. package/dist/cjs-types/server/meta.d.ts +63 -0
  205. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  206. package/dist/cjs-types/server/registration.d.ts +10 -0
  207. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  208. package/dist/cjs-types/server/schema.d.ts +33 -0
  209. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  210. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  211. package/dist/cjs-types/values/value.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +4889 -2980
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/bundler/context.js +7 -5
  215. package/dist/esm/bundler/context.js.map +2 -2
  216. package/dist/esm/bundler/fs.js +47 -6
  217. package/dist/esm/bundler/fs.js.map +2 -2
  218. package/dist/esm/bundler/index.js +5 -4
  219. package/dist/esm/bundler/index.js.map +2 -2
  220. package/dist/esm/cli/account.js +221 -0
  221. package/dist/esm/cli/account.js.map +7 -0
  222. package/dist/esm/cli/codegen.js +0 -4
  223. package/dist/esm/cli/codegen.js.map +2 -2
  224. package/dist/esm/cli/configure.js +27 -6
  225. package/dist/esm/cli/configure.js.map +2 -2
  226. package/dist/esm/cli/deploy.js +27 -2
  227. package/dist/esm/cli/deploy.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +6 -3
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +6 -0
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/env.js +11 -6
  233. package/dist/esm/cli/env.js.map +2 -2
  234. package/dist/esm/cli/envDefault.js +7 -2
  235. package/dist/esm/cli/envDefault.js.map +2 -2
  236. package/dist/esm/cli/lib/api.js +2 -0
  237. package/dist/esm/cli/lib/api.js.map +2 -2
  238. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  239. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  240. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +37 -48
  241. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  242. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +63 -41
  243. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  244. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  245. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  246. package/dist/esm/cli/lib/codegen.js.map +2 -2
  247. package/dist/esm/cli/lib/command.js +2 -1
  248. package/dist/esm/cli/lib/command.js.map +2 -2
  249. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  250. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  251. package/dist/esm/cli/lib/components.js +55 -5
  252. package/dist/esm/cli/lib/components.js.map +2 -2
  253. package/dist/esm/cli/lib/config.js +55 -17
  254. package/dist/esm/cli/lib/config.js.map +2 -2
  255. package/dist/esm/cli/lib/deploy2.js +3 -1
  256. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  257. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +28 -2
  258. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  259. package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
  260. package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
  261. package/dist/esm/cli/lib/deployment.js +2 -2
  262. package/dist/esm/cli/lib/deployment.js.map +2 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js +35 -20
  264. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  265. package/dist/esm/cli/lib/dev.js +5 -0
  266. package/dist/esm/cli/lib/dev.js.map +2 -2
  267. package/dist/esm/cli/lib/envvars.js +35 -1
  268. package/dist/esm/cli/lib/envvars.js.map +2 -2
  269. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  270. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  271. package/dist/esm/cli/lib/fsUtils.js +1 -1
  272. package/dist/esm/cli/lib/fsUtils.js.map +2 -2
  273. package/dist/esm/cli/lib/generateDocs.js +1 -1
  274. package/dist/esm/cli/lib/generateDocs.js.map +1 -1
  275. package/dist/esm/cli/lib/indexes.js.map +1 -1
  276. package/dist/esm/cli/lib/login.js +36 -4
  277. package/dist/esm/cli/lib/login.js.map +2 -2
  278. package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
  279. package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
  280. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  281. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  282. package/dist/esm/cli/lib/profileManagement.js +179 -0
  283. package/dist/esm/cli/lib/profileManagement.js.map +7 -0
  284. package/dist/esm/cli/lib/profiles.js +288 -0
  285. package/dist/esm/cli/lib/profiles.js.map +7 -0
  286. package/dist/esm/cli/lib/run.js +4 -0
  287. package/dist/esm/cli/lib/run.js.map +2 -2
  288. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  289. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  290. package/dist/esm/cli/lib/usageLimits.js +4 -2
  291. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  293. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +63 -27
  295. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  296. package/dist/esm/cli/login.js +225 -112
  297. package/dist/esm/cli/login.js.map +3 -3
  298. package/dist/esm/cli/logout.js +110 -13
  299. package/dist/esm/cli/logout.js.map +2 -2
  300. package/dist/esm/cli/mcp.js +34 -10
  301. package/dist/esm/cli/mcp.js.map +2 -2
  302. package/dist/esm/cli/program.js +2 -1
  303. package/dist/esm/cli/program.js.map +2 -2
  304. package/dist/esm/cli/projectCreate.js +1 -1
  305. package/dist/esm/cli/projectCreate.js.map +1 -1
  306. package/dist/esm/index.js +1 -1
  307. package/dist/esm/index.js.map +1 -1
  308. package/dist/esm/server/impl/actions_impl.js +7 -3
  309. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  310. package/dist/esm/server/impl/storage_impl.js +29 -0
  311. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  312. package/dist/esm/server/index.js +4 -1
  313. package/dist/esm/server/index.js.map +2 -2
  314. package/dist/esm/server/schema.js +34 -12
  315. package/dist/esm/server/schema.js.map +2 -2
  316. package/dist/esm/values/validators.js +1 -1
  317. package/dist/esm/values/validators.js.map +2 -2
  318. package/dist/esm/values/value.js +6 -0
  319. package/dist/esm/values/value.js.map +2 -2
  320. package/dist/esm-types/bundler/context.d.ts +5 -0
  321. package/dist/esm-types/bundler/context.d.ts.map +1 -1
  322. package/dist/esm-types/bundler/fs.d.ts +7 -2
  323. package/dist/esm-types/bundler/fs.d.ts.map +1 -1
  324. package/dist/esm-types/bundler/index.d.ts +9 -2
  325. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  326. package/dist/esm-types/cli/account.d.ts +6 -0
  327. package/dist/esm-types/cli/account.d.ts.map +1 -0
  328. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  329. package/dist/esm-types/cli/configure.d.ts +6 -0
  330. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  331. package/dist/esm-types/cli/deploy.d.ts +2 -0
  332. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  333. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  334. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  335. package/dist/esm-types/cli/dev.d.ts +1 -0
  336. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  337. package/dist/esm-types/cli/env.d.ts.map +1 -1
  338. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  339. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  340. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  341. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  342. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  343. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  344. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  345. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  346. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  347. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  348. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  349. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  350. package/dist/esm-types/cli/lib/codegen.d.ts +0 -3
  351. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  352. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  353. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  354. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  355. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  356. package/dist/esm-types/cli/lib/components.d.ts +4 -0
  357. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  358. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  359. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  360. package/dist/esm-types/cli/lib/deploy2.d.ts +2 -0
  361. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  362. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  363. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
  365. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  366. package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
  367. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  368. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
  369. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  370. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  371. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  372. package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
  373. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  374. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  375. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  376. package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
  377. package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/login.d.ts +3 -1
  379. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  382. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  384. package/dist/esm-types/cli/lib/profileManagement.d.ts +10 -0
  385. package/dist/esm-types/cli/lib/profileManagement.d.ts.map +1 -0
  386. package/dist/esm-types/cli/lib/profiles.d.ts +59 -0
  387. package/dist/esm-types/cli/lib/profiles.d.ts.map +1 -0
  388. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  389. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  390. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  391. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  392. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  393. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  394. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  395. package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -2
  396. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  397. package/dist/esm-types/cli/login.d.ts +21 -0
  398. package/dist/esm-types/cli/login.d.ts.map +1 -1
  399. package/dist/esm-types/cli/logout.d.ts +8 -1
  400. package/dist/esm-types/cli/logout.d.ts.map +1 -1
  401. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  402. package/dist/esm-types/cli/program.d.ts.map +1 -1
  403. package/dist/esm-types/index.d.ts +1 -1
  404. package/dist/esm-types/index.d.ts.map +1 -1
  405. package/dist/esm-types/server/impl/actions_impl.d.ts +18 -3
  406. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  407. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  408. package/dist/esm-types/server/index.d.ts +1 -1
  409. package/dist/esm-types/server/index.d.ts.map +1 -1
  410. package/dist/esm-types/server/meta.d.ts +63 -0
  411. package/dist/esm-types/server/meta.d.ts.map +1 -1
  412. package/dist/esm-types/server/registration.d.ts +10 -0
  413. package/dist/esm-types/server/registration.d.ts.map +1 -1
  414. package/dist/esm-types/server/schema.d.ts +33 -0
  415. package/dist/esm-types/server/schema.d.ts.map +1 -1
  416. package/dist/esm-types/server/storage.d.ts.map +1 -1
  417. package/dist/esm-types/values/value.d.ts.map +1 -1
  418. package/dist/react.bundle.js +7 -1
  419. package/dist/react.bundle.js.map +2 -2
  420. package/package.json +5 -5
  421. package/schemas/convex.schema.json +5 -5
  422. package/src/bundler/context.ts +9 -5
  423. package/src/bundler/fs.ts +54 -5
  424. package/src/bundler/index.ts +9 -4
  425. package/src/cli/account.ts +320 -0
  426. package/src/cli/codegen.ts +0 -2
  427. package/src/cli/configure.ts +45 -9
  428. package/src/cli/deploy.ts +36 -5
  429. package/src/cli/deploymentSelect.ts +7 -4
  430. package/src/cli/dev.ts +9 -0
  431. package/src/cli/env.ts +12 -6
  432. package/src/cli/envDefault.ts +8 -2
  433. package/src/cli/generatedApi.ts +1 -1
  434. package/src/cli/lib/api.ts +5 -1
  435. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  436. package/src/cli/lib/checkForLargeIndexDeletion.ts +45 -58
  437. package/src/cli/lib/checkForSlowSchemaValidation.ts +76 -65
  438. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  439. package/src/cli/lib/codegen.ts +0 -3
  440. package/src/cli/lib/command.ts +3 -0
  441. package/src/cli/lib/components/definition/bundle.ts +68 -14
  442. package/src/cli/lib/components.ts +71 -4
  443. package/src/cli/lib/config.ts +85 -18
  444. package/src/cli/lib/deploy2.ts +10 -1
  445. package/src/cli/lib/deployApi/evaluateSchema.ts +35 -0
  446. package/src/cli/lib/deployKeyWarning.ts +43 -0
  447. package/src/cli/lib/deployment.ts +2 -2
  448. package/src/cli/lib/deploymentSelection.ts +37 -18
  449. package/src/cli/lib/dev.ts +14 -0
  450. package/src/cli/lib/envvars.ts +43 -1
  451. package/src/cli/lib/formatValidationProgress.ts +35 -0
  452. package/src/cli/lib/fsUtils.ts +5 -2
  453. package/src/cli/lib/generateDocs.ts +1 -1
  454. package/src/cli/lib/indexes.ts +1 -1
  455. package/src/cli/lib/login.ts +47 -3
  456. package/src/cli/lib/mcp/requestContext.ts +7 -1
  457. package/src/cli/lib/mcp/tools/env.ts +17 -3
  458. package/src/cli/lib/profileManagement.ts +262 -0
  459. package/src/cli/lib/profiles.ts +398 -0
  460. package/src/cli/lib/run.ts +2 -0
  461. package/src/cli/lib/schemaEvaluation.ts +88 -0
  462. package/src/cli/lib/usageLimits.ts +2 -0
  463. package/src/cli/lib/utils/mutex.ts +9 -27
  464. package/src/cli/lib/utils/utils.ts +83 -36
  465. package/src/cli/login.ts +293 -168
  466. package/src/cli/logout.ts +142 -17
  467. package/src/cli/mcp.ts +48 -11
  468. package/src/cli/program.ts +2 -0
  469. package/src/cli/projectCreate.ts +1 -1
  470. package/src/index.ts +1 -1
  471. package/src/server/impl/actions_impl.ts +26 -6
  472. package/src/server/impl/storage_impl.ts +30 -0
  473. package/src/server/index.ts +5 -1
  474. package/src/server/meta.ts +56 -2
  475. package/src/server/registration.ts +10 -0
  476. package/src/server/schema.ts +37 -15
  477. package/src/server/storage.ts +17 -0
  478. package/src/values/validators.ts +1 -1
  479. package/src/values/value.ts +9 -5
@@ -53,6 +53,18 @@ import { deploymentDashboardUrlPage } from "./dashboard.js";
53
53
  import { formatIndex, LargeIndexDeletionCheck } from "./indexes.js";
54
54
  import { checkForLargeIndexDeletion } from "./checkForLargeIndexDeletion.js";
55
55
  import { checkForSlowSchemaValidation } from "./checkForSlowSchemaValidation.js";
56
+ import {
57
+ checkForLargeIndexBackfill,
58
+ LargeIndexBackfillCheck,
59
+ } from "./checkForLargeIndexBackfill.js";
60
+ import {
61
+ pushStagesValidators,
62
+ sharedSchemaEvaluation,
63
+ } from "./schemaEvaluation.js";
64
+ import {
65
+ checkForStagedValidatorDeletion,
66
+ StagedValidatorDeletionCheck,
67
+ } from "./checkForStagedValidatorDeletion.js";
56
68
  import { LogManager } from "./logs.js";
57
69
  import { createHash } from "crypto";
58
70
  import { Bundle, BundleHash } from "../../bundler/index.js";
@@ -76,6 +88,8 @@ export type PushOptions = {
76
88
  pushAllModules: boolean;
77
89
  logManager?: LogManager | undefined;
78
90
  largeIndexDeletionCheck: LargeIndexDeletionCheck;
91
+ largeIndexBackfillCheck: LargeIndexBackfillCheck;
92
+ stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;
79
93
  // Whether a dry run should warn when the schema change would block the
80
94
  // deploy on a slow table walk. On for deploys; off for commands whose dry
81
95
  // runs never deploy (e.g. codegen).
@@ -125,6 +139,11 @@ export async function runCodegen(
125
139
  liveComponentSources: options.liveComponentSources,
126
140
  typecheckComponents: false,
127
141
  debugNodeApis: options.debugNodeApis,
142
+ // Code generation uses the source schema independently of deployment data.
143
+ largeIndexDeletionCheck: "no verification",
144
+ largeIndexBackfillCheck: "no verification",
145
+ stagedValidatorDeletionCheck: "no verification",
146
+ warnOnSlowSchemaValidation: false,
128
147
  },
129
148
  );
130
149
  } else {
@@ -234,6 +253,8 @@ async function startComponentsPushAndCodegen(
234
253
  pushAllModules?: boolean;
235
254
  debugNodeApis: boolean;
236
255
  largeIndexDeletionCheck: LargeIndexDeletionCheck;
256
+ largeIndexBackfillCheck: LargeIndexBackfillCheck;
257
+ stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;
237
258
  warnOnSlowSchemaValidation: boolean;
238
259
  codegenOnlyThisComponent?: string | undefined;
239
260
  },
@@ -451,6 +472,11 @@ async function startComponentsPushAndCodegen(
451
472
  }
452
473
  logStartPushSizes(parentSpan, startPushRequest);
453
474
 
475
+ const schemaEvaluation = sharedSchemaEvaluation(
476
+ ctx,
477
+ startPushRequest,
478
+ options,
479
+ );
454
480
  if (options.largeIndexDeletionCheck !== "no verification") {
455
481
  await parentSpan.enterAsync("checkForLargeIndexDeletion", (span) =>
456
482
  checkForLargeIndexDeletion({
@@ -458,19 +484,60 @@ async function startComponentsPushAndCodegen(
458
484
  span,
459
485
  request: startPushRequest,
460
486
  options,
487
+ schemaEvaluation,
461
488
  askForConfirmation:
462
489
  options.largeIndexDeletionCheck === "ask for confirmation",
463
490
  }),
464
491
  );
465
492
  }
466
493
 
467
- if (options.dryRun && options.warnOnSlowSchemaValidation) {
468
- await parentSpan.enterAsync("checkForSlowSchemaValidation", (span) =>
469
- checkForSlowSchemaValidation({
494
+ const largeIndexBackfillCheck = options.largeIndexBackfillCheck;
495
+ if (largeIndexBackfillCheck !== "no verification") {
496
+ await parentSpan.enterAsync("checkForLargeIndexBackfill", (span) =>
497
+ checkForLargeIndexBackfill({
470
498
  ctx,
471
499
  span,
472
- request: startPushRequest,
500
+ schemaEvaluation,
473
501
  options,
502
+ // A dry run never blocks on a backfill, so it only reports.
503
+ mode: options.dryRun ? "warn" : largeIndexBackfillCheck,
504
+ }),
505
+ );
506
+ }
507
+
508
+ const stagedValidatorDeletionCheck = options.stagedValidatorDeletionCheck;
509
+ if (stagedValidatorDeletionCheck !== "no verification") {
510
+ await parentSpan.enterAsync(
511
+ "checkForStagedValidatorDeletion",
512
+ async (span) => {
513
+ const response = await schemaEvaluation(span);
514
+ await checkForStagedValidatorDeletion({
515
+ ctx,
516
+ response,
517
+ askForConfirmation:
518
+ stagedValidatorDeletionCheck === "ask for confirmation",
519
+ // A dry run previews the confirmation required by a real push.
520
+ dryRun: options.dryRun,
521
+ });
522
+ },
523
+ );
524
+ }
525
+
526
+ // A real push evaluates the schema only when the evaluation is already
527
+ // paid for by the unstaging check or the pushed schema stages a validator,
528
+ // so `dev` pushes of ordinary schemas skip the isolate evaluation and round
529
+ // trip that the status report would otherwise add on every save.
530
+ if (
531
+ options.warnOnSlowSchemaValidation &&
532
+ (options.dryRun ||
533
+ stagedValidatorDeletionCheck !== "no verification" ||
534
+ pushStagesValidators(startPushRequest))
535
+ ) {
536
+ await parentSpan.enterAsync("checkForSlowSchemaValidation", (span) =>
537
+ checkForSlowSchemaValidation({
538
+ span,
539
+ schemaEvaluation,
540
+ dryRun: options.dryRun,
474
541
  }),
475
542
  );
476
543
  }
@@ -42,6 +42,7 @@ import {
42
42
  } from "./localDeployment/errors.js";
43
43
  import { debugIsolateBundlesSerially } from "../../bundler/debugBundle.js";
44
44
  import { DeploymentType } from "./api.js";
45
+ import { isAnonymousDeployment } from "./deployment.js";
45
46
  export { productionProvisionHost, provisionHost } from "./utils/utils.js";
46
47
 
47
48
  /** Type representing WorkOS AuthKit integration configuration. */
@@ -672,7 +673,7 @@ export async function configFromProjectConfig(
672
673
  }
673
674
  const modules = convexResult.modules;
674
675
  modules.push(...nodeResult.modules);
675
- modules.push(...(await bundleAuthConfig(ctx, baseDir)));
676
+ modules.push(...(await bundleAuthConfig(ctx, baseDir)).modules);
676
677
 
677
678
  const nodeDependencies: NodeDependency[] = [];
678
679
  for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {
@@ -911,6 +912,49 @@ export function diffConfig(
911
912
  return { diffString: diff };
912
913
  }
913
914
 
915
+ export function setEnvVarsInstructions(
916
+ names: string[],
917
+ deploymentName: string | null,
918
+ deploymentType: DeploymentType | undefined,
919
+ deploymentUrl: string | undefined,
920
+ ): string {
921
+ // Name cloud deployments explicitly: without a flag `env set` targets the
922
+ // project's default dev deployment, which may not be where this push went
923
+ // (e.g. `npx convex dev --deployment <other dev deployment>`). Local and
924
+ // anonymous deployments are always the default target.
925
+ let deploymentFlag = "";
926
+ if (
927
+ deploymentName !== null &&
928
+ deploymentType !== "local" &&
929
+ deploymentType !== "anonymous"
930
+ ) {
931
+ deploymentFlag = ` --deployment ${deploymentName}`;
932
+ } else if (deploymentType === "prod") {
933
+ deploymentFlag = " --prod";
934
+ } else if (deploymentName === null && deploymentUrl !== undefined) {
935
+ // Pushes via `--url`/`--admin-key` or self-hosted env vars have no
936
+ // deployment name. The admin key stays a placeholder to keep it out of
937
+ // terminal output.
938
+ deploymentFlag = ` --url ${deploymentUrl} --admin-key <admin key>`;
939
+ }
940
+ const commands = (names.length > 0 ? names : ["<NAME>"]).map(
941
+ (name) =>
942
+ ` ${chalkStderr.bold(`npx convex env set${deploymentFlag} ${name} <value>`)}`,
943
+ );
944
+ let instructions = `Set ${names.length > 1 ? "them" : "it"} with:\n\n${commands.join("\n")}\n`;
945
+ // Anonymous deployments are only reachable from the local dashboard, which
946
+ // `deploymentDashboardUrlPage` can't address.
947
+ if (deploymentName !== null && !isAnonymousDeployment(deploymentName)) {
948
+ const variableQuery = names.length === 1 ? `?var=${names[0]}` : "";
949
+ const dashboardUrl = deploymentDashboardUrlPage(
950
+ deploymentName,
951
+ `/settings/environment-variables${variableQuery}`,
952
+ );
953
+ instructions += `\nor in the dashboard:\n\n ${chalkStderr.bold(dashboardUrl)}\n`;
954
+ }
955
+ return instructions;
956
+ }
957
+
914
958
  /** Handle an error from
915
959
  * legacy push path:
916
960
  * - /api/push_config
@@ -934,7 +978,7 @@ export async function handlePushConfigError(
934
978
  deploymentNotice: string;
935
979
  }
936
980
  | undefined,
937
- _deploymentType: DeploymentType | undefined,
981
+ deploymentType: DeploymentType | undefined,
938
982
  ): Promise<never> {
939
983
  const data: ErrorData | undefined =
940
984
  error instanceof ThrowingFetchError ? error.serverErrorData : undefined;
@@ -965,26 +1009,49 @@ export async function handlePushConfigError(
965
1009
  `Environment variable ${chalkStderr.bold(
966
1010
  variableName,
967
1011
  )} is used in auth config file but ` + `its value was not set.`;
968
- let setEnvVarInstructions =
969
- "Go set it in the dashboard or using `npx convex env set`";
970
-
971
- // If `npx convex dev` is running using --url there might not be a configured deployment
972
- if (deploymentName !== null) {
973
- const variableQuery =
974
- variableName !== undefined ? `?var=${variableName}` : "";
975
- const dashboardUrl = deploymentDashboardUrlPage(
976
- deploymentName,
977
- `/settings/environment-variables${variableQuery}`,
978
- );
979
- setEnvVarInstructions = `Go to:\n\n ${chalkStderr.bold(
980
- dashboardUrl,
981
- )}\n\n to set it up. `;
982
- }
983
1012
  await ctx.crash({
984
1013
  exitCode: 1,
985
1014
  errorType: "invalid filesystem or env vars",
986
1015
  errForSentry: error,
987
- printedMessage: envVarMessage + "\n" + setEnvVarInstructions,
1016
+ printedMessage:
1017
+ envVarMessage +
1018
+ "\n" +
1019
+ setEnvVarsInstructions(
1020
+ variableName !== undefined ? [variableName] : [],
1021
+ deploymentName,
1022
+ deploymentType,
1023
+ deployment?.deploymentUrl,
1024
+ ),
1025
+ });
1026
+ }
1027
+
1028
+ if (data?.code === "MissingEnvironmentVariables") {
1029
+ const errorMessage = data.message || "(no error message given)";
1030
+ const [, namesList] = errorMessage.match(/are not set: ([^.]+)\./) ?? [];
1031
+ const names = namesList?.split(", ") ?? [];
1032
+ const envVarMessage =
1033
+ names.length === 0
1034
+ ? errorMessage
1035
+ : names.length === 1
1036
+ ? `Environment variable ${chalkStderr.bold(names[0])} is ` +
1037
+ `declared as required in convex.config.ts but its value was not set.`
1038
+ : `Environment variables ${names
1039
+ .map((name) => chalkStderr.bold(name))
1040
+ .join(", ")} are declared as required in convex.config.ts ` +
1041
+ `but their values were not set.`;
1042
+ await ctx.crash({
1043
+ exitCode: 1,
1044
+ errorType: "invalid filesystem or env vars",
1045
+ errForSentry: error,
1046
+ printedMessage:
1047
+ envVarMessage +
1048
+ "\n" +
1049
+ setEnvVarsInstructions(
1050
+ names,
1051
+ deploymentName,
1052
+ deploymentType,
1053
+ deployment?.deploymentUrl,
1054
+ ),
988
1055
  });
989
1056
  }
990
1057
 
@@ -457,7 +457,9 @@ export async function deployToDeployment(
457
457
  writePushRequest?: string | undefined;
458
458
  liveComponentSources?: boolean | undefined;
459
459
  skipWorkosCheck?: boolean | undefined;
460
+ skipLargeIndexesCheck: boolean;
460
461
  allowDeletingLargeIndexes: boolean;
462
+ allowUnstagingSchema: boolean;
461
463
  message: string | null;
462
464
  },
463
465
  ) {
@@ -504,7 +506,14 @@ export async function deployToDeployment(
504
506
  writePushRequest: options.writePushRequest,
505
507
  liveComponentSources: !!options.liveComponentSources,
506
508
  pushAllModules: !!options.pushAllModules,
507
- largeIndexDeletionCheck: options.allowDeletingLargeIndexes
509
+ largeIndexDeletionCheck:
510
+ options.skipLargeIndexesCheck || options.allowDeletingLargeIndexes
511
+ ? "has confirmation"
512
+ : "ask for confirmation",
513
+ largeIndexBackfillCheck: options.skipLargeIndexesCheck
514
+ ? "has confirmation"
515
+ : "ask for confirmation",
516
+ stagedValidatorDeletionCheck: options.allowUnstagingSchema
508
517
  ? "has confirmation"
509
518
  : "ask for confirmation",
510
519
  warnOnSlowSchemaValidation: true,
@@ -10,6 +10,7 @@ import { looseObject } from "./utils.js";
10
10
  export const tableValidationOutcome = z.enum([
11
11
  "notValidated",
12
12
  "supersetOfEnforced",
13
+ "supersetOfStagedValidated",
13
14
  "supersetOfShape",
14
15
  "mustWalk",
15
16
  ]);
@@ -24,11 +25,26 @@ export const indexChangePrediction = z.enum([
24
25
  ]);
25
26
  export type IndexChangePrediction = z.infer<typeof indexChangePrediction>;
26
27
 
28
+ // Mirrors `StagedValidatorState` in
29
+ // `crates/application/src/deploy_config.rs`.
30
+ export const stagedValidatorState = z.union([
31
+ looseObject({
32
+ state: z.literal("pending"),
33
+ numDocsValidated: z.number(),
34
+ totalDocs: z.number().nullable().optional(),
35
+ }),
36
+ looseObject({ state: z.literal("valid") }),
37
+ looseObject({ state: z.literal("failed"), error: z.string() }),
38
+ ]);
39
+ export type StagedValidatorState = z.infer<typeof stagedValidatorState>;
40
+
27
41
  export const tablePrediction = looseObject({
28
42
  name: z.string(),
29
43
  outcome: tableValidationOutcome,
30
44
  numDocs: z.number(),
31
45
  sizeBytes: z.number(),
46
+ staged: stagedValidatorState.optional(),
47
+ canSkipAfterStagedValidation: z.boolean().optional(),
32
48
  });
33
49
  export type TablePrediction = z.infer<typeof tablePrediction>;
34
50
 
@@ -42,11 +58,30 @@ export const indexPrediction = z.intersection(
42
58
  );
43
59
  export type IndexPrediction = z.infer<typeof indexPrediction>;
44
60
 
61
+ // Mirrors `SerializedDiscardedStagedValidator` in
62
+ // `crates/local_backend/src/deploy_config2.rs`. The backend never discards a
63
+ // failed validator, since a redeploy retries it anyway.
64
+ export const discardedStagedValidator = looseObject({
65
+ tableName: z.string(),
66
+ state: z.union([
67
+ looseObject({
68
+ state: z.literal("pending"),
69
+ numDocsValidated: z.number(),
70
+ totalDocs: z.number().nullable().optional(),
71
+ }),
72
+ looseObject({ state: z.literal("valid") }),
73
+ ]),
74
+ replaced: z.boolean(),
75
+ });
76
+ export type DiscardedStagedValidator = z.infer<typeof discardedStagedValidator>;
77
+
45
78
  export const componentSchemaPrediction = looseObject({
46
79
  definitionPath: z.string(),
47
80
  schemaValidation: z.boolean(),
48
81
  tables: z.array(tablePrediction),
49
82
  indexes: z.array(indexPrediction),
83
+ // Optional: responses from backends predating the field.
84
+ discardedStagedValidators: z.array(discardedStagedValidator).optional(),
50
85
  });
51
86
  export type ComponentSchemaPrediction = z.infer<
52
87
  typeof componentSchemaPrediction
@@ -0,0 +1,43 @@
1
+ import { Context } from "../../bundler/context.js";
2
+ import { logWarning } from "../../bundler/log.js";
3
+ import {
4
+ deploymentNameFromAdminKey,
5
+ deploymentTypeFromAdminKey,
6
+ isDeploymentKey,
7
+ isPreviewDeployKey,
8
+ isProjectKey,
9
+ } from "./deployment.js";
10
+ import { getDeployKeySource } from "./envvars.js";
11
+ import { IGNORED_DEPLOY_KEY, readDeployKeyFromEnv } from "./utils/utils.js";
12
+
13
+ const warnedContexts = new WeakSet<Context>();
14
+
15
+ export function warnIfDeployKeyOverridesLogin(
16
+ ctx: Context,
17
+ hasAccount: boolean,
18
+ ) {
19
+ if (
20
+ !hasAccount ||
21
+ warnedContexts.has(ctx) ||
22
+ process.env.CONVEX_OVERRIDE_ACCESS_TOKEN
23
+ )
24
+ return;
25
+ const key = readDeployKeyFromEnv((name) => process.env[name]);
26
+ if (
27
+ key === undefined ||
28
+ key === IGNORED_DEPLOY_KEY ||
29
+ isPreviewDeployKey(key)
30
+ )
31
+ return;
32
+ const { envVarName, source } = getDeployKeySource(key);
33
+ const type = deploymentTypeFromAdminKey(key);
34
+ const target = isDeploymentKey(key)
35
+ ? `${type === "prod" ? "production" : type} deployment "${deploymentNameFromAdminKey(key)}"`
36
+ : isProjectKey(key)
37
+ ? "the project selected by the key"
38
+ : "the deployment selected by the key";
39
+ logWarning(
40
+ `WARNING: ${envVarName} in ${source} overrides your Convex account for deployment commands. They target ${target}. Remove ${envVarName} to use the selected account.`,
41
+ );
42
+ warnedContexts.add(ctx);
43
+ }
@@ -102,7 +102,7 @@ export async function eraseDeploymentEnvVar(ctx: Context): Promise<boolean> {
102
102
  return true;
103
103
  }
104
104
 
105
- async function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {
105
+ export async function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {
106
106
  const gitIgnorePath = ".gitignore";
107
107
  const gitIgnoreContents = ctx.fs.exists(gitIgnorePath)
108
108
  ? ctx.fs.readUtf8File(gitIgnorePath)
@@ -186,7 +186,7 @@ export async function deploymentNameFromAdminKeyOrCrash(
186
186
  return deploymentName;
187
187
  }
188
188
 
189
- function deploymentNameFromAdminKey(adminKey: string) {
189
+ export function deploymentNameFromAdminKey(adminKey: string) {
190
190
  const parts = adminKey.split("|");
191
191
  if (parts.length === 1) {
192
192
  return null;
@@ -31,18 +31,26 @@ import {
31
31
  targetProjectForLocalSelector,
32
32
  } from "./localDeployment/projectMismatch.js";
33
33
  import { chalkStderr } from "chalk";
34
- import { getBuildEnvironment } from "./envvars.js";
34
+ import {
35
+ getBuildEnvironment,
36
+ loadProjectEnvironmentVariables,
37
+ } from "./envvars.js";
35
38
  import { readGlobalConfig } from "./utils/globalConfig.js";
39
+ import {
40
+ getProfileSelection,
41
+ ProfileSelection,
42
+ readProfileAuth,
43
+ } from "./profiles.js";
36
44
  import {
37
45
  CONVEX_DEPLOYMENT_ENV_VAR_NAME,
38
46
  CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
39
47
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
40
48
  CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,
41
49
  CONVEX_SELF_HOSTED_URL_VAR_NAME,
42
- ENV_VAR_FILE_PATH,
43
50
  bigBrainAPI,
44
51
  processDeployKeyValue,
45
52
  readDeployKeyFromEnv,
53
+ readDeployKeyEnvVar,
46
54
  typedPlatformClient,
47
55
  } from "./utils/utils.js";
48
56
  import * as dotenv from "dotenv";
@@ -83,10 +91,11 @@ export async function initializeBigBrainAuth(
83
91
  if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {
84
92
  // Do not check any env vars if `url` and `adminKey` are specified via CLI
85
93
  ctx._updateBigBrainAuth(
86
- getBigBrainAuth(ctx, {
94
+ await getBigBrainAuth(ctx, {
87
95
  previewDeployKey: null,
88
96
  projectKey: null,
89
97
  deploymentKey: null,
98
+ skipProfile: true,
90
99
  }),
91
100
  );
92
101
  return;
@@ -106,30 +115,31 @@ export async function initializeBigBrainAuth(
106
115
  const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);
107
116
  const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
108
117
  if (deployKey !== undefined) {
109
- const bigBrainAuth = getBigBrainAuth(ctx, {
118
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
110
119
  previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,
111
120
  projectKey: isProjectKey(deployKey) ? deployKey : null,
112
121
  deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,
122
+ envFile: initialArgs.envFile,
113
123
  });
114
124
  ctx._updateBigBrainAuth(bigBrainAuth);
115
125
  return;
116
126
  }
117
127
  // No deploy key was found in the env file, so fall back on using the global config
118
128
  ctx._updateBigBrainAuth(
119
- getBigBrainAuth(ctx, {
129
+ await getBigBrainAuth(ctx, {
120
130
  previewDeployKey: null,
121
131
  projectKey: null,
122
132
  deploymentKey: null,
133
+ envFile: initialArgs.envFile,
123
134
  }),
124
135
  );
125
136
  return;
126
137
  }
127
- dotenv.config({ path: ENV_VAR_FILE_PATH });
128
- dotenv.config();
138
+ loadProjectEnvironmentVariables();
129
139
  const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);
130
140
  const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
131
141
  if (deployKey !== undefined) {
132
- const bigBrainAuth = getBigBrainAuth(ctx, {
142
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
133
143
  previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,
134
144
  projectKey: isProjectKey(deployKey) ? deployKey : null,
135
145
  deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,
@@ -138,7 +148,7 @@ export async function initializeBigBrainAuth(
138
148
  return;
139
149
  }
140
150
  ctx._updateBigBrainAuth(
141
- getBigBrainAuth(ctx, {
151
+ await getBigBrainAuth(ctx, {
142
152
  previewDeployKey: null,
143
153
  projectKey: null,
144
154
  deploymentKey: null,
@@ -150,6 +160,7 @@ export async function initializeBigBrainAuth(
150
160
  export async function updateBigBrainAuthAfterLogin(
151
161
  ctx: Context,
152
162
  accessToken: string,
163
+ profile?: ProfileSelection,
153
164
  ) {
154
165
  const existingAuth = ctx.bigBrainAuth();
155
166
  if (existingAuth !== null && existingAuth.kind === "projectKey") {
@@ -162,6 +173,7 @@ export async function updateBigBrainAuthAfterLogin(
162
173
  accessToken: accessToken,
163
174
  kind: "accessToken",
164
175
  header: `Bearer ${accessToken}`,
176
+ ...(profile ? { profile } : {}),
165
177
  });
166
178
  }
167
179
 
@@ -169,19 +181,22 @@ export async function clearBigBrainAuth(ctx: Context) {
169
181
  ctx._updateBigBrainAuth(null);
170
182
  }
171
183
 
172
- function getBigBrainAuth(
184
+ async function getBigBrainAuth(
173
185
  ctx: Context,
174
186
  opts: {
175
187
  previewDeployKey: string | null;
176
188
  projectKey: string | null;
177
189
  deploymentKey: string | null;
190
+ envFile?: string;
191
+ skipProfile?: boolean;
178
192
  },
179
- ): BigBrainAuth | null {
193
+ ): Promise<BigBrainAuth | null> {
180
194
  if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
181
195
  return {
182
196
  accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,
183
197
  kind: "accessToken",
184
198
  header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,
199
+ profile: null,
185
200
  };
186
201
  }
187
202
  if (opts.projectKey !== null) {
@@ -200,12 +215,19 @@ function getBigBrainAuth(
200
215
  deploymentKey: opts.deploymentKey,
201
216
  };
202
217
  }
218
+ const profile = opts.skipProfile
219
+ ? null
220
+ : await getProfileSelection(ctx, { envFile: opts.envFile });
221
+ if (profile !== null) {
222
+ return await readProfileAuth(ctx, profile);
223
+ }
203
224
  const globalConfig = readGlobalConfig(ctx);
204
225
  if (globalConfig) {
205
226
  return {
206
227
  kind: "accessToken",
207
228
  header: `Bearer ${globalConfig.accessToken}`,
208
229
  accessToken: globalConfig.accessToken,
230
+ profile: null,
209
231
  };
210
232
  }
211
233
  if (opts.previewDeployKey !== null) {
@@ -272,9 +294,9 @@ export async function ensureAuthCanCreateDeployment(
272
294
  )} and try again.`,
273
295
  });
274
296
  }
275
- const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
276
- ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME
277
- : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
297
+ const envVar =
298
+ readDeployKeyEnvVar((name) => process.env[name])?.name ??
299
+ CONVEX_DEPLOY_KEY_ENV_VAR_NAME;
278
300
  return await ctx.crash({
279
301
  exitCode: 1,
280
302
  errorType: "fatal",
@@ -569,10 +591,7 @@ async function resolveBaseDeploymentSelection(
569
591
  }
570
592
  return result.metadata;
571
593
  }
572
- // start with .env.local (but doesn't override existing)
573
- dotenv.config({ path: ENV_VAR_FILE_PATH });
574
- // for variables not already set, use .env values
575
- dotenv.config();
594
+ loadProjectEnvironmentVariables();
576
595
  const result = await getDeploymentSelectionFromEnv(
577
596
  ctx,
578
597
  selectionWithinProject,
@@ -60,6 +60,7 @@ export async function devAgainstDeployment(
60
60
  debugNodeApis: boolean;
61
61
  liveComponentSources: boolean;
62
62
  pushAllModules: boolean;
63
+ allowUnstagingSchema: boolean;
63
64
  },
64
65
  ) {
65
66
  const logManager = new LogManager(devOptions.tailLogs);
@@ -148,6 +149,19 @@ export async function devAgainstDeployment(
148
149
  pushAllModules: devOptions.pushAllModules,
149
150
  logManager, // Pass logManager to control logs during deploy
150
151
  largeIndexDeletionCheck: "no verification", // `convex dev` can’t push to prod
152
+ // `convex dev --prod` pushes straight to production, where an
153
+ // unstaged index on a large table blocks the push for the whole
154
+ // backfill; dev deployments are small enough to let it through.
155
+ largeIndexBackfillCheck:
156
+ credentials.deploymentType === "prod"
157
+ ? "ask for confirmation"
158
+ : "no verification",
159
+ stagedValidatorDeletionCheck:
160
+ credentials.deploymentType === "prod"
161
+ ? devOptions.allowUnstagingSchema
162
+ ? "has confirmation"
163
+ : "ask for confirmation"
164
+ : "no verification",
151
165
  warnOnSlowSchemaValidation: true,
152
166
  message: null,
153
167
  },
@@ -6,7 +6,49 @@ import * as dotenv from "dotenv";
6
6
 
7
7
  import { Context } from "../../bundler/context.js";
8
8
  import { logWarning } from "../../bundler/log.js";
9
- import { loadPackageJson } from "./utils/utils.js";
9
+ import {
10
+ CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
11
+ readDeployKeyEnvVar,
12
+ ENV_VAR_FILE_PATH,
13
+ loadPackageJson,
14
+ } from "./utils/utils.js";
15
+
16
+ export const CONVEX_ACCOUNT_ENV_VAR = "CONVEX_ACCOUNT";
17
+
18
+ const loadedEnvironment = new Map<string, { value: string; source: string }>();
19
+
20
+ export function loadProjectEnvironmentVariables() {
21
+ // Only remove values supplied by our previous load; later shell overrides win.
22
+ for (const [name, { value }] of loadedEnvironment) {
23
+ if (process.env[name] === value) delete process.env[name];
24
+ }
25
+ loadedEnvironment.clear();
26
+ const environment: Record<string, string> = {};
27
+ for (const [name, value] of Object.entries(process.env)) {
28
+ if (value !== undefined) environment[name] = value;
29
+ }
30
+ for (const file of [ENV_VAR_FILE_PATH, ".env"]) {
31
+ dotenv.config({ path: file, processEnv: environment });
32
+ for (const [name, value] of Object.entries(environment)) {
33
+ // Account selection reads the current project's files directly.
34
+ if (name !== CONVEX_ACCOUNT_ENV_VAR && process.env[name] === undefined) {
35
+ process.env[name] = value;
36
+ loadedEnvironment.set(name, { value, source: file });
37
+ }
38
+ }
39
+ }
40
+ }
41
+
42
+ export function getDeployKeySource(key: string) {
43
+ const envVarName =
44
+ readDeployKeyEnvVar((name) => process.env[name])?.name ??
45
+ CONVEX_DEPLOY_KEY_ENV_VAR_NAME;
46
+ const loaded = loadedEnvironment.get(envVarName);
47
+ return {
48
+ envVarName,
49
+ source: loaded?.value === key ? loaded.source : "shell environment",
50
+ };
51
+ }
10
52
 
11
53
  const _FRAMEWORKS = [
12
54
  "create-react-app",