convex 1.45.0 → 1.46.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 (319) hide show
  1. package/CHANGELOG.md +48 -6
  2. package/dist/browser.bundle.js +1 -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/cli/codegen.js +2 -0
  10. package/dist/cjs/cli/codegen.js.map +2 -2
  11. package/dist/cjs/cli/deploy.js +1 -0
  12. package/dist/cjs/cli/deploy.js.map +2 -2
  13. package/dist/cjs/cli/docs.js +3 -36
  14. package/dist/cjs/cli/docs.js.map +2 -2
  15. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +101 -60
  16. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  17. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +107 -0
  18. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  19. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  20. package/dist/cjs/cli/lib/components.js +12 -0
  21. package/dist/cjs/cli/lib/components.js.map +2 -2
  22. package/dist/cjs/cli/lib/deploy2.js +29 -2
  23. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  24. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +73 -0
  25. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  26. package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
  27. package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
  28. package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
  29. package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
  30. package/dist/cjs/cli/lib/dev.js +1 -0
  31. package/dist/cjs/cli/lib/dev.js.map +2 -2
  32. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  33. package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
  34. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  35. package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
  36. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  37. package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
  38. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  39. package/dist/cjs/cli/lib/run.js +1 -0
  40. package/dist/cjs/cli/lib/run.js.map +2 -2
  41. package/dist/cjs/cli/lib/utils/utils.js +36 -29
  42. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  43. package/dist/cjs/index.js +1 -1
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/nextjs/index.js.map +2 -2
  46. package/dist/cjs/react/client.js.map +2 -2
  47. package/dist/cjs/react/hydration.js.map +2 -2
  48. package/dist/cjs/react/queries_observer.js.map +2 -2
  49. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  50. package/dist/cjs/react/use_queries.js.map +2 -2
  51. package/dist/cjs/server/api.js.map +2 -2
  52. package/dist/cjs/server/components/index.js.map +2 -2
  53. package/dist/cjs/server/cron.js +10 -10
  54. package/dist/cjs/server/cron.js.map +2 -2
  55. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  56. package/dist/cjs/server/impl/meta_impl.js +8 -2
  57. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  58. package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
  59. package/dist/cjs/server/index.js.map +2 -2
  60. package/dist/cjs/server/meta.js.map +1 -1
  61. package/dist/cjs/server/registration.js.map +1 -1
  62. package/dist/cjs/server/scheduler.js.map +1 -1
  63. package/dist/cjs/server/schema.js +50 -3
  64. package/dist/cjs/server/schema.js.map +2 -2
  65. package/dist/cjs/values/validator.js +1 -1
  66. package/dist/cjs/values/validator.js.map +2 -2
  67. package/dist/cjs/values/validators.js +81 -25
  68. package/dist/cjs/values/validators.js.map +2 -2
  69. package/dist/cjs-types/browser/http_client.d.ts +5 -5
  70. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  71. package/dist/cjs-types/browser/query_options.d.ts +2 -2
  72. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  73. package/dist/cjs-types/browser/simple_client.d.ts +6 -6
  74. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  75. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
  76. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  77. package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  78. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  79. package/dist/cjs-types/cli/docs.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  81. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  83. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  84. package/dist/cjs-types/cli/lib/codegen.d.ts +1 -0
  85. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  86. package/dist/cjs-types/cli/lib/components.d.ts +1 -0
  87. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  88. package/dist/cjs-types/cli/lib/deploy2.d.ts +6 -0
  89. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  90. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  91. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  92. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  93. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  94. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  96. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  97. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
  98. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
  101. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -5
  104. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  105. package/dist/cjs-types/index.d.ts +1 -1
  106. package/dist/cjs-types/nextjs/index.d.ts +6 -6
  107. package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
  108. package/dist/cjs-types/react/client.d.ts +15 -15
  109. package/dist/cjs-types/react/client.d.ts.map +1 -1
  110. package/dist/cjs-types/react/hydration.d.ts +3 -3
  111. package/dist/cjs-types/react/hydration.d.ts.map +1 -1
  112. package/dist/cjs-types/react/queries_observer.d.ts +9 -9
  113. package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
  114. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  115. package/dist/cjs-types/react/use_queries.d.ts +14 -6
  116. package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
  117. package/dist/cjs-types/server/api.d.ts +157 -7
  118. package/dist/cjs-types/server/api.d.ts.map +1 -1
  119. package/dist/cjs-types/server/components/index.d.ts +2 -2
  120. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  121. package/dist/cjs-types/server/cron.d.ts +21 -20
  122. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  123. package/dist/cjs-types/server/impl/actions_impl.d.ts +4 -4
  124. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  125. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  126. package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
  127. package/dist/cjs-types/server/index.d.ts +1 -1
  128. package/dist/cjs-types/server/index.d.ts.map +1 -1
  129. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  130. package/dist/cjs-types/server/registration.d.ts +7 -7
  131. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  132. package/dist/cjs-types/server/scheduler.d.ts +9 -7
  133. package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
  134. package/dist/cjs-types/server/schema.d.ts +1 -0
  135. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  136. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  137. package/dist/cjs-types/values/validators.d.ts +30 -0
  138. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  139. package/dist/cli.bundle.cjs +347 -133
  140. package/dist/cli.bundle.cjs.map +4 -4
  141. package/dist/esm/browser/http_client.js.map +2 -2
  142. package/dist/esm/browser/query_options.js.map +2 -2
  143. package/dist/esm/browser/simple_client.js.map +2 -2
  144. package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
  145. package/dist/esm/cli/codegen.js +2 -0
  146. package/dist/esm/cli/codegen.js.map +2 -2
  147. package/dist/esm/cli/deploy.js +1 -0
  148. package/dist/esm/cli/deploy.js.map +2 -2
  149. package/dist/esm/cli/docs.js +3 -43
  150. package/dist/esm/cli/docs.js.map +2 -2
  151. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +100 -60
  152. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  153. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +85 -0
  154. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  155. package/dist/esm/cli/lib/codegen.js.map +2 -2
  156. package/dist/esm/cli/lib/components.js +12 -0
  157. package/dist/esm/cli/lib/components.js.map +2 -2
  158. package/dist/esm/cli/lib/deploy2.js +30 -2
  159. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  160. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +46 -0
  161. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  162. package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
  163. package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
  164. package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
  165. package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
  166. package/dist/esm/cli/lib/dev.js +1 -0
  167. package/dist/esm/cli/lib/dev.js.map +2 -2
  168. package/dist/esm/cli/lib/localDeployment/run.js +30 -2
  169. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  170. package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
  171. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  172. package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
  173. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  174. package/dist/esm/cli/lib/run.js +1 -0
  175. package/dist/esm/cli/lib/run.js.map +2 -2
  176. package/dist/esm/cli/lib/utils/utils.js +36 -30
  177. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  178. package/dist/esm/index.js +1 -1
  179. package/dist/esm/index.js.map +1 -1
  180. package/dist/esm/nextjs/index.js.map +2 -2
  181. package/dist/esm/react/client.js.map +2 -2
  182. package/dist/esm/react/hydration.js +3 -1
  183. package/dist/esm/react/hydration.js.map +2 -2
  184. package/dist/esm/react/queries_observer.js +3 -1
  185. package/dist/esm/react/queries_observer.js.map +2 -2
  186. package/dist/esm/react/use_paginated_query2.js +3 -1
  187. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  188. package/dist/esm/react/use_queries.js.map +2 -2
  189. package/dist/esm/server/api.js.map +2 -2
  190. package/dist/esm/server/components/index.js.map +2 -2
  191. package/dist/esm/server/cron.js +13 -11
  192. package/dist/esm/server/cron.js.map +2 -2
  193. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  194. package/dist/esm/server/impl/meta_impl.js +9 -3
  195. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  196. package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
  197. package/dist/esm/server/index.js.map +2 -2
  198. package/dist/esm/server/schema.js +50 -3
  199. package/dist/esm/server/schema.js.map +2 -2
  200. package/dist/esm/values/validator.js +1 -1
  201. package/dist/esm/values/validator.js.map +2 -2
  202. package/dist/esm/values/validators.js +81 -25
  203. package/dist/esm/values/validators.js.map +2 -2
  204. package/dist/esm-types/browser/http_client.d.ts +5 -5
  205. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  206. package/dist/esm-types/browser/query_options.d.ts +2 -2
  207. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  208. package/dist/esm-types/browser/simple_client.d.ts +6 -6
  209. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  210. package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
  211. package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  212. package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  213. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  214. package/dist/esm-types/cli/docs.d.ts.map +1 -1
  215. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  216. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  217. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  218. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  219. package/dist/esm-types/cli/lib/codegen.d.ts +1 -0
  220. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  221. package/dist/esm-types/cli/lib/components.d.ts +1 -0
  222. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  223. package/dist/esm-types/cli/lib/deploy2.d.ts +6 -0
  224. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  225. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  226. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  227. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  228. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  229. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  230. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  231. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  232. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
  233. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  234. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  235. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
  236. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  237. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  238. package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -5
  239. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  240. package/dist/esm-types/index.d.ts +1 -1
  241. package/dist/esm-types/nextjs/index.d.ts +6 -6
  242. package/dist/esm-types/nextjs/index.d.ts.map +1 -1
  243. package/dist/esm-types/react/client.d.ts +15 -15
  244. package/dist/esm-types/react/client.d.ts.map +1 -1
  245. package/dist/esm-types/react/hydration.d.ts +3 -3
  246. package/dist/esm-types/react/hydration.d.ts.map +1 -1
  247. package/dist/esm-types/react/queries_observer.d.ts +9 -9
  248. package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
  249. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  250. package/dist/esm-types/react/use_queries.d.ts +14 -6
  251. package/dist/esm-types/react/use_queries.d.ts.map +1 -1
  252. package/dist/esm-types/server/api.d.ts +157 -7
  253. package/dist/esm-types/server/api.d.ts.map +1 -1
  254. package/dist/esm-types/server/components/index.d.ts +2 -2
  255. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  256. package/dist/esm-types/server/cron.d.ts +21 -20
  257. package/dist/esm-types/server/cron.d.ts.map +1 -1
  258. package/dist/esm-types/server/impl/actions_impl.d.ts +4 -4
  259. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  260. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  261. package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
  262. package/dist/esm-types/server/index.d.ts +1 -1
  263. package/dist/esm-types/server/index.d.ts.map +1 -1
  264. package/dist/esm-types/server/meta.d.ts.map +1 -1
  265. package/dist/esm-types/server/registration.d.ts +7 -7
  266. package/dist/esm-types/server/registration.d.ts.map +1 -1
  267. package/dist/esm-types/server/scheduler.d.ts +9 -7
  268. package/dist/esm-types/server/scheduler.d.ts.map +1 -1
  269. package/dist/esm-types/server/schema.d.ts +1 -0
  270. package/dist/esm-types/server/schema.d.ts.map +1 -1
  271. package/dist/esm-types/values/validator.d.ts.map +1 -1
  272. package/dist/esm-types/values/validators.d.ts +30 -0
  273. package/dist/esm-types/values/validators.d.ts.map +1 -1
  274. package/dist/react.bundle.js +1 -1
  275. package/dist/react.bundle.js.map +2 -2
  276. package/package.json +5 -5
  277. package/src/browser/http_client.ts +43 -10
  278. package/src/browser/query_options.ts +11 -5
  279. package/src/browser/simple_client.ts +35 -14
  280. package/src/browser/sync/optimistic_updates.ts +17 -4
  281. package/src/browser/sync/optimistic_updates_impl.ts +17 -4
  282. package/src/cli/codegen.ts +1 -0
  283. package/src/cli/deploy.ts +1 -0
  284. package/src/cli/docs.ts +3 -44
  285. package/src/cli/lib/checkForLargeIndexDeletion.ts +154 -82
  286. package/src/cli/lib/checkForSlowSchemaValidation.ts +130 -0
  287. package/src/cli/lib/codegen.ts +1 -0
  288. package/src/cli/lib/components.ts +17 -0
  289. package/src/cli/lib/deploy2.ts +56 -1
  290. package/src/cli/lib/deployApi/evaluateSchema.ts +62 -0
  291. package/src/cli/lib/deployApi/finishPush.ts +1 -1
  292. package/src/cli/lib/deployApi/startPush.ts +1 -1
  293. package/src/cli/lib/dev.ts +1 -0
  294. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  295. package/src/cli/lib/localDeployment/run.ts +44 -2
  296. package/src/cli/lib/localDeployment/upgrade.ts +4 -6
  297. package/src/cli/lib/localDeployment/utils.ts +6 -0
  298. package/src/cli/lib/run.ts +1 -0
  299. package/src/cli/lib/utils/utils.ts +63 -35
  300. package/src/index.ts +1 -1
  301. package/src/nextjs/index.ts +19 -8
  302. package/src/react/client.ts +73 -30
  303. package/src/react/hydration.tsx +14 -6
  304. package/src/react/queries_observer.ts +19 -16
  305. package/src/react/use_paginated_query2.ts +10 -6
  306. package/src/react/use_queries.ts +23 -7
  307. package/src/server/api.ts +220 -14
  308. package/src/server/components/index.ts +4 -6
  309. package/src/server/cron.ts +34 -24
  310. package/src/server/impl/actions_impl.ts +13 -4
  311. package/src/server/impl/meta_impl.ts +8 -1
  312. package/src/server/impl/scheduler_impl.ts +13 -6
  313. package/src/server/index.ts +1 -0
  314. package/src/server/meta.ts +25 -0
  315. package/src/server/registration.ts +28 -7
  316. package/src/server/scheduler.ts +22 -7
  317. package/src/server/schema.ts +55 -0
  318. package/src/values/validator.ts +3 -1
  319. package/src/values/validators.ts +84 -26
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ import { z } from "zod";
3
+ import { componentDefinitionPath, componentPath } from "./paths.js";
4
+ import { developerIndexConfig } from "./finishPush.js";
5
+ import { looseObject } from "./utils.js";
6
+ export const tableValidationOutcome = z.enum([
7
+ "notValidated",
8
+ "supersetOfEnforced",
9
+ "supersetOfShape",
10
+ "mustWalk"
11
+ ]);
12
+ export const indexChangePrediction = z.enum([
13
+ "added",
14
+ "identical",
15
+ "enabled",
16
+ "disabled",
17
+ "dropped"
18
+ ]);
19
+ export const tablePrediction = looseObject({
20
+ name: z.string(),
21
+ outcome: tableValidationOutcome,
22
+ numDocs: z.number(),
23
+ sizeBytes: z.number()
24
+ });
25
+ export const indexPrediction = z.intersection(
26
+ developerIndexConfig,
27
+ looseObject({
28
+ change: indexChangePrediction,
29
+ needsBackfill: z.boolean(),
30
+ numDocs: z.number()
31
+ })
32
+ );
33
+ export const componentSchemaPrediction = looseObject({
34
+ definitionPath: z.string(),
35
+ schemaValidation: z.boolean(),
36
+ tables: z.array(tablePrediction),
37
+ indexes: z.array(indexPrediction)
38
+ });
39
+ export const evaluateSchemaResponse = looseObject({
40
+ componentSchemaEvaluations: z.record(
41
+ componentPath,
42
+ componentSchemaPrediction
43
+ ),
44
+ newComponentDefinitions: z.array(componentDefinitionPath)
45
+ });
46
+ //# sourceMappingURL=evaluateSchema.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/cli/lib/deployApi/evaluateSchema.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { developerIndexConfig } from \"./finishPush.js\";\nimport { looseObject } from \"./utils.js\";\n\n// Hand-mirrors `TableValidationOutcome` in\n// `crates/common/src/schemas/mod.rs` (`#[serde(rename_all = \"camelCase\")]`),\n// like the rest of this deployApi directory: there's no codegen sharing\n// types between the Rust backend and this package.\nexport const tableValidationOutcome = z.enum([\n \"notValidated\",\n \"supersetOfEnforced\",\n \"supersetOfShape\",\n \"mustWalk\",\n]);\nexport type TableValidationOutcome = z.infer<typeof tableValidationOutcome>;\n\nexport const indexChangePrediction = z.enum([\n \"added\",\n \"identical\",\n \"enabled\",\n \"disabled\",\n \"dropped\",\n]);\nexport type IndexChangePrediction = z.infer<typeof indexChangePrediction>;\n\nexport const tablePrediction = looseObject({\n name: z.string(),\n outcome: tableValidationOutcome,\n numDocs: z.number(),\n sizeBytes: z.number(),\n});\nexport type TablePrediction = z.infer<typeof tablePrediction>;\n\nexport const indexPrediction = z.intersection(\n developerIndexConfig,\n looseObject({\n change: indexChangePrediction,\n needsBackfill: z.boolean(),\n numDocs: z.number(),\n }),\n);\nexport type IndexPrediction = z.infer<typeof indexPrediction>;\n\nexport const componentSchemaPrediction = looseObject({\n definitionPath: z.string(),\n schemaValidation: z.boolean(),\n tables: z.array(tablePrediction),\n indexes: z.array(indexPrediction),\n});\nexport type ComponentSchemaPrediction = z.infer<\n typeof componentSchemaPrediction\n>;\n\nexport const evaluateSchemaResponse = looseObject({\n componentSchemaEvaluations: z.record(\n componentPath,\n componentSchemaPrediction,\n ),\n newComponentDefinitions: z.array(componentDefinitionPath),\n});\nexport type EvaluateSchemaResponse = z.infer<typeof evaluateSchemaResponse>;\n"],
5
+ "mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,yBAAyB,qBAAqB;AACvD,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAMrB,aAAM,yBAAyB,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,aAAM,wBAAwB,EAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,aAAM,kBAAkB,YAAY;AAAA,EACzC,MAAM,EAAE,OAAO;AAAA,EACf,SAAS;AAAA,EACT,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,OAAO;AACtB,CAAC;AAGM,aAAM,kBAAkB,EAAE;AAAA,EAC/B;AAAA,EACA,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,EAAE,QAAQ;AAAA,IACzB,SAAS,EAAE,OAAO;AAAA,EACpB,CAAC;AACH;AAGO,aAAM,4BAA4B,YAAY;AAAA,EACnD,gBAAgB,EAAE,OAAO;AAAA,EACzB,kBAAkB,EAAE,QAAQ;AAAA,EAC5B,QAAQ,EAAE,MAAM,eAAe;AAAA,EAC/B,SAAS,EAAE,MAAM,eAAe;AAClC,CAAC;AAKM,aAAM,yBAAyB,YAAY;AAAA,EAChD,4BAA4B,EAAE;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACA,yBAAyB,EAAE,MAAM,uBAAuB;AAC1D,CAAC;",
6
+ "names": []
7
+ }
@@ -33,7 +33,7 @@ export const cronDiff = looseObject({
33
33
  updated: z.array(z.string()),
34
34
  deleted: z.array(z.string())
35
35
  });
