convex 1.45.0 → 1.47.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 (511) hide show
  1. package/CHANGELOG.md +105 -6
  2. package/dist/browser.bundle.js +7 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/http_client.js.map +2 -2
  5. package/dist/cjs/browser/query_options.js.map +2 -2
  6. package/dist/cjs/browser/simple_client.js.map +2 -2
  7. package/dist/cjs/browser/sync/optimistic_updates.js.map +1 -1
  8. package/dist/cjs/browser/sync/optimistic_updates_impl.js.map +2 -2
  9. package/dist/cjs/bundler/index.js +5 -4
  10. package/dist/cjs/bundler/index.js.map +2 -2
  11. package/dist/cjs/cli/codegen.js +0 -2
  12. package/dist/cjs/cli/codegen.js.map +2 -2
  13. package/dist/cjs/cli/configure.js +13 -4
  14. package/dist/cjs/cli/configure.js.map +2 -2
  15. package/dist/cjs/cli/deploy.js +28 -2
  16. package/dist/cjs/cli/deploy.js.map +2 -2
  17. package/dist/cjs/cli/deploymentSelect.js +2 -2
  18. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  19. package/dist/cjs/cli/dev.js +6 -0
  20. package/dist/cjs/cli/dev.js.map +2 -2
  21. package/dist/cjs/cli/docs.js +3 -36
  22. package/dist/cjs/cli/docs.js.map +2 -2
  23. package/dist/cjs/cli/env.js +10 -5
  24. package/dist/cjs/cli/env.js.map +2 -2
  25. package/dist/cjs/cli/envDefault.js +7 -2
  26. package/dist/cjs/cli/envDefault.js.map +2 -2
  27. package/dist/cjs/cli/generatedApi.js.map +1 -1
  28. package/dist/cjs/cli/lib/api.js +2 -0
  29. package/dist/cjs/cli/lib/api.js.map +2 -2
  30. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  31. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  32. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +100 -70
  33. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  34. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +126 -0
  35. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  36. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  37. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  38. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  39. package/dist/cjs/cli/lib/command.js +2 -1
  40. package/dist/cjs/cli/lib/command.js.map +2 -2
  41. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  42. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  43. package/dist/cjs/cli/lib/components.js +56 -1
  44. package/dist/cjs/cli/lib/components.js.map +2 -2
  45. package/dist/cjs/cli/lib/config.js +56 -17
  46. package/dist/cjs/cli/lib/config.js.map +2 -2
  47. package/dist/cjs/cli/lib/deploy2.js +32 -3
  48. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  49. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +101 -0
  50. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  51. package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
  52. package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
  53. package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
  54. package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
  55. package/dist/cjs/cli/lib/dev.js +6 -0
  56. package/dist/cjs/cli/lib/dev.js.map +2 -2
  57. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  58. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  59. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  60. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  61. package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
  62. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  63. package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
  64. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  65. package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
  66. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  67. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  68. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  69. package/dist/cjs/cli/lib/run.js +5 -0
  70. package/dist/cjs/cli/lib/run.js.map +2 -2
  71. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  72. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  73. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  74. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  75. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  76. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  77. package/dist/cjs/cli/lib/utils/utils.js +84 -47
  78. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  79. package/dist/cjs/cli/projectCreate.js +1 -1
  80. package/dist/cjs/cli/projectCreate.js.map +1 -1
  81. package/dist/cjs/index.js +1 -1
  82. package/dist/cjs/index.js.map +1 -1
  83. package/dist/cjs/nextjs/index.js.map +2 -2
  84. package/dist/cjs/react/client.js.map +2 -2
  85. package/dist/cjs/react/hydration.js.map +2 -2
  86. package/dist/cjs/react/queries_observer.js.map +2 -2
  87. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  88. package/dist/cjs/react/use_queries.js.map +2 -2
  89. package/dist/cjs/server/api.js.map +2 -2
  90. package/dist/cjs/server/components/index.js.map +2 -2
  91. package/dist/cjs/server/cron.js +10 -10
  92. package/dist/cjs/server/cron.js.map +2 -2
  93. package/dist/cjs/server/impl/actions_impl.js +8 -3
  94. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  95. package/dist/cjs/server/impl/meta_impl.js +8 -2
  96. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  97. package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
  98. package/dist/cjs/server/impl/storage_impl.js +29 -0
  99. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  100. package/dist/cjs/server/index.js +1 -0
  101. package/dist/cjs/server/index.js.map +2 -2
  102. package/dist/cjs/server/meta.js.map +1 -1
  103. package/dist/cjs/server/registration.js.map +1 -1
  104. package/dist/cjs/server/scheduler.js.map +1 -1
  105. package/dist/cjs/server/schema.js +72 -3
  106. package/dist/cjs/server/schema.js.map +2 -2
  107. package/dist/cjs/server/storage.js.map +1 -1
  108. package/dist/cjs/values/validator.js +1 -1
  109. package/dist/cjs/values/validator.js.map +2 -2
  110. package/dist/cjs/values/validators.js +82 -26
  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/browser/http_client.d.ts +5 -5
  115. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  116. package/dist/cjs-types/browser/query_options.d.ts +2 -2
  117. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  118. package/dist/cjs-types/browser/simple_client.d.ts +6 -6
  119. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  120. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
  121. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  122. package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  123. package/dist/cjs-types/bundler/index.d.ts +9 -2
  124. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  126. package/dist/cjs-types/cli/configure.d.ts +6 -0
  127. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  128. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  129. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  130. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  131. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/dev.d.ts +1 -0
  133. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  134. package/dist/cjs-types/cli/docs.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  138. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  140. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  141. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  142. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +25 -6
  143. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  144. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
  145. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  146. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  147. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  148. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -2
  149. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  151. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  153. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/lib/components.d.ts +5 -0
  155. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  157. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploy2.d.ts +8 -0
  159. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
  161. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  162. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  163. package/dist/cjs-types/cli/lib/deployApi/finishPush.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/formatValidationProgress.d.ts +8 -0
  167. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  169. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
  171. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  173. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
  174. package/dist/cjs-types/cli/lib/localDeployment/utils.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/run.d.ts.map +1 -1
  178. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  179. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  180. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  181. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  183. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -7
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/nextjs/index.d.ts +6 -6
  188. package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
  189. package/dist/cjs-types/react/client.d.ts +15 -15
  190. package/dist/cjs-types/react/client.d.ts.map +1 -1
  191. package/dist/cjs-types/react/hydration.d.ts +3 -3
  192. package/dist/cjs-types/react/hydration.d.ts.map +1 -1
  193. package/dist/cjs-types/react/queries_observer.d.ts +9 -9
  194. package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
  195. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  196. package/dist/cjs-types/react/use_queries.d.ts +14 -6
  197. package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
  198. package/dist/cjs-types/server/api.d.ts +157 -7
  199. package/dist/cjs-types/server/api.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +2 -2
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/cron.d.ts +21 -20
  203. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/actions_impl.d.ts +22 -7
  205. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  206. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
  208. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  209. package/dist/cjs-types/server/index.d.ts +2 -2
  210. package/dist/cjs-types/server/index.d.ts.map +1 -1
  211. package/dist/cjs-types/server/meta.d.ts +63 -0
  212. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  213. package/dist/cjs-types/server/registration.d.ts +17 -7
  214. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  215. package/dist/cjs-types/server/scheduler.d.ts +9 -7
  216. package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
  217. package/dist/cjs-types/server/schema.d.ts +34 -0
  218. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  219. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  220. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  221. package/dist/cjs-types/values/validators.d.ts +30 -0
  222. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  223. package/dist/cjs-types/values/value.d.ts.map +1 -1
  224. package/dist/cli.bundle.cjs +2728 -1627
  225. package/dist/cli.bundle.cjs.map +4 -4
  226. package/dist/esm/browser/http_client.js.map +2 -2
  227. package/dist/esm/browser/query_options.js.map +2 -2
  228. package/dist/esm/browser/simple_client.js.map +2 -2
  229. package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
  230. package/dist/esm/bundler/index.js +5 -4
  231. package/dist/esm/bundler/index.js.map +2 -2
  232. package/dist/esm/cli/codegen.js +0 -2
  233. package/dist/esm/cli/codegen.js.map +2 -2
  234. package/dist/esm/cli/configure.js +12 -4
  235. package/dist/esm/cli/configure.js.map +2 -2
  236. package/dist/esm/cli/deploy.js +28 -2
  237. package/dist/esm/cli/deploy.js.map +2 -2
  238. package/dist/esm/cli/deploymentSelect.js +6 -3
  239. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  240. package/dist/esm/cli/dev.js +6 -0
  241. package/dist/esm/cli/dev.js.map +2 -2
  242. package/dist/esm/cli/docs.js +3 -43
  243. package/dist/esm/cli/docs.js.map +2 -2
  244. package/dist/esm/cli/env.js +11 -6
  245. package/dist/esm/cli/env.js.map +2 -2
  246. package/dist/esm/cli/envDefault.js +7 -2
  247. package/dist/esm/cli/envDefault.js.map +2 -2
  248. package/dist/esm/cli/lib/api.js +2 -0
  249. package/dist/esm/cli/lib/api.js.map +2 -2
  250. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  251. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  252. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +98 -69
  253. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  254. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +107 -0
  255. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  256. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  257. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  258. package/dist/esm/cli/lib/codegen.js.map +2 -2
  259. package/dist/esm/cli/lib/command.js +2 -1
  260. package/dist/esm/cli/lib/command.js.map +2 -2
  261. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  262. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  263. package/dist/esm/cli/lib/components.js +63 -1
  264. package/dist/esm/cli/lib/components.js.map +2 -2
  265. package/dist/esm/cli/lib/config.js +55 -17
  266. package/dist/esm/cli/lib/config.js.map +2 -2
  267. package/dist/esm/cli/lib/deploy2.js +33 -3
  268. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  269. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +72 -0
  270. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  271. package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
  272. package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
  273. package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
  274. package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
  275. package/dist/esm/cli/lib/dev.js +6 -0
  276. package/dist/esm/cli/lib/dev.js.map +2 -2
  277. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  278. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  279. package/dist/esm/cli/lib/indexes.js.map +1 -1
  280. package/dist/esm/cli/lib/localDeployment/run.js +30 -2
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  287. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  288. package/dist/esm/cli/lib/run.js +5 -0
  289. package/dist/esm/cli/lib/run.js.map +2 -2
  290. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  291. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  292. package/dist/esm/cli/lib/usageLimits.js +4 -2
  293. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  295. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  296. package/dist/esm/cli/lib/utils/utils.js +84 -49
  297. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  298. package/dist/esm/cli/projectCreate.js +1 -1
  299. package/dist/esm/cli/projectCreate.js.map +1 -1
  300. package/dist/esm/index.js +1 -1
  301. package/dist/esm/index.js.map +1 -1
  302. package/dist/esm/nextjs/index.js.map +2 -2
  303. package/dist/esm/react/client.js.map +2 -2
  304. package/dist/esm/react/hydration.js +3 -1
  305. package/dist/esm/react/hydration.js.map +2 -2
  306. package/dist/esm/react/queries_observer.js +3 -1
  307. package/dist/esm/react/queries_observer.js.map +2 -2
  308. package/dist/esm/react/use_paginated_query2.js +3 -1
  309. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  310. package/dist/esm/react/use_queries.js.map +2 -2
  311. package/dist/esm/server/api.js.map +2 -2
  312. package/dist/esm/server/components/index.js.map +2 -2
  313. package/dist/esm/server/cron.js +13 -11
  314. package/dist/esm/server/cron.js.map +2 -2
  315. package/dist/esm/server/impl/actions_impl.js +7 -3
  316. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  317. package/dist/esm/server/impl/meta_impl.js +9 -3
  318. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  319. package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
  320. package/dist/esm/server/impl/storage_impl.js +29 -0
  321. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  322. package/dist/esm/server/index.js +4 -1
  323. package/dist/esm/server/index.js.map +2 -2
  324. package/dist/esm/server/schema.js +72 -3
  325. package/dist/esm/server/schema.js.map +2 -2
  326. package/dist/esm/values/validator.js +1 -1
  327. package/dist/esm/values/validator.js.map +2 -2
  328. package/dist/esm/values/validators.js +82 -26
  329. package/dist/esm/values/validators.js.map +2 -2
  330. package/dist/esm/values/value.js +6 -0
  331. package/dist/esm/values/value.js.map +2 -2
  332. package/dist/esm-types/browser/http_client.d.ts +5 -5
  333. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  334. package/dist/esm-types/browser/query_options.d.ts +2 -2
  335. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  336. package/dist/esm-types/browser/simple_client.d.ts +6 -6
  337. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  338. package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
  339. package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  340. package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  341. package/dist/esm-types/bundler/index.d.ts +9 -2
  342. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  343. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  344. package/dist/esm-types/cli/configure.d.ts +6 -0
  345. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  346. package/dist/esm-types/cli/deploy.d.ts +2 -0
  347. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  348. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  349. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  350. package/dist/esm-types/cli/dev.d.ts +1 -0
  351. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  352. package/dist/esm-types/cli/docs.d.ts.map +1 -1
  353. package/dist/esm-types/cli/env.d.ts.map +1 -1
  354. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  355. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  356. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  358. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  359. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  360. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +25 -6
  361. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  362. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
  363. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  364. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  365. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  366. package/dist/esm-types/cli/lib/codegen.d.ts +0 -2
  367. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  368. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  369. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  370. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  371. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  372. package/dist/esm-types/cli/lib/components.d.ts +5 -0
  373. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  374. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  375. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/deploy2.d.ts +8 -0
  377. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
  379. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  380. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  381. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  382. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  383. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  384. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  385. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  386. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  387. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
  389. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  391. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
  392. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  393. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  394. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  395. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  396. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  397. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  398. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  399. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  400. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  401. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  402. package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -7
  403. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  404. package/dist/esm-types/index.d.ts +1 -1
  405. package/dist/esm-types/nextjs/index.d.ts +6 -6
  406. package/dist/esm-types/nextjs/index.d.ts.map +1 -1
  407. package/dist/esm-types/react/client.d.ts +15 -15
  408. package/dist/esm-types/react/client.d.ts.map +1 -1
  409. package/dist/esm-types/react/hydration.d.ts +3 -3
  410. package/dist/esm-types/react/hydration.d.ts.map +1 -1
  411. package/dist/esm-types/react/queries_observer.d.ts +9 -9
  412. package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
  413. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  414. package/dist/esm-types/react/use_queries.d.ts +14 -6
  415. package/dist/esm-types/react/use_queries.d.ts.map +1 -1
  416. package/dist/esm-types/server/api.d.ts +157 -7
  417. package/dist/esm-types/server/api.d.ts.map +1 -1
  418. package/dist/esm-types/server/components/index.d.ts +2 -2
  419. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  420. package/dist/esm-types/server/cron.d.ts +21 -20
  421. package/dist/esm-types/server/cron.d.ts.map +1 -1
  422. package/dist/esm-types/server/impl/actions_impl.d.ts +22 -7
  423. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  424. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  425. package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
  426. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  427. package/dist/esm-types/server/index.d.ts +2 -2
  428. package/dist/esm-types/server/index.d.ts.map +1 -1
  429. package/dist/esm-types/server/meta.d.ts +63 -0
  430. package/dist/esm-types/server/meta.d.ts.map +1 -1
  431. package/dist/esm-types/server/registration.d.ts +17 -7
  432. package/dist/esm-types/server/registration.d.ts.map +1 -1
  433. package/dist/esm-types/server/scheduler.d.ts +9 -7
  434. package/dist/esm-types/server/scheduler.d.ts.map +1 -1
  435. package/dist/esm-types/server/schema.d.ts +34 -0
  436. package/dist/esm-types/server/schema.d.ts.map +1 -1
  437. package/dist/esm-types/server/storage.d.ts.map +1 -1
  438. package/dist/esm-types/values/validator.d.ts.map +1 -1
  439. package/dist/esm-types/values/validators.d.ts +30 -0
  440. package/dist/esm-types/values/validators.d.ts.map +1 -1
  441. package/dist/esm-types/values/value.d.ts.map +1 -1
  442. package/dist/react.bundle.js +7 -1
  443. package/dist/react.bundle.js.map +2 -2
  444. package/package.json +9 -9
  445. package/schemas/convex.schema.json +5 -5
  446. package/src/browser/http_client.ts +43 -10
  447. package/src/browser/query_options.ts +11 -5
  448. package/src/browser/simple_client.ts +35 -14
  449. package/src/browser/sync/optimistic_updates.ts +17 -4
  450. package/src/browser/sync/optimistic_updates_impl.ts +17 -4
  451. package/src/bundler/index.ts +9 -4
  452. package/src/cli/codegen.ts +0 -1
  453. package/src/cli/configure.ts +27 -7
  454. package/src/cli/deploy.ts +37 -5
  455. package/src/cli/deploymentSelect.ts +7 -4
  456. package/src/cli/dev.ts +9 -0
  457. package/src/cli/docs.ts +3 -44
  458. package/src/cli/env.ts +12 -6
  459. package/src/cli/envDefault.ts +8 -2
  460. package/src/cli/generatedApi.ts +1 -1
  461. package/src/cli/lib/api.ts +5 -1
  462. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  463. package/src/cli/lib/checkForLargeIndexDeletion.ts +150 -91
  464. package/src/cli/lib/checkForSlowSchemaValidation.ts +141 -0
  465. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  466. package/src/cli/lib/codegen.ts +0 -2
  467. package/src/cli/lib/command.ts +3 -0
  468. package/src/cli/lib/components/definition/bundle.ts +68 -14
  469. package/src/cli/lib/components.ts +84 -0
  470. package/src/cli/lib/config.ts +85 -18
  471. package/src/cli/lib/deploy2.ts +66 -2
  472. package/src/cli/lib/deployApi/evaluateSchema.ts +97 -0
  473. package/src/cli/lib/deployApi/finishPush.ts +1 -1
  474. package/src/cli/lib/deployApi/startPush.ts +1 -1
  475. package/src/cli/lib/dev.ts +15 -0
  476. package/src/cli/lib/formatValidationProgress.ts +35 -0
  477. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  478. package/src/cli/lib/indexes.ts +1 -1
  479. package/src/cli/lib/localDeployment/run.ts +44 -2
  480. package/src/cli/lib/localDeployment/upgrade.ts +4 -6
  481. package/src/cli/lib/localDeployment/utils.ts +6 -0
  482. package/src/cli/lib/mcp/tools/env.ts +17 -3
  483. package/src/cli/lib/run.ts +3 -0
  484. package/src/cli/lib/schemaEvaluation.ts +88 -0
  485. package/src/cli/lib/usageLimits.ts +2 -0
  486. package/src/cli/lib/utils/mutex.ts +9 -27
  487. package/src/cli/lib/utils/utils.ts +127 -56
  488. package/src/cli/projectCreate.ts +1 -1
  489. package/src/index.ts +1 -1
  490. package/src/nextjs/index.ts +19 -8
  491. package/src/react/client.ts +73 -30
  492. package/src/react/hydration.tsx +14 -6
  493. package/src/react/queries_observer.ts +19 -16
  494. package/src/react/use_paginated_query2.ts +10 -6
  495. package/src/react/use_queries.ts +23 -7
  496. package/src/server/api.ts +220 -14
  497. package/src/server/components/index.ts +4 -6
  498. package/src/server/cron.ts +34 -24
  499. package/src/server/impl/actions_impl.ts +39 -10
  500. package/src/server/impl/meta_impl.ts +8 -1
  501. package/src/server/impl/scheduler_impl.ts +13 -6
  502. package/src/server/impl/storage_impl.ts +30 -0
  503. package/src/server/index.ts +6 -1
  504. package/src/server/meta.ts +79 -0
  505. package/src/server/registration.ts +38 -7
  506. package/src/server/scheduler.ts +22 -7
  507. package/src/server/schema.ts +77 -0
  508. package/src/server/storage.ts +17 -0
  509. package/src/values/validator.ts +3 -1
  510. package/src/values/validators.ts +85 -27
  511. package/src/values/value.ts +9 -5
