convex 1.46.0 → 1.48.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/browser.bundle.js +7 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/bundler/context.js +7 -5
  5. package/dist/cjs/bundler/context.js.map +2 -2
  6. package/dist/cjs/bundler/fs.js +47 -6
  7. package/dist/cjs/bundler/fs.js.map +2 -2
  8. package/dist/cjs/bundler/index.js +5 -4
  9. package/dist/cjs/bundler/index.js.map +2 -2
  10. package/dist/cjs/cli/account.js +237 -0
  11. package/dist/cjs/cli/account.js.map +7 -0
  12. package/dist/cjs/cli/codegen.js +0 -4
  13. package/dist/cjs/cli/codegen.js.map +2 -2
  14. package/dist/cjs/cli/configure.js +28 -6
  15. package/dist/cjs/cli/configure.js.map +2 -2
  16. package/dist/cjs/cli/deploy.js +27 -2
  17. package/dist/cjs/cli/deploy.js.map +2 -2
  18. package/dist/cjs/cli/deploymentSelect.js +2 -2
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +6 -0
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/env.js +10 -5
  23. package/dist/cjs/cli/env.js.map +2 -2
  24. package/dist/cjs/cli/envDefault.js +7 -2
  25. package/dist/cjs/cli/envDefault.js.map +2 -2
  26. package/dist/cjs/cli/generatedApi.js.map +1 -1
  27. package/dist/cjs/cli/lib/api.js +2 -0
  28. package/dist/cjs/cli/lib/api.js.map +2 -2
  29. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  30. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  31. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +36 -47
  32. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  33. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +58 -39
  34. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  35. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  36. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  37. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +2 -1
  39. package/dist/cjs/cli/lib/command.js.map +2 -2
  40. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  41. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  42. package/dist/cjs/cli/lib/components.js +48 -5
  43. package/dist/cjs/cli/lib/components.js.map +2 -2
  44. package/dist/cjs/cli/lib/config.js +56 -17
  45. package/dist/cjs/cli/lib/config.js.map +2 -2
  46. package/dist/cjs/cli/lib/deploy2.js +3 -1
  47. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  48. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +30 -2
  49. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
  51. package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
  52. package/dist/cjs/cli/lib/deployment.js +2 -0
  53. package/dist/cjs/cli/lib/deployment.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
  55. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +5 -0
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/envvars.js +32 -0
  59. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  60. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  61. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  62. package/dist/cjs/cli/lib/fsUtils.js +1 -1
  63. package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
  64. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  65. package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
  66. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  67. package/dist/cjs/cli/lib/login.js +28 -4
  68. package/dist/cjs/cli/lib/login.js.map +2 -2
  69. package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
  70. package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
  71. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  72. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  73. package/dist/cjs/cli/lib/profileManagement.js +196 -0
  74. package/dist/cjs/cli/lib/profileManagement.js.map +7 -0
  75. package/dist/cjs/cli/lib/profiles.js +333 -0
  76. package/dist/cjs/cli/lib/profiles.js.map +7 -0
  77. package/dist/cjs/cli/lib/run.js +4 -0
  78. package/dist/cjs/cli/lib/run.js.map +2 -2
  79. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  80. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  81. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  82. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  84. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +66 -27
  86. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  87. package/dist/cjs/cli/login.js +213 -114
  88. package/dist/cjs/cli/login.js.map +3 -3
  89. package/dist/cjs/cli/logout.js +113 -12
  90. package/dist/cjs/cli/logout.js.map +3 -3
  91. package/dist/cjs/cli/mcp.js +43 -10
  92. package/dist/cjs/cli/mcp.js.map +3 -3
  93. package/dist/cjs/cli/program.js +2 -1
  94. package/dist/cjs/cli/program.js.map +2 -2
  95. package/dist/cjs/cli/projectCreate.js +1 -1
  96. package/dist/cjs/cli/projectCreate.js.map +1 -1
  97. package/dist/cjs/index.js +1 -1
  98. package/dist/cjs/index.js.map +1 -1
  99. package/dist/cjs/server/impl/actions_impl.js +8 -3
  100. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  101. package/dist/cjs/server/impl/storage_impl.js +29 -0
  102. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js +1 -0
  104. package/dist/cjs/server/index.js.map +2 -2
  105. package/dist/cjs/server/meta.js.map +1 -1
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs/server/schema.js +34 -12
  108. package/dist/cjs/server/schema.js.map +2 -2
  109. package/dist/cjs/server/storage.js.map +1 -1
  110. package/dist/cjs/values/validators.js +1 -1
  111. package/dist/cjs/values/validators.js.map +2 -2
  112. package/dist/cjs/values/value.js +6 -0
  113. package/dist/cjs/values/value.js.map +2 -2
  114. package/dist/cjs-types/bundler/context.d.ts +5 -0
  115. package/dist/cjs-types/bundler/context.d.ts.map +1 -1
  116. package/dist/cjs-types/bundler/fs.d.ts +7 -2
  117. package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
  118. package/dist/cjs-types/bundler/index.d.ts +9 -2
  119. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  120. package/dist/cjs-types/cli/account.d.ts +6 -0
  121. package/dist/cjs-types/cli/account.d.ts.map +1 -0
  122. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/configure.d.ts +6 -0
  124. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  126. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  128. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/dev.d.ts +1 -0
  130. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  134. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  137. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  138. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  139. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  140. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  141. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  142. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  143. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  144. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -3
  145. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  147. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  149. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/components.d.ts +4 -0
  151. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  153. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/lib/deploy2.d.ts +2 -0
  155. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  157. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
  159. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  160. package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
  161. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  162. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
  163. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  164. package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
  165. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
  167. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  168. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
  169. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  170. package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
  171. package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/login.d.ts +3 -1
  173. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts +8 -5
  176. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  178. package/dist/cjs-types/cli/lib/profileManagement.d.ts +10 -0
  179. package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +1 -0
  180. package/dist/cjs-types/cli/lib/profiles.d.ts +59 -0
  181. package/dist/cjs-types/cli/lib/profiles.d.ts.map +1 -0
  182. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  183. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  184. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  185. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  186. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  187. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  188. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  189. package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -2
  190. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  191. package/dist/cjs-types/cli/login.d.ts +21 -0
  192. package/dist/cjs-types/cli/login.d.ts.map +1 -1
  193. package/dist/cjs-types/cli/logout.d.ts +8 -1
  194. package/dist/cjs-types/cli/logout.d.ts.map +1 -1
  195. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  196. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  197. package/dist/cjs-types/index.d.ts +1 -1
  198. package/dist/cjs-types/index.d.ts.map +1 -1
  199. package/dist/cjs-types/server/impl/actions_impl.d.ts +18 -3
  200. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  201. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  202. package/dist/cjs-types/server/index.d.ts +1 -1
  203. package/dist/cjs-types/server/index.d.ts.map +1 -1
  204. package/dist/cjs-types/server/meta.d.ts +63 -0
  205. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  206. package/dist/cjs-types/server/registration.d.ts +10 -0
  207. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  208. package/dist/cjs-types/server/schema.d.ts +33 -0
  209. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  210. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  211. package/dist/cjs-types/values/value.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +4889 -2980
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/bundler/context.js +7 -5
  215. package/dist/esm/bundler/context.js.map +2 -2
  216. package/dist/esm/bundler/fs.js +47 -6
  217. package/dist/esm/bundler/fs.js.map +2 -2
  218. package/dist/esm/bundler/index.js +5 -4
  219. package/dist/esm/bundler/index.js.map +2 -2
  220. package/dist/esm/cli/account.js +221 -0
  221. package/dist/esm/cli/account.js.map +7 -0
  222. package/dist/esm/cli/codegen.js +0 -4
  223. package/dist/esm/cli/codegen.js.map +2 -2
  224. package/dist/esm/cli/configure.js +27 -6
  225. package/dist/esm/cli/configure.js.map +2 -2
  226. package/dist/esm/cli/deploy.js +27 -2
  227. package/dist/esm/cli/deploy.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +6 -3
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +6 -0
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/env.js +11 -6
  233. package/dist/esm/cli/env.js.map +2 -2
  234. package/dist/esm/cli/envDefault.js +7 -2
  235. package/dist/esm/cli/envDefault.js.map +2 -2
  236. package/dist/esm/cli/lib/api.js +2 -0
  237. package/dist/esm/cli/lib/api.js.map +2 -2
  238. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  239. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  240. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +37 -48
  241. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  242. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +63 -41
  243. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  244. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  245. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  246. package/dist/esm/cli/lib/codegen.js.map +2 -2
  247. package/dist/esm/cli/lib/command.js +2 -1
  248. package/dist/esm/cli/lib/command.js.map +2 -2
  249. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  250. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  251. package/dist/esm/cli/lib/components.js +55 -5
  252. package/dist/esm/cli/lib/components.js.map +2 -2
  253. package/dist/esm/cli/lib/config.js +55 -17
  254. package/dist/esm/cli/lib/config.js.map +2 -2
  255. package/dist/esm/cli/lib/deploy2.js +3 -1
  256. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  257. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +28 -2
  258. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  259. package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
  260. package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
  261. package/dist/esm/cli/lib/deployment.js +2 -2
  262. package/dist/esm/cli/lib/deployment.js.map +2 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js +35 -20
  264. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  265. package/dist/esm/cli/lib/dev.js +5 -0
  266. package/dist/esm/cli/lib/dev.js.map +2 -2
  267. package/dist/esm/cli/lib/envvars.js +35 -1
  268. package/dist/esm/cli/lib/envvars.js.map +2 -2
  269. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  270. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  271. package/dist/esm/cli/lib/fsUtils.js +1 -1
  272. package/dist/esm/cli/lib/fsUtils.js.map +2 -2
  273. package/dist/esm/cli/lib/generateDocs.js +1 -1
  274. package/dist/esm/cli/lib/generateDocs.js.map +1 -1
  275. package/dist/esm/cli/lib/indexes.js.map +1 -1
  276. package/dist/esm/cli/lib/login.js +36 -4
  277. package/dist/esm/cli/lib/login.js.map +2 -2
  278. package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
  279. package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
  280. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  281. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  282. package/dist/esm/cli/lib/profileManagement.js +179 -0
  283. package/dist/esm/cli/lib/profileManagement.js.map +7 -0
  284. package/dist/esm/cli/lib/profiles.js +288 -0
  285. package/dist/esm/cli/lib/profiles.js.map +7 -0
  286. package/dist/esm/cli/lib/run.js +4 -0
  287. package/dist/esm/cli/lib/run.js.map +2 -2
  288. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  289. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  290. package/dist/esm/cli/lib/usageLimits.js +4 -2
  291. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  293. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +63 -27
  295. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  296. package/dist/esm/cli/login.js +225 -112
  297. package/dist/esm/cli/login.js.map +3 -3
  298. package/dist/esm/cli/logout.js +110 -13
  299. package/dist/esm/cli/logout.js.map +2 -2
  300. package/dist/esm/cli/mcp.js +34 -10
  301. package/dist/esm/cli/mcp.js.map +2 -2
  302. package/dist/esm/cli/program.js +2 -1
  303. package/dist/esm/cli/program.js.map +2 -2
  304. package/dist/esm/cli/projectCreate.js +1 -1
  305. package/dist/esm/cli/projectCreate.js.map +1 -1
  306. package/dist/esm/index.js +1 -1
  307. package/dist/esm/index.js.map +1 -1
  308. package/dist/esm/server/impl/actions_impl.js +7 -3
  309. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  310. package/dist/esm/server/impl/storage_impl.js +29 -0
  311. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  312. package/dist/esm/server/index.js +4 -1
  313. package/dist/esm/server/index.js.map +2 -2
  314. package/dist/esm/server/schema.js +34 -12
  315. package/dist/esm/server/schema.js.map +2 -2
  316. package/dist/esm/values/validators.js +1 -1
  317. package/dist/esm/values/validators.js.map +2 -2
  318. package/dist/esm/values/value.js +6 -0
  319. package/dist/esm/values/value.js.map +2 -2
  320. package/dist/esm-types/bundler/context.d.ts +5 -0
  321. package/dist/esm-types/bundler/context.d.ts.map +1 -1
  322. package/dist/esm-types/bundler/fs.d.ts +7 -2
  323. package/dist/esm-types/bundler/fs.d.ts.map +1 -1
  324. package/dist/esm-types/bundler/index.d.ts +9 -2
  325. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  326. package/dist/esm-types/cli/account.d.ts +6 -0
  327. package/dist/esm-types/cli/account.d.ts.map +1 -0
  328. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  329. package/dist/esm-types/cli/configure.d.ts +6 -0
  330. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  331. package/dist/esm-types/cli/deploy.d.ts +2 -0
  332. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  333. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  334. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  335. package/dist/esm-types/cli/dev.d.ts +1 -0
  336. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  337. package/dist/esm-types/cli/env.d.ts.map +1 -1
  338. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  339. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  340. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  341. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  342. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  343. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  344. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  345. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  346. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  347. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  348. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  349. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  350. package/dist/esm-types/cli/lib/codegen.d.ts +0 -3
  351. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  352. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  353. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  354. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  355. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  356. package/dist/esm-types/cli/lib/components.d.ts +4 -0
  357. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  358. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  359. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  360. package/dist/esm-types/cli/lib/deploy2.d.ts +2 -0
  361. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  362. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  363. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
  365. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  366. package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
  367. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  368. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
  369. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  370. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  371. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  372. package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
  373. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  374. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  375. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  376. package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
  377. package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/login.d.ts +3 -1
  379. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  382. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  384. package/dist/esm-types/cli/lib/profileManagement.d.ts +10 -0
  385. package/dist/esm-types/cli/lib/profileManagement.d.ts.map +1 -0
  386. package/dist/esm-types/cli/lib/profiles.d.ts +59 -0
  387. package/dist/esm-types/cli/lib/profiles.d.ts.map +1 -0
  388. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  389. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  390. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  391. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  392. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  393. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  394. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  395. package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -2
  396. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  397. package/dist/esm-types/cli/login.d.ts +21 -0
  398. package/dist/esm-types/cli/login.d.ts.map +1 -1
  399. package/dist/esm-types/cli/logout.d.ts +8 -1
  400. package/dist/esm-types/cli/logout.d.ts.map +1 -1
  401. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  402. package/dist/esm-types/cli/program.d.ts.map +1 -1
  403. package/dist/esm-types/index.d.ts +1 -1
  404. package/dist/esm-types/index.d.ts.map +1 -1
  405. package/dist/esm-types/server/impl/actions_impl.d.ts +18 -3
  406. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  407. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  408. package/dist/esm-types/server/index.d.ts +1 -1
  409. package/dist/esm-types/server/index.d.ts.map +1 -1
  410. package/dist/esm-types/server/meta.d.ts +63 -0
  411. package/dist/esm-types/server/meta.d.ts.map +1 -1
  412. package/dist/esm-types/server/registration.d.ts +10 -0
  413. package/dist/esm-types/server/registration.d.ts.map +1 -1
  414. package/dist/esm-types/server/schema.d.ts +33 -0
  415. package/dist/esm-types/server/schema.d.ts.map +1 -1
  416. package/dist/esm-types/server/storage.d.ts.map +1 -1
  417. package/dist/esm-types/values/value.d.ts.map +1 -1
  418. package/dist/react.bundle.js +7 -1
  419. package/dist/react.bundle.js.map +2 -2
  420. package/package.json +5 -5
  421. package/schemas/convex.schema.json +5 -5
  422. package/src/bundler/context.ts +9 -5
  423. package/src/bundler/fs.ts +54 -5
  424. package/src/bundler/index.ts +9 -4
  425. package/src/cli/account.ts +320 -0
  426. package/src/cli/codegen.ts +0 -2
  427. package/src/cli/configure.ts +45 -9
  428. package/src/cli/deploy.ts +36 -5
  429. package/src/cli/deploymentSelect.ts +7 -4
  430. package/src/cli/dev.ts +9 -0
  431. package/src/cli/env.ts +12 -6
  432. package/src/cli/envDefault.ts +8 -2
  433. package/src/cli/generatedApi.ts +1 -1
  434. package/src/cli/lib/api.ts +5 -1
  435. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  436. package/src/cli/lib/checkForLargeIndexDeletion.ts +45 -58
  437. package/src/cli/lib/checkForSlowSchemaValidation.ts +76 -65
  438. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  439. package/src/cli/lib/codegen.ts +0 -3
  440. package/src/cli/lib/command.ts +3 -0
  441. package/src/cli/lib/components/definition/bundle.ts +68 -14
  442. package/src/cli/lib/components.ts +71 -4
  443. package/src/cli/lib/config.ts +85 -18
  444. package/src/cli/lib/deploy2.ts +10 -1
  445. package/src/cli/lib/deployApi/evaluateSchema.ts +35 -0
  446. package/src/cli/lib/deployKeyWarning.ts +43 -0
  447. package/src/cli/lib/deployment.ts +2 -2
  448. package/src/cli/lib/deploymentSelection.ts +37 -18
  449. package/src/cli/lib/dev.ts +14 -0
  450. package/src/cli/lib/envvars.ts +43 -1
  451. package/src/cli/lib/formatValidationProgress.ts +35 -0
  452. package/src/cli/lib/fsUtils.ts +5 -2
  453. package/src/cli/lib/generateDocs.ts +1 -1
  454. package/src/cli/lib/indexes.ts +1 -1
  455. package/src/cli/lib/login.ts +47 -3
  456. package/src/cli/lib/mcp/requestContext.ts +7 -1
  457. package/src/cli/lib/mcp/tools/env.ts +17 -3
  458. package/src/cli/lib/profileManagement.ts +262 -0
  459. package/src/cli/lib/profiles.ts +398 -0
  460. package/src/cli/lib/run.ts +2 -0
  461. package/src/cli/lib/schemaEvaluation.ts +88 -0
  462. package/src/cli/lib/usageLimits.ts +2 -0
  463. package/src/cli/lib/utils/mutex.ts +9 -27
  464. package/src/cli/lib/utils/utils.ts +83 -36
  465. package/src/cli/login.ts +293 -168
  466. package/src/cli/logout.ts +142 -17
  467. package/src/cli/mcp.ts +48 -11
  468. package/src/cli/program.ts +2 -0
  469. package/src/cli/projectCreate.ts +1 -1
  470. package/src/index.ts +1 -1
  471. package/src/server/impl/actions_impl.ts +26 -6
  472. package/src/server/impl/storage_impl.ts +30 -0
  473. package/src/server/index.ts +5 -1
  474. package/src/server/meta.ts +56 -2
  475. package/src/server/registration.ts +10 -0
  476. package/src/server/schema.ts +37 -15
  477. package/src/server/storage.ts +17 -0
  478. package/src/values/validators.ts +1 -1
  479. package/src/values/value.ts +9 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deploy2.ts"],
