convex 1.46.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 (332) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/browser.bundle.js +7 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/bundler/index.js +5 -4
  5. package/dist/cjs/bundler/index.js.map +2 -2
  6. package/dist/cjs/cli/codegen.js +0 -4
  7. package/dist/cjs/cli/codegen.js.map +2 -2
  8. package/dist/cjs/cli/configure.js +13 -4
  9. package/dist/cjs/cli/configure.js.map +2 -2
  10. package/dist/cjs/cli/deploy.js +27 -2
  11. package/dist/cjs/cli/deploy.js.map +2 -2
  12. package/dist/cjs/cli/deploymentSelect.js +2 -2
  13. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  14. package/dist/cjs/cli/dev.js +6 -0
  15. package/dist/cjs/cli/dev.js.map +2 -2
  16. package/dist/cjs/cli/env.js +10 -5
  17. package/dist/cjs/cli/env.js.map +2 -2
  18. package/dist/cjs/cli/envDefault.js +7 -2
  19. package/dist/cjs/cli/envDefault.js.map +2 -2
  20. package/dist/cjs/cli/generatedApi.js.map +1 -1
  21. package/dist/cjs/cli/lib/api.js +2 -0
  22. package/dist/cjs/cli/lib/api.js.map +2 -2
  23. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  24. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  25. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +36 -47
  26. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  27. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +58 -39
  28. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  29. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  30. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  31. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  32. package/dist/cjs/cli/lib/command.js +2 -1
  33. package/dist/cjs/cli/lib/command.js.map +2 -2
  34. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  35. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  36. package/dist/cjs/cli/lib/components.js +48 -5
  37. package/dist/cjs/cli/lib/components.js.map +2 -2
  38. package/dist/cjs/cli/lib/config.js +56 -17
  39. package/dist/cjs/cli/lib/config.js.map +2 -2
  40. package/dist/cjs/cli/lib/deploy2.js +3 -1
  41. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  42. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +30 -2
  43. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  44. package/dist/cjs/cli/lib/dev.js +5 -0
  45. package/dist/cjs/cli/lib/dev.js.map +2 -2
  46. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  47. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  48. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  49. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  50. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  51. package/dist/cjs/cli/lib/run.js +4 -0
  52. package/dist/cjs/cli/lib/run.js.map +2 -2
  53. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  54. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  55. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  56. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  57. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  58. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  59. package/dist/cjs/cli/lib/utils/utils.js +48 -18
  60. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  61. package/dist/cjs/cli/projectCreate.js +1 -1
  62. package/dist/cjs/cli/projectCreate.js.map +1 -1
  63. package/dist/cjs/index.js +1 -1
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/cjs/server/impl/actions_impl.js +8 -3
  66. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  67. package/dist/cjs/server/impl/storage_impl.js +29 -0
  68. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  69. package/dist/cjs/server/index.js +1 -0
  70. package/dist/cjs/server/index.js.map +2 -2
  71. package/dist/cjs/server/meta.js.map +1 -1
  72. package/dist/cjs/server/registration.js.map +1 -1
  73. package/dist/cjs/server/schema.js +34 -12
  74. package/dist/cjs/server/schema.js.map +2 -2
  75. package/dist/cjs/server/storage.js.map +1 -1
  76. package/dist/cjs/values/validators.js +1 -1
  77. package/dist/cjs/values/validators.js.map +2 -2
  78. package/dist/cjs/values/value.js +6 -0
  79. package/dist/cjs/values/value.js.map +2 -2
  80. package/dist/cjs-types/bundler/index.d.ts +9 -2
  81. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  83. package/dist/cjs-types/cli/configure.d.ts +6 -0
  84. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  85. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  86. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  87. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  88. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  89. package/dist/cjs-types/cli/dev.d.ts +1 -0
  90. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  91. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  92. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  93. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  94. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  96. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  97. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  98. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  99. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  101. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  103. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  104. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -3
  105. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  106. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  107. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  108. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  109. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  110. package/dist/cjs-types/cli/lib/components.d.ts +4 -0
  111. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  112. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  113. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  114. package/dist/cjs-types/cli/lib/deploy2.d.ts +2 -0
  115. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  116. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  117. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  118. package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
  119. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  120. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
  121. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  122. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts +8 -5
  123. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  124. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  126. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  127. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  128. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  130. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/utils/utils.d.ts +10 -2
  132. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  133. package/dist/cjs-types/index.d.ts +1 -1
  134. package/dist/cjs-types/server/impl/actions_impl.d.ts +18 -3
  135. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  136. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  137. package/dist/cjs-types/server/index.d.ts +1 -1
  138. package/dist/cjs-types/server/index.d.ts.map +1 -1
  139. package/dist/cjs-types/server/meta.d.ts +63 -0
  140. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  141. package/dist/cjs-types/server/registration.d.ts +10 -0
  142. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  143. package/dist/cjs-types/server/schema.d.ts +33 -0
  144. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  145. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  146. package/dist/cjs-types/values/value.d.ts.map +1 -1
  147. package/dist/cli.bundle.cjs +2935 -2048
  148. package/dist/cli.bundle.cjs.map +4 -4
  149. package/dist/esm/bundler/index.js +5 -4
  150. package/dist/esm/bundler/index.js.map +2 -2
  151. package/dist/esm/cli/codegen.js +0 -4
  152. package/dist/esm/cli/codegen.js.map +2 -2
  153. package/dist/esm/cli/configure.js +12 -4
  154. package/dist/esm/cli/configure.js.map +2 -2
  155. package/dist/esm/cli/deploy.js +27 -2
  156. package/dist/esm/cli/deploy.js.map +2 -2
  157. package/dist/esm/cli/deploymentSelect.js +6 -3
  158. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  159. package/dist/esm/cli/dev.js +6 -0
  160. package/dist/esm/cli/dev.js.map +2 -2
  161. package/dist/esm/cli/env.js +11 -6
  162. package/dist/esm/cli/env.js.map +2 -2
  163. package/dist/esm/cli/envDefault.js +7 -2
  164. package/dist/esm/cli/envDefault.js.map +2 -2
  165. package/dist/esm/cli/lib/api.js +2 -0
  166. package/dist/esm/cli/lib/api.js.map +2 -2
  167. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  168. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  169. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +37 -48
  170. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  171. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +63 -41
  172. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  173. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  174. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  175. package/dist/esm/cli/lib/codegen.js.map +2 -2
  176. package/dist/esm/cli/lib/command.js +2 -1
  177. package/dist/esm/cli/lib/command.js.map +2 -2
  178. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  179. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  180. package/dist/esm/cli/lib/components.js +55 -5
  181. package/dist/esm/cli/lib/components.js.map +2 -2
  182. package/dist/esm/cli/lib/config.js +55 -17
  183. package/dist/esm/cli/lib/config.js.map +2 -2
  184. package/dist/esm/cli/lib/deploy2.js +3 -1
  185. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  186. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +28 -2
  187. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  188. package/dist/esm/cli/lib/dev.js +5 -0
  189. package/dist/esm/cli/lib/dev.js.map +2 -2
  190. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  191. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  192. package/dist/esm/cli/lib/indexes.js.map +1 -1
  193. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  194. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  195. package/dist/esm/cli/lib/run.js +4 -0
  196. package/dist/esm/cli/lib/run.js.map +2 -2
  197. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  198. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  199. package/dist/esm/cli/lib/usageLimits.js +4 -2
  200. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  201. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  202. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  203. package/dist/esm/cli/lib/utils/utils.js +47 -18
  204. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  205. package/dist/esm/cli/projectCreate.js +1 -1
  206. package/dist/esm/cli/projectCreate.js.map +1 -1
  207. package/dist/esm/index.js +1 -1
  208. package/dist/esm/index.js.map +1 -1
  209. package/dist/esm/server/impl/actions_impl.js +7 -3
  210. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  211. package/dist/esm/server/impl/storage_impl.js +29 -0
  212. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  213. package/dist/esm/server/index.js +4 -1
  214. package/dist/esm/server/index.js.map +2 -2
  215. package/dist/esm/server/schema.js +34 -12
  216. package/dist/esm/server/schema.js.map +2 -2
  217. package/dist/esm/values/validators.js +1 -1
  218. package/dist/esm/values/validators.js.map +2 -2
  219. package/dist/esm/values/value.js +6 -0
  220. package/dist/esm/values/value.js.map +2 -2
  221. package/dist/esm-types/bundler/index.d.ts +9 -2
  222. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  223. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  224. package/dist/esm-types/cli/configure.d.ts +6 -0
  225. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  226. package/dist/esm-types/cli/deploy.d.ts +2 -0
  227. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  228. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  229. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  230. package/dist/esm-types/cli/dev.d.ts +1 -0
  231. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  232. package/dist/esm-types/cli/env.d.ts.map +1 -1
  233. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  234. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  235. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  236. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  237. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  238. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  239. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  240. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  241. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  242. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  243. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  244. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  245. package/dist/esm-types/cli/lib/codegen.d.ts +0 -3
  246. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  247. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  248. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  249. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  250. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  251. package/dist/esm-types/cli/lib/components.d.ts +4 -0
  252. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  253. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  254. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  255. package/dist/esm-types/cli/lib/deploy2.d.ts +2 -0
  256. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  257. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  258. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  259. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  260. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  261. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  262. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  263. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  264. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  265. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  266. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  267. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  268. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  269. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  270. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  271. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  272. package/dist/esm-types/cli/lib/utils/utils.d.ts +10 -2
  273. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  274. package/dist/esm-types/index.d.ts +1 -1
  275. package/dist/esm-types/server/impl/actions_impl.d.ts +18 -3
  276. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  277. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  278. package/dist/esm-types/server/index.d.ts +1 -1
  279. package/dist/esm-types/server/index.d.ts.map +1 -1
  280. package/dist/esm-types/server/meta.d.ts +63 -0
  281. package/dist/esm-types/server/meta.d.ts.map +1 -1
  282. package/dist/esm-types/server/registration.d.ts +10 -0
  283. package/dist/esm-types/server/registration.d.ts.map +1 -1
  284. package/dist/esm-types/server/schema.d.ts +33 -0
  285. package/dist/esm-types/server/schema.d.ts.map +1 -1
  286. package/dist/esm-types/server/storage.d.ts.map +1 -1
  287. package/dist/esm-types/values/value.d.ts.map +1 -1
  288. package/dist/react.bundle.js +7 -1
  289. package/dist/react.bundle.js.map +2 -2
  290. package/package.json +5 -5
  291. package/schemas/convex.schema.json +5 -5
  292. package/src/bundler/index.ts +9 -4
  293. package/src/cli/codegen.ts +0 -2
  294. package/src/cli/configure.ts +27 -7
  295. package/src/cli/deploy.ts +36 -5
  296. package/src/cli/deploymentSelect.ts +7 -4
  297. package/src/cli/dev.ts +9 -0
  298. package/src/cli/env.ts +12 -6
  299. package/src/cli/envDefault.ts +8 -2
  300. package/src/cli/generatedApi.ts +1 -1
  301. package/src/cli/lib/api.ts +5 -1
  302. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  303. package/src/cli/lib/checkForLargeIndexDeletion.ts +45 -58
  304. package/src/cli/lib/checkForSlowSchemaValidation.ts +76 -65
  305. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  306. package/src/cli/lib/codegen.ts +0 -3
  307. package/src/cli/lib/command.ts +3 -0
  308. package/src/cli/lib/components/definition/bundle.ts +68 -14
  309. package/src/cli/lib/components.ts +71 -4
  310. package/src/cli/lib/config.ts +85 -18
  311. package/src/cli/lib/deploy2.ts +10 -1
  312. package/src/cli/lib/deployApi/evaluateSchema.ts +35 -0
  313. package/src/cli/lib/dev.ts +14 -0
  314. package/src/cli/lib/formatValidationProgress.ts +35 -0
  315. package/src/cli/lib/indexes.ts +1 -1
  316. package/src/cli/lib/mcp/tools/env.ts +17 -3
  317. package/src/cli/lib/run.ts +2 -0
  318. package/src/cli/lib/schemaEvaluation.ts +88 -0
  319. package/src/cli/lib/usageLimits.ts +2 -0
  320. package/src/cli/lib/utils/mutex.ts +9 -27
  321. package/src/cli/lib/utils/utils.ts +64 -21
  322. package/src/cli/projectCreate.ts +1 -1
  323. package/src/index.ts +1 -1
  324. package/src/server/impl/actions_impl.ts +26 -6
  325. package/src/server/impl/storage_impl.ts +30 -0
  326. package/src/server/index.ts +5 -1
  327. package/src/server/meta.ts +56 -2
  328. package/src/server/registration.ts +10 -0
  329. package/src/server/schema.ts +37 -15
  330. package/src/server/storage.ts +17 -0
  331. package/src/values/validators.ts +1 -1
  332. package/src/values/value.ts +9 -5
