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
@@ -4,6 +4,7 @@ import {
4
4
  changeSpinner,
5
5
  logFinishedStep,
6
6
  logMessage,
7
+ logVerbose,
7
8
  stopSpinner,
8
9
  } from "../../bundler/log.js";
9
10
  import { formatIndex } from "./indexes.js";
@@ -11,107 +12,85 @@ import { promptYesNo } from "./utils/prompts.js";
11
12
  import { Span } from "./tracing.js";
12
13
  import { StartPushRequest } from "./deployApi/startPush.js";
13
14
  import { evaluatePush } from "./deploy2.js";
14
- import { DeveloperIndexConfig, IndexDiff } from "./deployApi/finishPush.js";
15
+ import { DeveloperIndexConfig } from "./deployApi/finishPush.js";
16
+ import { EvaluateSchemaResponse } from "./deployApi/evaluateSchema.js";
15
17
  import { runSystemQuery } from "./run.js";
18
+ import { SchemaEvaluation } from "./schemaEvaluation.js";
19
+ import { integerFromEnv } from "./utils/utils.js";
16
20
 
17
21
  const MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 100_000;
18
22
 
23
+ type CheckOptions = {
24
+ url: string;
25
+ deploymentName: string | null;
26
+ adminKey: string;
27
+ };
28
+
29
+ type DeletedIndex = {
30
+ // The component instance path ("" for the root component), matching the
31
+ // keys of both `componentSchemaEvaluations` and `indexDiffs`.
32
+ componentPath: string;
33
+ index: DeveloperIndexConfig;
34
+ documentsCount: number;
35
+ replacedBy: DeveloperIndexConfig | null;
36
+ };
37
+
19
38
  export async function checkForLargeIndexDeletion({
20
39
  ctx,
21
40
  span,
22
41
  request,
23
42
  options,
43
+ schemaEvaluation,
24
44
  askForConfirmation,
25
45
  }: {
26
46
  ctx: Context;
27
47
  span: Span;
28
48
  request: StartPushRequest;
29
- options: {
30
- url: string;
31
- deploymentName: string | null;
32
- adminKey: string;
33
- };
49
+ options: CheckOptions;
50
+ schemaEvaluation: SchemaEvaluation;
34
51
  askForConfirmation: boolean;
35
52
  }): Promise<void> {
36
53
  changeSpinner("Verifying that the push isn’t deleting large indexes...");
37
54
 
38
- const { schemaChange } = await evaluatePush(ctx, span, request, options);
39
-
40
- const indexDiffs = schemaChange.indexDiffs ?? {};
41
- const deletedIndexes = Object.entries(indexDiffs).flatMap(
42
- ([componentDefinitionPath, indexDiff]) =>
43
- indexDiff.removed_indexes.map((index) => ({
44
- componentDefinitionPath,
45
- index,
46
- })),
47
- );
55
+ const schemaEvaluationResponse = await schemaEvaluation(span);
56
+ let deletedIndexes: DeletedIndex[];
57
+ if (schemaEvaluationResponse !== null) {
58
+ deletedIndexes = deletedIndexesFromSchemaEvaluation(
59
+ schemaEvaluationResponse,
60
+ );
61
+ } else {
62
+ logVerbose(
63
+ "Schema evaluation unavailable, sizing deleted indexes per table",
64
+ );
65
+ deletedIndexes = await deletedIndexesFromTableSizes({
66
+ ctx,
67
+ span,
68
+ request,
69
+ options,
70
+ });
71
+ }
48
72
 
49
73
  if (deletedIndexes.length === 0) {
50
74
  logFinishedStep("No indexes are deleted by this push");
51
75
  return;
52
76
  }
53
77
 
54
- const tablesWithDeletedIndexes = [
55
- ...new Set(
56
- deletedIndexes.map(
57
- ({ componentDefinitionPath, index }) =>
58
- `${componentDefinitionPath}:${getTableName(index)}`,
59
- ),
60
- ),
61
- ].map((str) => {
62
- const [componentDefinitionPath, table] = str.split(":");
63
- return { componentDefinitionPath, table };
64
- });
65
- changeSpinner("Checking whether the deleted indexes are on large tables...");
66
- const documentCounts = await Promise.all(
67
- tablesWithDeletedIndexes.map(
68
- async ({ componentDefinitionPath, table }) => ({
69
- componentDefinitionPath,
70
- table,
71
- count: (await runSystemQuery(ctx, {
72
- deploymentUrl: options.url,
73
- adminKey: options.adminKey,
74
- functionName: "_system/cli/tableSize:default",
75
- componentPath: componentDefinitionPath,
76
- args: { tableName: table },
77
- })) as number,
78
- }),
79
- ),
80
- );
81
- const deletedIndexesWithDocumentsCount = deletedIndexes.map(
82
- ({ componentDefinitionPath, index }) => ({
83
- componentDefinitionPath,
84
- index,
85
- count: documentCounts.find(
86
- (count) =>
87
- count.table === getTableName(index) &&
88
- count.componentDefinitionPath === componentDefinitionPath,
89
- )!.count,
90
- }),
91
- );
92
-
93
78
  const minDocumentsForWarning = minDocumentsForIndexDeleteWarning();
94
79
  if (
95
- !deletedIndexesWithDocumentsCount.some(
96
- ({ count }) => count >= minDocumentsForWarning,
80
+ !deletedIndexes.some(
81
+ ({ documentsCount }) => documentsCount >= minDocumentsForWarning,
97
82
  )
98
83
  ) {
99
84
  logFinishedStep("No large indexes are deleted by this push");
100
85
  return;
101
86
  }
102
87
 
103
- logMessage(`⚠️ This code push will ${chalkStderr.bold("delete")} the following ${deletedIndexesWithDocumentsCount.length === 1 ? "index" : "indexes"}
88
+ logMessage(`⚠️ This code push will ${chalkStderr.bold("delete")} the following ${deletedIndexes.length === 1 ? "index" : "indexes"}
104
89
  from your production deployment (${options.url}):
105
90
 
106
- ${deletedIndexesWithDocumentsCount
107
- .map(({ componentDefinitionPath, index, count }) =>
108
- formatDeletedIndex({
109
- componentDefinitionPath,
110
- index,
111
- indexDiff: indexDiffs[componentDefinitionPath],
112
- documentsCount: count,
113
- minDocumentsForWarning,
114
- }),
91
+ ${deletedIndexes
92
+ .map((deletedIndex) =>
93
+ formatDeletedIndex({ ...deletedIndex, minDocumentsForWarning }),
115
94
  )
116
95
  .join("\n")}
117
96
 
@@ -119,9 +98,11 @@ The documents that are in the index won’t be deleted, but the index will need
119
98
  to be backfilled again if you want to restore it later.
120
99
  `);
121
100
 
101
+ // Either --skip-large-indexes-check or its deletion-only predecessor
102
+ // --allow-deleting-large-indexes gets here, so name neither.
122
103
  if (!askForConfirmation) {
123
104
  logFinishedStep(
124
- "Proceeding with push since --allow-deleting-large-indexes is set",
105
+ "Proceeding with push since deleting large indexes was allowed by flag",
125
106
  );
126
107
  return;
127
108
  }
@@ -132,14 +113,14 @@ to be backfilled again if you want to restore it later.
132
113
  errorType: "fatal",
133
114
  printedMessage: `To confirm the push:
134
115
  • run the deploy command in an ${chalkStderr.bold("interactive terminal")}
135
- • or run the deploy command with the ${chalkStderr.bold("--allow-deleting-large-indexes")} flag`,
116
+ • or run the deploy command with the ${chalkStderr.bold("--skip-large-indexes-check")} flag`,
136
117
  });
137
118
  }
138
119
 
139
120
  stopSpinner();
140
121
  if (
141
122
  !(await promptYesNo(ctx, {
142
- message: `Delete ${deletedIndexesWithDocumentsCount.length === 1 ? "this index" : "these indexes"}?`,
123
+ message: `Delete ${deletedIndexes.length === 1 ? "this index" : "these indexes"}?`,
143
124
  default: false,
144
125
  }))
145
126
  ) {
@@ -153,30 +134,112 @@ to be backfilled again if you want to restore it later.
153
134
  logFinishedStep("Proceeding with push.");
154
135
  }
155
136
 
137
+ // Preferred source: one schema evaluation reports every dropped index
138
+ // together with its table's document count, requiring only the
139
+ // `deployment:deploy` permission the push itself needs.
140
+ export function deletedIndexesFromSchemaEvaluation(
141
+ response: EvaluateSchemaResponse,
142
+ ): DeletedIndex[] {
143
+ return Object.entries(response.componentSchemaEvaluations).flatMap(
144
+ ([componentPath, prediction]) =>
145
+ prediction.indexes
146
+ .filter((index) => index.change === "dropped")
147
+ .map((index) => ({
148
+ componentPath,
149
+ index,
150
+ documentsCount: index.numDocs,
151
+ replacedBy:
152
+ prediction.indexes.find(
153
+ (other) => other.change === "added" && other.name === index.name,
154
+ ) ?? null,
155
+ })),
156
+ );
157
+ }
158
+
159
+ // Fallback for deployments without `evaluate_schema`: diff indexes with
160
+ // `evaluate_push`, then size each affected table with a system query. The
161
+ // system query needs the `deployment:data:view` permission, which a
162
+ // deploy-scoped key may lack.
163
+ export async function deletedIndexesFromTableSizes({
164
+ ctx,
165
+ span,
166
+ request,
167
+ options,
168
+ }: {
169
+ ctx: Context;
170
+ span: Span;
171
+ request: StartPushRequest;
172
+ options: CheckOptions;
173
+ }): Promise<DeletedIndex[]> {
174
+ const { schemaChange } = await evaluatePush(ctx, span, request, options);
175
+
176
+ const indexDiffs = schemaChange.indexDiffs ?? {};
177
+ const deletedIndexes = Object.entries(indexDiffs).flatMap(
178
+ ([componentPath, indexDiff]) =>
179
+ indexDiff.removed_indexes.map((index) => ({
180
+ componentPath,
181
+ index,
182
+ replacedBy:
183
+ indexDiff.added_indexes.find((other) => other.name === index.name) ??
184
+ null,
185
+ })),
186
+ );
187
+
188
+ if (deletedIndexes.length === 0) {
189
+ return [];
190
+ }
191
+
192
+ const tablesWithDeletedIndexes = [
193
+ ...new Set(
194
+ deletedIndexes.map(
195
+ ({ componentPath, index }) => `${componentPath}:${getTableName(index)}`,
196
+ ),
197
+ ),
198
+ ].map((str) => {
199
+ const [componentPath, table] = str.split(":");
200
+ return { componentPath, table };
201
+ });
202
+ changeSpinner("Checking whether the deleted indexes are on large tables...");
203
+ const documentCounts = await Promise.all(
204
+ tablesWithDeletedIndexes.map(async ({ componentPath, table }) => ({
205
+ componentPath,
206
+ table,
207
+ count: (await runSystemQuery(ctx, {
208
+ deploymentUrl: options.url,
209
+ adminKey: options.adminKey,
210
+ functionName: "_system/cli/tableSize:default",
211
+ componentPath,
212
+ args: { tableName: table },
213
+ })) as number,
214
+ })),
215
+ );
216
+ return deletedIndexes.map(({ componentPath, index, replacedBy }) => ({
217
+ componentPath,
218
+ index,
219
+ replacedBy,
220
+ documentsCount: documentCounts.find(
221
+ (count) =>
222
+ count.table === getTableName(index) &&
223
+ count.componentPath === componentPath,
224
+ )!.count,
225
+ }));
226
+ }
227
+
156
228
  function formatDeletedIndex({
157
- componentDefinitionPath,
229
+ componentPath,
158
230
  index,
159
- indexDiff,
160
231
  documentsCount,
232
+ replacedBy,
161
233
  minDocumentsForWarning,
162
- }: {
163
- componentDefinitionPath: string;
164
- index: DeveloperIndexConfig;
165
- indexDiff: IndexDiff;
166
- documentsCount: number;
167
- minDocumentsForWarning: number;
168
- }) {
234
+ }: DeletedIndex & { minDocumentsForWarning: number }) {
169
235
  const componentNameFormatted =
170
- componentDefinitionPath !== ""
171
- ? `${chalkStderr.gray(componentDefinitionPath)}:`
172
- : "";
236
+ componentPath !== "" ? `${chalkStderr.gray(componentPath)}:` : "";
173
237
 
174
238
  const documentsCountFormatted =
175
239
  documentsCount >= minDocumentsForWarning
176
240
  ? ` ${chalkStderr.yellowBright(`⚠️ ${documentsCount.toLocaleString()} documents`)}`
177
241
  : ` ${documentsCount.toLocaleString()} ${documentsCount === 1 ? "document" : "documents"}`;
178
242
 
179
- const replacedBy = indexDiff.added_indexes.find((i) => i.name === index.name);
180
243
  const replacedByFormatted = replacedBy
181
244
  ? `\n ${chalkStderr.green("→ replaced by:")} ${formatIndex(replacedBy)}`
182
245
  : "";
@@ -196,12 +259,8 @@ function getTableName(index: DeveloperIndexConfig) {
196
259
  }
197
260
 
198
261
  function minDocumentsForIndexDeleteWarning(): number {
199
- const envValue = process.env.CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
200
- if (envValue !== undefined) {
201
- const parsed = parseInt(envValue, 10);
202
- if (!isNaN(parsed)) {
203
- return parsed;
204
- }
205
- }
206
- return MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
262
+ return integerFromEnv(
263
+ "CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING",
264
+ MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING,
265
+ );
207
266
  }
@@ -0,0 +1,141 @@
1
+ import { chalkStderr } from "chalk";
2
+ import { logMessage } from "../../bundler/log.js";
3
+ import { Span } from "./tracing.js";
4
+ import {
5
+ EvaluateSchemaResponse,
6
+ TablePrediction,
7
+ } from "./deployApi/evaluateSchema.js";
8
+ import { SchemaEvaluation } from "./schemaEvaluation.js";
9
+ import { formatSize, integerFromEnv } from "./utils/utils.js";
10
+ import {
11
+ formatDiscardedStagedValidator,
12
+ formatValidationProgress,
13
+ } from "./formatValidationProgress.js";
14
+
15
+ const MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27; // 128 MiB
16
+
17
+ export async function checkForSlowSchemaValidation({
18
+ span,
19
+ schemaEvaluation,
20
+ dryRun,
21
+ }: {
22
+ span: Span;
23
+ schemaEvaluation: SchemaEvaluation;
24
+ dryRun: boolean;
25
+ }): Promise<void> {
26
+ const response = await schemaEvaluation(span);
27
+ if (response === null) {
28
+ return;
29
+ }
30
+ reportStagedValidators(response);
31
+ if (!dryRun) {
32
+ return;
33
+ }
34
+
35
+ const walkedTables = Object.entries(
36
+ response.componentSchemaEvaluations,
37
+ ).flatMap(([componentPath, prediction]) =>
38
+ prediction.tables
39
+ .filter((table) => table.outcome === "mustWalk")
40
+ .map((table) => ({ componentPath, table })),
41
+ );
42
+ if (walkedTables.length === 0) {
43
+ return;
44
+ }
45
+
46
+ const totalBytes = walkedTables.reduce(
47
+ (sum, { table }) => sum + table.sizeBytes,
48
+ 0,
49
+ );
50
+ if (totalBytes < minBytesForSchemaWalkWarning()) {
51
+ return;
52
+ }
53
+
54
+ const shouldSuggestStaging = walkedTables.some(
55
+ ({ table }) => !table.canSkipAfterStagedValidation,
56
+ );
57
+ logMessage(`⚠️ This schema change requires checking every document in the following ${walkedTables.length === 1 ? "table" : "tables"} against your new schema, totaling ${chalkStderr.yellowBright(formatSize(totalBytes))}. This deploy may take a while:
58
+
59
+ ${walkedTables
60
+ .map(({ componentPath, table }) =>
61
+ formatWalkedTable({ componentPath, table }),
62
+ )
63
+ .join("\n")}
64
+ ${
65
+ shouldSuggestStaging
66
+ ? `\nTip: stage the new validator (\`defineTable({...}).staged({...})\`) to validate it in the background without blocking deploys.`
67
+ : ""
68
+ }`);
69
+ }
70
+
71
+ // The prediction includes staged validators from active and in-flight schemas.
72
+ function reportStagedValidators(response: EvaluateSchemaResponse) {
73
+ const stagedTables = Object.entries(
74
+ response.componentSchemaEvaluations,
75
+ ).flatMap(([componentPath, prediction]) => {
76
+ const discarded = new Map(
77
+ (prediction.discardedStagedValidators ?? []).map((validator) => [
78
+ validator.tableName,
79
+ validator,
80
+ ]),
81
+ );
82
+ return prediction.tables
83
+ .filter((table) => table.staged !== undefined)
84
+ .map((table) => ({
85
+ componentPath,
86
+ table,
87
+ discarded: discarded.get(table.name),
88
+ }));
89
+ });
90
+ if (stagedTables.length === 0) {
91
+ return;
92
+ }
93
+ const lines = stagedTables.map(({ componentPath, table, discarded }) => {
94
+ const componentPrefix =
95
+ componentPath !== "" ? `${chalkStderr.gray(componentPath)}: ` : "";
96
+ // The state describes the validator this push discards, so advertising
97
+ // it as ready to promote would contradict the unstaging warning.
98
+ if (discarded !== undefined) {
99
+ return ` ${componentPrefix}${table.name}: ${formatDiscardedStagedValidator(discarded)}`;
100
+ }
101
+ const staged = table.staged!;
102
+ switch (staged.state) {
103
+ case "pending": {
104
+ return ` ${componentPrefix}${table.name}: validating in the background (${formatValidationProgress(staged)})`;
105
+ }
106
+ case "valid":
107
+ // `supersetOfStagedValidated` means this push already promotes it.
108
+ return table.outcome === "supersetOfStagedValidated"
109
+ ? ` ${componentPrefix}${table.name}: ${chalkStderr.green("validated")}. This deploy applies the staged schema without scanning the table.`
110
+ : ` ${componentPrefix}${table.name}: ${chalkStderr.green("validated")}. Safe to apply the staged schema changes and deploy.`;
111
+ case "failed":
112
+ return ` ${componentPrefix}${table.name}: ${chalkStderr.red("failed")}: ${staged.error}${chalkStderr.gray(" (fix the offending documents and redeploy to revalidate)")}`;
113
+ }
114
+ });
115
+ logMessage(`Staged schema validation status:\n${lines.join("\n")}\n`);
116
+ }
117
+
118
+ function formatWalkedTable({
119
+ componentPath,
120
+ table,
121
+ }: {
122
+ componentPath: string;
123
+ table: TablePrediction;
124
+ }) {
125
+ const componentPrefix =
126
+ componentPath !== "" ? `${chalkStderr.gray(componentPath)}: ` : "";
127
+ const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;
128
+ const sizeFormatted = formatSize(table.sizeBytes);
129
+ let stagedNote = "";
130
+ if (table.staged?.state === "pending" && table.canSkipAfterStagedValidation) {
131
+ stagedNote = `. Staged schema validation in progress. Wait for validation to complete before deploying with the staged changes. Deploying now will block on a full table revalidation scan.`;
132
+ }
133
+ return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;
134
+ }
135
+
136
+ function minBytesForSchemaWalkWarning(): number {
137
+ return integerFromEnv(
138
+ "CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING",
139
+ MIN_BYTES_FOR_SCHEMA_WALK_WARNING,
140
+ );
141
+ }
@@ -0,0 +1,104 @@
1
+ import { chalkStderr } from "chalk";
2
+ import { Context } from "../../bundler/context.js";
3
+ import { logFinishedStep, logMessage, stopSpinner } from "../../bundler/log.js";
4
+ import { promptYesNo } from "./utils/prompts.js";
5
+ import {
6
+ DiscardedStagedValidator,
7
+ EvaluateSchemaResponse,
8
+ } from "./deployApi/evaluateSchema.js";
9
+ import { formatDiscardedStagedValidator } from "./formatValidationProgress.js";
10
+
11
+ export type StagedValidatorDeletionCheck =
12
+ | "ask for confirmation"
13
+ | "has confirmation"
14
+ | "no verification";
15
+
16
+ /**
17
+ * Confirm before discarding pending or successful staged validation. Unstaging
18
+ * stops write-time checks, so restaging requires a fresh scan.
19
+ *
20
+ * A dry run only reports what the push would discard, so `--dry-run` previews
21
+ * the confirmation the real push will ask for.
22
+ */
23
+ export async function checkForStagedValidatorDeletion({
24
+ ctx,
25
+ response,
26
+ askForConfirmation,
27
+ dryRun = false,
28
+ }: {
29
+ ctx: Context;
30
+ response: EvaluateSchemaResponse | null;
31
+ askForConfirmation: boolean;
32
+ dryRun?: boolean;
33
+ }): Promise<void> {
34
+ // `sharedSchemaEvaluation` has already logged why evaluation failed.
35
+ if (response === null) {
36
+ return;
37
+ }
38
+ const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(
39
+ ([componentPath, prediction]) =>
40
+ (prediction.discardedStagedValidators ?? []).map((validator) => ({
41
+ componentPath,
42
+ validator,
43
+ })),
44
+ );
45
+ if (discarded.length === 0) {
46
+ return;
47
+ }
48
+
49
+ logMessage(`\u26a0\ufe0f This push ${chalkStderr.bold(dryRun ? "would discard" : "discards")} staged schema validation for the following ${discarded.length === 1 ? "table" : "tables"}:
50
+
51
+ ${discarded.map(formatDiscarded).join("\n")}
52
+
53
+ A discarded staged validator restarts validation from zero if staged again.
54
+ `);
55
+
56
+ if (dryRun) {
57
+ return;
58
+ }
59
+
60
+ if (!askForConfirmation) {
61
+ logFinishedStep(
62
+ "Proceeding with push since --allow-unstaging-schema is set",
63
+ );
64
+ return;
65
+ }
66
+
67
+ if (!process.stdin.isTTY) {
68
+ return ctx.crash({
69
+ exitCode: 1,
70
+ errorType: "fatal",
71
+ printedMessage: `To confirm the push:
72
+ \u2022 run the deploy command in an ${chalkStderr.bold("interactive terminal")}
73
+ \u2022 or run the deploy command with the ${chalkStderr.bold("--allow-unstaging-schema")} flag`,
74
+ });
75
+ }
76
+
77
+ stopSpinner();
78
+ if (
79
+ !(await promptYesNo(ctx, {
80
+ message: `Discard staged validation for ${discarded.length === 1 ? "this table" : "these tables"}?`,
81
+ default: false,
82
+ }))
83
+ ) {
84
+ return ctx.crash({
85
+ exitCode: 1,
86
+ errorType: "fatal",
87
+ printedMessage: `Canceling push`,
88
+ });
89
+ }
90
+
91
+ logFinishedStep("Proceeding with push.");
92
+ }
93
+
94
+ function formatDiscarded({
95
+ componentPath,
96
+ validator,
97
+ }: {
98
+ componentPath: string;
99
+ validator: DiscardedStagedValidator;
100
+ }): string {
101
+ const componentPrefix =
102
+ componentPath !== "" ? `${chalkStderr.gray(componentPath)}:` : "";
103
+ return `\u26d4 ${componentPrefix}${validator.tableName}: ${formatDiscardedStagedValidator(validator)}`;
104
+ }
@@ -46,7 +46,6 @@ import {
46
46
  rootComponentApiCJS,
47
47
  } from "../codegen_templates/component_api.js";
48
48
  import { functionsDir } from "./utils/utils.js";
49
- import { LargeIndexDeletionCheck } from "./indexes.js";
50
49
 
51
50
  const PRESERVED_GENERATED_ENTRIES = new Set(["ai"]);
52
51
 
@@ -81,7 +80,6 @@ export type CodegenOptions = {
81
80
  liveComponentSources: boolean;
82
81
  debugNodeApis: boolean;
83
82
  systemUdfs: boolean;
84
- largeIndexDeletionCheck: LargeIndexDeletionCheck;
85
83
  codegenOnlyThisComponent?: string | undefined;
86
84
  };
87
85
 
@@ -260,6 +260,7 @@ export async function normalizeDevOptions(
260
260
  debugNodeApis?: boolean;
261
261
  liveComponentSources?: boolean;
262
262
  pushAllModules?: boolean;
263
+ allowUnstagingSchema?: boolean;
263
264
  while?: string;
264
265
  },
265
266
  ): Promise<{
@@ -279,6 +280,7 @@ export async function normalizeDevOptions(
279
280
  debugNodeApis: boolean;
280
281
  liveComponentSources: boolean;
281
282
  pushAllModules: boolean;
283
+ allowUnstagingSchema: boolean;
282
284
  }> {
283
285
  if (cmdOptions.runComponent && !cmdOptions.run) {
284
286
  return await ctx.crash({
@@ -332,6 +334,7 @@ export async function normalizeDevOptions(
332
334
  debugNodeApis: !!cmdOptions.debugNodeApis,
333
335
  liveComponentSources: !!cmdOptions.liveComponentSources,
334
336
  pushAllModules: !!cmdOptions.pushAllModules,
337
+ allowUnstagingSchema: !!cmdOptions.allowUnstagingSchema,
335
338
  };
336
339
  }
337
340