36
- const developerIndexConfig = z.intersection(
36
+ export const developerIndexConfig = z.intersection(
37
37
  z.discriminatedUnion("type", [
38
38
  looseObject({
39
39
  name: z.string(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/deployApi/finishPush.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nexport const authDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type AuthDiff = z.infer<typeof authDiff>;\n\nexport const componentDefinitionDiff = looseObject({});\nexport type ComponentDefinitionDiff = z.infer<typeof componentDefinitionDiff>;\n\nexport const componentDiffType = z.discriminatedUnion(\"type\", [\n looseObject({\n type: z.literal(\"create\"),\n }),\n looseObject({\n type: z.literal(\"modify\"),\n }),\n looseObject({\n type: z.literal(\"unmount\"),\n }),\n looseObject({\n type: z.literal(\"remount\"),\n }),\n]);\nexport type ComponentDiffType = z.infer<typeof componentDiffType>;\n\nexport const moduleDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type ModuleDiff = z.infer<typeof moduleDiff>;\n\nexport const udfConfigDiff = looseObject({\n previous_version: z.string(),\n next_version: z.string(),\n});\nexport type UdfConfigDiff = z.infer<typeof udfConfigDiff>;\n\nexport const cronDiff = looseObject({\n added: z.array(z.string()),\n updated: z.array(z.string()),\n deleted: z.array(z.string()),\n});\nexport type CronDiff = z.infer<typeof cronDiff>;\n\nconst developerIndexConfig = z.intersection(\n z.discriminatedUnion(\"type\", [\n looseObject({\n name: z.string(),\n type: z.literal(\"database\"),\n fields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"search\"),\n searchField: z.string(),\n filterFields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"vector\"),\n dimensions: z.number(),\n vectorField: z.string(),\n filterFields: z.array(z.string()),\n }),\n ]),\n z.object({ staged: z.boolean().optional() }),\n);\nexport type DeveloperIndexConfig = z.infer<typeof developerIndexConfig>;\n\nexport const indexDiff = looseObject({\n added_indexes: z.array(developerIndexConfig),\n removed_indexes: z.array(developerIndexConfig),\n enabled_indexes: z.array(developerIndexConfig).optional(),\n disabled_indexes: z.array(developerIndexConfig).optional(),\n});\nexport type IndexDiff = z.infer<typeof indexDiff>;\n\nexport const schemaDiff = looseObject({\n previous_schema: z.nullable(z.string()),\n next_schema: z.nullable(z.string()),\n});\nexport type SchemaDiff = z.infer<typeof schemaDiff>;\n\nexport const componentDiff = looseObject({\n diffType: componentDiffType,\n moduleDiff,\n udfConfigDiff: z.nullable(udfConfigDiff),\n cronDiff,\n indexDiff,\n schemaDiff: z.nullable(schemaDiff),\n});\nexport type ComponentDiff = z.infer<typeof componentDiff>;\n\nexport const finishPushDiff = looseObject({\n authDiff,\n definitionDiffs: z.record(z.string(), componentDefinitionDiff),\n componentDiffs: z.record(z.string(), componentDiff),\n});\nexport type FinishPushDiff = z.infer<typeof finishPushDiff>;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nexport const authDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type AuthDiff = z.infer<typeof authDiff>;\n\nexport const componentDefinitionDiff = looseObject({});\nexport type ComponentDefinitionDiff = z.infer<typeof componentDefinitionDiff>;\n\nexport const componentDiffType = z.discriminatedUnion(\"type\", [\n looseObject({\n type: z.literal(\"create\"),\n }),\n looseObject({\n type: z.literal(\"modify\"),\n }),\n looseObject({\n type: z.literal(\"unmount\"),\n }),\n looseObject({\n type: z.literal(\"remount\"),\n }),\n]);\nexport type ComponentDiffType = z.infer<typeof componentDiffType>;\n\nexport const moduleDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type ModuleDiff = z.infer<typeof moduleDiff>;\n\nexport const udfConfigDiff = looseObject({\n previous_version: z.string(),\n next_version: z.string(),\n});\nexport type UdfConfigDiff = z.infer<typeof udfConfigDiff>;\n\nexport const cronDiff = looseObject({\n added: z.array(z.string()),\n updated: z.array(z.string()),\n deleted: z.array(z.string()),\n});\nexport type CronDiff = z.infer<typeof cronDiff>;\n\nexport const developerIndexConfig = z.intersection(\n z.discriminatedUnion(\"type\", [\n looseObject({\n name: z.string(),\n type: z.literal(\"database\"),\n fields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"search\"),\n searchField: z.string(),\n filterFields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"vector\"),\n dimensions: z.number(),\n vectorField: z.string(),\n filterFields: z.array(z.string()),\n }),\n ]),\n z.object({ staged: z.boolean().optional() }),\n);\nexport type DeveloperIndexConfig = z.infer<typeof developerIndexConfig>;\n\nexport const indexDiff = looseObject({\n added_indexes: z.array(developerIndexConfig),\n removed_indexes: z.array(developerIndexConfig),\n enabled_indexes: z.array(developerIndexConfig).optional(),\n disabled_indexes: z.array(developerIndexConfig).optional(),\n});\nexport type IndexDiff = z.infer<typeof indexDiff>;\n\nexport const schemaDiff = looseObject({\n previous_schema: z.nullable(z.string()),\n next_schema: z.nullable(z.string()),\n});\nexport type SchemaDiff = z.infer<typeof schemaDiff>;\n\nexport const componentDiff = looseObject({\n diffType: componentDiffType,\n moduleDiff,\n udfConfigDiff: z.nullable(udfConfigDiff),\n cronDiff,\n indexDiff,\n schemaDiff: z.nullable(schemaDiff),\n});\nexport type ComponentDiff = z.infer<typeof componentDiff>;\n\nexport const finishPushDiff = looseObject({\n authDiff,\n definitionDiffs: z.record(z.string(), componentDefinitionDiff),\n componentDiffs: z.record(z.string(), componentDiff),\n});\nexport type FinishPushDiff = z.infer<typeof finishPushDiff>;\n"],
5
+ "mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,mBAAmB;AAErB,aAAM,WAAW,YAAY;AAAA,EAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACzB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAC7B,CAAC;AAGM,aAAM,0BAA0B,YAAY,CAAC,CAAC;AAG9C,aAAM,oBAAoB,EAAE,mBAAmB,QAAQ;AAAA,EAC5D,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,SAAS;AAAA,EAC3B,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,SAAS;AAAA,EAC3B,CAAC;AACH,CAAC;AAGM,aAAM,aAAa,YAAY;AAAA,EACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACzB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAC7B,CAAC;AAGM,aAAM,gBAAgB,YAAY;AAAA,EACvC,kBAAkB,EAAE,OAAO;AAAA,EAC3B,cAAc,EAAE,OAAO;AACzB,CAAC;AAGM,aAAM,WAAW,YAAY;AAAA,EAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACzB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAC7B,CAAC;AAGM,aAAM,uBAAuB,EAAE;AAAA,EACpC,EAAE,mBAAmB,QAAQ;AAAA,IAC3B,YAAY;AAAA,MACV,MAAM,EAAE,OAAO;AAAA,MACf,MAAM,EAAE,QAAQ,UAAU;AAAA,MAC1B,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAC5B,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,OAAO;AAAA,MACf,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,aAAa,EAAE,OAAO;AAAA,MACtB,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAClC,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,OAAO;AAAA,MACf,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,YAAY,EAAE,OAAO;AAAA,MACrB,aAAa,EAAE,OAAO;AAAA,MACtB,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAAA,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC7C;AAGO,aAAM,YAAY,YAAY;AAAA,EACnC,eAAe,EAAE,MAAM,oBAAoB;AAAA,EAC3C,iBAAiB,EAAE,MAAM,oBAAoB;AAAA,EAC7C,iBAAiB,EAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,EACxD,kBAAkB,EAAE,MAAM,oBAAoB,EAAE,SAAS;AAC3D,CAAC;AAGM,aAAM,aAAa,YAAY;AAAA,EACpC,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACtC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AACpC,CAAC;AAGM,aAAM,gBAAgB,YAAY;AAAA,EACvC,UAAU;AAAA,EACV;AAAA,EACA,eAAe,EAAE,SAAS,aAAa;AAAA,EACvC;AAAA,EACA;AAAA,EACA,YAAY,EAAE,SAAS,UAAU;AACnC,CAAC;AAGM,aAAM,iBAAiB,YAAY;AAAA,EACxC;AAAA,EACA,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,uBAAuB;AAAA,EAC7D,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa;AACpD,CAAC;",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,7 @@ export const startPushRequest = looseObject({
23
23
  export const schemaChange = looseObject({
24
24
  allocatedComponentIds: z.any(),
25
25
  schemaIds: z.any(),
26
- indexDiffs: z.record(componentDefinitionPath, indexDiff).optional()
26
+ indexDiffs: z.record(componentPath, indexDiff).optional()
27
27
  });
28
28
  export const startPushResponse = looseObject({
29
29
  environmentVariables: z.record(z.string(), z.string()),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/deployApi/startPush.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { nodeDependency, sourcePackage } from \"./modules.js\";\nimport { checkedComponent } from \"./checkedComponent.js\";\nimport { evaluatedComponentDefinition } from \"./componentDefinition.js\";\nimport {\n appDefinitionConfig,\n componentDefinitionConfig,\n} from \"./definitionConfig.js\";\nimport { authInfo } from \"./types.js\";\nimport { looseObject } from \"./utils.js\";\nimport { indexDiff } from \"./finishPush.js\";\n\nexport const startPushRequest = looseObject({\n adminKey: z.string(),\n dryRun: z.boolean(),\n\n functions: z.string(),\n\n appDefinition: appDefinitionConfig,\n componentDefinitions: z.array(componentDefinitionConfig),\n\n nodeDependencies: z.array(nodeDependency),\n\n nodeVersion: z.optional(z.string()),\n});\nexport type StartPushRequest = z.infer<typeof startPushRequest>;\n\nexport const schemaChange = looseObject({\n allocatedComponentIds: z.any(),\n schemaIds: z.any(),\n indexDiffs: z.record(componentDefinitionPath, indexDiff).optional(),\n});\nexport type SchemaChange = z.infer<typeof schemaChange>;\n\nexport const startPushResponse = looseObject({\n environmentVariables: z.record(z.string(), z.string()),\n\n externalDepsId: z.nullable(z.string()),\n componentDefinitionPackages: z.record(componentDefinitionPath, sourcePackage),\n\n appAuth: z.array(authInfo),\n analysis: z.record(componentDefinitionPath, evaluatedComponentDefinition),\n\n app: checkedComponent,\n\n schemaChange,\n});\nexport type StartPushResponse = z.infer<typeof startPushResponse>;\n\nexport const evaluatePushResponse = looseObject({\n schemaChange,\n});\nexport type EvaluatePushResponse = z.infer<typeof evaluatePushResponse>;\n\nexport const componentSchemaStatus = looseObject({\n schemaValidationComplete: z.boolean(),\n indexesComplete: z.number(),\n indexesTotal: z.number(),\n});\nexport type ComponentSchemaStatus = z.infer<typeof componentSchemaStatus>;\n\nexport const schemaStatus = z.union([\n looseObject({\n type: z.literal(\"inProgress\"),\n components: z.record(componentPath, componentSchemaStatus),\n }),\n looseObject({\n type: z.literal(\"failed\"),\n error: z.string(),\n componentPath,\n tableName: z.nullable(z.string()),\n }),\n looseObject({\n type: z.literal(\"raceDetected\"),\n }),\n looseObject({\n type: z.literal(\"complete\"),\n }),\n]);\nexport type SchemaStatus = z.infer<typeof schemaStatus>;\n"],
5
- "mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,yBAAyB,qBAAqB;AACvD,SAAS,gBAAgB,qBAAqB;AAC9C,SAAS,wBAAwB;AACjC,SAAS,oCAAoC;AAC7C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAEnB,aAAM,mBAAmB,YAAY;AAAA,EAC1C,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,QAAQ;AAAA,EAElB,WAAW,EAAE,OAAO;AAAA,EAEpB,eAAe;AAAA,EACf,sBAAsB,EAAE,MAAM,yBAAyB;AAAA,EAEvD,kBAAkB,EAAE,MAAM,cAAc;AAAA,EAExC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AACpC,CAAC;AAGM,aAAM,eAAe,YAAY;AAAA,EACtC,uBAAuB,EAAE,IAAI;AAAA,EAC7B,WAAW,EAAE,IAAI;AAAA,EACjB,YAAY,EAAE,OAAO,yBAAyB,SAAS,EAAE,SAAS;AACpE,CAAC;AAGM,aAAM,oBAAoB,YAAY;AAAA,EAC3C,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EAErD,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACrC,6BAA6B,EAAE,OAAO,yBAAyB,aAAa;AAAA,EAE5E,SAAS,EAAE,MAAM,QAAQ;AAAA,EACzB,UAAU,EAAE,OAAO,yBAAyB,4BAA4B;AAAA,EAExE,KAAK;AAAA,EAEL;AACF,CAAC;AAGM,aAAM,uBAAuB,YAAY;AAAA,EAC9C;AACF,CAAC;AAGM,aAAM,wBAAwB,YAAY;AAAA,EAC/C,0BAA0B,EAAE,QAAQ;AAAA,EACpC,iBAAiB,EAAE,OAAO;AAAA,EAC1B,cAAc,EAAE,OAAO;AACzB,CAAC;AAGM,aAAM,eAAe,EAAE,MAAM;AAAA,EAClC,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC5B,YAAY,EAAE,OAAO,eAAe,qBAAqB;AAAA,EAC3D,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,IACxB,OAAO,EAAE,OAAO;AAAA,IAChB;AAAA,IACA,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,cAAc;AAAA,EAChC,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC5B,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { nodeDependency, sourcePackage } from \"./modules.js\";\nimport { checkedComponent } from \"./checkedComponent.js\";\nimport { evaluatedComponentDefinition } from \"./componentDefinition.js\";\nimport {\n appDefinitionConfig,\n componentDefinitionConfig,\n} from \"./definitionConfig.js\";\nimport { authInfo } from \"./types.js\";\nimport { looseObject } from \"./utils.js\";\nimport { indexDiff } from \"./finishPush.js\";\n\nexport const startPushRequest = looseObject({\n adminKey: z.string(),\n dryRun: z.boolean(),\n\n functions: z.string(),\n\n appDefinition: appDefinitionConfig,\n componentDefinitions: z.array(componentDefinitionConfig),\n\n nodeDependencies: z.array(nodeDependency),\n\n nodeVersion: z.optional(z.string()),\n});\nexport type StartPushRequest = z.infer<typeof startPushRequest>;\n\nexport const schemaChange = looseObject({\n allocatedComponentIds: z.any(),\n schemaIds: z.any(),\n indexDiffs: z.record(componentPath, indexDiff).optional(),\n});\nexport type SchemaChange = z.infer<typeof schemaChange>;\n\nexport const startPushResponse = looseObject({\n environmentVariables: z.record(z.string(), z.string()),\n\n externalDepsId: z.nullable(z.string()),\n componentDefinitionPackages: z.record(componentDefinitionPath, sourcePackage),\n\n appAuth: z.array(authInfo),\n analysis: z.record(componentDefinitionPath, evaluatedComponentDefinition),\n\n app: checkedComponent,\n\n schemaChange,\n});\nexport type StartPushResponse = z.infer<typeof startPushResponse>;\n\nexport const evaluatePushResponse = looseObject({\n schemaChange,\n});\nexport type EvaluatePushResponse = z.infer<typeof evaluatePushResponse>;\n\nexport const componentSchemaStatus = looseObject({\n schemaValidationComplete: z.boolean(),\n indexesComplete: z.number(),\n indexesTotal: z.number(),\n});\nexport type ComponentSchemaStatus = z.infer<typeof componentSchemaStatus>;\n\nexport const schemaStatus = z.union([\n looseObject({\n type: z.literal(\"inProgress\"),\n components: z.record(componentPath, componentSchemaStatus),\n }),\n looseObject({\n type: z.literal(\"failed\"),\n error: z.string(),\n componentPath,\n tableName: z.nullable(z.string()),\n }),\n looseObject({\n type: z.literal(\"raceDetected\"),\n }),\n looseObject({\n type: z.literal(\"complete\"),\n }),\n]);\nexport type SchemaStatus = z.infer<typeof schemaStatus>;\n"],
5
+ "mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,yBAAyB,qBAAqB;AACvD,SAAS,gBAAgB,qBAAqB;AAC9C,SAAS,wBAAwB;AACjC,SAAS,oCAAoC;AAC7C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAEnB,aAAM,mBAAmB,YAAY;AAAA,EAC1C,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,QAAQ;AAAA,EAElB,WAAW,EAAE,OAAO;AAAA,EAEpB,eAAe;AAAA,EACf,sBAAsB,EAAE,MAAM,yBAAyB;AAAA,EAEvD,kBAAkB,EAAE,MAAM,cAAc;AAAA,EAExC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AACpC,CAAC;AAGM,aAAM,eAAe,YAAY;AAAA,EACtC,uBAAuB,EAAE,IAAI;AAAA,EAC7B,WAAW,EAAE,IAAI;AAAA,EACjB,YAAY,EAAE,OAAO,eAAe,SAAS,EAAE,SAAS;AAC1D,CAAC;AAGM,aAAM,oBAAoB,YAAY;AAAA,EAC3C,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EAErD,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACrC,6BAA6B,EAAE,OAAO,yBAAyB,aAAa;AAAA,EAE5E,SAAS,EAAE,MAAM,QAAQ;AAAA,EACzB,UAAU,EAAE,OAAO,yBAAyB,4BAA4B;AAAA,EAExE,KAAK;AAAA,EAEL;AACF,CAAC;AAGM,aAAM,uBAAuB,YAAY;AAAA,EAC9C;AACF,CAAC;AAGM,aAAM,wBAAwB,YAAY;AAAA,EAC/C,0BAA0B,EAAE,QAAQ;AAAA,EACpC,iBAAiB,EAAE,OAAO;AAAA,EAC1B,cAAc,EAAE,OAAO;AACzB,CAAC;AAGM,aAAM,eAAe,EAAE,MAAM;AAAA,EAClC,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC5B,YAAY,EAAE,OAAO,eAAe,qBAAqB;AAAA,EAC3D,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,IACxB,OAAO,EAAE,OAAO;AAAA,IAChB;AAAA,IACA,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,cAAc;AAAA,EAChC,CAAC;AAAA,EACD,YAAY;AAAA,IACV,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC5B,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }
@@ -101,6 +101,7 @@ export async function devAgainstDeployment(ctx, credentials, devOptions) {
101
101
  // Pass logManager to control logs during deploy
102
102
  largeIndexDeletionCheck: "no verification",
103
103
  // `convex dev` can’t push to prod
104
+ warnOnSlowSchemaValidation: true,
104
105
  message: null
105
106
  },
106
107
  devOptions
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/dev.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\nimport { handleDashboard } from \"./localDeployment/dashboard.js\";\nimport { loadDeploymentConfig } from \"./localDeployment/filePaths.js\";\nimport { LocalDeploymentError } from \"./localDeployment/errors.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n backendVersion?: string | undefined;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.\n if (\n !devOptions.once &&\n !devOptions.untilSuccess &&\n credentials.deploymentType === \"anonymous\" &&\n credentials.deploymentName !== null\n ) {\n const deploymentConfig = loadDeploymentConfig(\n ctx,\n \"anonymous\",\n credentials.deploymentName,\n );\n if (deploymentConfig === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find local deployment config. This is a bug in Convex.`,\n errForSentry: new LocalDeploymentError(\n `Could not find local deployment config to start the anonymous dashboard.`,\n ),\n });\n }\n await handleDashboard(\n ctx,\n {\n name: credentials.deploymentName,\n cloudPort: deploymentConfig.ports.cloud,\n adminKey: deploymentConfig.adminKey,\n },\n {\n backendVersion: credentials.backendVersion,\n },\n );\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\nimport { handleDashboard } from \"./localDeployment/dashboard.js\";\nimport { loadDeploymentConfig } from \"./localDeployment/filePaths.js\";\nimport { LocalDeploymentError } from \"./localDeployment/errors.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n backendVersion?: string | undefined;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.\n if (\n !devOptions.once &&\n !devOptions.untilSuccess &&\n credentials.deploymentType === \"anonymous\" &&\n credentials.deploymentName !== null\n ) {\n const deploymentConfig = loadDeploymentConfig(\n ctx,\n \"anonymous\",\n credentials.deploymentName,\n );\n if (deploymentConfig === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find local deployment config. This is a bug in Convex.`,\n errForSentry: new LocalDeploymentError(\n `Could not find local deployment config to start the anonymous dashboard.`,\n ),\n });\n }\n await handleDashboard(\n ctx,\n {\n name: credentials.deploymentName,\n cloudPort: deploymentConfig.ports.cloud,\n adminKey: deploymentConfig.adminKey,\n },\n {\n backendVersion: credentials.backendVersion,\n },\n );\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n warnOnSlowSchemaValidation: true,\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["result"]
7
7
  }
@@ -12,8 +12,20 @@ import detect from "detect-port";
12
12
  import { LOCAL_BACKEND_SENTRY_DSN } from "../utils/sentry.js";
13
13
  import { createHash } from "crypto";
14
14
  import { LocalDeploymentError } from "./errors.js";
15
- import { LOCAL_BACKEND_INSTANCE_SECRET } from "./utils.js";
15
+ import { LOCAL_BACKEND_INSTANCE_SECRET, releaseDate } from "./utils.js";
16
+ import { productionProvisionHost, provisionHost } from "../config.js";
16
17
  const DEFAULT_STARTUP_TIMEOUT_SECS = 30;
18
+ const FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION = "precompiled-2026-09-15-4e9b83a";
19
+ export function _backendSupportsControlPlaneAuth(version) {
20
+ if (version === FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION) {
21
+ return true;
22
+ }
23
+ const backendDate = releaseDate(version);
24
+ const firstSupportedDate = releaseDate(
25
+ FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION
26
+ );
27
+ return backendDate !== null && firstSupportedDate !== null && backendDate > firstSupportedDate;
28
+ }
17
29
  async function parseStartupTimeoutSecs(ctx) {
18
30
  const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;
19
31
  if (raw === void 0) {
@@ -101,7 +113,22 @@ export async function runLocalBackend(ctx, args) {
101
113
  errForSentry: new LocalDeploymentError(message)
102
114
  });
103
115
  }
104
- const commandStr = `${args.binaryPath} ${commandArgs.join(" ")}`;
116
+ const supportsControlPlane = _backendSupportsControlPlaneAuth(
117
+ args.backendVersion
118
+ );
119
+ if (supportsControlPlane && provisionHost !== productionProvisionHost) {
120
+ commandArgs.push("--control-plane-url", provisionHost);
121
+ }
122
+ const auth = ctx.bigBrainAuth();
123
+ if (supportsControlPlane && args.deploymentKind === "local" && auth?.kind === "accessToken") {
124
+ commandArgs.push("--control-plane-access-token", auth.accessToken);
125
+ }
126
+ const displayArgs = commandArgs.map(
127
+ (arg, index) => index > 0 && ["--instance-secret", "--control-plane-access-token"].includes(
128
+ commandArgs[index - 1]
129
+ ) ? "[REDACTED]" : arg
130
+ );
131
+ const commandStr = `${args.binaryPath} ${displayArgs.join(" ")}`;
105
132
  logVerbose(`Starting local backend: \`${commandStr}\``);
106
133
  const p = child_process.spawn(args.binaryPath, commandArgs, {
107
134
  stdio: "ignore",
@@ -305,6 +332,7 @@ Run \`npx convex dev\` first.`
305
332
  const instanceSecret = config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;
306
333
  const { cleanupHandle } = await runLocalBackend(ctx, {
307
334
  binaryPath,
335
+ backendVersion: config.backendVersion,
308
336
  ports: config.ports,
309
337
  deploymentKind,
310
338
  deploymentName: args.deploymentName,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/run.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logVerbose, logMessage } from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n loadUuidForAnonymousUser,\n} from \"./filePaths.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport path from \"path\";\nimport child_process from \"child_process\";\nimport detect from \"detect-port\";\nimport { LOCAL_BACKEND_SENTRY_DSN } from \"../utils/sentry.js\";\nimport { createHash } from \"crypto\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { LOCAL_BACKEND_INSTANCE_SECRET } from \"./utils.js\";\nimport { DeploymentType, DetailedDeploymentCredentials } from \"../api.js\";\n\nconst DEFAULT_STARTUP_TIMEOUT_SECS = 30;\n\nasync function parseStartupTimeoutSecs(ctx: Context): Promise<number> {\n const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;\n if (raw === undefined) {\n return DEFAULT_STARTUP_TIMEOUT_SECS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=${JSON.stringify(raw)}: expected a positive number.`,\n });\n }\n return parsed;\n}\n\nexport async function runLocalBackend(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site: number;\n };\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n binaryPath: string;\n instanceSecret: string;\n isLatestVersion: boolean;\n },\n): Promise<{\n cleanupHandle: string;\n}> {\n const { ports } = args;\n const deploymentDir = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n ctx.fs.mkdir(deploymentDir, { recursive: true });\n const deploymentNameSha = createHash(\"sha256\")\n .update(args.deploymentName)\n .digest(\"hex\");\n const commandArgs = [\n \"--port\",\n ports.cloud.toString(),\n \"--site-proxy-port\",\n ports.site.toString(),\n \"--sentry-identifier\",\n deploymentNameSha,\n \"--instance-name\",\n args.deploymentName,\n \"--instance-secret\",\n args.instanceSecret,\n \"--local-storage\",\n path.join(deploymentDir, \"convex_local_storage\"),\n \"--beacon-tag\",\n selfHostedEventTag(args.deploymentKind),\n path.join(deploymentDir, \"convex_local_backend.sqlite3\"),\n ];\n if (args.isLatestVersion) {\n // CLI args that were added in later versions of backend go here instead of above\n // since the CLI may run older versions of backend (e.g. when upgrading).\n if (args.deploymentKind === \"anonymous\") {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid !== null) {\n commandArgs.push(\n \"--beacon-fields\",\n JSON.stringify({\n override_uuid: uuid,\n }),\n );\n }\n }\n }\n\n // Check that binary works by running with --help\n try {\n const result = child_process.spawnSync(args.binaryPath, [\n ...commandArgs,\n \"--help\",\n ]);\n if (result.status === 3221225781) {\n const message =\n \"Local backend exited because shared libraries are missing. These may include libraries installed via 'Microsoft Visual C++ Redistributable for Visual Studio.'\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(\n \"Local backend exited with code 3221225781\",\n ),\n });\n } else if (result.status !== 0) {\n const message = `Failed to run backend binary, exit code ${result.status}, error: ${result.stderr === null ? \"null\" : result.stderr.toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n } catch (e) {\n const message = `Failed to run backend binary: ${(e as any).toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n const commandStr = `${args.binaryPath} ${commandArgs.join(\" \")}`;\n logVerbose(`Starting local backend: \\`${commandStr}\\``);\n const p = child_process\n .spawn(args.binaryPath, commandArgs, {\n stdio: \"ignore\",\n env: {\n ...process.env,\n SENTRY_DSN: LOCAL_BACKEND_SENTRY_DSN,\n },\n })\n .on(\"exit\", (code) => {\n const why = code === null ? \"from signal\" : `with code ${code}`;\n logVerbose(`Local backend exited ${why}, full command \\`${commandStr}\\``);\n });\n const cleanupHandle = ctx.registerCleanup(async () => {\n logVerbose(`Stopping local backend on port ${ports.cloud}`);\n p.kill(\"SIGTERM\");\n });\n\n await ensureBackendRunning(ctx, {\n cloudPort: ports.cloud,\n deploymentName: args.deploymentName,\n maxTimeSecs: await parseStartupTimeoutSecs(ctx),\n });\n\n return {\n cleanupHandle,\n };\n}\n\n/** Crash if correct local backend is not currently listening on the expected port. */\nexport async function assertLocalBackendRunning(\n ctx: Context,\n args: {\n url: string;\n deploymentName: string;\n },\n): Promise<void> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n const result = await fetchLocalBackendStatus(args);\n switch (result.kind) {\n case \"running\":\n return;\n case \"different\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${result.name} is running at ${args.url}`,\n });\n case \"error\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error response code received from local backend ${result.resp.status} ${result.resp.statusText}`,\n });\n case \"not-running\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running. (it's not listening at ${args.url})\\nRun \\`npx convex dev\\` in another terminal first.`,\n });\n }\n}\n\n/** Wait for up to maxTimeSecs for the correct local backend to be running on the expected port. */\nexport async function ensureBackendRunning(\n ctx: Context,\n args: {\n cloudPort: number;\n deploymentName: string;\n maxTimeSecs: number;\n },\n): Promise<void> {\n logVerbose(`Ensuring backend running on port ${args.cloudPort} is running`);\n const deploymentUrl = localDeploymentUrl(args.cloudPort);\n let timeElapsedSecs = 0;\n let hasShownWaiting = false;\n while (timeElapsedSecs <= args.maxTimeSecs) {\n if (!hasShownWaiting && timeElapsedSecs > 2) {\n logMessage(\"waiting for local backend to start...\");\n hasShownWaiting = true;\n }\n try {\n const resp = await fetch(`${deploymentUrl}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${text} is running on selected port ${args.cloudPort}`,\n });\n } else {\n // The backend is running!\n return;\n }\n } else {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n }\n const base = `Local backend did not start on port ${args.cloudPort} within ${args.maxTimeSecs} seconds.`;\n const message =\n args.maxTimeSecs >= DEFAULT_STARTUP_TIMEOUT_SECS\n ? `${base} If your local database is large, increase the timeout by setting CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS (e.g. CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=120).`\n : base;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n}\n\nexport async function ensureBackendStopped(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site?: number;\n };\n maxTimeSecs: number;\n deploymentName: string;\n // Whether to allow a deployment with a different name to run on this port\n allowOtherDeployments: boolean;\n },\n) {\n logVerbose(`Ensuring backend running on port ${args.ports.cloud} is stopped`);\n let timeElapsedSecs = 0;\n while (timeElapsedSecs < args.maxTimeSecs) {\n const cloudPort = await detect(args.ports.cloud);\n const sitePort =\n args.ports.site === undefined ? undefined : await detect(args.ports.site);\n // Both ports are free\n if (cloudPort === args.ports.cloud && sitePort === args.ports.site) {\n return;\n }\n try {\n const instanceNameResp = await fetch(\n `${localDeploymentUrl(args.ports.cloud)}/instance_name`,\n );\n if (instanceNameResp.ok) {\n const instanceName = await instanceNameResp.text();\n if (instanceName !== args.deploymentName) {\n if (args.allowOtherDeployments) {\n return;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${instanceName} is running on selected port ${args.ports.cloud}`,\n });\n }\n }\n } catch (error: any) {\n logVerbose(`Error checking if backend is running: ${error.message}`);\n // Backend is probably not running\n continue;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A local backend is still running on port ${args.ports.cloud}. Please stop it and run this command again.`,\n });\n}\n\nexport function localDeploymentUrl(cloudPort: number): string {\n return `http://127.0.0.1:${cloudPort}`;\n}\n\nexport function selfHostedEventTag(\n deploymentKind: LocalDeploymentKind,\n): string {\n return deploymentKind === \"local\" ? \"cli-local-dev\" : \"cli-anonymous-dev\";\n}\n\ntype LocalBackendStatus =\n | { kind: \"running\" }\n | { kind: \"error\"; resp: Response }\n | { kind: \"different\"; name: string }\n | { kind: \"not-running\" };\n\nexport async function fetchLocalBackendStatus(args: {\n url: string;\n deploymentName: string;\n}): Promise<LocalBackendStatus> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n try {\n const resp = await fetch(`${args.url}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return { kind: \"different\", name: text };\n } else {\n return { kind: \"running\" };\n }\n } else {\n return { kind: \"error\", resp };\n }\n } catch {\n return { kind: \"not-running\" };\n }\n}\n\n/** Returns true if the correct local backend is listening. */\nexport async function isLocalBackendRunning(\n url: string,\n deploymentName: string,\n): Promise<boolean> {\n return (\n \"running\" === (await fetchLocalBackendStatus({ url, deploymentName })).kind\n );\n}\n\nexport function shouldUseLocalDeployment(deploymentType: DeploymentType) {\n return deploymentType === \"local\" || deploymentType === \"anonymous\";\n}\n\ninterface WithRunningBackendArgs {\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n action: () => Promise<void>;\n}\n\n/**\n * If the deployment is a local deployment and not already running, start it\n * for the duration of the action, then stop it.\n */\nexport async function withRunningBackend({\n ctx,\n deployment,\n action,\n}: WithRunningBackendArgs) {\n let cleanup: (() => Promise<void>) | null = null;\n\n if (\n deployment.deploymentFields &&\n shouldUseLocalDeployment(deployment.deploymentFields.deploymentType)\n ) {\n const isRunning = await isLocalBackendRunning(\n deployment.deploymentUrl,\n deployment.deploymentFields.deploymentName,\n );\n if (!isRunning) {\n ({ cleanup } = await startEphemeralLocalBackend(ctx, {\n deploymentType: deployment.deploymentFields.deploymentType,\n deploymentName: deployment.deploymentFields.deploymentName,\n }));\n }\n }\n\n try {\n await action();\n } finally {\n await cleanup?.();\n }\n}\n\n/**\n * Start a local backend for a one-off command using saved deployment config.\n * Returns a cleanup function that stops the backend.\n */\nasync function startEphemeralLocalBackend(\n ctx: Context,\n args: {\n deploymentType: string;\n deploymentName: string;\n },\n): Promise<{ cleanup: () => Promise<void> }> {\n const deploymentKind: LocalDeploymentKind =\n args.deploymentType === \"anonymous\" ? \"anonymous\" : \"local\";\n\n const config = loadDeploymentConfig(ctx, deploymentKind, args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running and no saved configuration found.\\nRun \\`npx convex dev\\` first.`,\n });\n }\n\n const { binaryPath } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"version\",\n version: config.backendVersion,\n });\n\n const instanceSecret = config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath,\n ports: config.ports,\n deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: true,\n });\n\n return {\n cleanup: async () => {\n const fn = ctx.removeCleanup(cleanupHandle);\n if (fn) {\n await fn(0);\n }\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logVerbose, logMessage } from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n loadUuidForAnonymousUser,\n} from \"./filePaths.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport path from \"path\";\nimport child_process from \"child_process\";\nimport detect from \"detect-port\";\nimport { LOCAL_BACKEND_SENTRY_DSN } from \"../utils/sentry.js\";\nimport { createHash } from \"crypto\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { LOCAL_BACKEND_INSTANCE_SECRET, releaseDate } from \"./utils.js\";\nimport { DeploymentType, DetailedDeploymentCredentials } from \"../api.js\";\nimport { productionProvisionHost, provisionHost } from \"../config.js\";\n\nconst DEFAULT_STARTUP_TIMEOUT_SECS = 30;\nconst FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION =\n \"precompiled-2026-09-15-4e9b83a\";\n\nexport function _backendSupportsControlPlaneAuth(version: string): boolean {\n if (version === FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION) {\n return true;\n }\n const backendDate = releaseDate(version);\n const firstSupportedDate = releaseDate(\n FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION,\n );\n return (\n backendDate !== null &&\n firstSupportedDate !== null &&\n backendDate > firstSupportedDate\n );\n}\n\nasync function parseStartupTimeoutSecs(ctx: Context): Promise<number> {\n const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;\n if (raw === undefined) {\n return DEFAULT_STARTUP_TIMEOUT_SECS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=${JSON.stringify(raw)}: expected a positive number.`,\n });\n }\n return parsed;\n}\n\nexport async function runLocalBackend(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site: number;\n };\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n binaryPath: string;\n backendVersion: string;\n instanceSecret: string;\n isLatestVersion: boolean;\n },\n): Promise<{\n cleanupHandle: string;\n}> {\n const { ports } = args;\n const deploymentDir = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n ctx.fs.mkdir(deploymentDir, { recursive: true });\n const deploymentNameSha = createHash(\"sha256\")\n .update(args.deploymentName)\n .digest(\"hex\");\n const commandArgs = [\n \"--port\",\n ports.cloud.toString(),\n \"--site-proxy-port\",\n ports.site.toString(),\n \"--sentry-identifier\",\n deploymentNameSha,\n \"--instance-name\",\n args.deploymentName,\n \"--instance-secret\",\n args.instanceSecret,\n \"--local-storage\",\n path.join(deploymentDir, \"convex_local_storage\"),\n \"--beacon-tag\",\n selfHostedEventTag(args.deploymentKind),\n path.join(deploymentDir, \"convex_local_backend.sqlite3\"),\n ];\n if (args.isLatestVersion) {\n // CLI args that were added in later versions of backend go here instead of above\n // since the CLI may run older versions of backend (e.g. when upgrading).\n if (args.deploymentKind === \"anonymous\") {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid !== null) {\n commandArgs.push(\n \"--beacon-fields\",\n JSON.stringify({\n override_uuid: uuid,\n }),\n );\n }\n }\n }\n\n // Check that binary works by running with --help\n try {\n const result = child_process.spawnSync(args.binaryPath, [\n ...commandArgs,\n \"--help\",\n ]);\n if (result.status === 3221225781) {\n const message =\n \"Local backend exited because shared libraries are missing. These may include libraries installed via 'Microsoft Visual C++ Redistributable for Visual Studio.'\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(\n \"Local backend exited with code 3221225781\",\n ),\n });\n } else if (result.status !== 0) {\n const message = `Failed to run backend binary, exit code ${result.status}, error: ${result.stderr === null ? \"null\" : result.stderr.toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n } catch (e) {\n const message = `Failed to run backend binary: ${(e as any).toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n const supportsControlPlane = _backendSupportsControlPlaneAuth(\n args.backendVersion,\n );\n if (supportsControlPlane && provisionHost !== productionProvisionHost) {\n commandArgs.push(\"--control-plane-url\", provisionHost);\n }\n const auth = ctx.bigBrainAuth();\n if (\n supportsControlPlane &&\n args.deploymentKind === \"local\" &&\n auth?.kind === \"accessToken\"\n ) {\n commandArgs.push(\"--control-plane-access-token\", auth.accessToken);\n }\n const displayArgs = commandArgs.map((arg, index) =>\n index > 0 &&\n [\"--instance-secret\", \"--control-plane-access-token\"].includes(\n commandArgs[index - 1],\n )\n ? \"[REDACTED]\"\n : arg,\n );\n const commandStr = `${args.binaryPath} ${displayArgs.join(\" \")}`;\n logVerbose(`Starting local backend: \\`${commandStr}\\``);\n const p = child_process\n .spawn(args.binaryPath, commandArgs, {\n stdio: \"ignore\",\n env: {\n ...process.env,\n SENTRY_DSN: LOCAL_BACKEND_SENTRY_DSN,\n },\n })\n .on(\"exit\", (code) => {\n const why = code === null ? \"from signal\" : `with code ${code}`;\n logVerbose(`Local backend exited ${why}, full command \\`${commandStr}\\``);\n });\n const cleanupHandle = ctx.registerCleanup(async () => {\n logVerbose(`Stopping local backend on port ${ports.cloud}`);\n p.kill(\"SIGTERM\");\n });\n\n await ensureBackendRunning(ctx, {\n cloudPort: ports.cloud,\n deploymentName: args.deploymentName,\n maxTimeSecs: await parseStartupTimeoutSecs(ctx),\n });\n\n return {\n cleanupHandle,\n };\n}\n\n/** Crash if correct local backend is not currently listening on the expected port. */\nexport async function assertLocalBackendRunning(\n ctx: Context,\n args: {\n url: string;\n deploymentName: string;\n },\n): Promise<void> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n const result = await fetchLocalBackendStatus(args);\n switch (result.kind) {\n case \"running\":\n return;\n case \"different\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${result.name} is running at ${args.url}`,\n });\n case \"error\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error response code received from local backend ${result.resp.status} ${result.resp.statusText}`,\n });\n case \"not-running\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running. (it's not listening at ${args.url})\\nRun \\`npx convex dev\\` in another terminal first.`,\n });\n }\n}\n\n/** Wait for up to maxTimeSecs for the correct local backend to be running on the expected port. */\nexport async function ensureBackendRunning(\n ctx: Context,\n args: {\n cloudPort: number;\n deploymentName: string;\n maxTimeSecs: number;\n },\n): Promise<void> {\n logVerbose(`Ensuring backend running on port ${args.cloudPort} is running`);\n const deploymentUrl = localDeploymentUrl(args.cloudPort);\n let timeElapsedSecs = 0;\n let hasShownWaiting = false;\n while (timeElapsedSecs <= args.maxTimeSecs) {\n if (!hasShownWaiting && timeElapsedSecs > 2) {\n logMessage(\"waiting for local backend to start...\");\n hasShownWaiting = true;\n }\n try {\n const resp = await fetch(`${deploymentUrl}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${text} is running on selected port ${args.cloudPort}`,\n });\n } else {\n // The backend is running!\n return;\n }\n } else {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n }\n const base = `Local backend did not start on port ${args.cloudPort} within ${args.maxTimeSecs} seconds.`;\n const message =\n args.maxTimeSecs >= DEFAULT_STARTUP_TIMEOUT_SECS\n ? `${base} If your local database is large, increase the timeout by setting CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS (e.g. CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=120).`\n : base;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n}\n\nexport async function ensureBackendStopped(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site?: number;\n };\n maxTimeSecs: number;\n deploymentName: string;\n // Whether to allow a deployment with a different name to run on this port\n allowOtherDeployments: boolean;\n },\n) {\n logVerbose(`Ensuring backend running on port ${args.ports.cloud} is stopped`);\n let timeElapsedSecs = 0;\n while (timeElapsedSecs < args.maxTimeSecs) {\n const cloudPort = await detect(args.ports.cloud);\n const sitePort =\n args.ports.site === undefined ? undefined : await detect(args.ports.site);\n // Both ports are free\n if (cloudPort === args.ports.cloud && sitePort === args.ports.site) {\n return;\n }\n try {\n const instanceNameResp = await fetch(\n `${localDeploymentUrl(args.ports.cloud)}/instance_name`,\n );\n if (instanceNameResp.ok) {\n const instanceName = await instanceNameResp.text();\n if (instanceName !== args.deploymentName) {\n if (args.allowOtherDeployments) {\n return;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${instanceName} is running on selected port ${args.ports.cloud}`,\n });\n }\n }\n } catch (error: any) {\n logVerbose(`Error checking if backend is running: ${error.message}`);\n // Backend is probably not running\n continue;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A local backend is still running on port ${args.ports.cloud}. Please stop it and run this command again.`,\n });\n}\n\nexport function localDeploymentUrl(cloudPort: number): string {\n return `http://127.0.0.1:${cloudPort}`;\n}\n\nexport function selfHostedEventTag(\n deploymentKind: LocalDeploymentKind,\n): string {\n return deploymentKind === \"local\" ? \"cli-local-dev\" : \"cli-anonymous-dev\";\n}\n\ntype LocalBackendStatus =\n | { kind: \"running\" }\n | { kind: \"error\"; resp: Response }\n | { kind: \"different\"; name: string }\n | { kind: \"not-running\" };\n\nexport async function fetchLocalBackendStatus(args: {\n url: string;\n deploymentName: string;\n}): Promise<LocalBackendStatus> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n try {\n const resp = await fetch(`${args.url}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return { kind: \"different\", name: text };\n } else {\n return { kind: \"running\" };\n }\n } else {\n return { kind: \"error\", resp };\n }\n } catch {\n return { kind: \"not-running\" };\n }\n}\n\n/** Returns true if the correct local backend is listening. */\nexport async function isLocalBackendRunning(\n url: string,\n deploymentName: string,\n): Promise<boolean> {\n return (\n \"running\" === (await fetchLocalBackendStatus({ url, deploymentName })).kind\n );\n}\n\nexport function shouldUseLocalDeployment(deploymentType: DeploymentType) {\n return deploymentType === \"local\" || deploymentType === \"anonymous\";\n}\n\ninterface WithRunningBackendArgs {\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n action: () => Promise<void>;\n}\n\n/**\n * If the deployment is a local deployment and not already running, start it\n * for the duration of the action, then stop it.\n */\nexport async function withRunningBackend({\n ctx,\n deployment,\n action,\n}: WithRunningBackendArgs) {\n let cleanup: (() => Promise<void>) | null = null;\n\n if (\n deployment.deploymentFields &&\n shouldUseLocalDeployment(deployment.deploymentFields.deploymentType)\n ) {\n const isRunning = await isLocalBackendRunning(\n deployment.deploymentUrl,\n deployment.deploymentFields.deploymentName,\n );\n if (!isRunning) {\n ({ cleanup } = await startEphemeralLocalBackend(ctx, {\n deploymentType: deployment.deploymentFields.deploymentType,\n deploymentName: deployment.deploymentFields.deploymentName,\n }));\n }\n }\n\n try {\n await action();\n } finally {\n await cleanup?.();\n }\n}\n\n/**\n * Start a local backend for a one-off command using saved deployment config.\n * Returns a cleanup function that stops the backend.\n */\nasync function startEphemeralLocalBackend(\n ctx: Context,\n args: {\n deploymentType: string;\n deploymentName: string;\n },\n): Promise<{ cleanup: () => Promise<void> }> {\n const deploymentKind: LocalDeploymentKind =\n args.deploymentType === \"anonymous\" ? \"anonymous\" : \"local\";\n\n const config = loadDeploymentConfig(ctx, deploymentKind, args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running and no saved configuration found.\\nRun \\`npx convex dev\\` first.`,\n });\n }\n\n const { binaryPath } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"version\",\n version: config.backendVersion,\n });\n\n const instanceSecret = config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath,\n backendVersion: config.backendVersion,\n ports: config.ports,\n deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: true,\n });\n\n return {\n cleanup: async () => {\n const fn = ctx.removeCleanup(cleanupHandle);\n if (fn) {\n await fn(0);\n }\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -8,6 +8,7 @@ import {
8
8
  saveDeploymentConfig
9
9
  } from "./filePaths.js";
10
10
  import { runLocalBackend } from "./run.js";
11
+ import { releaseDate } from "./utils.js";
11
12
  import { promptYesNo } from "../utils/prompts.js";
12
13
  import { ensureBackendBinaryDownloaded } from "./download.js";
13
14
  import {
@@ -43,6 +44,7 @@ export async function handlePotentialUpgradeAndStart(ctx, args) {
43
44
  );
44
45
  const { cleanupHandle: cleanupHandle2 } = await runLocalBackend(ctx, {
45
46
  binaryPath: args.newBinaryPath,
47
+ backendVersion: args.newVersion,
46
48
  deploymentKind: args.deploymentKind,
47
49
  deploymentName: args.deploymentName,
48
50
  ports: args.ports,
@@ -72,6 +74,7 @@ export async function handlePotentialUpgradeAndStart(ctx, args) {
72
74
  });
73
75
  const { cleanupHandle: cleanupHandle2 } = await runLocalBackend(ctx, {
74
76
  binaryPath: oldBinaryPath,
77
+ backendVersion: args.oldVersion,
75
78
  ports: args.ports,
76
79
  deploymentKind: args.deploymentKind,
77
80
  deploymentName: args.deploymentName,
@@ -103,6 +106,7 @@ async function handleUpgrade(ctx, args) {
103
106
  logVerbose(`Running backend on new version ${args.newVersion}`);
104
107
  const { cleanupHandle } = await runLocalBackend(ctx, {
105
108
  binaryPath: args.newBinaryPath,
109
+ backendVersion: args.newVersion,
106
110
  ports: args.ports,
107
111
  deploymentKind: args.deploymentKind,
108
112
  deploymentName: args.deploymentName,
@@ -126,7 +130,4 @@ export function _isDowngrade(oldVersion, newVersion) {
126
130
  const newDate = releaseDate(newVersion);
127
131
  return oldDate !== null && newDate !== null && newDate < oldDate;
128
132
  }
129
- function releaseDate(version) {
130
- return /^precompiled-(\d{4}-\d{2}-\d{2})-/.exec(version)?.[1] ?? null;
131
- }
132
133
  //# sourceMappingURL=upgrade.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/upgrade.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { runLocalBackend } from \"./run.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handlePotentialUpgradeAndStart(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n existingCredentials: { adminKey: string; instanceSecret: string } | null;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string; adminKey: string }> {\n const { adminKey, instanceSecret } =\n args.existingCredentials === null ||\n args.existingCredentials.instanceSecret ===\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET\n ? // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`\n // here, because `newBinaryPath` can be a binary that doesn\u2019t support\n // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)\n //\n // In most cases (the user is not using the flag), we have already downloaded the latest binary\n // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn\u2019t cause an\n // extra download (even if the user chooses later not to upgrade their deployment)\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: args.deploymentName,\n })\n : args.existingCredentials;\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: false,\n });\n return { cleanupHandle, adminKey };\n }\n const { cleanupHandle } = await handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n return { cleanupHandle, adminKey };\n}\n\n/**\n * Upgrade in place: hand the existing data directory to the new binary, which\n * migrates its own on-disk state on startup (the same path self-hosted\n * deployments take).\n */\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n instanceSecret: string;\n adminKey: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const isDowngrade = _isDowngrade(args.oldVersion, args.newVersion);\n if (isDowngrade) {\n logWarning(\n `Moving a local deployment back to an older backend version (${args.oldVersion} \u2192 ${args.newVersion}) isn't supported: ` +\n `the older backend may not be able to read data written by the newer one. ` +\n `If it fails to start, delete the deployment's state directory to start fresh on this version.`,\n );\n }\n\n logVerbose(`Running backend on new version ${args.newVersion}`);\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logFinishedStep(\n `Successfully ${isDowngrade ? \"moved\" : \"upgraded\"} to backend version ${args.newVersion}`,\n );\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n\n/** Whether `newVersion` predates `oldVersion`, as far as we can tell. */\nexport function _isDowngrade(oldVersion: string, newVersion: string): boolean {\n const oldDate = releaseDate(oldVersion);\n const newDate = releaseDate(newVersion);\n return oldDate !== null && newDate !== null && newDate < oldDate;\n}\n\n// Backend releases are tagged `precompiled-YYYY-MM-DD-<commit>`, so the dates\n// sort lexicographically.\nfunction releaseDate(version: string): string | null {\n return /^precompiled-(\\d{4}-\\d{2}-\\d{2})-/.exec(version)?.[1] ?? null;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { runLocalBackend } from \"./run.js\";\nimport { releaseDate } from \"./utils.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handlePotentialUpgradeAndStart(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n existingCredentials: { adminKey: string; instanceSecret: string } | null;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string; adminKey: string }> {\n const { adminKey, instanceSecret } =\n args.existingCredentials === null ||\n args.existingCredentials.instanceSecret ===\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET\n ? // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`\n // here, because `newBinaryPath` can be a binary that doesn\u2019t support\n // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)\n //\n // In most cases (the user is not using the flag), we have already downloaded the latest binary\n // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn\u2019t cause an\n // extra download (even if the user chooses later not to upgrade their deployment)\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: args.deploymentName,\n })\n : args.existingCredentials;\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n backendVersion: args.newVersion,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n backendVersion: args.oldVersion,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: false,\n });\n return { cleanupHandle, adminKey };\n }\n const { cleanupHandle } = await handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n return { cleanupHandle, adminKey };\n}\n\n/**\n * Upgrade in place: hand the existing data directory to the new binary, which\n * migrates its own on-disk state on startup (the same path self-hosted\n * deployments take).\n */\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n instanceSecret: string;\n adminKey: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const isDowngrade = _isDowngrade(args.oldVersion, args.newVersion);\n if (isDowngrade) {\n logWarning(\n `Moving a local deployment back to an older backend version (${args.oldVersion} \u2192 ${args.newVersion}) isn't supported: ` +\n `the older backend may not be able to read data written by the newer one. ` +\n `If it fails to start, delete the deployment's state directory to start fresh on this version.`,\n );\n }\n\n logVerbose(`Running backend on new version ${args.newVersion}`);\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n backendVersion: args.newVersion,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logFinishedStep(\n `Successfully ${isDowngrade ? \"moved\" : \"upgraded\"} to backend version ${args.newVersion}`,\n );\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n\n/** Whether `newVersion` predates `oldVersion`, as far as we can tell. */\nexport function _isDowngrade(oldVersion: string, newVersion: string): boolean {\n const oldDate = releaseDate(oldVersion);\n const newDate = releaseDate(newVersion);\n return oldDate !== null && newDate !== null && newDate < oldDate;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["cleanupHandle"]
7
7
  }
@@ -64,4 +64,7 @@ export function printLocalDeploymentWelcomeMessage() {
64
64
  );
65
65
  }
66
66
  export const LOCAL_BACKEND_INSTANCE_SECRET = "4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974";
67
+ export function releaseDate(version) {
68
+ return /^precompiled-(\d{4}-\d{2}-\d{2})-/.exec(version)?.[1] ?? null;
69
+ }
67
70
  //# sourceMappingURL=utils.js.map