4
- "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n EvaluateSchemaResponse,\n evaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nexport async function evaluateSchema(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n // When set, a failed evaluation throws the raw error instead of crashing\n // the process, so best-effort callers (e.g. advisory checks) can recover.\n bestEffort?: boolean,\n): Promise<EvaluateSchemaResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_schema\",\n bestEffort,\n );\n return evaluateSchemaResponse.parse(response);\n}\n\n// Retries for best-effort requests, where a transient failure should be\n// ridden out if possible but the command proceeds without the result\n// otherwise.\nconst BEST_EFFORT_RETRIES = 5;\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint:\n | \"/api/deploy2/start_push\"\n | \"/api/deploy2/evaluate_push\"\n | \"/api/deploy2/evaluate_schema\",\n bestEffort?: boolean,\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n // Best-effort callers tolerate failure, so retry only plausibly\n // transient conditions \u2014 network errors and 5xx responses (e.g. table\n // summaries still bootstrapping) \u2014 and fail fast on everything else,\n // like a 404 from a deployment whose backend doesn't yet expose the\n // endpoint.\n ...(bestEffort\n ? {\n maxRetries: BEST_EFFORT_RETRIES,\n shouldRetry: (error: Error | null, response: Response | null) =>\n error !== null || (response !== null && response.status >= 500),\n }\n : {}),\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n if (bestEffort) {\n // The caller handles this itself instead of crashing the process.\n // eslint-disable-next-line no-restricted-syntax\n throw error;\n }\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\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: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n warnOnSlowSchemaValidation: true,\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
5
- "mappings": ";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EAGA;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,OACK;AAKP,SAAS,mBAAmB;AAC5B,SAAS,sBAAsC;AAE/C,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AAGjB,SAAS,eAAe;AACxB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kCAAkC;AAC3C,SAAS,6BAA6B;AACtC,SAAS,2CAA2C;AAEpD,MAAM,SAAS,UAAU,KAAK,cAAc;AAE5C,eAAe,eAAe,KAAc,MAA+B;AACzE,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,SAAS,MAAM,OAAO,MAAM;AAAA,IAChC,QAAQ;AAAA,MACN,CAAC,KAAK,UAAU,iBAAiB,GAAG,KAAK,UAAU;AAAA,MACnD,CAAC,KAAK,UAAU,oBAAoB,GAAG;AAAA,IACzC;AAAA,EACF,CAAC;AACD,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,WAAW,MAAM;AACvB;AAAA,IACE,eAAe,KAAK,SAAS,MAAM,QAAQ,CAAC,CAAC,WAAW,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,SAAU,OAAO,SAAS,KAAK,SAAU,KAAK,QAAQ,CAAC,CAAC,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EAC9K;AACA,SAAO;AACT;AAGA,sBAAsB,UACpB,KACA,MACA,SACA,SAK4B;AAC5B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,kBAAkB,MAAM,QAAQ;AACzC;AAEA,sBAAsB,aACpB,KACA,MACA,SACA,SAK+B;AAC/B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,qBAAqB,MAAM,QAAQ;AAC5C;AAEA,sBAAsB,eACpB,KACA,MACA,SACA,SAOA,YACiC;AACjC,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,uBAAuB,MAAM,QAAQ;AAC9C;AAKA,MAAM,sBAAsB;AAE5B,eAAe,SACb,KACA,MACA,SACA,SAKA,UAIA,YACkB;AAElB,QAAM,uBACJ,QAAQ,eAAe,uBAAuB,UAAU;AAC1D,QAAM,qBAAqB,QAAQ,eAAe,gBAAgB,UAAU;AAC5E,QAAM,iBAAiB;AAAA,IACrB,kBAAkB,QAAQ,kBAAkB;AAAA,IAC5C,kBAAkB,uBAAuB;AAAA,IACzC,cAAc,QAAQ,eAAe,WAAW;AAAA,IAChD,gBAAgB,QAAQ,sBAAsB,UAAU;AAAA,IACxD,iBAAiB,QAAQ,kBAAkB,SAAS;AAAA,IACpD,QAAQ,QAAQ;AAAA,EAClB;AACA,aAAW,yBAAyB,KAAK,UAAU,cAAc,CAAC,EAAE;AACpE,QAAM,UAAU,CAAC,QAAa;AAC5B,QAAI,IAAI,SAAS,MAAM,2BAA2B;AAChD,oBAAc,oBAAoB,QAAQ,GAAG,uBAAuB;AAAA,IACtE;AAAA,EACF;AACA,QAAM,QAAQ,gBAAgB,KAAK;AAAA,IACjC,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,GAAI,aACA;AAAA,MACE,YAAY;AAAA,MACZ,aAAa,CAAC,OAAqB,aACjC,UAAU,QAAS,aAAa,QAAQ,SAAS,UAAU;AAAA,IAC/D,IACA,CAAC;AAAA,EACP,CAAC;AACD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,MAAM,MAAM,eAAe,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,aAAa,KAAK,qBAAqB;AAAA,MACzC;AAAA,IACF,CAAC;AACD,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAgB;AACvB,QAAI,YAAY;AAGd,YAAM;AAAA,IACR;AACA,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA,oCAAoC,QAAQ;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,QACE,UAAU,QAAQ;AAAA,QAClB,eAAe,QAAQ;AAAA,QACvB,kBAAkB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAGA,MAAM,oBAAoB;AAE1B,sBAAsB,cACpB,KACA,MACAA,YACA,SAMA;AACA,QAAM,QAAQ,gBAAgB,KAAK;AAAA,IACjC,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,QAAM,QAAQ,KAAK,IAAI;AACvB,gBAAc,2CAA2C;AAEzD,SAAO,MAAM;AACX,QAAI;AACJ,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,gCAAgC;AAAA,QAC3D,MAAM,KAAK,UAAU;AAAA,UACnB,UAAU,QAAQ;AAAA,UAClB,cAAcA,WAAU;AAAA,UACxB,WAAW;AAAA,UACX,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,QACD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,aAAa,KAAK,qBAAqB;AAAA,QACzC;AAAA,MACF,CAAC;AACD,sBAAgB,aAAa,MAAM,MAAM,SAAS,KAAK,CAAC;AAAA,IAC1D,SAAS,OAAgB;AACvB,iBAAW,2CAA2C,QAAQ,GAAG;AACjE,aAAO,MAAM,uBAAuB,KAAK,KAAK;AAAA,IAChD;AACA,YAAQ,cAAc,MAAM;AAAA,MAC1B,KAAK,cAAc;AACjB,YAAI,aAAa;AACjB,YAAI,kBAAkB;AACtB,YAAI,eAAe;AACnB,mBAAW,mBAAmB,OAAO,OAAO,cAAc,UAAU,GAAG;AACrE,cAAI,CAAC,gBAAgB,0BAA0B;AAC7C,yBAAa;AAAA,UACf;AACA,6BAAmB,gBAAgB;AACnC,0BAAgB,gBAAgB;AAAA,QAClC;AACA,cAAM,cAAc,oBAAoB;AACxC,YAAI;AACJ,YAAI,CAAC,eAAe,CAAC,YAAY;AAC/B,gBAAM;AAAA,YACJ,wBAAwB,eAAe,IAAI,YAAY;AAAA,YACvD,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,CAAC,aAAa;AACvB,gBAAM,wBAAwB,eAAe,IAAI,YAAY;AAE7D,cAAI,KAAK,IAAI,IAAI,QAAQ,KAAQ;AAC/B,kBAAM,WAAWA,WAAU,aAAa,aAAa,EAAE;AACvD,kBAAM,aACJ,UAAU,cAAc,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAC1D;AACH,gBAAI,WAAW;AACb,oBAAM,QAAQ,UAAU,MAAM,GAAG,EAAE,CAAC;AACpC,oBAAM,eAAe;AAAA,gBACnB,QAAQ;AAAA,gBACR,eAAe,KAAK;AAAA,cACtB;AACA,oBAAM,qBAAqB,SAAS,KAAK,eAAe,IAAI,YAAY,+BAA+B,YAAY;AAAA,YACrH;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,sBAAc,GAAG;AACjB;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AAIb,YAAI,MAAM;AACV,YAAI,cAAc,eAAe;AAC/B,iBAAO,kBAAkB,cAAc,aAAa;AAAA,QACtD;AACA,eAAO;AACP,mBAAW,GAAG;AACd,iBAAS,YAAY,IAAI,GAAG,cAAc,KAAK,EAAE,CAAC;AAClD,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,YACT,iCAAiC,cAAc,YAC3C;AAAA,cACE,WAAW,cAAc;AAAA,cACzB,eAAe,cAAc;AAAA,YAC/B,IACA;AAAA,UACN;AAAA,UACA,gBAAgB;AAAA;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,KAAK,gBAAgB;AACnB,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,KAAK,YAAY;AACf,sBAAc,6BAA6B;AAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,sBAAsB,WACpB,KACA,MACAA,YACA,SASyB;AACzB,gBAAc,oBAAoB;AAClC,QAAM,QAAQ,gBAAgB,KAAK;AAAA,IACjC,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACD,QAAM,UAAU;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,WAAAA;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB;AACA,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,4BAA4B;AAAA,MACvD,MAAM,MAAM,eAAe,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,aAAa,KAAK,qBAAqB;AAAA,MACzC;AAAA,IACF,CAAC;AACD,WAAO,eAAe,MAAM,MAAM,SAAS,KAAK,CAAC;AAAA,EACnD,SAAS,OAAgB;AACvB,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA,qCAAqC,QAAQ;AAAA,MAC7C,QAAQ;AAAA,MACR;AAAA,QACE,UAAU,QAAQ;AAAA,QAClB,eAAe,QAAQ;AAAA,QACvB,kBAAkB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAWA,sBAAsB,oBACpB,KACA,UACA,KACA,UACA;AACA,QAAM,QAAQ,gBAAgB,KAAK;AAAA,IACjC,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AACD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,sCAAsC;AAAA,MACjE,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,MACD,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,SAAS,KAAK;AAAA,EACtB,SAAS,OAAgB;AACvB;AAAA,MACE,+CAA+C,MAAM,OAAO;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,sBAAsB,mBACpB,KACA,aAMA,SAmBA;AACA,QAAM,EAAE,KAAK,SAAS,IAAI;AAG1B,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,UAAM,EAAE,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACrD,UAAM,gBAAgB,MAAM,iBAAiB,KAAK,aAAa;AAE/D,QAAI,iBAAiB,YAAY,gBAAgB;AAG/C,YAAM,iBAAiB,YAAY;AACnC,UACE,mBAAmB,SACnB,mBAAmB,aACnB,mBAAmB,QACnB;AACA,cAAM;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,EAAE,eAAe,KAAK,SAAS;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,EAAE,GAAG,SAAS,KAAK,SAAS,CAAC;AAEnD,QAAM,cAA2B;AAAA,IAC/B,gBAAgB,YAAY;AAAA,IAC5B;AAAA,IACA,SAAS,CAAC,CAAC,QAAQ;AAAA,IACnB,QAAQ,CAAC,CAAC,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,qBAAqB,QAAQ;AAAA,IAC7B,OAAO,CAAC,CAAC,QAAQ;AAAA,IACjB,iBAAiB,QAAQ;AAAA,IACzB,eAAe;AAAA,IACf,SAAS,QAAQ,YAAY;AAAA,IAC7B;AAAA,IACA,kBAAkB,QAAQ;AAAA,IAC1B,sBAAsB,CAAC,CAAC,QAAQ;AAAA,IAChC,gBAAgB,CAAC,CAAC,QAAQ;AAAA,IAC1B,yBAAyB,QAAQ,4BAC7B,qBACA;AAAA,IACJ,4BAA4B;AAAA,IAC5B,SAAS,QAAQ;AAAA,EACnB;AACA,cAAY,gBAAgB,GAAG,MAAM,QAAQ,SAAS,eAAe,EAAE,EAAE;AACzE,QAAM,QAAQ,KAAK,WAAW;AAC9B;AAAA,IACE,GACE,QAAQ,SAAS,wBAAwB,UAC3C,wBAAwB,GAAG;AAAA,EAC7B;AACF;AAEA,sBAAsB,WACpB,KACA,SAOA;AACA,MAAI,QAAQ,QAAQ,QAAW;AAC7B;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,qBAAqB,GAAG;AACvD,QAAM,SAAS,QAAQ,oBAAoB,iBAAiB;AAC5D,QAAM,UAAU,iBAAiB;AACjC;AAAA,IACE,YAAY,QAAQ,GAAG,iCAAiC,MAAM,UAAU,OAAO,WAC7E,QAAQ,SAAS,eAAe,EAClC;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,aAAa;AAAA,MACjB,eAAe,QAAQ;AAAA,MACvB,UAAU,QAAQ;AAAA,IACpB;AACA,UAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB,IAAI,MAAM,6BAA6B,KAAK,UAAU;AAEtD,UAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAC7B,QAAI,MAAM,IAAI;AACd,QAAI,OAAO,IAAI;AACf,UAAM,SAAS,UAAU,QAAQ,KAAK;AAAA,MACpC;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AACD,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MAAM;AAAA,QACd,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,IAAI,QAAQ,GAAG;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AACA;AAAA,IACE,GAAG,QAAQ,SAAS,mBAAmB,KAAK,KAC1C,QAAQ,GACV,iCAAiC,MAAM,UAAU,OAAO;AAAA,EAC1D;AACF;AAEA,sBAAsB,6BACpB,KACA,SAC4D;AAC5D,QAAM,SAAS,sBAAsB,KAAK,OAAO;AACjD,QAAM,SAAS,MAAM,OAAO,IAAI,qBAAqB;AACrD,SAAO,OAAO;AAChB;",
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n EvaluateSchemaResponse,\n evaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nexport async function evaluateSchema(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n // When set, a failed evaluation throws the raw error instead of crashing\n // the process, so best-effort callers (e.g. advisory checks) can recover.\n bestEffort?: boolean,\n): Promise<EvaluateSchemaResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_schema\",\n bestEffort,\n );\n return evaluateSchemaResponse.parse(response);\n}\n\n// Retries for best-effort requests, where a transient failure should be\n// ridden out if possible but the command proceeds without the result\n// otherwise.\nconst BEST_EFFORT_RETRIES = 5;\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint:\n | \"/api/deploy2/start_push\"\n | \"/api/deploy2/evaluate_push\"\n | \"/api/deploy2/evaluate_schema\",\n bestEffort?: boolean,\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n // Best-effort callers tolerate failure, so retry only plausibly\n // transient conditions \u2014 network errors and 5xx responses (e.g. table\n // summaries still bootstrapping) \u2014 and fail fast on everything else,\n // like a 404 from a deployment whose backend doesn't yet expose the\n // endpoint.\n ...(bestEffort\n ? {\n maxRetries: BEST_EFFORT_RETRIES,\n shouldRetry: (error: Error | null, response: Response | null) =>\n error !== null || (response !== null && response.status >= 500),\n }\n : {}),\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n if (bestEffort) {\n // The caller handles this itself instead of crashing the process.\n // eslint-disable-next-line no-restricted-syntax\n throw error;\n }\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n skipLargeIndexesCheck: boolean;\n allowDeletingLargeIndexes: boolean;\n allowUnstagingSchema: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\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: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck:\n options.skipLargeIndexesCheck || options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n largeIndexBackfillCheck: options.skipLargeIndexesCheck\n ? \"has confirmation\"\n : \"ask for confirmation\",\n stagedValidatorDeletionCheck: options.allowUnstagingSchema\n ? \"has confirmation\"\n : \"ask for confirmation\",\n warnOnSlowSchemaValidation: true,\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["startPush"]
7
7
  }