@@ -29,21 +29,34 @@ var import_indexes = require("./indexes.js");
29
29
  var import_prompts = require("./utils/prompts.js");
30
30
  var import_deploy2 = require("./deploy2.js");
31
31
  var import_run = require("./run.js");
32
+ var import_utils = require("./utils/utils.js");
32
33
  const MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 1e5;
33
34
  async function checkForLargeIndexDeletion({
34
35
  ctx,
35
36
  span,
36
37
  request,
37
38
  options,
39
+ schemaEvaluation,
38
40
  askForConfirmation
39
41
  }) {
40
42
  (0, import_log.changeSpinner)("Verifying that the push isn\u2019t deleting large indexes...");
41
- const deletedIndexes = await deletedIndexesFromSchemaEvaluation({
42
- ctx,
43
- span,
44
- request,
45
- options
46
- }) ?? await deletedIndexesFromTableSizes({ ctx, span, request, options });
43
+ const schemaEvaluationResponse = await schemaEvaluation(span);
44
+ let deletedIndexes;
45
+ if (schemaEvaluationResponse !== null) {
46
+ deletedIndexes = deletedIndexesFromSchemaEvaluation(
47
+ schemaEvaluationResponse
48
+ );
49
+ } else {
50
+ (0, import_log.logVerbose)(
51
+ "Schema evaluation unavailable, sizing deleted indexes per table"
52
+ );
53
+ deletedIndexes = await deletedIndexesFromTableSizes({
54
+ ctx,
55
+ span,
56
+ request,
57
+ options
58
+ });
59
+ }
47
60
  if (deletedIndexes.length === 0) {
48
61
  (0, import_log.logFinishedStep)("No indexes are deleted by this push");
49
62
  return;
@@ -67,7 +80,7 @@ to be backfilled again if you want to restore it later.
67
80
  `);
68
81
  if (!askForConfirmation) {
69
82
  (0, import_log.logFinishedStep)(
70
- "Proceeding with push since --allow-deleting-large-indexes is set"
83
+ "Proceeding with push since deleting large indexes was allowed by flag"
71
84
  );
72
85
  return;
73
86
  }
@@ -77,7 +90,7 @@ to be backfilled again if you want to restore it later.
77
90
  errorType: "fatal",
78
91
  printedMessage: `To confirm the push:
79
92
  \u2022 run the deploy command in an ${import_chalk.chalkStderr.bold("interactive terminal")}
80
- \u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--allow-deleting-large-indexes")} flag`
93
+ \u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--skip-large-indexes-check")} flag`
81
94
  });