@@ -645,9 +645,11 @@ export async function bundleImplementations({
645
645
  functions: Bundle[];
646
646
  definitionPath: ComponentDefinitionPath;
647
647
  }[];
648
+ buildDebugInfos: BuildDebugInfo[];
648
649
  }> {
649
650
  let appImplementation;
650
651
  const componentImplementations = [];
652
+ const buildDebugInfos: BuildDebugInfo[] = [];
651
653
 
652
654
  // For --component-dir flag, skip bundling root implementations (no real code to bundle)
653
655
  const directoriesToBundle = rootComponentDirectory.syntheticComponentImport
@@ -660,13 +662,25 @@ export async function bundleImplementations({
660
662
  rootComponentDirectory.path,
661
663
  directory.path,
662
664
  );
665
+ // definitionPath is the canonical form
666
+ const definitionPath = toComponentDefinitionPath(
667
+ rootComponentDirectory,
668
+ directory,
669
+ );
663
670
  let schema;
664
- if (ctx.fs.exists(path.resolve(resolvedPath, "schema.ts"))) {
665
- schema =
666
- (await bundleSchema(ctx, resolvedPath, extraConditions))[0] || null;
667
- } else if (ctx.fs.exists(path.resolve(resolvedPath, "schema.js"))) {
668
- schema =
669
- (await bundleSchema(ctx, resolvedPath, extraConditions))[0] || null;
671
+ if (
672
+ ctx.fs.exists(path.resolve(resolvedPath, "schema.ts")) ||
673
+ ctx.fs.exists(path.resolve(resolvedPath, "schema.js"))
674
+ ) {
675
+ const schemaResult = await bundleSchema(
676
+ ctx,
677
+ resolvedPath,
678
+ extraConditions,
679
+ );
680
+ buildDebugInfos.push(
681
+ buildDebugInfo(directory, definitionPath, "schema", schemaResult),
682
+ );
683
+ schema = schemaResult.modules[0] || null;
670
684
  } else {
671
685
  schema = null;
672
686
  }
@@ -676,6 +690,7 @@ export async function bundleImplementations({
676
690
  modules: Bundle[];
677
691
  externalDependencies: Map<string, string>;
678
692
  bundledModuleNames: Set<string>;
693
+ metafile: Metafile | null;
679
694
  } = await bundle({
680
695
  ctx,
681
696
  dir: resolvedPath,
@@ -693,6 +708,9 @@ export async function bundleImplementations({
693
708
  printedMessage: "external dependencies not supported",
694
709
  });
695
710
  }
711
+ buildDebugInfos.push(
712
+ buildDebugInfo(directory, definitionPath, "convex", convexResult),
713
+ );
696
714
  const functions = convexResult.modules;
697
715
  if (isRoot) {
698
716
  if (verbose) {
@@ -702,6 +720,7 @@ export async function bundleImplementations({
702
720
  modules: Bundle[];
703
721
  externalDependencies: Map<string, string>;
704
722
  bundledModuleNames: Set<string>;
723
+ metafile: Metafile | null;
705
724
  } = await bundle({
706
725
  ctx,
707
726
  dir: resolvedPath,
@@ -713,6 +732,9 @@ export async function bundleImplementations({
713
732
  extraConditions,
714
733
  includeSourcesContent,
715
734
  });
735
+ buildDebugInfos.push(
736
+ buildDebugInfo(directory, definitionPath, "node", nodeResult),
737
+ );
716
738
 
717
739
  const externalNodeDependencies: NodeDependency[] = [];
718
740
  for (const [
@@ -724,10 +746,15 @@ export async function bundleImplementations({
724
746
  version: moduleVersion,
725
747
  });
726
748
  }
727
- const authBundle = await bundleAuthConfig(ctx, resolvedPath);
749
+ const authResult = await bundleAuthConfig(ctx, resolvedPath);
750
+ buildDebugInfos.push(
751
+ buildDebugInfo(directory, definitionPath, "auth", authResult),
752
+ );
728
753
  appImplementation = {
729
754
  schema,
730
- functions: functions.concat(nodeResult.modules).concat(authBundle),
755
+ functions: functions
756
+ .concat(nodeResult.modules)
757
+ .concat(authResult.modules),
731
758
  externalNodeDependencies,
732
759
  };
733
760
  } else {
@@ -757,11 +784,6 @@ export async function bundleImplementations({
757
784
  });
758
785
  }
759
786
  }
760
- // definitionPath is the canonical form
761
- const definitionPath = toComponentDefinitionPath(
762
- rootComponentDirectory,
763
- directory,
764
- );
765
787
  componentImplementations.push({ definitionPath, schema, functions });
766
788
  }
767
789
  }
@@ -783,7 +805,39 @@ export async function bundleImplementations({
783
805
  }
784
806
  }
785
807
 
786
- return { appImplementation, componentImplementations };
808
+ return { appImplementation, componentImplementations, buildDebugInfos };
809
+ }
810
+
811
+ /**
812
+ * Debug information for a build in a push.
813
+ */
814
+ export type BuildDebugInfo = {
815
+ directory: ComponentDirectory;
816
+ definitionPath: ComponentDefinitionPath;
817
+ kind: "convex" | "node" | "schema" | "auth";
818
+ metafile: Metafile | null;
819
+ modules: Bundle[];
820
+ externalDependencies: Map<string, string>;
821
+ };
822
+
823
+ function buildDebugInfo(
824
+ directory: ComponentDirectory,
825
+ definitionPath: ComponentDefinitionPath,
826
+ kind: BuildDebugInfo["kind"],
827
+ result: {
828
+ modules: Bundle[];
829
+ metafile: Metafile | null;
830
+ externalDependencies?: Map<string, string>;
831
+ },
832
+ ): BuildDebugInfo {
833
+ return {
834
+ directory,
835
+ definitionPath,
836
+ kind,
837
+ metafile: result.metafile,
838
+ modules: result.modules,
839
+ externalDependencies: result.externalDependencies ?? new Map(),
840
+ };
787
841
  }
788
842
 
789
843
  async function registerEsbuildReads(
@@ -52,6 +52,19 @@ import { DeploymentType } from "./api.js";
52
52
  import { deploymentDashboardUrlPage } from "./dashboard.js";
53
53
  import { formatIndex, LargeIndexDeletionCheck } from "./indexes.js";
54
54
  import { checkForLargeIndexDeletion } from "./checkForLargeIndexDeletion.js";
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";
55
68
  import { LogManager } from "./logs.js";
56
69
  import { createHash } from "crypto";
57
70
  import { Bundle, BundleHash } from "../../bundler/index.js";
@@ -75,6 +88,12 @@ export type PushOptions = {
75
88
  pushAllModules: boolean;
76
89
  logManager?: LogManager | undefined;
77
90
  largeIndexDeletionCheck: LargeIndexDeletionCheck;
91
+ largeIndexBackfillCheck: LargeIndexBackfillCheck;
92
+ stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;
93
+ // Whether a dry run should warn when the schema change would block the
94
+ // deploy on a slow table walk. On for deploys; off for commands whose dry
95
+ // runs never deploy (e.g. codegen).
96
+ warnOnSlowSchemaValidation: boolean;
78
97
  message: string | null;
79
98
  };
80
99
 
@@ -120,6 +139,11 @@ export async function runCodegen(
120
139
  liveComponentSources: options.liveComponentSources,
121
140
  typecheckComponents: false,
122
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,
123
147
  },
124
148
  );
125
149
  } else {
@@ -229,6 +253,9 @@ async function startComponentsPushAndCodegen(
229
253
  pushAllModules?: boolean;
230
254
  debugNodeApis: boolean;
231
255
  largeIndexDeletionCheck: LargeIndexDeletionCheck;
256
+ largeIndexBackfillCheck: LargeIndexBackfillCheck;
257
+ stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;
258
+ warnOnSlowSchemaValidation: boolean;
232
259
  codegenOnlyThisComponent?: string | undefined;
233
260
  },
234
261
  ): Promise<StartPushResponse | null> {
@@ -445,6 +472,11 @@ async function startComponentsPushAndCodegen(
445
472
  }
446
473
  logStartPushSizes(parentSpan, startPushRequest);
447
474
 
475
+ const schemaEvaluation = sharedSchemaEvaluation(
476
+ ctx,
477
+ startPushRequest,
478
+ options,
479
+ );
448
480
  if (options.largeIndexDeletionCheck !== "no verification") {
449
481
  await parentSpan.enterAsync("checkForLargeIndexDeletion", (span) =>
450
482
  checkForLargeIndexDeletion({
@@ -452,12 +484,64 @@ async function startComponentsPushAndCodegen(
452
484
  span,
453
485
  request: startPushRequest,
454
486
  options,
487
+ schemaEvaluation,
455
488
  askForConfirmation:
456
489
  options.largeIndexDeletionCheck === "ask for confirmation",
457
490
  }),
458
491
  );
459
492
  }
460
493
 
494
+ const largeIndexBackfillCheck = options.largeIndexBackfillCheck;
495
+ if (largeIndexBackfillCheck !== "no verification") {
496
+ await parentSpan.enterAsync("checkForLargeIndexBackfill", (span) =>
497
+ checkForLargeIndexBackfill({
498
+ ctx,
499
+ span,
500
+ schemaEvaluation,
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,
541
+ }),
542
+ );
543
+ }
544
+
461
545
  changeSpinner("Uploading functions to Convex...");
462
546
  const startPushResponse = await parentSpan.enterAsync("startPush", (span) =>
463
547
  startPush(ctx, span, startPushRequest, options),
@@ -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
 
@@ -22,6 +22,10 @@ import {
22
22
  startPushResponse,
23
23
  StartPushResponse,
24
24
  } from "./deployApi/startPush.js";
25
+ import {
26
+ EvaluateSchemaResponse,
27
+ evaluateSchemaResponse,
28
+ } from "./deployApi/evaluateSchema.js";
25
29
  import {
26
30
  AppDefinitionConfig,
27
31
  ComponentDefinitionConfig,
@@ -103,6 +107,35 @@ export async function evaluatePush(
103
107
  return evaluatePushResponse.parse(response);
104
108
  }
105
109
 
110
+ export async function evaluateSchema(
111
+ ctx: Context,
112
+ span: Span,
113
+ request: StartPushRequest,
114
+ options: {
115
+ url: string;
116
+ deploymentName: string | null;
117
+ deploymentType?: DeploymentType;
118
+ },
119
+ // When set, a failed evaluation throws the raw error instead of crashing
120
+ // the process, so best-effort callers (e.g. advisory checks) can recover.
121
+ bestEffort?: boolean,
122
+ ): Promise<EvaluateSchemaResponse> {
123
+ const response = await pushCode(
124
+ ctx,
125
+ span,
126
+ request,
127
+ options,
128
+ "/api/deploy2/evaluate_schema",
129
+ bestEffort,
130
+ );
131
+ return evaluateSchemaResponse.parse(response);
132
+ }
133
+
134
+ // Retries for best-effort requests, where a transient failure should be
135
+ // ridden out if possible but the command proceeds without the result
136
+ // otherwise.
137
+ const BEST_EFFORT_RETRIES = 5;
138
+
106
139
  async function pushCode(
107
140
  ctx: Context,
108
141
  span: Span,
@@ -112,7 +145,11 @@ async function pushCode(
112
145
  deploymentName: string | null;
113
146
  deploymentType?: DeploymentType;
114
147
  },
115
- endpoint: "/api/deploy2/start_push" | "/api/deploy2/evaluate_push",
148
+ endpoint:
149
+ | "/api/deploy2/start_push"
150
+ | "/api/deploy2/evaluate_push"
151
+ | "/api/deploy2/evaluate_schema",
152
+ bestEffort?: boolean,
116
153
  ): Promise<unknown> {
117
154
  // Log a summary of the push request instead of the full object
118
155
  const unchangedModuleCount =
@@ -136,6 +173,18 @@ async function pushCode(
136
173
  deploymentUrl: options.url,
137
174
  adminKey: request.adminKey,
138
175
  onError,
176
+ // Best-effort callers tolerate failure, so retry only plausibly
177
+ // transient conditions — network errors and 5xx responses (e.g. table
178
+ // summaries still bootstrapping) — and fail fast on everything else,
179
+ // like a 404 from a deployment whose backend doesn't yet expose the
180
+ // endpoint.
181
+ ...(bestEffort
182
+ ? {
183
+ maxRetries: BEST_EFFORT_RETRIES,
184
+ shouldRetry: (error: Error | null, response: Response | null) =>
185
+ error !== null || (response !== null && response.status >= 500),
186
+ }
187
+ : {}),
139
188
  });
140
189
  try {
141
190
  const response = await fetch(endpoint, {
@@ -149,6 +198,11 @@ async function pushCode(
149
198
  });
150
199
  return await response.json();
151
200
  } catch (error: unknown) {
201
+ if (bestEffort) {
202
+ // The caller handles this itself instead of crashing the process.
203
+ // eslint-disable-next-line no-restricted-syntax
204
+ throw error;
205
+ }
152
206
  return await handlePushConfigError(
153
207
  ctx,
154
208
  error,
@@ -403,7 +457,9 @@ export async function deployToDeployment(
403
457
  writePushRequest?: string | undefined;
404
458
  liveComponentSources?: boolean | undefined;
405
459
  skipWorkosCheck?: boolean | undefined;
460
+ skipLargeIndexesCheck: boolean;
406
461
  allowDeletingLargeIndexes: boolean;
462
+ allowUnstagingSchema: boolean;
407
463
  message: string | null;
408
464
  },
409
465
  ) {
@@ -450,9 +506,17 @@ export async function deployToDeployment(
450
506
  writePushRequest: options.writePushRequest,
451
507
  liveComponentSources: !!options.liveComponentSources,
452
508
  pushAllModules: !!options.pushAllModules,
453
- 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
454
517
  ? "has confirmation"
455
518
  : "ask for confirmation",
519
+ warnOnSlowSchemaValidation: true,
456
520
  message: options.message,
457
521
  };
458
522
  showSpinner(`Deploying to ${url}...${options.dryRun ? " [dry run]" : ""}`);
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ import { componentDefinitionPath, componentPath } from "./paths.js";
3
+ import { developerIndexConfig } from "./finishPush.js";
4
+ import { looseObject } from "./utils.js";
5
+
6
+ // Hand-mirrors `TableValidationOutcome` in
7
+ // `crates/common/src/schemas/mod.rs` (`#[serde(rename_all = "camelCase")]`),
8
+ // like the rest of this deployApi directory: there's no codegen sharing
9
+ // types between the Rust backend and this package.
10
+ export const tableValidationOutcome = z.enum([
11
+ "notValidated",
12
+ "supersetOfEnforced",
13
+ "supersetOfStagedValidated",
14
+ "supersetOfShape",
15
+ "mustWalk",
16
+ ]);
17
+ export type TableValidationOutcome = z.infer<typeof tableValidationOutcome>;
18
+
19
+ export const indexChangePrediction = z.enum([
20
+ "added",
21
+ "identical",
22
+ "enabled",
23
+ "disabled",
24
+ "dropped",
25
+ ]);
26
+ export type IndexChangePrediction = z.infer<typeof indexChangePrediction>;
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
+
41
+ export const tablePrediction = looseObject({
42
+ name: z.string(),
43
+ outcome: tableValidationOutcome,
44
+ numDocs: z.number(),
45
+ sizeBytes: z.number(),
46
+ staged: stagedValidatorState.optional(),
47
+ canSkipAfterStagedValidation: z.boolean().optional(),
48
+ });
49
+ export type TablePrediction = z.infer<typeof tablePrediction>;
50
+
51
+ export const indexPrediction = z.intersection(
52
+ developerIndexConfig,
53
+ looseObject({
54
+ change: indexChangePrediction,
55
+ needsBackfill: z.boolean(),
56
+ numDocs: z.number(),
57
+ }),
58
+ );
59
+ export type IndexPrediction = z.infer<typeof indexPrediction>;
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
+
78
+ export const componentSchemaPrediction = looseObject({
79
+ definitionPath: z.string(),
80
+ schemaValidation: z.boolean(),
81
+ tables: z.array(tablePrediction),
82
+ indexes: z.array(indexPrediction),
83
+ // Optional: responses from backends predating the field.
84
+ discardedStagedValidators: z.array(discardedStagedValidator).optional(),
85
+ });
86
+ export type ComponentSchemaPrediction = z.infer<
87
+ typeof componentSchemaPrediction
88
+ >;
89
+
90
+ export const evaluateSchemaResponse = looseObject({
91
+ componentSchemaEvaluations: z.record(
92
+ componentPath,
93
+ componentSchemaPrediction,
94
+ ),
95
+ newComponentDefinitions: z.array(componentDefinitionPath),
96
+ });
97
+ export type EvaluateSchemaResponse = z.infer<typeof evaluateSchemaResponse>;
@@ -45,7 +45,7 @@ export const cronDiff = looseObject({
45
45
  });
46
46
  export type CronDiff = z.infer<typeof cronDiff>;
47
47
 
48
- const developerIndexConfig = z.intersection(
48
+ export const developerIndexConfig = z.intersection(
49
49
  z.discriminatedUnion("type", [
50
50
  looseObject({
51
51
  name: z.string(),
@@ -29,7 +29,7 @@ export type StartPushRequest = z.infer<typeof startPushRequest>;
29
29
  export const schemaChange = looseObject({
30
30
  allocatedComponentIds: z.any(),
31
31
  schemaIds: z.any(),
32
- indexDiffs: z.record(componentDefinitionPath, indexDiff).optional(),
32
+ indexDiffs: z.record(componentPath, indexDiff).optional(),
33
33
  });
34
34
  export type SchemaChange = z.infer<typeof schemaChange>;
35
35
 
@@ -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,20 @@ 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",
165
+ warnOnSlowSchemaValidation: true,
151
166
  message: null,
152
167
  },
153
168
  devOptions,