@@ -6,6 +6,7 @@ import { looseObject } from "./utils.js";
6
6
  export const tableValidationOutcome = z.enum([
7
7
  "notValidated",
8
8
  "supersetOfEnforced",
9
+ "supersetOfStagedValidated",
9
10
  "supersetOfShape",
10
11
  "mustWalk"
11
12
  ]);
@@ -16,11 +17,22 @@ export const indexChangePrediction = z.enum([
16
17
  "disabled",
17
18
  "dropped"
18
19
  ]);
20
+ export const stagedValidatorState = z.union([
21
+ looseObject({
22
+ state: z.literal("pending"),
23
+ numDocsValidated: z.number(),
24
+ totalDocs: z.number().nullable().optional()
25
+ }),
26
+ looseObject({ state: z.literal("valid") }),
27
+ looseObject({ state: z.literal("failed"), error: z.string() })
28
+ ]);
19
29
  export const tablePrediction = looseObject({
20
30
  name: z.string(),
21
31
  outcome: tableValidationOutcome,
22
32
  numDocs: z.number(),
23
- sizeBytes: z.number()
33
+ sizeBytes: z.number(),
34
+ staged: stagedValidatorState.optional(),
35
+ canSkipAfterStagedValidation: z.boolean().optional()
24
36
  });