82
95
  }
83
96
  (0, import_log.stopSpinner)();
@@ -93,37 +106,17 @@ to be backfilled again if you want to restore it later.
93
106
  }
94
107
  (0, import_log.logFinishedStep)("Proceeding with push.");
95
108
  }
96
- async function deletedIndexesFromSchemaEvaluation({
97
- ctx,
98
- span,
99
- request,
100
- options
101
- }) {
102
- try {
103
- const response = await (0, import_deploy2.evaluateSchema)(
104
- ctx,
105
- span,
106
- request,
107
- options,
108
- /* bestEffort */
109
- true
110
- );
111
- return Object.entries(response.componentSchemaEvaluations).flatMap(
112
- ([componentPath, prediction]) => prediction.indexes.filter((index) => index.change === "dropped").map((index) => ({
113
- componentPath,
114
- index,
115
- documentsCount: index.numDocs,
116
- replacedBy: prediction.indexes.find(
117
- (other) => other.change === "added" && other.name === index.name
118
- ) ?? null
119
- }))
120
- );
121
- } catch (error) {
122
- (0, import_log.logVerbose)(
123
- `Schema evaluation unavailable, sizing deleted indexes per table: ${error instanceof Error ? error.message : String(error)}`
124
- );
125
- return null;
126
- }
109
+ function deletedIndexesFromSchemaEvaluation(response) {
110
+ return Object.entries(response.componentSchemaEvaluations).flatMap(
111
+ ([componentPath, prediction]) => prediction.indexes.filter((index) => index.change === "dropped").map((index) => ({
112
+ componentPath,
113
+ index,
114
+ documentsCount: index.numDocs,
115
+ replacedBy: prediction.indexes.find(
116
+ (other) => other.change === "added" && other.name === index.name
117
+ ) ?? null
118
+ }))
119
+ );
127
120
  }
128
121
  async function deletedIndexesFromTableSizes({
129
122
  ctx,
@@ -194,13 +187,9 @@ function getTableName(index) {
194
187
  return tableName;
195
188
  }
196
189
  function minDocumentsForIndexDeleteWarning() {
197
- const envValue = process.env.CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
198
- if (envValue !== void 0) {
199
- const parsed = parseInt(envValue, 10);
200
- if (!isNaN(parsed)) {
201
- return parsed;
202
- }
203
- }
204
- return MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
190
+ return (0, import_utils.integerFromEnv)(
191
+ "CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING",
192
+ MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING
193
+ );
205
194
  }
206
195
  //# sourceMappingURL=checkForLargeIndexDeletion.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/checkForLargeIndexDeletion.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n logVerbose,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { formatIndex } from \"./indexes.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport { Span } from \"./tracing.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport { evaluatePush, evaluateSchema } from \"./deploy2.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\nimport { runSystemQuery } from \"./run.js\";\n\nconst MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 100_000;\n\ntype CheckOptions = {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n};\n\ntype DeletedIndex = {\n // The component instance path (\"\" for the root component), matching the\n // keys of both `componentSchemaEvaluations` and `indexDiffs`.\n componentPath: string;\n index: DeveloperIndexConfig;\n documentsCount: number;\n replacedBy: DeveloperIndexConfig | null;\n};\n\nexport async function checkForLargeIndexDeletion({\n ctx,\n span,\n request,\n options,\n askForConfirmation,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n askForConfirmation: boolean;\n}): Promise<void> {\n changeSpinner(\"Verifying that the push isn\u2019t deleting large indexes...\");\n\n const deletedIndexes =\n (await deletedIndexesFromSchemaEvaluation({\n ctx,\n span,\n request,\n options,\n })) ??\n (await deletedIndexesFromTableSizes({ ctx, span, request, options }));\n\n if (deletedIndexes.length === 0) {\n logFinishedStep(\"No indexes are deleted by this push\");\n return;\n }\n\n const minDocumentsForWarning = minDocumentsForIndexDeleteWarning();\n if (\n !deletedIndexes.some(\n ({ documentsCount }) => documentsCount >= minDocumentsForWarning,\n )\n ) {\n logFinishedStep(\"No large indexes are deleted by this push\");\n return;\n }\n\n logMessage(`\u26A0\uFE0F This code push will ${chalkStderr.bold(\"delete\")} the following ${deletedIndexes.length === 1 ? \"index\" : \"indexes\"}\nfrom your production deployment (${options.url}):\n\n${deletedIndexes\n .map((deletedIndex) =>\n formatDeletedIndex({ ...deletedIndex, minDocumentsForWarning }),\n )\n .join(\"\\n\")}\n\nThe documents that are in the index won\u2019t be deleted, but the index will need\nto be backfilled again if you want to restore it later.\n`);\n\n if (!askForConfirmation) {\n logFinishedStep(\n \"Proceeding with push since --allow-deleting-large-indexes is set\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\u2022 or run the deploy command with the ${chalkStderr.bold(\"--allow-deleting-large-indexes\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Delete ${deletedIndexes.length === 1 ? \"this index\" : \"these indexes\"}?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\n// Preferred source: one schema evaluation reports every dropped index\n// together with its table's document count, requiring only the\n// `deployment:deploy` permission the push itself needs. Returns null when the\n// deployment doesn't support the endpoint, in which case the caller falls\n// back to sizing tables one system query at a time.\nexport async function deletedIndexesFromSchemaEvaluation({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n}): Promise<DeletedIndex[] | null> {\n try {\n const response = await evaluateSchema(\n ctx,\n span,\n request,\n options,\n /* bestEffort */ true,\n );\n return Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n prediction.indexes\n .filter((index) => index.change === \"dropped\")\n .map((index) => ({\n componentPath,\n index,\n documentsCount: index.numDocs,\n replacedBy:\n prediction.indexes.find(\n (other) =>\n other.change === \"added\" && other.name === index.name,\n ) ?? null,\n })),\n );\n } catch (error: unknown) {\n logVerbose(\n `Schema evaluation unavailable, sizing deleted indexes per table: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\n// Fallback for deployments without `evaluate_schema`: diff indexes with\n// `evaluate_push`, then size each affected table with a system query. The\n// system query needs the `deployment:data:view` permission, which a\n// deploy-scoped key may lack.\nexport async function deletedIndexesFromTableSizes({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n}): Promise<DeletedIndex[]> {\n const { schemaChange } = await evaluatePush(ctx, span, request, options);\n\n const indexDiffs = schemaChange.indexDiffs ?? {};\n const deletedIndexes = Object.entries(indexDiffs).flatMap(\n ([componentPath, indexDiff]) =>\n indexDiff.removed_indexes.map((index) => ({\n componentPath,\n index,\n replacedBy:\n indexDiff.added_indexes.find((other) => other.name === index.name) ??\n null,\n })),\n );\n\n if (deletedIndexes.length === 0) {\n return [];\n }\n\n const tablesWithDeletedIndexes = [\n ...new Set(\n deletedIndexes.map(\n ({ componentPath, index }) => `${componentPath}:${getTableName(index)}`,\n ),\n ),\n ].map((str) => {\n const [componentPath, table] = str.split(\":\");\n return { componentPath, table };\n });\n changeSpinner(\"Checking whether the deleted indexes are on large tables...\");\n const documentCounts = await Promise.all(\n tablesWithDeletedIndexes.map(async ({ componentPath, table }) => ({\n componentPath,\n table,\n count: (await runSystemQuery(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n functionName: \"_system/cli/tableSize:default\",\n componentPath,\n args: { tableName: table },\n })) as number,\n })),\n );\n return deletedIndexes.map(({ componentPath, index, replacedBy }) => ({\n componentPath,\n index,\n replacedBy,\n documentsCount: documentCounts.find(\n (count) =>\n count.table === getTableName(index) &&\n count.componentPath === componentPath,\n )!.count,\n }));\n}\n\nfunction formatDeletedIndex({\n componentPath,\n index,\n documentsCount,\n replacedBy,\n minDocumentsForWarning,\n}: DeletedIndex & { minDocumentsForWarning: number }) {\n const componentNameFormatted =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n\n const documentsCountFormatted =\n documentsCount >= minDocumentsForWarning\n ? ` ${chalkStderr.yellowBright(`\u26A0\uFE0F ${documentsCount.toLocaleString()} documents`)}`\n : ` ${documentsCount.toLocaleString()} ${documentsCount === 1 ? \"document\" : \"documents\"}`;\n\n const replacedByFormatted = replacedBy\n ? `\\n ${chalkStderr.green(\"\u2192 replaced by:\")} ${formatIndex(replacedBy)}`\n : \"\";\n\n return (\n \"\u26D4 \" +\n componentNameFormatted +\n formatIndex(index) +\n documentsCountFormatted +\n replacedByFormatted\n );\n}\n\nfunction getTableName(index: DeveloperIndexConfig) {\n const [tableName, _indexName] = index.name.split(\".\");\n return tableName;\n}\n\nfunction minDocumentsForIndexDeleteWarning(): number {\n const envValue = process.env.CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;\n if (envValue !== undefined) {\n const parsed = parseInt(envValue, 10);\n if (!isNaN(parsed)) {\n return parsed;\n }\n }\n return MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n logVerbose,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { formatIndex } from \"./indexes.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport { Span } from \"./tracing.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport { evaluatePush } from \"./deploy2.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\nimport { EvaluateSchemaResponse } from \"./deployApi/evaluateSchema.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { SchemaEvaluation } from \"./schemaEvaluation.js\";\nimport { integerFromEnv } from \"./utils/utils.js\";\n\nconst MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 100_000;\n\ntype CheckOptions = {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n};\n\ntype DeletedIndex = {\n // The component instance path (\"\" for the root component), matching the\n // keys of both `componentSchemaEvaluations` and `indexDiffs`.\n componentPath: string;\n index: DeveloperIndexConfig;\n documentsCount: number;\n replacedBy: DeveloperIndexConfig | null;\n};\n\nexport async function checkForLargeIndexDeletion({\n ctx,\n span,\n request,\n options,\n schemaEvaluation,\n askForConfirmation,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n schemaEvaluation: SchemaEvaluation;\n askForConfirmation: boolean;\n}): Promise<void> {\n changeSpinner(\"Verifying that the push isn\u2019t deleting large indexes...\");\n\n const schemaEvaluationResponse = await schemaEvaluation(span);\n let deletedIndexes: DeletedIndex[];\n if (schemaEvaluationResponse !== null) {\n deletedIndexes = deletedIndexesFromSchemaEvaluation(\n schemaEvaluationResponse,\n );\n } else {\n logVerbose(\n \"Schema evaluation unavailable, sizing deleted indexes per table\",\n );\n deletedIndexes = await deletedIndexesFromTableSizes({\n ctx,\n span,\n request,\n options,\n });\n }\n\n if (deletedIndexes.length === 0) {\n logFinishedStep(\"No indexes are deleted by this push\");\n return;\n }\n\n const minDocumentsForWarning = minDocumentsForIndexDeleteWarning();\n if (\n !deletedIndexes.some(\n ({ documentsCount }) => documentsCount >= minDocumentsForWarning,\n )\n ) {\n logFinishedStep(\"No large indexes are deleted by this push\");\n return;\n }\n\n logMessage(`\u26A0\uFE0F This code push will ${chalkStderr.bold(\"delete\")} the following ${deletedIndexes.length === 1 ? \"index\" : \"indexes\"}\nfrom your production deployment (${options.url}):\n\n${deletedIndexes\n .map((deletedIndex) =>\n formatDeletedIndex({ ...deletedIndex, minDocumentsForWarning }),\n )\n .join(\"\\n\")}\n\nThe documents that are in the index won\u2019t be deleted, but the index will need\nto be backfilled again if you want to restore it later.\n`);\n\n // Either --skip-large-indexes-check or its deletion-only predecessor\n // --allow-deleting-large-indexes gets here, so name neither.\n if (!askForConfirmation) {\n logFinishedStep(\n \"Proceeding with push since deleting large indexes was allowed by flag\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\u2022 or run the deploy command with the ${chalkStderr.bold(\"--skip-large-indexes-check\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Delete ${deletedIndexes.length === 1 ? \"this index\" : \"these indexes\"}?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\n// Preferred source: one schema evaluation reports every dropped index\n// together with its table's document count, requiring only the\n// `deployment:deploy` permission the push itself needs.\nexport function deletedIndexesFromSchemaEvaluation(\n response: EvaluateSchemaResponse,\n): DeletedIndex[] {\n return Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n prediction.indexes\n .filter((index) => index.change === \"dropped\")\n .map((index) => ({\n componentPath,\n index,\n documentsCount: index.numDocs,\n replacedBy:\n prediction.indexes.find(\n (other) => other.change === \"added\" && other.name === index.name,\n ) ?? null,\n })),\n );\n}\n\n// Fallback for deployments without `evaluate_schema`: diff indexes with\n// `evaluate_push`, then size each affected table with a system query. The\n// system query needs the `deployment:data:view` permission, which a\n// deploy-scoped key may lack.\nexport async function deletedIndexesFromTableSizes({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n}): Promise<DeletedIndex[]> {\n const { schemaChange } = await evaluatePush(ctx, span, request, options);\n\n const indexDiffs = schemaChange.indexDiffs ?? {};\n const deletedIndexes = Object.entries(indexDiffs).flatMap(\n ([componentPath, indexDiff]) =>\n indexDiff.removed_indexes.map((index) => ({\n componentPath,\n index,\n replacedBy:\n indexDiff.added_indexes.find((other) => other.name === index.name) ??\n null,\n })),\n );\n\n if (deletedIndexes.length === 0) {\n return [];\n }\n\n const tablesWithDeletedIndexes = [\n ...new Set(\n deletedIndexes.map(\n ({ componentPath, index }) => `${componentPath}:${getTableName(index)}`,\n ),\n ),\n ].map((str) => {\n const [componentPath, table] = str.split(\":\");\n return { componentPath, table };\n });\n changeSpinner(\"Checking whether the deleted indexes are on large tables...\");\n const documentCounts = await Promise.all(\n tablesWithDeletedIndexes.map(async ({ componentPath, table }) => ({\n componentPath,\n table,\n count: (await runSystemQuery(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n functionName: \"_system/cli/tableSize:default\",\n componentPath,\n args: { tableName: table },\n })) as number,\n })),\n );\n return deletedIndexes.map(({ componentPath, index, replacedBy }) => ({\n componentPath,\n index,\n replacedBy,\n documentsCount: documentCounts.find(\n (count) =>\n count.table === getTableName(index) &&\n count.componentPath === componentPath,\n )!.count,\n }));\n}\n\nfunction formatDeletedIndex({\n componentPath,\n index,\n documentsCount,\n replacedBy,\n minDocumentsForWarning,\n}: DeletedIndex & { minDocumentsForWarning: number }) {\n const componentNameFormatted =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n\n const documentsCountFormatted =\n documentsCount >= minDocumentsForWarning\n ? ` ${chalkStderr.yellowBright(`\u26A0\uFE0F ${documentsCount.toLocaleString()} documents`)}`\n : ` ${documentsCount.toLocaleString()} ${documentsCount === 1 ? \"document\" : \"documents\"}`;\n\n const replacedByFormatted = replacedBy\n ? `\\n ${chalkStderr.green(\"\u2192 replaced by:\")} ${formatIndex(replacedBy)}`\n : \"\";\n\n return (\n \"\u26D4 \" +\n componentNameFormatted +\n formatIndex(index) +\n documentsCountFormatted +\n replacedByFormatted\n );\n}\n\nfunction getTableName(index: DeveloperIndexConfig) {\n const [tableName, _indexName] = index.name.split(\".\");\n return tableName;\n}\n\nfunction minDocumentsForIndexDeleteWarning(): number {\n return integerFromEnv(\n \"CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING\",\n MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING,\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -23,24 +23,22 @@ __export(checkForSlowSchemaValidation_exports, {
23
23
  module.exports = __toCommonJS(checkForSlowSchemaValidation_exports);
24
24
  var import_chalk = require("chalk");
25
25
  var import_log = require("../../bundler/log.js");
26
- var import_deploy2 = require("./deploy2.js");
27
26
  var import_utils = require("./utils/utils.js");
27
+ var import_formatValidationProgress = require("./formatValidationProgress.js");
28
28
  const MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27;
29
29
  async function checkForSlowSchemaValidation({
30
- ctx,
31
30
  span,
32
- request,
33
- options
31
+ schemaEvaluation,
32
+ dryRun
34
33
  }) {
35
- const response = await evaluateSchemaBestEffort({
36
- ctx,
37
- span,
38
- request,
39
- options
40
- });
34
+ const response = await schemaEvaluation(span);
41
35
  if (response === null) {
42
36
  return;
43
37
  }
38
+ reportStagedValidators(response);
39
+ if (!dryRun) {
40
+ return;
41
+ }
44
42
  const walkedTables = Object.entries(
45
43
  response.componentSchemaEvaluations
46
44
  ).flatMap(
@@ -56,34 +54,55 @@ async function checkForSlowSchemaValidation({
56
54
  if (totalBytes < minBytesForSchemaWalkWarning()) {
57
55
  return;
58
56
  }
57
+ const shouldSuggestStaging = walkedTables.some(
58
+ ({ table }) => !table.canSkipAfterStagedValidation
59
+ );
59
60
  (0, import_log.logMessage)(`\u26A0\uFE0F This schema change requires checking every document in the following ${walkedTables.length === 1 ? "table" : "tables"} against your new schema, totaling ${import_chalk.chalkStderr.yellowBright((0, import_utils.formatSize)(totalBytes))}. This deploy may take a while:
60
61
 
61
62
  ${walkedTables.map(
62
63
  ({ componentPath, table }) => formatWalkedTable({ componentPath, table })
63
64
  ).join("\n")}
64
- `);
65
+ ${shouldSuggestStaging ? `
66
+ Tip: stage the new validator (\`defineTable({...}).staged({...})\`) to validate it in the background without blocking deploys.` : ""}`);
65
67
  }
66
- async function evaluateSchemaBestEffort({
67
- ctx,
68
- span,
69
- request,
70
- options
71
- }) {
72
- try {
73
- return await (0, import_deploy2.evaluateSchema)(
74
- ctx,
75
- span,
76
- request,
77
- options,
78
- /* bestEffort */
79
- true
80
- );
81
- } catch (error) {
82
- (0, import_log.logVerbose)(
83
- `Skipping slow schema validation check: ${error instanceof Error ? error.message : String(error)}`
68
+ function reportStagedValidators(response) {
69
+ const stagedTables = Object.entries(
70
+ response.componentSchemaEvaluations
71
+ ).flatMap(([componentPath, prediction]) => {
72
+ const discarded = new Map(
73
+ (prediction.discardedStagedValidators ?? []).map((validator) => [
74
+ validator.tableName,
75
+ validator
76
+ ])
84
77
  );
85
- return null;
78
+ return prediction.tables.filter((table) => table.staged !== void 0).map((table) => ({
79
+ componentPath,
80
+ table,
81
+ discarded: discarded.get(table.name)
82
+ }));
83
+ });
84
+ if (stagedTables.length === 0) {
85
+ return;
86
86
  }
87
+ const lines = stagedTables.map(({ componentPath, table, discarded }) => {
88
+ const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}: ` : "";
89
+ if (discarded !== void 0) {
90
+ return ` ${componentPrefix}${table.name}: ${(0, import_formatValidationProgress.formatDiscardedStagedValidator)(discarded)}`;
91
+ }
92
+ const staged = table.staged;
93
+ switch (staged.state) {
94
+ case "pending": {
95
+ return ` ${componentPrefix}${table.name}: validating in the background (${(0, import_formatValidationProgress.formatValidationProgress)(staged)})`;
96
+ }
97
+ case "valid":
98
+ return table.outcome === "supersetOfStagedValidated" ? ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.green("validated")}. This deploy applies the staged schema without scanning the table.` : ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.green("validated")}. Safe to apply the staged schema changes and deploy.`;
99
+ case "failed":
100
+ return ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.red("failed")}: ${staged.error}${import_chalk.chalkStderr.gray(" (fix the offending documents and redeploy to revalidate)")}`;
101
+ }
102
+ });
103
+ (0, import_log.logMessage)(`Staged schema validation status:
104
+ ${lines.join("\n")}
105
+ `);
87
106
  }
88
107
  function formatWalkedTable({
89
108
  componentPath,
@@ -92,16 +111,16 @@ function formatWalkedTable({
92
111
  const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}: ` : "";
93
112
  const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;
94
113
  const sizeFormatted = (0, import_utils.formatSize)(table.sizeBytes);
95
- return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})`;
114
+ let stagedNote = "";
115
+ if (table.staged?.state === "pending" && table.canSkipAfterStagedValidation) {
116
+ 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.`;
117
+ }
118
+ return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;
96
119
  }
97
120
  function minBytesForSchemaWalkWarning() {
98
- const envValue = process.env.CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING;
99
- if (envValue !== void 0) {
100
- const parsed = parseInt(envValue, 10);
101
- if (!isNaN(parsed)) {
102
- return parsed;
103
- }
104
- }
105
- return MIN_BYTES_FOR_SCHEMA_WALK_WARNING;
121
+ return (0, import_utils.integerFromEnv)(
122
+ "CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING",
123
+ MIN_BYTES_FOR_SCHEMA_WALK_WARNING
124
+ );
106
125
  }
107
126
  //# sourceMappingURL=checkForSlowSchemaValidation.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/checkForSlowSchemaValidation.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logMessage, logVerbose } from \"../../bundler/log.js\";\nimport { Span } from \"./tracing.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport {\n EvaluateSchemaResponse,\n TablePrediction,\n} from \"./deployApi/evaluateSchema.js\";\nimport { evaluateSchema } from \"./deploy2.js\";\nimport { formatSize } from \"./utils/utils.js\";\n\nconst MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27; // 128 MiB\n\nexport async function checkForSlowSchemaValidation({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n };\n}): Promise<void> {\n const response = await evaluateSchemaBestEffort({\n ctx,\n span,\n request,\n options,\n });\n if (response === null) {\n return;\n }\n\n const walkedTables = Object.entries(\n response.componentSchemaEvaluations,\n ).flatMap(([componentPath, prediction]) =>\n prediction.tables\n .filter((table) => table.outcome === \"mustWalk\")\n .map((table) => ({ componentPath, table })),\n );\n if (walkedTables.length === 0) {\n return;\n }\n\n const totalBytes = walkedTables.reduce(\n (sum, { table }) => sum + table.sizeBytes,\n 0,\n );\n if (totalBytes < minBytesForSchemaWalkWarning()) {\n return;\n }\n\n logMessage(`\u26A0\uFE0F 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:\n\n${walkedTables\n .map(({ componentPath, table }) =>\n formatWalkedTable({ componentPath, table }),\n )\n .join(\"\\n\")}\n`);\n}\n\n// This warning is advisory: if evaluation fails, fall back to skipping it\n// rather than aborting the push over a check that isn't required for\n// correctness. Plausibly transient failures \u2014 network errors and 5xx\n// responses (e.g. table summaries still bootstrapping) \u2014 are retried with\n// backoff by the shared fetch wrapper (see `pushCode`); anything else is\n// deterministic, including a 2xx whose shape the CLI doesn't recognize, so\n// it skips the check immediately.\nasync function evaluateSchemaBestEffort({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n };\n}): Promise<EvaluateSchemaResponse | null> {\n try {\n return await evaluateSchema(\n ctx,\n span,\n request,\n options,\n /* bestEffort */ true,\n );\n } catch (error: unknown) {\n logVerbose(\n `Skipping slow schema validation check: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nfunction formatWalkedTable({\n componentPath,\n table,\n}: {\n componentPath: string;\n table: TablePrediction;\n}) {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}: ` : \"\";\n const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;\n const sizeFormatted = formatSize(table.sizeBytes);\n return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})`;\n}\n\nfunction minBytesForSchemaWalkWarning(): number {\n const envValue = process.env.CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING;\n if (envValue !== undefined) {\n const parsed = parseInt(envValue, 10);\n if (!isNaN(parsed)) {\n return parsed;\n }\n }\n return MIN_BYTES_FOR_SCHEMA_WALK_WARNING;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAAuC;AAOvC,qBAA+B;AAC/B,mBAA2B;AAE3B,MAAM,oCAAoC,KAAK;AAE/C,eAAsB,6BAA6B;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASkB;AAChB,QAAM,WAAW,MAAM,yBAAyB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,aAAa,MAAM;AACrB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO;AAAA,IAC1B,SAAS;AAAA,EACX,EAAE;AAAA,IAAQ,CAAC,CAAC,eAAe,UAAU,MACnC,WAAW,OACR,OAAO,CAAC,UAAU,MAAM,YAAY,UAAU,EAC9C,IAAI,CAAC,WAAW,EAAE,eAAe,MAAM,EAAE;AAAA,EAC9C;AACA,MAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,EACF;AAEA,QAAM,aAAa,aAAa;AAAA,IAC9B,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM;AAAA,IAChC;AAAA,EACF;AACA,MAAI,aAAa,6BAA6B,GAAG;AAC/C;AAAA,EACF;AAEA,6BAAW,sFAA4E,aAAa,WAAW,IAAI,UAAU,QAAQ,sCAAsC,yBAAY,iBAAa,yBAAW,UAAU,CAAC,CAAC;AAAA;AAAA,EAE3N,aACC;AAAA,IAAI,CAAC,EAAE,eAAe,MAAM,MAC3B,kBAAkB,EAAE,eAAe,MAAM,CAAC;AAAA,EAC5C,EACC,KAAK,IAAI,CAAC;AAAA,CACZ;AACD;AASA,eAAe,yBAAyB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAS2C;AACzC,MAAI;AACF,WAAO,UAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACiB;AAAA,IACnB;AAAA,EACF,SAAS,OAAgB;AACvB;AAAA,MACE,0CAA0C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClG;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,QAAM,kBACJ,kBAAkB,KAAK,GAAG,yBAAY,KAAK,aAAa,CAAC,OAAO;AAClE,QAAM,gBAAgB,GAAG,MAAM,QAAQ,eAAe,CAAC;AACvD,QAAM,oBAAgB,yBAAW,MAAM,SAAS;AAChD,SAAO,KAAK,eAAe,GAAG,MAAM,IAAI,KAAK,aAAa,GAAG,aAAa;AAC5E;AAEA,SAAS,+BAAuC;AAC9C,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,aAAa,QAAW;AAC1B,UAAM,SAAS,SAAS,UAAU,EAAE;AACpC,QAAI,CAAC,MAAM,MAAM,GAAG;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport { Span } from \"./tracing.js\";\nimport {\n EvaluateSchemaResponse,\n TablePrediction,\n} from \"./deployApi/evaluateSchema.js\";\nimport { SchemaEvaluation } from \"./schemaEvaluation.js\";\nimport { formatSize, integerFromEnv } from \"./utils/utils.js\";\nimport {\n formatDiscardedStagedValidator,\n formatValidationProgress,\n} from \"./formatValidationProgress.js\";\n\nconst MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27; // 128 MiB\n\nexport async function checkForSlowSchemaValidation({\n span,\n schemaEvaluation,\n dryRun,\n}: {\n span: Span;\n schemaEvaluation: SchemaEvaluation;\n dryRun: boolean;\n}): Promise<void> {\n const response = await schemaEvaluation(span);\n if (response === null) {\n return;\n }\n reportStagedValidators(response);\n if (!dryRun) {\n return;\n }\n\n const walkedTables = Object.entries(\n response.componentSchemaEvaluations,\n ).flatMap(([componentPath, prediction]) =>\n prediction.tables\n .filter((table) => table.outcome === \"mustWalk\")\n .map((table) => ({ componentPath, table })),\n );\n if (walkedTables.length === 0) {\n return;\n }\n\n const totalBytes = walkedTables.reduce(\n (sum, { table }) => sum + table.sizeBytes,\n 0,\n );\n if (totalBytes < minBytesForSchemaWalkWarning()) {\n return;\n }\n\n const shouldSuggestStaging = walkedTables.some(\n ({ table }) => !table.canSkipAfterStagedValidation,\n );\n logMessage(`\u26A0\uFE0F 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:\n\n${walkedTables\n .map(({ componentPath, table }) =>\n formatWalkedTable({ componentPath, table }),\n )\n .join(\"\\n\")}\n${\n shouldSuggestStaging\n ? `\\nTip: stage the new validator (\\`defineTable({...}).staged({...})\\`) to validate it in the background without blocking deploys.`\n : \"\"\n}`);\n}\n\n// The prediction includes staged validators from active and in-flight schemas.\nfunction reportStagedValidators(response: EvaluateSchemaResponse) {\n const stagedTables = Object.entries(\n response.componentSchemaEvaluations,\n ).flatMap(([componentPath, prediction]) => {\n const discarded = new Map(\n (prediction.discardedStagedValidators ?? []).map((validator) => [\n validator.tableName,\n validator,\n ]),\n );\n return prediction.tables\n .filter((table) => table.staged !== undefined)\n .map((table) => ({\n componentPath,\n table,\n discarded: discarded.get(table.name),\n }));\n });\n if (stagedTables.length === 0) {\n return;\n }\n const lines = stagedTables.map(({ componentPath, table, discarded }) => {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}: ` : \"\";\n // The state describes the validator this push discards, so advertising\n // it as ready to promote would contradict the unstaging warning.\n if (discarded !== undefined) {\n return ` ${componentPrefix}${table.name}: ${formatDiscardedStagedValidator(discarded)}`;\n }\n const staged = table.staged!;\n switch (staged.state) {\n case \"pending\": {\n return ` ${componentPrefix}${table.name}: validating in the background (${formatValidationProgress(staged)})`;\n }\n case \"valid\":\n // `supersetOfStagedValidated` means this push already promotes it.\n return table.outcome === \"supersetOfStagedValidated\"\n ? ` ${componentPrefix}${table.name}: ${chalkStderr.green(\"validated\")}. This deploy applies the staged schema without scanning the table.`\n : ` ${componentPrefix}${table.name}: ${chalkStderr.green(\"validated\")}. Safe to apply the staged schema changes and deploy.`;\n case \"failed\":\n return ` ${componentPrefix}${table.name}: ${chalkStderr.red(\"failed\")}: ${staged.error}${chalkStderr.gray(\" (fix the offending documents and redeploy to revalidate)\")}`;\n }\n });\n logMessage(`Staged schema validation status:\\n${lines.join(\"\\n\")}\\n`);\n}\n\nfunction formatWalkedTable({\n componentPath,\n table,\n}: {\n componentPath: string;\n table: TablePrediction;\n}) {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}: ` : \"\";\n const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;\n const sizeFormatted = formatSize(table.sizeBytes);\n let stagedNote = \"\";\n if (table.staged?.state === \"pending\" && table.canSkipAfterStagedValidation) {\n 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.`;\n }\n return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;\n}\n\nfunction minBytesForSchemaWalkWarning(): number {\n return integerFromEnv(\n \"CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING\",\n MIN_BYTES_FOR_SCHEMA_WALK_WARNING,\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var checkForStagedValidatorDeletion_exports = {};
20
+ __export(checkForStagedValidatorDeletion_exports, {
21
+ checkForStagedValidatorDeletion: () => checkForStagedValidatorDeletion
22
+ });
23
+ module.exports = __toCommonJS(checkForStagedValidatorDeletion_exports);
24
+ var import_chalk = require("chalk");
25
+ var import_log = require("../../bundler/log.js");
26
+ var import_prompts = require("./utils/prompts.js");
27
+ var import_formatValidationProgress = require("./formatValidationProgress.js");
28
+ async function checkForStagedValidatorDeletion({
29
+ ctx,
30
+ response,
31
+ askForConfirmation,
32
+ dryRun = false
33
+ }) {
34
+ if (response === null) {
35
+ return;
36
+ }
37
+ const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(
38
+ ([componentPath, prediction]) => (prediction.discardedStagedValidators ?? []).map((validator) => ({
39
+ componentPath,
40
+ validator
41
+ }))
42
+ );
43
+ if (discarded.length === 0) {
44
+ return;
45
+ }
46
+ (0, import_log.logMessage)(`\u26A0\uFE0F This push ${import_chalk.chalkStderr.bold(dryRun ? "would discard" : "discards")} staged schema validation for the following ${discarded.length === 1 ? "table" : "tables"}:
47
+
48
+ ${discarded.map(formatDiscarded).join("\n")}
49
+
50
+ A discarded staged validator restarts validation from zero if staged again.
51
+ `);
52
+ if (dryRun) {
53
+ return;
54
+ }
55
+ if (!askForConfirmation) {
56
+ (0, import_log.logFinishedStep)(
57
+ "Proceeding with push since --allow-unstaging-schema is set"
58
+ );
59
+ return;
60
+ }
61
+ if (!process.stdin.isTTY) {
62
+ return ctx.crash({
63
+ exitCode: 1,
64
+ errorType: "fatal",
65
+ printedMessage: `To confirm the push:
66
+ \u2022 run the deploy command in an ${import_chalk.chalkStderr.bold("interactive terminal")}
67
+ \u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--allow-unstaging-schema")} flag`
68
+ });
69
+ }
70
+ (0, import_log.stopSpinner)();
71
+ if (!await (0, import_prompts.promptYesNo)(ctx, {
72
+ message: `Discard staged validation for ${discarded.length === 1 ? "this table" : "these tables"}?`,
73
+ default: false
74
+ })) {
75
+ return ctx.crash({
76
+ exitCode: 1,
77
+ errorType: "fatal",
78
+ printedMessage: `Canceling push`
79
+ });
80
+ }
81
+ (0, import_log.logFinishedStep)("Proceeding with push.");
82
+ }
83
+ function formatDiscarded({
84
+ componentPath,
85
+ validator
86
+ }) {
87
+ const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}:` : "";
88
+ return `\u26D4 ${componentPrefix}${validator.tableName}: ${(0, import_formatValidationProgress.formatDiscardedStagedValidator)(validator)}`;
89
+ }
90
+ //# sourceMappingURL=checkForStagedValidatorDeletion.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/lib/checkForStagedValidatorDeletion.ts"],
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, stopSpinner } from \"../../bundler/log.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport {\n DiscardedStagedValidator,\n EvaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport { formatDiscardedStagedValidator } from \"./formatValidationProgress.js\";\n\nexport type StagedValidatorDeletionCheck =\n | \"ask for confirmation\"\n | \"has confirmation\"\n | \"no verification\";\n\n/**\n * Confirm before discarding pending or successful staged validation. Unstaging\n * stops write-time checks, so restaging requires a fresh scan.\n *\n * A dry run only reports what the push would discard, so `--dry-run` previews\n * the confirmation the real push will ask for.\n */\nexport async function checkForStagedValidatorDeletion({\n ctx,\n response,\n askForConfirmation,\n dryRun = false,\n}: {\n ctx: Context;\n response: EvaluateSchemaResponse | null;\n askForConfirmation: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n // `sharedSchemaEvaluation` has already logged why evaluation failed.\n if (response === null) {\n return;\n }\n const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n (prediction.discardedStagedValidators ?? []).map((validator) => ({\n componentPath,\n validator,\n })),\n );\n if (discarded.length === 0) {\n return;\n }\n\n logMessage(`\\u26a0\\ufe0f This push ${chalkStderr.bold(dryRun ? \"would discard\" : \"discards\")} staged schema validation for the following ${discarded.length === 1 ? \"table\" : \"tables\"}:\n\n${discarded.map(formatDiscarded).join(\"\\n\")}\n\nA discarded staged validator restarts validation from zero if staged again.\n`);\n\n if (dryRun) {\n return;\n }\n\n if (!askForConfirmation) {\n logFinishedStep(\n \"Proceeding with push since --allow-unstaging-schema is set\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\\u2022 or run the deploy command with the ${chalkStderr.bold(\"--allow-unstaging-schema\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Discard staged validation for ${discarded.length === 1 ? \"this table\" : \"these tables\"}?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\nfunction formatDiscarded({\n componentPath,\n validator,\n}: {\n componentPath: string;\n validator: DiscardedStagedValidator;\n}): string {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n return `\\u26d4 ${componentPrefix}${validator.tableName}: ${formatDiscardedStagedValidator(validator)}`;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAAyD;AACzD,qBAA4B;AAK5B,sCAA+C;AAc/C,eAAsB,gCAAgC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAKkB;AAEhB,MAAI,aAAa,MAAM;AACrB;AAAA,EACF;AACA,QAAM,YAAY,OAAO,QAAQ,SAAS,0BAA0B,EAAE;AAAA,IACpE,CAAC,CAAC,eAAe,UAAU,OACxB,WAAW,6BAA6B,CAAC,GAAG,IAAI,CAAC,eAAe;AAAA,MAC/D;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACN;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,EACF;AAEA,6BAAW,2BAA2B,yBAAY,KAAK,SAAS,kBAAkB,UAAU,CAAC,+CAA+C,UAAU,WAAW,IAAI,UAAU,QAAQ;AAAA;AAAA,EAEvL,UAAU,IAAI,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,CAG1C;AAEC,MAAI,QAAQ;AACV;AAAA,EACF;AAEA,MAAI,CAAC,oBAAoB;AACvB;AAAA,MACE;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,sCACgB,yBAAY,KAAK,sBAAsB,CAAC;AAAA,4CAClC,yBAAY,KAAK,0BAA0B,CAAC;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,8BAAY;AACZ,MACE,CAAE,UAAM,4BAAY,KAAK;AAAA,IACvB,SAAS,iCAAiC,UAAU,WAAW,IAAI,eAAe,cAAc;AAAA,IAChG,SAAS;AAAA,EACX,CAAC,GACD;AACA,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,kCAAgB,uBAAuB;AACzC;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGW;AACT,QAAM,kBACJ,kBAAkB,KAAK,GAAG,yBAAY,KAAK,aAAa,CAAC,MAAM;AACjE,SAAO,UAAU,eAAe,GAAG,UAAU,SAAS,SAAK,gEAA+B,SAAS,CAAC;AACtG;",
6
+ "names": []
7
+ }