25
37
  export const indexPrediction = z.intersection(
26
38
  developerIndexConfig,
@@ -30,11 +42,25 @@ export const indexPrediction = z.intersection(
30
42
  numDocs: z.number()
31
43
  })
32
44
  );
45
+ export const discardedStagedValidator = looseObject({
46
+ tableName: z.string(),
47
+ state: z.union([
48
+ looseObject({
49
+ state: z.literal("pending"),
50
+ numDocsValidated: z.number(),
51
+ totalDocs: z.number().nullable().optional()
52
+ }),
53
+ looseObject({ state: z.literal("valid") })
54
+ ]),
55
+ replaced: z.boolean()
56
+ });
33
57
  export const componentSchemaPrediction = looseObject({
34
58
  definitionPath: z.string(),
35
59
  schemaValidation: z.boolean(),
36
60
  tables: z.array(tablePrediction),
37
- indexes: z.array(indexPrediction)
61
+ indexes: z.array(indexPrediction),
62
+ // Optional: responses from backends predating the field.
63
+ discardedStagedValidators: z.array(discardedStagedValidator).optional()
38
64
  });
39
65
  export const evaluateSchemaResponse = looseObject({
40
66
  componentSchemaEvaluations: z.record(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 \"supersetOfStagedValidated\",\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\n// Mirrors `StagedValidatorState` in\n// `crates/application/src/deploy_config.rs`.\nexport const stagedValidatorState = z.union([\n looseObject({\n state: z.literal(\"pending\"),\n numDocsValidated: z.number(),\n totalDocs: z.number().nullable().optional(),\n }),\n looseObject({ state: z.literal(\"valid\") }),\n looseObject({ state: z.literal(\"failed\"), error: z.string() }),\n]);\nexport type StagedValidatorState = z.infer<typeof stagedValidatorState>;\n\nexport const tablePrediction = looseObject({\n name: z.string(),\n outcome: tableValidationOutcome,\n numDocs: z.number(),\n sizeBytes: z.number(),\n staged: stagedValidatorState.optional(),\n canSkipAfterStagedValidation: z.boolean().optional(),\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\n// Mirrors `SerializedDiscardedStagedValidator` in\n// `crates/local_backend/src/deploy_config2.rs`. The backend never discards a\n// failed validator, since a redeploy retries it anyway.\nexport const discardedStagedValidator = looseObject({\n tableName: z.string(),\n state: z.union([\n looseObject({\n state: z.literal(\"pending\"),\n numDocsValidated: z.number(),\n totalDocs: z.number().nullable().optional(),\n }),\n looseObject({ state: z.literal(\"valid\") }),\n ]),\n replaced: z.boolean(),\n});\nexport type DiscardedStagedValidator = z.infer<typeof discardedStagedValidator>;\n\nexport const componentSchemaPrediction = looseObject({\n definitionPath: z.string(),\n schemaValidation: z.boolean(),\n tables: z.array(tablePrediction),\n indexes: z.array(indexPrediction),\n // Optional: responses from backends predating the field.\n discardedStagedValidators: z.array(discardedStagedValidator).optional(),\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;AAAA,EACA;AACF,CAAC;AAGM,aAAM,wBAAwB,EAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,aAAM,uBAAuB,EAAE,MAAM;AAAA,EAC1C,YAAY;AAAA,IACV,OAAO,EAAE,QAAQ,SAAS;AAAA,IAC1B,kBAAkB,EAAE,OAAO;AAAA,IAC3B,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,CAAC;AAAA,EACD,YAAY,EAAE,OAAO,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,OAAO,EAAE,QAAQ,QAAQ,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AAC/D,CAAC;AAGM,aAAM,kBAAkB,YAAY;AAAA,EACzC,MAAM,EAAE,OAAO;AAAA,EACf,SAAS;AAAA,EACT,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,OAAO;AAAA,EACpB,QAAQ,qBAAqB,SAAS;AAAA,EACtC,8BAA8B,EAAE,QAAQ,EAAE,SAAS;AACrD,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;AAMO,aAAM,2BAA2B,YAAY;AAAA,EAClD,WAAW,EAAE,OAAO;AAAA,EACpB,OAAO,EAAE,MAAM;AAAA,IACb,YAAY;AAAA,MACV,OAAO,EAAE,QAAQ,SAAS;AAAA,MAC1B,kBAAkB,EAAE,OAAO;AAAA,MAC3B,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC5C,CAAC;AAAA,IACD,YAAY,EAAE,OAAO,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EAC3C,CAAC;AAAA,EACD,UAAU,EAAE,QAAQ;AACtB,CAAC;AAGM,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;AAAA;AAAA,EAEhC,2BAA2B,EAAE,MAAM,wBAAwB,EAAE,SAAS;AACxE,CAAC;AAKM,aAAM,yBAAyB,YAAY;AAAA,EAChD,4BAA4B,EAAE;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACA,yBAAyB,EAAE,MAAM,uBAAuB;AAC1D,CAAC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ import { logWarning } from "../../bundler/log.js";
3
+ import {
4
+ deploymentNameFromAdminKey,
5
+ deploymentTypeFromAdminKey,
6
+ isDeploymentKey,
7
+ isPreviewDeployKey,
8
+ isProjectKey
9
+ } from "./deployment.js";
10
+ import { getDeployKeySource } from "./envvars.js";
11
+ import { IGNORED_DEPLOY_KEY, readDeployKeyFromEnv } from "./utils/utils.js";
12
+ const warnedContexts = /* @__PURE__ */ new WeakSet();
13
+ export function warnIfDeployKeyOverridesLogin(ctx, hasAccount) {
14
+ if (!hasAccount || warnedContexts.has(ctx) || process.env.CONVEX_OVERRIDE_ACCESS_TOKEN)
15
+ return;
16
+ const key = readDeployKeyFromEnv((name) => process.env[name]);
17
+ if (key === void 0 || key === IGNORED_DEPLOY_KEY || isPreviewDeployKey(key))
18
+ return;
19
+ const { envVarName, source } = getDeployKeySource(key);
20
+ const type = deploymentTypeFromAdminKey(key);
21
+ const target = isDeploymentKey(key) ? `${type === "prod" ? "production" : type} deployment "${deploymentNameFromAdminKey(key)}"` : isProjectKey(key) ? "the project selected by the key" : "the deployment selected by the key";
22
+ logWarning(
23
+ `WARNING: ${envVarName} in ${source} overrides your Convex account for deployment commands. They target ${target}. Remove ${envVarName} to use the selected account.`
24
+ );
25
+ warnedContexts.add(ctx);
26
+ }
27
+ //# sourceMappingURL=deployKeyWarning.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/lib/deployKeyWarning.ts"],
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport {\n deploymentNameFromAdminKey,\n deploymentTypeFromAdminKey,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n} from \"./deployment.js\";\nimport { getDeployKeySource } from \"./envvars.js\";\nimport { IGNORED_DEPLOY_KEY, readDeployKeyFromEnv } from \"./utils/utils.js\";\n\nconst warnedContexts = new WeakSet<Context>();\n\nexport function warnIfDeployKeyOverridesLogin(\n ctx: Context,\n hasAccount: boolean,\n) {\n if (\n !hasAccount ||\n warnedContexts.has(ctx) ||\n process.env.CONVEX_OVERRIDE_ACCESS_TOKEN\n )\n return;\n const key = readDeployKeyFromEnv((name) => process.env[name]);\n if (\n key === undefined ||\n key === IGNORED_DEPLOY_KEY ||\n isPreviewDeployKey(key)\n )\n return;\n const { envVarName, source } = getDeployKeySource(key);\n const type = deploymentTypeFromAdminKey(key);\n const target = isDeploymentKey(key)\n ? `${type === \"prod\" ? \"production\" : type} deployment \"${deploymentNameFromAdminKey(key)}\"`\n : isProjectKey(key)\n ? \"the project selected by the key\"\n : \"the deployment selected by the key\";\n logWarning(\n `WARNING: ${envVarName} in ${source} overrides your Convex account for deployment commands. They target ${target}. Remove ${envVarName} to use the selected account.`,\n );\n warnedContexts.add(ctx);\n}\n"],
5
+ "mappings": ";AACA,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,oBAAoB,4BAA4B;AAEzD,MAAM,iBAAiB,oBAAI,QAAiB;AAErC,gBAAS,8BACd,KACA,YACA;AACA,MACE,CAAC,cACD,eAAe,IAAI,GAAG,KACtB,QAAQ,IAAI;AAEZ;AACF,QAAM,MAAM,qBAAqB,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC;AAC5D,MACE,QAAQ,UACR,QAAQ,sBACR,mBAAmB,GAAG;AAEtB;AACF,QAAM,EAAE,YAAY,OAAO,IAAI,mBAAmB,GAAG;AACrD,QAAM,OAAO,2BAA2B,GAAG;AAC3C,QAAM,SAAS,gBAAgB,GAAG,IAC9B,GAAG,SAAS,SAAS,eAAe,IAAI,gBAAgB,2BAA2B,GAAG,CAAC,MACvF,aAAa,GAAG,IACd,oCACA;AACN;AAAA,IACE,YAAY,UAAU,OAAO,MAAM,uEAAuE,MAAM,YAAY,UAAU;AAAA,EACxI;AACA,iBAAe,IAAI,GAAG;AACxB;",
6
+ "names": []
7
+ }
@@ -61,7 +61,7 @@ export async function eraseDeploymentEnvVar(ctx) {
61
61
  ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);
62
62
  return true;
63
63
  }
64
- async function gitIgnoreEnvVarFile(ctx) {
64
+ export async function gitIgnoreEnvVarFile(ctx) {
65
65
  const gitIgnorePath = ".gitignore";
66
66
  const gitIgnoreContents = ctx.fs.exists(gitIgnorePath) ? ctx.fs.readUtf8File(gitIgnorePath) : "";
67
67
  const changedGitIgnore = changesToGitIgnore(gitIgnoreContents);
@@ -125,7 +125,7 @@ export async function deploymentNameFromAdminKeyOrCrash(ctx, adminKey) {
125
125
  }
126
126
  return deploymentName;
127
127
  }
128
- function deploymentNameFromAdminKey(adminKey) {
128
+ export function deploymentNameFromAdminKey(adminKey) {
129
129
  const parts = adminKey.split("|");
130
130
  if (parts.length === 1) {
131
131
  return null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deployment.ts"],
4
- "sourcesContent": ["import * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport { changedEnvVarFile, getEnvVarRegex } from \"./envvars.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n} from \"./utils/utils.js\";\nimport { DeploymentType } from \"./api.js\";\n\n// Given a deployment string like \"dev:tall-forest-1234\"\n// returns only the slug \"tall-forest-1234\".\n// If there's no prefix returns the original string.\nexport function stripDeploymentTypePrefix(deployment: string) {\n return deployment.split(\":\").at(-1)!;\n}\n\n// Handling legacy CONVEX_DEPLOYMENT without type prefix as well\nexport function getDeploymentTypeFromConfiguredDeployment(raw: string) {\n const typeRaw = raw.split(\":\")[0];\n const type =\n typeRaw === \"prod\" ||\n typeRaw === \"dev\" ||\n typeRaw === \"preview\" ||\n typeRaw === \"local\"\n ? typeRaw\n : null;\n return type;\n}\n\nexport function isAnonymousDeployment(deploymentName: string) {\n return deploymentName.startsWith(\"anonymous-\");\n}\n\nexport function removeAnonymousPrefix(deploymentName: string) {\n if (isAnonymousDeployment(deploymentName)) {\n return deploymentName.slice(\"anonymous-\".length);\n }\n return deploymentName;\n}\n\nexport async function writeDeploymentEnvVar(\n ctx: Context,\n deploymentType: DeploymentType,\n deployment: {\n team: string | null;\n project: string | null;\n deploymentName: string;\n },\n existingValue: string | null,\n): Promise<{ wroteToGitIgnore: boolean; changedDeploymentEnvVar: boolean }> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n const changedFile = changesToEnvVarFile(\n existingFile,\n deploymentType,\n deployment,\n );\n const deploymentEnvVarValue =\n deploymentType + \":\" + deployment.deploymentName;\n // The `existingValue` that reaches this function is at least sometimes is missing its prefix.\n // Until this is cleaned up consider either of these values not a change.\n // Otherwise we spam the init instructions (Welcome to Convex etc.) on every run of `npx convex dev`.\n const changedDeploymentEnvVar =\n !!changedFile &&\n existingValue !== deployment.deploymentName &&\n existingValue !== deploymentEnvVarValue;\n\n if (changedFile !== null) {\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n // Only do this if we're not reinitializing an existing setup\n return {\n wroteToGitIgnore: await gitIgnoreEnvVarFile(ctx),\n changedDeploymentEnvVar,\n };\n }\n return {\n wroteToGitIgnore: false,\n changedDeploymentEnvVar,\n };\n}\n\n// Only used in the internal --url flow\nexport async function eraseDeploymentEnvVar(ctx: Context): Promise<boolean> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n if (existingFile === null) {\n return false;\n }\n const config = dotenv.parse(existingFile);\n const existing = config[CONVEX_DEPLOYMENT_ENV_VAR_NAME];\n if (existing === undefined) {\n return false;\n }\n const changedFile = existingFile.replace(\n getEnvVarRegex(CONVEX_DEPLOYMENT_ENV_VAR_NAME),\n \"\",\n );\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n return true;\n}\n\nasync function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {\n const gitIgnorePath = \".gitignore\";\n const gitIgnoreContents = ctx.fs.exists(gitIgnorePath)\n ? ctx.fs.readUtf8File(gitIgnorePath)\n : \"\";\n const changedGitIgnore = changesToGitIgnore(gitIgnoreContents);\n if (changedGitIgnore !== null) {\n ctx.fs.writeUtf8File(gitIgnorePath, changedGitIgnore);\n return true;\n }\n return false;\n}\n\n// exported for tests\nexport function changesToEnvVarFile(\n existingFile: string | null,\n deploymentType: DeploymentType,\n {\n team,\n project,\n deploymentName,\n }: { team: string | null; project: string | null; deploymentName: string },\n): string | null {\n const deploymentValue = deploymentType + \":\" + deploymentName;\n const commentOnPreviousLine = \"# Deployment used by `npx convex dev`\";\n const commentAfterValue =\n team !== null && project !== null\n ? `team: ${team}, project: ${project}`\n : null;\n return changedEnvVarFile({\n existingFileContent: existingFile,\n envVarName: CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n envVarValue: deploymentValue,\n commentAfterValue,\n commentOnPreviousLine,\n });\n}\n\n// exported for tests\nexport function changesToGitIgnore(existingFile: string | null): string | null {\n if (existingFile === null) {\n return `${ENV_VAR_FILE_PATH}\\n`;\n }\n const gitIgnoreLines = existingFile.split(\"\\n\");\n const envVarFileIgnored = gitIgnoreLines.some((line) => {\n if (line.startsWith(\"#\")) return false;\n if (line.startsWith(\"!\")) return false;\n\n // .gitignore ignores trailing whitespace, and also we need to remove\n // the trailing `\\r` from Windows-style newline since we split on `\\n`.\n const trimmedLine = line.trimEnd();\n\n const envIgnorePatterns = [\n /^\\.env\\.local$/,\n /^\\.env\\.\\*$/,\n /^\\.env\\*$/,\n /^.*\\.local$/,\n /^\\.env\\*\\.local$/,\n ];\n\n return envIgnorePatterns.some((pattern) => pattern.test(trimmedLine));\n });\n if (!envVarFileIgnored) {\n return `${existingFile}\\n${ENV_VAR_FILE_PATH}\\n`;\n } else {\n return null;\n }\n}\n\nexport async function deploymentNameFromAdminKeyOrCrash(\n ctx: Context,\n adminKey: string,\n) {\n const deploymentName = deploymentNameFromAdminKey(adminKey);\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Please set ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} to a new key which you can find on your Convex dashboard.`,\n });\n }\n return deploymentName;\n}\n\nfunction deploymentNameFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return null;\n }\n if (isPreviewDeployKey(adminKey)) {\n // Preview deploy keys do not contain a deployment name.\n return null;\n }\n return stripDeploymentTypePrefix(parts[0]);\n}\n\n// Needed to differentiate a preview deploy key\n// from a concrete preview deployment's deploy key.\n// preview deploy key: `preview:team:project|key`\n// preview deployment's deploy key: `preview:deploymentName|key`\nexport function isPreviewDeployKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return false;\n }\n const [prefix] = parts;\n const prefixParts = prefix.split(\":\");\n return prefixParts[0] === \"preview\" && prefixParts.length === 3;\n}\n\nexport function isProjectKey(adminKey: string) {\n return /^project:.*\\|/.test(adminKey);\n}\n\n// \"dev deploy keys\" and \"prod deploy keys\" are deployment keys.\n// On the client these are also known as admin keys.\nexport function isDeploymentKey(adminKey: string) {\n return /^(dev|prod):.*\\|/.test(adminKey);\n}\n\n// For current keys returns prod|dev|preview,\n// for legacy keys returns \"prod\".\n// Examples:\n// \"prod:deploymentName|key\" -> \"prod\"\n// \"preview:deploymentName|key\" -> \"preview\"\n// \"dev:deploymentName|key\" -> \"dev\"\n// \"custom:deploymentName|key\" -> \"custom\"\n// \"key\" -> \"prod\"\nexport function deploymentTypeFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\":\");\n if (parts.length === 1) {\n return \"prod\";\n }\n return parts.at(0)! as DeploymentType;\n}\n\nexport async function getTeamAndProjectFromPreviewAdminKey(\n ctx: Context,\n adminKey: string,\n) {\n const parts = adminKey.split(\"|\")[0].split(\":\");\n if (parts.length !== 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Malformed preview CONVEX_DEPLOY_KEY, get a new key from Project Settings.\",\n });\n }\n const [_preview, teamSlug, projectSlug] = parts;\n return { teamSlug, projectSlug };\n}\n\nexport type CleanupDeploymentFunc = () => Promise<void>;\nexport type DeploymentDetails = {\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n reference: string | null;\n isDefault: boolean;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport { changedEnvVarFile, getEnvVarRegex } from \"./envvars.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n} from \"./utils/utils.js\";\nimport { DeploymentType } from \"./api.js\";\n\n// Given a deployment string like \"dev:tall-forest-1234\"\n// returns only the slug \"tall-forest-1234\".\n// If there's no prefix returns the original string.\nexport function stripDeploymentTypePrefix(deployment: string) {\n return deployment.split(\":\").at(-1)!;\n}\n\n// Handling legacy CONVEX_DEPLOYMENT without type prefix as well\nexport function getDeploymentTypeFromConfiguredDeployment(raw: string) {\n const typeRaw = raw.split(\":\")[0];\n const type =\n typeRaw === \"prod\" ||\n typeRaw === \"dev\" ||\n typeRaw === \"preview\" ||\n typeRaw === \"local\"\n ? typeRaw\n : null;\n return type;\n}\n\nexport function isAnonymousDeployment(deploymentName: string) {\n return deploymentName.startsWith(\"anonymous-\");\n}\n\nexport function removeAnonymousPrefix(deploymentName: string) {\n if (isAnonymousDeployment(deploymentName)) {\n return deploymentName.slice(\"anonymous-\".length);\n }\n return deploymentName;\n}\n\nexport async function writeDeploymentEnvVar(\n ctx: Context,\n deploymentType: DeploymentType,\n deployment: {\n team: string | null;\n project: string | null;\n deploymentName: string;\n },\n existingValue: string | null,\n): Promise<{ wroteToGitIgnore: boolean; changedDeploymentEnvVar: boolean }> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n const changedFile = changesToEnvVarFile(\n existingFile,\n deploymentType,\n deployment,\n );\n const deploymentEnvVarValue =\n deploymentType + \":\" + deployment.deploymentName;\n // The `existingValue` that reaches this function is at least sometimes is missing its prefix.\n // Until this is cleaned up consider either of these values not a change.\n // Otherwise we spam the init instructions (Welcome to Convex etc.) on every run of `npx convex dev`.\n const changedDeploymentEnvVar =\n !!changedFile &&\n existingValue !== deployment.deploymentName &&\n existingValue !== deploymentEnvVarValue;\n\n if (changedFile !== null) {\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n // Only do this if we're not reinitializing an existing setup\n return {\n wroteToGitIgnore: await gitIgnoreEnvVarFile(ctx),\n changedDeploymentEnvVar,\n };\n }\n return {\n wroteToGitIgnore: false,\n changedDeploymentEnvVar,\n };\n}\n\n// Only used in the internal --url flow\nexport async function eraseDeploymentEnvVar(ctx: Context): Promise<boolean> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n if (existingFile === null) {\n return false;\n }\n const config = dotenv.parse(existingFile);\n const existing = config[CONVEX_DEPLOYMENT_ENV_VAR_NAME];\n if (existing === undefined) {\n return false;\n }\n const changedFile = existingFile.replace(\n getEnvVarRegex(CONVEX_DEPLOYMENT_ENV_VAR_NAME),\n \"\",\n );\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n return true;\n}\n\nexport async function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {\n const gitIgnorePath = \".gitignore\";\n const gitIgnoreContents = ctx.fs.exists(gitIgnorePath)\n ? ctx.fs.readUtf8File(gitIgnorePath)\n : \"\";\n const changedGitIgnore = changesToGitIgnore(gitIgnoreContents);\n if (changedGitIgnore !== null) {\n ctx.fs.writeUtf8File(gitIgnorePath, changedGitIgnore);\n return true;\n }\n return false;\n}\n\n// exported for tests\nexport function changesToEnvVarFile(\n existingFile: string | null,\n deploymentType: DeploymentType,\n {\n team,\n project,\n deploymentName,\n }: { team: string | null; project: string | null; deploymentName: string },\n): string | null {\n const deploymentValue = deploymentType + \":\" + deploymentName;\n const commentOnPreviousLine = \"# Deployment used by `npx convex dev`\";\n const commentAfterValue =\n team !== null && project !== null\n ? `team: ${team}, project: ${project}`\n : null;\n return changedEnvVarFile({\n existingFileContent: existingFile,\n envVarName: CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n envVarValue: deploymentValue,\n commentAfterValue,\n commentOnPreviousLine,\n });\n}\n\n// exported for tests\nexport function changesToGitIgnore(existingFile: string | null): string | null {\n if (existingFile === null) {\n return `${ENV_VAR_FILE_PATH}\\n`;\n }\n const gitIgnoreLines = existingFile.split(\"\\n\");\n const envVarFileIgnored = gitIgnoreLines.some((line) => {\n if (line.startsWith(\"#\")) return false;\n if (line.startsWith(\"!\")) return false;\n\n // .gitignore ignores trailing whitespace, and also we need to remove\n // the trailing `\\r` from Windows-style newline since we split on `\\n`.\n const trimmedLine = line.trimEnd();\n\n const envIgnorePatterns = [\n /^\\.env\\.local$/,\n /^\\.env\\.\\*$/,\n /^\\.env\\*$/,\n /^.*\\.local$/,\n /^\\.env\\*\\.local$/,\n ];\n\n return envIgnorePatterns.some((pattern) => pattern.test(trimmedLine));\n });\n if (!envVarFileIgnored) {\n return `${existingFile}\\n${ENV_VAR_FILE_PATH}\\n`;\n } else {\n return null;\n }\n}\n\nexport async function deploymentNameFromAdminKeyOrCrash(\n ctx: Context,\n adminKey: string,\n) {\n const deploymentName = deploymentNameFromAdminKey(adminKey);\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Please set ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} to a new key which you can find on your Convex dashboard.`,\n });\n }\n return deploymentName;\n}\n\nexport function deploymentNameFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return null;\n }\n if (isPreviewDeployKey(adminKey)) {\n // Preview deploy keys do not contain a deployment name.\n return null;\n }\n return stripDeploymentTypePrefix(parts[0]);\n}\n\n// Needed to differentiate a preview deploy key\n// from a concrete preview deployment's deploy key.\n// preview deploy key: `preview:team:project|key`\n// preview deployment's deploy key: `preview:deploymentName|key`\nexport function isPreviewDeployKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return false;\n }\n const [prefix] = parts;\n const prefixParts = prefix.split(\":\");\n return prefixParts[0] === \"preview\" && prefixParts.length === 3;\n}\n\nexport function isProjectKey(adminKey: string) {\n return /^project:.*\\|/.test(adminKey);\n}\n\n// \"dev deploy keys\" and \"prod deploy keys\" are deployment keys.\n// On the client these are also known as admin keys.\nexport function isDeploymentKey(adminKey: string) {\n return /^(dev|prod):.*\\|/.test(adminKey);\n}\n\n// For current keys returns prod|dev|preview,\n// for legacy keys returns \"prod\".\n// Examples:\n// \"prod:deploymentName|key\" -> \"prod\"\n// \"preview:deploymentName|key\" -> \"preview\"\n// \"dev:deploymentName|key\" -> \"dev\"\n// \"custom:deploymentName|key\" -> \"custom\"\n// \"key\" -> \"prod\"\nexport function deploymentTypeFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\":\");\n if (parts.length === 1) {\n return \"prod\";\n }\n return parts.at(0)! as DeploymentType;\n}\n\nexport async function getTeamAndProjectFromPreviewAdminKey(\n ctx: Context,\n adminKey: string,\n) {\n const parts = adminKey.split(\"|\")[0].split(\":\");\n if (parts.length !== 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Malformed preview CONVEX_DEPLOY_KEY, get a new key from Project Settings.\",\n });\n }\n const [_preview, teamSlug, projectSlug] = parts;\n return { teamSlug, projectSlug };\n}\n\nexport type CleanupDeploymentFunc = () => Promise<void>;\nexport type DeploymentDetails = {\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n reference: string | null;\n isDefault: boolean;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -25,28 +25,36 @@ import {
25
25
  targetProjectForLocalSelector
26
26
  } from "./localDeployment/projectMismatch.js";
27
27
  import { chalkStderr } from "chalk";
28
- import { getBuildEnvironment } from "./envvars.js";
28
+ import {
29
+ getBuildEnvironment,
30
+ loadProjectEnvironmentVariables
31
+ } from "./envvars.js";
29
32
  import { readGlobalConfig } from "./utils/globalConfig.js";
33
+ import {
34
+ getProfileSelection,
35
+ readProfileAuth
36
+ } from "./profiles.js";
30
37
  import {
31
38
  CONVEX_DEPLOYMENT_ENV_VAR_NAME,
32
39
  CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
33
40
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
34
41
  CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,
35
42
  CONVEX_SELF_HOSTED_URL_VAR_NAME,
36
- ENV_VAR_FILE_PATH,
37
43
  bigBrainAPI,
38
44
  processDeployKeyValue,
39
45
  readDeployKeyFromEnv,
46
+ readDeployKeyEnvVar,
40
47
  typedPlatformClient
41
48
  } from "./utils/utils.js";
42
49
  import * as dotenv from "dotenv";
43
50
  export async function initializeBigBrainAuth(ctx, initialArgs) {
44
51
  if (initialArgs.url !== void 0 && initialArgs.adminKey !== void 0) {
45
52
  ctx._updateBigBrainAuth(
46
- getBigBrainAuth(ctx, {
53
+ await getBigBrainAuth(ctx, {
47
54
  previewDeployKey: null,
48
55
  projectKey: null,
49
- deploymentKey: null
56
+ deploymentKey: null,
57
+ skipProfile: true
50
58
  })
51
59
  );
52
60
  return;
@@ -64,29 +72,30 @@ export async function initializeBigBrainAuth(ctx, initialArgs) {
64
72
  const rawDeployKey2 = readDeployKeyFromEnv((name) => config[name]);
65
73
  const deployKey2 = await processDeployKeyValue(ctx, rawDeployKey2);
66
74
  if (deployKey2 !== void 0) {
67
- const bigBrainAuth = getBigBrainAuth(ctx, {
75
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
68
76
  previewDeployKey: isPreviewDeployKey(deployKey2) ? deployKey2 : null,
69
77
  projectKey: isProjectKey(deployKey2) ? deployKey2 : null,
70
- deploymentKey: isDeploymentKey(deployKey2) ? deployKey2 : null
78
+ deploymentKey: isDeploymentKey(deployKey2) ? deployKey2 : null,
79
+ envFile: initialArgs.envFile
71
80
  });
72
81
  ctx._updateBigBrainAuth(bigBrainAuth);
73
82
  return;
74
83
  }
75
84
  ctx._updateBigBrainAuth(
76
- getBigBrainAuth(ctx, {
85
+ await getBigBrainAuth(ctx, {
77
86
  previewDeployKey: null,
78
87
  projectKey: null,
79
- deploymentKey: null
88
+ deploymentKey: null,
89
+ envFile: initialArgs.envFile
80
90
  })
81
91
  );
82
92
  return;
83
93
  }
84
- dotenv.config({ path: ENV_VAR_FILE_PATH });
85
- dotenv.config();
94
+ loadProjectEnvironmentVariables();
86
95
  const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);
87
96
  const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
88
97
  if (deployKey !== void 0) {
89
- const bigBrainAuth = getBigBrainAuth(ctx, {
98
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
90
99
  previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,
91
100
  projectKey: isProjectKey(deployKey) ? deployKey : null,
92
101
  deploymentKey: isDeploymentKey(deployKey) ? deployKey : null
@@ -95,7 +104,7 @@ export async function initializeBigBrainAuth(ctx, initialArgs) {
95
104
  return;
96
105
  }
97
106
  ctx._updateBigBrainAuth(
98
- getBigBrainAuth(ctx, {
107
+ await getBigBrainAuth(ctx, {
99
108
  previewDeployKey: null,
100
109
  projectKey: null,
101
110
  deploymentKey: null
@@ -103,7 +112,7 @@ export async function initializeBigBrainAuth(ctx, initialArgs) {
103
112
  );
104
113
  return;
105
114
  }
106
- export async function updateBigBrainAuthAfterLogin(ctx, accessToken) {
115
+ export async function updateBigBrainAuthAfterLogin(ctx, accessToken, profile) {
107
116
  const existingAuth = ctx.bigBrainAuth();
108
117
  if (existingAuth !== null && existingAuth.kind === "projectKey") {
109
118
  logVerbose(
@@ -114,18 +123,20 @@ export async function updateBigBrainAuthAfterLogin(ctx, accessToken) {
114
123
  ctx._updateBigBrainAuth({
115
124
  accessToken,
116
125
  kind: "accessToken",
117
- header: `Bearer ${accessToken}`
126
+ header: `Bearer ${accessToken}`,
127
+ ...profile ? { profile } : {}
118
128
  });
119
129
  }
120
130
  export async function clearBigBrainAuth(ctx) {
121
131
  ctx._updateBigBrainAuth(null);
122
132
  }
123
- function getBigBrainAuth(ctx, opts) {
133
+ async function getBigBrainAuth(ctx, opts) {
124
134
  if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
125
135
  return {
126
136
  accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,
127
137
  kind: "accessToken",
128
- header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`
138
+ header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,
139
+ profile: null
129
140
  };
130
141
  }
131
142
  if (opts.projectKey !== null) {
@@ -142,12 +153,17 @@ function getBigBrainAuth(ctx, opts) {
142
153
  deploymentKey: opts.deploymentKey
143
154
  };
144
155
  }
156
+ const profile = opts.skipProfile ? null : await getProfileSelection(ctx, { envFile: opts.envFile });
157
+ if (profile !== null) {
158
+ return await readProfileAuth(ctx, profile);
159
+ }
145
160
  const globalConfig = readGlobalConfig(ctx);
146
161
  if (globalConfig) {
147
162
  return {
148
163
  kind: "accessToken",
149
164
  header: `Bearer ${globalConfig.accessToken}`,
150
- accessToken: globalConfig.accessToken
165
+ accessToken: globalConfig.accessToken,
166
+ profile: null
151
167
  };
152
168
  }
153
169
  if (opts.previewDeployKey !== null) {
@@ -187,7 +203,7 @@ export async function ensureAuthCanCreateDeployment(ctx) {
187
203
  )} and try again.`
188
204
  });
189
205
  }
190
- const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
206
+ const envVar = readDeployKeyEnvVar((name) => process.env[name])?.name ?? CONVEX_DEPLOY_KEY_ENV_VAR_NAME;
191
207
  return await ctx.crash({
192
208
  exitCode: 1,
193
209
  errorType: "fatal",
@@ -357,8 +373,7 @@ async function resolveBaseDeploymentSelection(ctx, cliArgs, selectionWithinProje
357
373
  }
358
374
  return result2.metadata;
359
375
  }
360
- dotenv.config({ path: ENV_VAR_FILE_PATH });
361
- dotenv.config();
376
+ loadProjectEnvironmentVariables();
362
377
  const result = await getDeploymentSelectionFromEnv(
363
378
  ctx,
364
379
  selectionWithinProject,