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/components.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n} from \"../../bundler/log.js\";\nimport {\n ProjectConfig,\n configFromProjectConfig,\n debugIsolateEndpointBundles,\n getFunctionsDirectoryPath,\n readProjectConfig,\n pullConfig,\n diffConfig,\n} from \"./config.js\";\nimport {\n finishPush,\n reportPushCompleted,\n startPush,\n waitForSchema,\n} from \"./deploy2.js\";\nimport { version } from \"../version.js\";\nimport { ensureHasConvexDependency, functionsDir } from \"./utils/utils.js\";\nimport {\n bundleDefinitions,\n bundleImplementations,\n componentGraph,\n} from \"./components/definition/bundle.js\";\nimport { isComponentDirectory } from \"./components/definition/directoryStructure.js\";\nimport {\n doFinalComponentCodegen,\n doInitialComponentCodegen,\n CodegenOptions,\n doInitConvexFolder,\n doCodegen,\n} from \"./codegen.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport { withTmpDir } from \"../../bundler/fs.js\";\nimport { handleDebugBundlePath } from \"./debugBundlePath.js\";\nimport { chalkStderr } from \"chalk\";\nimport { StartPushRequest, StartPushResponse } from \"./deployApi/startPush.js\";\nimport { DetailedDeploymentCredentials } from \"./api.js\";\nimport { FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { DEFINITION_FILENAME_TS } from \"./components/constants.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { formatIndex, LargeIndexDeletionCheck } from \"./indexes.js\";\nimport { checkForLargeIndexDeletion } from \"./checkForLargeIndexDeletion.js\";\nimport { checkForSlowSchemaValidation } from \"./checkForSlowSchemaValidation.js\";\nimport { LogManager } from \"./logs.js\";\nimport { createHash } from \"crypto\";\nimport { Bundle, BundleHash } from \"../../bundler/index.js\";\nimport { ModuleHashConfig } from \"./deployApi/modules.js\";\n\nexport type PushOptions = {\n adminKey: string;\n verbose: boolean;\n dryRun: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n debug: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n codegen: boolean;\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n writePushRequest?: string | undefined;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n logManager?: LogManager | undefined;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n // Whether a dry run should warn when the schema change would block the\n // deploy on a slow table walk. On for deploys; off for commands whose dry\n // runs never deploy (e.g. codegen).\n warnOnSlowSchemaValidation: boolean;\n message: string | null;\n};\n\nexport async function runCodegen(\n ctx: Context,\n credentials: DetailedDeploymentCredentials | null,\n options: CodegenOptions,\n) {\n // This also ensures the current directory is the project root.\n await ensureHasConvexDependency(ctx, \"codegen\");\n\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const functionsDirectoryPath = functionsDir(configPath, projectConfig);\n\n if (options.init) {\n await doInitConvexFolder(ctx, functionsDirectoryPath, {\n dryRun: options.dryRun,\n debug: options.debug,\n });\n }\n\n if (!options.systemUdfs) {\n if (credentials === null) {\n return;\n }\n\n await startComponentsPushAndCodegen(\n ctx,\n Span.noop(),\n projectConfig,\n configPath,\n {\n ...options,\n deploymentName: credentials.deploymentFields?.deploymentName ?? null,\n ...(credentials.deploymentFields?.deploymentType !== undefined\n ? { deploymentType: credentials.deploymentFields.deploymentType }\n : {}),\n url: credentials.url,\n adminKey: credentials.adminKey,\n generateCommonJSApi: options.commonjs,\n verbose: !!process.env.CONVEX_VERBOSE,\n codegen: true,\n liveComponentSources: options.liveComponentSources,\n typecheckComponents: false,\n debugNodeApis: options.debugNodeApis,\n },\n );\n } else {\n if (options.typecheck !== \"disable\") {\n logMessage(chalkStderr.gray(\"Running TypeScript typecheck\u2026\"));\n }\n\n await doCodegen(ctx, functionsDirectoryPath, options.typecheck, {\n dryRun: options.dryRun,\n debug: options.debug,\n generateCommonJSApi: options.commonjs,\n });\n }\n}\n\nexport async function runPush(ctx: Context, options: PushOptions) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n await runComponentsPush(ctx, options, configPath, projectConfig);\n}\n\nexport function hash(bundle: Bundle) {\n return createHash(\"sha256\")\n .update(bundle.source)\n .update(bundle.sourceMap || \"\")\n .digest(\"hex\");\n}\n\nfunction isModuleTheSame(newBundle: Bundle, oldBundleHash: BundleHash) {\n return (\n newBundle.environment === oldBundleHash.environment &&\n hash(newBundle) === oldBundleHash.hash\n );\n}\n\nexport function partitionModulesByChanges(\n functions: Bundle[],\n remoteHashesByPath: Map<string, BundleHash>,\n): {\n unchangedModuleHashes: ModuleHashConfig[];\n changedModules: Bundle[];\n} {\n // Partition modules based on whether they match the existing modules\n const unchangedModuleHashes = functions\n .filter((newBundle) => {\n const oldBundleHash = remoteHashesByPath.get(newBundle.path);\n return oldBundleHash && isModuleTheSame(newBundle, oldBundleHash);\n })\n .map((func) => ({\n path: func.path,\n environment: func.environment,\n sha256: hash(func),\n }));\n const changedModules = functions.filter((newBundle) => {\n const oldBundleHash = remoteHashesByPath.get(newBundle.path);\n return !oldBundleHash || !isModuleTheSame(newBundle, oldBundleHash);\n });\n return { unchangedModuleHashes, changedModules };\n}\n\nasync function getUnchangedModuleHashesFromServer(\n ctx: Context,\n appImplementation: { functions: Bundle[] },\n options: { url: string; adminKey: string },\n): Promise<{\n unchangedModuleHashes: ModuleHashConfig[];\n changedModules: Bundle[];\n}> {\n const remoteConfigWithModuleHashes = await pullConfig(\n ctx,\n undefined,\n undefined,\n options.url,\n options.adminKey,\n );\n const remoteHashesByPath = new Map(\n remoteConfigWithModuleHashes.moduleHashes.map((moduleHash) => [\n moduleHash.path,\n moduleHash,\n ]),\n );\n return partitionModulesByChanges(\n appImplementation.functions,\n remoteHashesByPath,\n );\n}\n\nasync function startComponentsPushAndCodegen(\n ctx: Context,\n parentSpan: Span,\n projectConfig: ProjectConfig,\n configPath: string,\n options: {\n typecheck: TypeCheckMode;\n typecheckComponents: boolean;\n adminKey: string;\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n verbose: boolean;\n debugBundlePath?: string | undefined;\n dryRun: boolean;\n generateCommonJSApi?: boolean;\n debug: boolean;\n writePushRequest?: string | undefined;\n codegen: boolean;\n liveComponentSources?: boolean;\n pushAllModules?: boolean;\n debugNodeApis: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n warnOnSlowSchemaValidation: boolean;\n codegenOnlyThisComponent?: string | undefined;\n },\n): Promise<StartPushResponse | null> {\n const convexDir = await getFunctionsDirectoryPath(ctx);\n\n // '.' means use the process current working directory, it's the default behavior.\n // Spelling it out here to be explicit for a future where this code can run\n // from other directories.\n // In esbuild the working directory is used to print error messages and resolving\n // relatives paths passed to it. It generally doesn't matter for resolving imports,\n // imports are resolved from the file where they are written.\n const absWorkingDir = path.resolve(\".\");\n const isComponent = isComponentDirectory(ctx, convexDir, true);\n if (isComponent.kind === \"err\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Invalid component root directory (${isComponent.why}): ${convexDir}`,\n });\n }\n\n let rootComponent = isComponent.component;\n if (options.codegenOnlyThisComponent) {\n const absolutePath = path.resolve(options.codegenOnlyThisComponent);\n let componentConfigPath: string;\n\n // Must be a directory containing a convex.config.ts\n componentConfigPath = path.join(absolutePath, DEFINITION_FILENAME_TS);\n if (!ctx.fs.exists(componentConfigPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Only directories with convex.config.ts files are supported, this directory does not: ${absolutePath}`,\n });\n }\n\n const syntheticConfigPath = path.join(\n rootComponent.path,\n DEFINITION_FILENAME_TS,\n );\n rootComponent = {\n isRoot: true,\n path: rootComponent.path,\n definitionPath: syntheticConfigPath,\n isRootWithoutConfig: false,\n syntheticComponentImport: componentConfigPath,\n };\n }\n\n changeSpinner(\"Finding component definitions...\");\n // Create a list of relevant component directories. These are just for knowing\n // while directories to bundle in bundleDefinitions and bundleImplementations.\n // This produces a bundle in memory as a side effect but it's thrown away.\n const { components, dependencyGraph } = await parentSpan.enterAsync(\n \"componentGraph\",\n () =>\n componentGraph(\n ctx,\n absWorkingDir,\n rootComponent,\n !!options.liveComponentSources,\n options.verbose,\n ),\n );\n\n // Initial codegen is everything we need to get code runnable:\n // root components and other components need a basic _generated/api.ts etc.\n // just to make the code bundleable and runnable so we can analyze.\n if (options.codegen) {\n changeSpinner(\"Generating server code...\");\n await parentSpan.enterAsync(\"doInitialComponentCodegen\", () =>\n withTmpDir(async (tmpDir) => {\n // Skip the root in component cases\n if (!rootComponent.syntheticComponentImport) {\n // Do root first so if a component fails, we'll at least have a working root.\n await doInitialComponentCodegen(ctx, tmpDir, rootComponent, options);\n }\n for (const directory of components.values()) {\n if (directory.isRoot) {\n continue;\n }\n // When --component-dir is used, only generate code for the target component\n if (\n rootComponent.syntheticComponentImport &&\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await doInitialComponentCodegen(ctx, tmpDir, directory, options);\n }\n }),\n );\n }\n\n changeSpinner(\"Bundling component definitions...\");\n // This bundles everything but the actual function definitions\n const {\n appDefinitionSpecWithoutImpls,\n componentDefinitionSpecsWithoutImpls,\n } = await parentSpan.enterAsync(\"bundleDefinitions\", () =>\n bundleDefinitions(\n ctx,\n absWorkingDir,\n dependencyGraph,\n rootComponent,\n // Note that this *includes* the root component.\n [...components.values()],\n !!options.liveComponentSources,\n options.verbose,\n ),\n );\n\n if (options.debugNodeApis) {\n await debugIsolateEndpointBundles(ctx, projectConfig, configPath);\n logFinishedStep(\n \"All non-'use node' entry points successfully bundled. Skipping rest of push.\",\n );\n return null;\n }\n\n changeSpinner(\"Bundling component schemas and implementations...\");\n const { appImplementation, componentImplementations } =\n await parentSpan.enterAsync(\"bundleImplementations\", () =>\n bundleImplementations({\n ctx,\n rootComponentDirectory: rootComponent,\n // When running codegen for a specific component, don't bundle the root.\n componentDirectories: [...components.values()].filter(\n (dir) => !dir.isRoot && !dir.syntheticComponentImport,\n ),\n nodeExternalPackages: projectConfig.node.externalPackages,\n extraConditions: options.liveComponentSources\n ? [\"@convex-dev/component-source\"]\n : [],\n verbose: options.verbose,\n includeSourcesContent:\n projectConfig.bundler?.includeSourcesContent ?? false,\n }),\n );\n if (options.debugBundlePath) {\n const { config: localConfig } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n options.verbose,\n );\n // TODO(ENG-6972): Actually write the bundles for components.\n await handleDebugBundlePath(ctx, options.debugBundlePath, localConfig);\n logMessage(\n `Wrote bundle and metadata for modules in the root to ${options.debugBundlePath}. Skipping rest of push.`,\n );\n return null;\n }\n\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n // TODO: This should be the version of the `convex` package used by each\n // component, and may be different for each component.\n const udfServerVersion = version;\n\n const { unchangedModuleHashes, changedModules } = options.pushAllModules\n ? {\n unchangedModuleHashes: [],\n changedModules: appImplementation.functions,\n }\n : await parentSpan.enterAsync(\"getUnchangedModuleHashesFromServer\", () =>\n getUnchangedModuleHashesFromServer(ctx, appImplementation, options),\n );\n\n const appDefinition: AppDefinitionConfig = {\n ...appDefinitionSpecWithoutImpls,\n schema: appImplementation.schema,\n changedModules,\n unchangedModuleHashes,\n udfServerVersion,\n };\n\n const componentDefinitions: ComponentDefinitionConfig[] = [];\n for (const componentDefinition of componentDefinitionSpecsWithoutImpls) {\n const impl = componentImplementations.filter(\n (impl) => impl.definitionPath === componentDefinition.definitionPath,\n )[0];\n if (!impl) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `missing! couldn't find ${componentDefinition.definitionPath} in ${componentImplementations.map((impl) => impl.definitionPath).toString()}`,\n });\n }\n componentDefinitions.push({\n ...componentDefinition,\n ...impl,\n udfServerVersion,\n });\n }\n const startPushRequest = {\n adminKey: options.adminKey,\n dryRun: options.dryRun,\n functions: projectConfig.functions,\n appDefinition,\n componentDefinitions,\n nodeDependencies: appImplementation.externalNodeDependencies,\n nodeVersion: projectConfig.node.nodeVersion,\n forCodegen: !!options.codegenOnlyThisComponent,\n };\n if (options.writePushRequest) {\n const pushRequestPath = path.resolve(options.writePushRequest);\n ctx.fs.writeUtf8File(\n `${pushRequestPath}.json`,\n JSON.stringify(startPushRequest),\n );\n return null;\n }\n logStartPushSizes(parentSpan, startPushRequest);\n\n if (options.largeIndexDeletionCheck !== \"no verification\") {\n await parentSpan.enterAsync(\"checkForLargeIndexDeletion\", (span) =>\n checkForLargeIndexDeletion({\n ctx,\n span,\n request: startPushRequest,\n options,\n askForConfirmation:\n options.largeIndexDeletionCheck === \"ask for confirmation\",\n }),\n );\n }\n\n if (options.dryRun && options.warnOnSlowSchemaValidation) {\n await parentSpan.enterAsync(\"checkForSlowSchemaValidation\", (span) =>\n checkForSlowSchemaValidation({\n ctx,\n span,\n request: startPushRequest,\n options,\n }),\n );\n }\n\n changeSpinner(\"Uploading functions to Convex...\");\n const startPushResponse = await parentSpan.enterAsync(\"startPush\", (span) =>\n startPush(ctx, span, startPushRequest, options),\n );\n\n if (options.verbose) {\n logMessage(\"startPush: \" + JSON.stringify(startPushResponse, null, 2));\n }\n\n if (options.codegen) {\n changeSpinner(\"Generating TypeScript bindings...\");\n await parentSpan.enterAsync(\"doFinalComponentCodegen\", () =>\n withTmpDir(async (tmpDir) => {\n // TODO generating code for the root component last might be better DX\n // When running codegen for a specific component, don't generate types for the root\n if (!rootComponent.syntheticComponentImport) {\n // Do the root first\n await doFinalComponentCodegen(\n ctx,\n tmpDir,\n rootComponent,\n rootComponent,\n startPushResponse,\n components,\n options,\n );\n }\n for (const directory of components.values()) {\n if (directory.isRoot) {\n continue;\n }\n // When --component-dir is used, only generate code for the target component\n if (\n rootComponent.syntheticComponentImport &&\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await doFinalComponentCodegen(\n ctx,\n tmpDir,\n rootComponent,\n directory,\n startPushResponse,\n components,\n options,\n );\n }\n }),\n );\n }\n\n changeSpinner(\"Running TypeScript...\");\n await parentSpan.enterAsync(\"typeCheckFunctionsInMode\", async () => {\n // When running codegen for a specific component, don't typecheck the root\n if (!rootComponent.syntheticComponentImport) {\n await typeCheckFunctionsInMode(\n ctx,\n options.typecheck,\n rootComponent.path,\n );\n }\n if (options.typecheckComponents) {\n for (const directory of components.values()) {\n if (!directory.isRoot) {\n await typeCheckFunctionsInMode(\n ctx,\n options.typecheck,\n directory.path,\n );\n }\n }\n } else if (rootComponent.syntheticComponentImport) {\n // When running codegen for a specific component, only typecheck that component.\n for (const directory of components.values()) {\n if (\n directory.isRoot ||\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await typeCheckFunctionsInMode(ctx, options.typecheck, directory.path);\n }\n }\n });\n\n return startPushResponse;\n}\n\nfunction logStartPushSizes(span: Span, startPushRequest: StartPushRequest) {\n let v8Size = 0;\n let v8Count = 0;\n let nodeSize = 0;\n let nodeCount = 0;\n\n for (const componentDefinition of startPushRequest.componentDefinitions) {\n for (const module of componentDefinition.functions) {\n if (module.environment === \"isolate\") {\n v8Size += module.source.length + (module.sourceMap ?? \"\").length;\n v8Count += 1;\n } else if (module.environment === \"node\") {\n nodeSize += module.source.length + (module.sourceMap ?? \"\").length;\n nodeCount += 1;\n }\n }\n }\n span.setProperty(\"v8_size\", v8Size.toString());\n span.setProperty(\"v8_count\", v8Count.toString());\n span.setProperty(\"node_size\", nodeSize.toString());\n span.setProperty(\"node_count\", nodeCount.toString());\n}\n\nexport async function runComponentsPush(\n ctx: Context,\n options: PushOptions,\n configPath: string,\n projectConfig: ProjectConfig,\n) {\n const reporter = new Reporter();\n const pushSpan = Span.root(reporter, \"runComponentsPush\");\n pushSpan.setProperty(\"cli_version\", version);\n const verbose = options.verbose || options.dryRun;\n\n await ensureHasConvexDependency(ctx, \"push\");\n\n const startPushResponse = await pushSpan.enterAsync(\n \"startComponentsPushAndCodegen\",\n (span) =>\n startComponentsPushAndCodegen(\n ctx,\n span,\n projectConfig,\n configPath,\n options,\n ),\n );\n if (!startPushResponse) {\n return;\n }\n\n await pushSpan.enterAsync(\"waitForSchema\", (span) =>\n waitForSchema(ctx, span, startPushResponse, options),\n );\n\n if (verbose) {\n const remoteConfigWithModuleHashes = await pullConfig(\n ctx,\n undefined,\n undefined,\n options.url,\n options.adminKey,\n );\n\n const { config: localConfig } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n options.verbose,\n );\n\n changeSpinner(\"Diffing local code and deployment state...\");\n const { diffString } = diffConfig(\n remoteConfigWithModuleHashes,\n localConfig,\n );\n\n logFinishedStep(\n `Remote config ${\n options.dryRun ? \"would\" : \"will\"\n } be overwritten with the following changes:\\n ` +\n diffString.replace(/\\n/g, \"\\n \"),\n );\n }\n\n const finishPushResponse = await pushSpan.enterAsync(\"finishPush\", (span) =>\n finishPush(ctx, span, startPushResponse, options),\n );\n printDiff(startPushResponse, finishPushResponse, options);\n pushSpan.end();\n\n // Asynchronously report that the push completed.\n if (!options.dryRun) {\n void reportPushCompleted(ctx, options.adminKey, options.url, reporter);\n }\n}\n\nfunction printDiff(\n startPushResponse: StartPushResponse,\n finishPushResponse: FinishPushDiff,\n opts: { verbose: boolean; dryRun: boolean; deploymentName: string | null },\n) {\n if (opts.verbose) {\n const diffString = JSON.stringify(finishPushResponse, null, 2);\n logMessage(diffString);\n return;\n }\n const indexDiffs = startPushResponse.schemaChange.indexDiffs;\n const { componentDiffs } = finishPushResponse;\n\n // Print out index diffs for the root component.\n let rootDiff = indexDiffs?.[\"\"] || componentDiffs[\"\"]?.indexDiff;\n if (rootDiff) {\n if (rootDiff.removed_indexes.length > 0) {\n let msg = `${opts.dryRun ? \"Would delete\" : \"Deleted\"} table indexes:\\n`;\n for (const index of rootDiff.removed_indexes) {\n msg += ` [-] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n const addedEnabled = rootDiff.added_indexes.filter((i) => !i.staged);\n if (addedEnabled.length > 0) {\n let msg = `${opts.dryRun ? \"Would add\" : \"Added\"} table indexes:\\n`;\n for (const index of addedEnabled) {\n msg += ` [+] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n const addedStaged = rootDiff.added_indexes.filter((i) => i.staged);\n if (addedStaged.length > 0) {\n let msg = `${opts.dryRun ? \"Would add\" : \"Added\"} staged table indexes:\\n`;\n for (const index of addedStaged) {\n const table = index.name.split(\".\")[0];\n const progressLink = deploymentDashboardUrlPage(\n opts.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg += ` [+] ${formatIndex(index)}\\n`;\n msg += ` See progress: ${progressLink}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n if (rootDiff.enabled_indexes && rootDiff.enabled_indexes.length > 0) {\n let msg = opts.dryRun\n ? `These indexes would be enabled:\\n`\n : `These indexes are now enabled:\\n`;\n for (const index of rootDiff.enabled_indexes) {\n msg += ` [*] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n if (rootDiff.disabled_indexes && rootDiff.disabled_indexes.length > 0) {\n let msg = opts.dryRun\n ? `These indexes would be staged:\\n`\n : `These indexes are now staged:\\n`;\n for (const index of rootDiff.disabled_indexes) {\n msg += ` [*] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n }\n\n // Only show component level diffs for other components.\n for (const [componentPath, componentDiff] of Object.entries(componentDiffs)) {\n if (componentPath === \"\") {\n continue;\n }\n if (componentDiff.diffType.type === \"create\") {\n logFinishedStep(`Installed component ${componentPath}.`);\n }\n if (componentDiff.diffType.type === \"unmount\") {\n logFinishedStep(`Unmounted component ${componentPath}.`);\n }\n if (componentDiff.diffType.type === \"remount\") {\n logFinishedStep(`Remounted component ${componentPath}.`);\n }\n }\n}\n"],
5
- "mappings": ";AAAA,OAAO,UAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,2BAA2B,oBAAoB;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAKP,SAAS,gCAA+C;AACxD,SAAS,kBAAkB;AAC3B,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAI5B,SAAS,UAAU,YAAY;AAC/B,SAAS,8BAA8B;AAEvC,SAAS,kCAAkC;AAC3C,SAAS,mBAA4C;AACrD,SAAS,kCAAkC;AAC3C,SAAS,oCAAoC;AAE7C,SAAS,kBAAkB;AA6B3B,sBAAsB,WACpB,KACA,aACA,SACA;AAEA,QAAM,0BAA0B,KAAK,SAAS;AAE9C,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,QAAM,yBAAyB,aAAa,YAAY,aAAa;AAErE,MAAI,QAAQ,MAAM;AAChB,UAAM,mBAAmB,KAAK,wBAAwB;AAAA,MACpD,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,YAAY;AACvB,QAAI,gBAAgB,MAAM;AACxB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,gBAAgB,YAAY,kBAAkB,kBAAkB;AAAA,QAChE,GAAI,YAAY,kBAAkB,mBAAmB,SACjD,EAAE,gBAAgB,YAAY,iBAAiB,eAAe,IAC9D,CAAC;AAAA,QACL,KAAK,YAAY;AAAA,QACjB,UAAU,YAAY;AAAA,QACtB,qBAAqB,QAAQ;AAAA,QAC7B,SAAS,CAAC,CAAC,QAAQ,IAAI;AAAA,QACvB,SAAS;AAAA,QACT,sBAAsB,QAAQ;AAAA,QAC9B,qBAAqB;AAAA,QACrB,eAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,QAAQ,cAAc,WAAW;AACnC,iBAAW,YAAY,KAAK,oCAA+B,CAAC;AAAA,IAC9D;AAEA,UAAM,UAAU,KAAK,wBAAwB,QAAQ,WAAW;AAAA,MAC9D,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,qBAAqB,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEA,sBAAsB,QAAQ,KAAc,SAAsB;AAChE,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,QAAM,kBAAkB,KAAK,SAAS,YAAY,aAAa;AACjE;AAEO,gBAAS,KAAK,QAAgB;AACnC,SAAO,WAAW,QAAQ,EACvB,OAAO,OAAO,MAAM,EACpB,OAAO,OAAO,aAAa,EAAE,EAC7B,OAAO,KAAK;AACjB;AAEA,SAAS,gBAAgB,WAAmB,eAA2B;AACrE,SACE,UAAU,gBAAgB,cAAc,eACxC,KAAK,SAAS,MAAM,cAAc;AAEtC;AAEO,gBAAS,0BACd,WACA,oBAIA;AAEA,QAAM,wBAAwB,UAC3B,OAAO,CAAC,cAAc;AACrB,UAAM,gBAAgB,mBAAmB,IAAI,UAAU,IAAI;AAC3D,WAAO,iBAAiB,gBAAgB,WAAW,aAAa;AAAA,EAClE,CAAC,EACA,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK,IAAI;AAAA,EACnB,EAAE;AACJ,QAAM,iBAAiB,UAAU,OAAO,CAAC,cAAc;AACrD,UAAM,gBAAgB,mBAAmB,IAAI,UAAU,IAAI;AAC3D,WAAO,CAAC,iBAAiB,CAAC,gBAAgB,WAAW,aAAa;AAAA,EACpE,CAAC;AACD,SAAO,EAAE,uBAAuB,eAAe;AACjD;AAEA,eAAe,mCACb,KACA,mBACA,SAIC;AACD,QAAM,+BAA+B,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,qBAAqB,IAAI;AAAA,IAC7B,6BAA6B,aAAa,IAAI,CAAC,eAAe;AAAA,MAC5D,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAe,8BACb,KACA,YACA,eACA,YACA,SAqBmC;AACnC,QAAM,YAAY,MAAM,0BAA0B,GAAG;AAQrD,QAAM,gBAAgB,KAAK,QAAQ,GAAG;AACtC,QAAM,cAAc,qBAAqB,KAAK,WAAW,IAAI;AAC7D,MAAI,YAAY,SAAS,OAAO;AAC9B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,qCAAqC,YAAY,GAAG,MAAM,SAAS;AAAA,IACrF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,YAAY;AAChC,MAAI,QAAQ,0BAA0B;AACpC,UAAM,eAAe,KAAK,QAAQ,QAAQ,wBAAwB;AAClE,QAAI;AAGJ,0BAAsB,KAAK,KAAK,cAAc,sBAAsB;AACpE,QAAI,CAAC,IAAI,GAAG,OAAO,mBAAmB,GAAG;AACvC,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,wFAAwF,YAAY;AAAA,MACtH,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd;AAAA,IACF;AACA,oBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,cAAc;AAAA,MACpB,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,IAC5B;AAAA,EACF;AAEA,gBAAc,kCAAkC;AAIhD,QAAM,EAAE,YAAY,gBAAgB,IAAI,MAAM,WAAW;AAAA,IACvD;AAAA,IACA,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,CAAC,QAAQ;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACJ;AAKA,MAAI,QAAQ,SAAS;AACnB,kBAAc,2BAA2B;AACzC,UAAM,WAAW;AAAA,MAAW;AAAA,MAA6B,MACvD,WAAW,OAAO,WAAW;AAE3B,YAAI,CAAC,cAAc,0BAA0B;AAE3C,gBAAM,0BAA0B,KAAK,QAAQ,eAAe,OAAO;AAAA,QACrE;AACA,mBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,cAAI,UAAU,QAAQ;AACpB;AAAA,UACF;AAEA,cACE,cAAc,4BACd,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,UACF;AACA,gBAAM,0BAA0B,KAAK,QAAQ,WAAW,OAAO;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,mCAAmC;AAEjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI,MAAM,WAAW;AAAA,IAAW;AAAA,IAAqB,MACnD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,MACvB,CAAC,CAAC,QAAQ;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe;AACzB,UAAM,4BAA4B,KAAK,eAAe,UAAU;AAChE;AAAA,MACE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,gBAAc,mDAAmD;AACjE,QAAM,EAAE,mBAAmB,yBAAyB,IAClD,MAAM,WAAW;AAAA,IAAW;AAAA,IAAyB,MACnD,sBAAsB;AAAA,MACpB;AAAA,MACA,wBAAwB;AAAA;AAAA,MAExB,sBAAsB,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,QAC7C,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,MAC/B;AAAA,MACA,sBAAsB,cAAc,KAAK;AAAA,MACzC,iBAAiB,QAAQ,uBACrB,CAAC,8BAA8B,IAC/B,CAAC;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,uBACE,cAAc,SAAS,yBAAyB;AAAA,IACpD,CAAC;AAAA,EACH;AACF,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,UAAM,sBAAsB,KAAK,QAAQ,iBAAiB,WAAW;AACrE;AAAA,MACE,wDAAwD,QAAQ,eAAe;AAAA,IACjF;AACA,WAAO;AAAA,EACT;AAOA,QAAM,mBAAmB;AAEzB,QAAM,EAAE,uBAAuB,eAAe,IAAI,QAAQ,iBACtD;AAAA,IACE,uBAAuB,CAAC;AAAA,IACxB,gBAAgB,kBAAkB;AAAA,EACpC,IACA,MAAM,WAAW;AAAA,IAAW;AAAA,IAAsC,MAChE,mCAAmC,KAAK,mBAAmB,OAAO;AAAA,EACpE;AAEJ,QAAM,gBAAqC;AAAA,IACzC,GAAG;AAAA,IACH,QAAQ,kBAAkB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,uBAAoD,CAAC;AAC3D,aAAW,uBAAuB,sCAAsC;AACtE,UAAM,OAAO,yBAAyB;AAAA,MACpC,CAACA,UAASA,MAAK,mBAAmB,oBAAoB;AAAA,IACxD,EAAE,CAAC;AACH,QAAI,CAAC,MAAM;AACT,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,0BAA0B,oBAAoB,cAAc,OAAO,yBAAyB,IAAI,CAACA,UAASA,MAAK,cAAc,EAAE,SAAS,CAAC;AAAA,MAC3J,CAAC;AAAA,IACH;AACA,yBAAqB,KAAK;AAAA,MACxB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,mBAAmB;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,WAAW,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,IACA,kBAAkB,kBAAkB;AAAA,IACpC,aAAa,cAAc,KAAK;AAAA,IAChC,YAAY,CAAC,CAAC,QAAQ;AAAA,EACxB;AACA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,kBAAkB,KAAK,QAAQ,QAAQ,gBAAgB;AAC7D,QAAI,GAAG;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,KAAK,UAAU,gBAAgB;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AACA,oBAAkB,YAAY,gBAAgB;AAE9C,MAAI,QAAQ,4BAA4B,mBAAmB;AACzD,UAAM,WAAW;AAAA,MAAW;AAAA,MAA8B,CAAC,SACzD,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,oBACE,QAAQ,4BAA4B;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,QAAQ,4BAA4B;AACxD,UAAM,WAAW;AAAA,MAAW;AAAA,MAAgC,CAAC,SAC3D,6BAA6B;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,kCAAkC;AAChD,QAAM,oBAAoB,MAAM,WAAW;AAAA,IAAW;AAAA,IAAa,CAAC,SAClE,UAAU,KAAK,MAAM,kBAAkB,OAAO;AAAA,EAChD;AAEA,MAAI,QAAQ,SAAS;AACnB,eAAW,gBAAgB,KAAK,UAAU,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACvE;AAEA,MAAI,QAAQ,SAAS;AACnB,kBAAc,mCAAmC;AACjD,UAAM,WAAW;AAAA,MAAW;AAAA,MAA2B,MACrD,WAAW,OAAO,WAAW;AAG3B,YAAI,CAAC,cAAc,0BAA0B;AAE3C,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,mBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,cAAI,UAAU,QAAQ;AACpB;AAAA,UACF;AAEA,cACE,cAAc,4BACd,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,UACF;AACA,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,uBAAuB;AACrC,QAAM,WAAW,WAAW,4BAA4B,YAAY;AAElE,QAAI,CAAC,cAAc,0BAA0B;AAC3C,YAAM;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF;AACA,QAAI,QAAQ,qBAAqB;AAC/B,iBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,YAAI,CAAC,UAAU,QAAQ;AACrB,gBAAM;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,cAAc,0BAA0B;AAEjD,iBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,YACE,UAAU,UACV,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,QACF;AACA,cAAM,yBAAyB,KAAK,QAAQ,WAAW,UAAU,IAAI;AAAA,MACvE;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAY,kBAAoC;AACzE,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,aAAW,uBAAuB,iBAAiB,sBAAsB;AACvE,eAAW,UAAU,oBAAoB,WAAW;AAClD,UAAI,OAAO,gBAAgB,WAAW;AACpC,kBAAU,OAAO,OAAO,UAAU,OAAO,aAAa,IAAI;AAC1D,mBAAW;AAAA,MACb,WAAW,OAAO,gBAAgB,QAAQ;AACxC,oBAAY,OAAO,OAAO,UAAU,OAAO,aAAa,IAAI;AAC5D,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,OAAK,YAAY,WAAW,OAAO,SAAS,CAAC;AAC7C,OAAK,YAAY,YAAY,QAAQ,SAAS,CAAC;AAC/C,OAAK,YAAY,aAAa,SAAS,SAAS,CAAC;AACjD,OAAK,YAAY,cAAc,UAAU,SAAS,CAAC;AACrD;AAEA,sBAAsB,kBACpB,KACA,SACA,YACA,eACA;AACA,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,WAAW,KAAK,KAAK,UAAU,mBAAmB;AACxD,WAAS,YAAY,eAAe,OAAO;AAC3C,QAAM,UAAU,QAAQ,WAAW,QAAQ;AAE3C,QAAM,0BAA0B,KAAK,MAAM;AAE3C,QAAM,oBAAoB,MAAM,SAAS;AAAA,IACvC;AAAA,IACA,CAAC,SACC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACA,MAAI,CAAC,mBAAmB;AACtB;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IAAW;AAAA,IAAiB,CAAC,SAC1C,cAAc,KAAK,MAAM,mBAAmB,OAAO;AAAA,EACrD;AAEA,MAAI,SAAS;AACX,UAAM,+BAA+B,MAAM;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,kBAAc,4CAA4C;AAC1D,UAAM,EAAE,WAAW,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAEA;AAAA,MACE,iBACE,QAAQ,SAAS,UAAU,MAC7B;AAAA,MACE,WAAW,QAAQ,OAAO,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM,SAAS;AAAA,IAAW;AAAA,IAAc,CAAC,SAClE,WAAW,KAAK,MAAM,mBAAmB,OAAO;AAAA,EAClD;AACA,YAAU,mBAAmB,oBAAoB,OAAO;AACxD,WAAS,IAAI;AAGb,MAAI,CAAC,QAAQ,QAAQ;AACnB,SAAK,oBAAoB,KAAK,QAAQ,UAAU,QAAQ,KAAK,QAAQ;AAAA,EACvE;AACF;AAEA,SAAS,UACP,mBACA,oBACA,MACA;AACA,MAAI,KAAK,SAAS;AAChB,UAAM,aAAa,KAAK,UAAU,oBAAoB,MAAM,CAAC;AAC7D,eAAW,UAAU;AACrB;AAAA,EACF;AACA,QAAM,aAAa,kBAAkB,aAAa;AAClD,QAAM,EAAE,eAAe,IAAI;AAG3B,MAAI,WAAW,aAAa,EAAE,KAAK,eAAe,EAAE,GAAG;AACvD,MAAI,UAAU;AACZ,QAAI,SAAS,gBAAgB,SAAS,GAAG;AACvC,UAAI,MAAM,GAAG,KAAK,SAAS,iBAAiB,SAAS;AAAA;AACrD,iBAAW,SAAS,SAAS,iBAAiB;AAC5C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,UAAM,eAAe,SAAS,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACnE,QAAI,aAAa,SAAS,GAAG;AAC3B,UAAI,MAAM,GAAG,KAAK,SAAS,cAAc,OAAO;AAAA;AAChD,iBAAW,SAAS,cAAc;AAChC,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,UAAM,cAAc,SAAS,cAAc,OAAO,CAAC,MAAM,EAAE,MAAM;AACjE,QAAI,YAAY,SAAS,GAAG;AAC1B,UAAI,MAAM,GAAG,KAAK,SAAS,cAAc,OAAO;AAAA;AAChD,iBAAW,SAAS,aAAa;AAC/B,cAAM,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACrC,cAAM,eAAe;AAAA,UACnB,KAAK;AAAA,UACL,eAAe,KAAK;AAAA,QACtB;AACA,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAClC,eAAO,uBAAuB,YAAY;AAAA;AAAA,MAC5C;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,QAAI,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,GAAG;AACnE,UAAI,MAAM,KAAK,SACX;AAAA,IACA;AAAA;AACJ,iBAAW,SAAS,SAAS,iBAAiB;AAC5C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,QAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,UAAI,MAAM,KAAK,SACX;AAAA,IACA;AAAA;AACJ,iBAAW,SAAS,SAAS,kBAAkB;AAC7C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AAGA,aAAW,CAAC,eAAe,aAAa,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC3E,QAAI,kBAAkB,IAAI;AACxB;AAAA,IACF;AACA,QAAI,cAAc,SAAS,SAAS,UAAU;AAC5C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AACA,QAAI,cAAc,SAAS,SAAS,WAAW;AAC7C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AACA,QAAI,cAAc,SAAS,SAAS,WAAW;AAC7C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n} from \"../../bundler/log.js\";\nimport {\n ProjectConfig,\n configFromProjectConfig,\n debugIsolateEndpointBundles,\n getFunctionsDirectoryPath,\n readProjectConfig,\n pullConfig,\n diffConfig,\n} from \"./config.js\";\nimport {\n finishPush,\n reportPushCompleted,\n startPush,\n waitForSchema,\n} from \"./deploy2.js\";\nimport { version } from \"../version.js\";\nimport { ensureHasConvexDependency, functionsDir } from \"./utils/utils.js\";\nimport {\n bundleDefinitions,\n bundleImplementations,\n componentGraph,\n} from \"./components/definition/bundle.js\";\nimport { isComponentDirectory } from \"./components/definition/directoryStructure.js\";\nimport {\n doFinalComponentCodegen,\n doInitialComponentCodegen,\n CodegenOptions,\n doInitConvexFolder,\n doCodegen,\n} from \"./codegen.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport { withTmpDir } from \"../../bundler/fs.js\";\nimport { handleDebugBundlePath } from \"./debugBundlePath.js\";\nimport { chalkStderr } from \"chalk\";\nimport { StartPushRequest, StartPushResponse } from \"./deployApi/startPush.js\";\nimport { DetailedDeploymentCredentials } from \"./api.js\";\nimport { FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { DEFINITION_FILENAME_TS } from \"./components/constants.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { formatIndex, LargeIndexDeletionCheck } from \"./indexes.js\";\nimport { checkForLargeIndexDeletion } from \"./checkForLargeIndexDeletion.js\";\nimport { checkForSlowSchemaValidation } from \"./checkForSlowSchemaValidation.js\";\nimport {\n checkForLargeIndexBackfill,\n LargeIndexBackfillCheck,\n} from \"./checkForLargeIndexBackfill.js\";\nimport {\n pushStagesValidators,\n sharedSchemaEvaluation,\n} from \"./schemaEvaluation.js\";\nimport {\n checkForStagedValidatorDeletion,\n StagedValidatorDeletionCheck,\n} from \"./checkForStagedValidatorDeletion.js\";\nimport { LogManager } from \"./logs.js\";\nimport { createHash } from \"crypto\";\nimport { Bundle, BundleHash } from \"../../bundler/index.js\";\nimport { ModuleHashConfig } from \"./deployApi/modules.js\";\n\nexport type PushOptions = {\n adminKey: string;\n verbose: boolean;\n dryRun: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n debug: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n codegen: boolean;\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n writePushRequest?: string | undefined;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n logManager?: LogManager | undefined;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n largeIndexBackfillCheck: LargeIndexBackfillCheck;\n stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;\n // Whether a dry run should warn when the schema change would block the\n // deploy on a slow table walk. On for deploys; off for commands whose dry\n // runs never deploy (e.g. codegen).\n warnOnSlowSchemaValidation: boolean;\n message: string | null;\n};\n\nexport async function runCodegen(\n ctx: Context,\n credentials: DetailedDeploymentCredentials | null,\n options: CodegenOptions,\n) {\n // This also ensures the current directory is the project root.\n await ensureHasConvexDependency(ctx, \"codegen\");\n\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const functionsDirectoryPath = functionsDir(configPath, projectConfig);\n\n if (options.init) {\n await doInitConvexFolder(ctx, functionsDirectoryPath, {\n dryRun: options.dryRun,\n debug: options.debug,\n });\n }\n\n if (!options.systemUdfs) {\n if (credentials === null) {\n return;\n }\n\n await startComponentsPushAndCodegen(\n ctx,\n Span.noop(),\n projectConfig,\n configPath,\n {\n ...options,\n deploymentName: credentials.deploymentFields?.deploymentName ?? null,\n ...(credentials.deploymentFields?.deploymentType !== undefined\n ? { deploymentType: credentials.deploymentFields.deploymentType }\n : {}),\n url: credentials.url,\n adminKey: credentials.adminKey,\n generateCommonJSApi: options.commonjs,\n verbose: !!process.env.CONVEX_VERBOSE,\n codegen: true,\n liveComponentSources: options.liveComponentSources,\n typecheckComponents: false,\n debugNodeApis: options.debugNodeApis,\n // Code generation uses the source schema independently of deployment data.\n largeIndexDeletionCheck: \"no verification\",\n largeIndexBackfillCheck: \"no verification\",\n stagedValidatorDeletionCheck: \"no verification\",\n warnOnSlowSchemaValidation: false,\n },\n );\n } else {\n if (options.typecheck !== \"disable\") {\n logMessage(chalkStderr.gray(\"Running TypeScript typecheck\u2026\"));\n }\n\n await doCodegen(ctx, functionsDirectoryPath, options.typecheck, {\n dryRun: options.dryRun,\n debug: options.debug,\n generateCommonJSApi: options.commonjs,\n });\n }\n}\n\nexport async function runPush(ctx: Context, options: PushOptions) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n await runComponentsPush(ctx, options, configPath, projectConfig);\n}\n\nexport function hash(bundle: Bundle) {\n return createHash(\"sha256\")\n .update(bundle.source)\n .update(bundle.sourceMap || \"\")\n .digest(\"hex\");\n}\n\nfunction isModuleTheSame(newBundle: Bundle, oldBundleHash: BundleHash) {\n return (\n newBundle.environment === oldBundleHash.environment &&\n hash(newBundle) === oldBundleHash.hash\n );\n}\n\nexport function partitionModulesByChanges(\n functions: Bundle[],\n remoteHashesByPath: Map<string, BundleHash>,\n): {\n unchangedModuleHashes: ModuleHashConfig[];\n changedModules: Bundle[];\n} {\n // Partition modules based on whether they match the existing modules\n const unchangedModuleHashes = functions\n .filter((newBundle) => {\n const oldBundleHash = remoteHashesByPath.get(newBundle.path);\n return oldBundleHash && isModuleTheSame(newBundle, oldBundleHash);\n })\n .map((func) => ({\n path: func.path,\n environment: func.environment,\n sha256: hash(func),\n }));\n const changedModules = functions.filter((newBundle) => {\n const oldBundleHash = remoteHashesByPath.get(newBundle.path);\n return !oldBundleHash || !isModuleTheSame(newBundle, oldBundleHash);\n });\n return { unchangedModuleHashes, changedModules };\n}\n\nasync function getUnchangedModuleHashesFromServer(\n ctx: Context,\n appImplementation: { functions: Bundle[] },\n options: { url: string; adminKey: string },\n): Promise<{\n unchangedModuleHashes: ModuleHashConfig[];\n changedModules: Bundle[];\n}> {\n const remoteConfigWithModuleHashes = await pullConfig(\n ctx,\n undefined,\n undefined,\n options.url,\n options.adminKey,\n );\n const remoteHashesByPath = new Map(\n remoteConfigWithModuleHashes.moduleHashes.map((moduleHash) => [\n moduleHash.path,\n moduleHash,\n ]),\n );\n return partitionModulesByChanges(\n appImplementation.functions,\n remoteHashesByPath,\n );\n}\n\nasync function startComponentsPushAndCodegen(\n ctx: Context,\n parentSpan: Span,\n projectConfig: ProjectConfig,\n configPath: string,\n options: {\n typecheck: TypeCheckMode;\n typecheckComponents: boolean;\n adminKey: string;\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n verbose: boolean;\n debugBundlePath?: string | undefined;\n dryRun: boolean;\n generateCommonJSApi?: boolean;\n debug: boolean;\n writePushRequest?: string | undefined;\n codegen: boolean;\n liveComponentSources?: boolean;\n pushAllModules?: boolean;\n debugNodeApis: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n largeIndexBackfillCheck: LargeIndexBackfillCheck;\n stagedValidatorDeletionCheck: StagedValidatorDeletionCheck;\n warnOnSlowSchemaValidation: boolean;\n codegenOnlyThisComponent?: string | undefined;\n },\n): Promise<StartPushResponse | null> {\n const convexDir = await getFunctionsDirectoryPath(ctx);\n\n // '.' means use the process current working directory, it's the default behavior.\n // Spelling it out here to be explicit for a future where this code can run\n // from other directories.\n // In esbuild the working directory is used to print error messages and resolving\n // relatives paths passed to it. It generally doesn't matter for resolving imports,\n // imports are resolved from the file where they are written.\n const absWorkingDir = path.resolve(\".\");\n const isComponent = isComponentDirectory(ctx, convexDir, true);\n if (isComponent.kind === \"err\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Invalid component root directory (${isComponent.why}): ${convexDir}`,\n });\n }\n\n let rootComponent = isComponent.component;\n if (options.codegenOnlyThisComponent) {\n const absolutePath = path.resolve(options.codegenOnlyThisComponent);\n let componentConfigPath: string;\n\n // Must be a directory containing a convex.config.ts\n componentConfigPath = path.join(absolutePath, DEFINITION_FILENAME_TS);\n if (!ctx.fs.exists(componentConfigPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Only directories with convex.config.ts files are supported, this directory does not: ${absolutePath}`,\n });\n }\n\n const syntheticConfigPath = path.join(\n rootComponent.path,\n DEFINITION_FILENAME_TS,\n );\n rootComponent = {\n isRoot: true,\n path: rootComponent.path,\n definitionPath: syntheticConfigPath,\n isRootWithoutConfig: false,\n syntheticComponentImport: componentConfigPath,\n };\n }\n\n changeSpinner(\"Finding component definitions...\");\n // Create a list of relevant component directories. These are just for knowing\n // while directories to bundle in bundleDefinitions and bundleImplementations.\n // This produces a bundle in memory as a side effect but it's thrown away.\n const { components, dependencyGraph } = await parentSpan.enterAsync(\n \"componentGraph\",\n () =>\n componentGraph(\n ctx,\n absWorkingDir,\n rootComponent,\n !!options.liveComponentSources,\n options.verbose,\n ),\n );\n\n // Initial codegen is everything we need to get code runnable:\n // root components and other components need a basic _generated/api.ts etc.\n // just to make the code bundleable and runnable so we can analyze.\n if (options.codegen) {\n changeSpinner(\"Generating server code...\");\n await parentSpan.enterAsync(\"doInitialComponentCodegen\", () =>\n withTmpDir(async (tmpDir) => {\n // Skip the root in component cases\n if (!rootComponent.syntheticComponentImport) {\n // Do root first so if a component fails, we'll at least have a working root.\n await doInitialComponentCodegen(ctx, tmpDir, rootComponent, options);\n }\n for (const directory of components.values()) {\n if (directory.isRoot) {\n continue;\n }\n // When --component-dir is used, only generate code for the target component\n if (\n rootComponent.syntheticComponentImport &&\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await doInitialComponentCodegen(ctx, tmpDir, directory, options);\n }\n }),\n );\n }\n\n changeSpinner(\"Bundling component definitions...\");\n // This bundles everything but the actual function definitions\n const {\n appDefinitionSpecWithoutImpls,\n componentDefinitionSpecsWithoutImpls,\n } = await parentSpan.enterAsync(\"bundleDefinitions\", () =>\n bundleDefinitions(\n ctx,\n absWorkingDir,\n dependencyGraph,\n rootComponent,\n // Note that this *includes* the root component.\n [...components.values()],\n !!options.liveComponentSources,\n options.verbose,\n ),\n );\n\n if (options.debugNodeApis) {\n await debugIsolateEndpointBundles(ctx, projectConfig, configPath);\n logFinishedStep(\n \"All non-'use node' entry points successfully bundled. Skipping rest of push.\",\n );\n return null;\n }\n\n changeSpinner(\"Bundling component schemas and implementations...\");\n const { appImplementation, componentImplementations } =\n await parentSpan.enterAsync(\"bundleImplementations\", () =>\n bundleImplementations({\n ctx,\n rootComponentDirectory: rootComponent,\n // When running codegen for a specific component, don't bundle the root.\n componentDirectories: [...components.values()].filter(\n (dir) => !dir.isRoot && !dir.syntheticComponentImport,\n ),\n nodeExternalPackages: projectConfig.node.externalPackages,\n extraConditions: options.liveComponentSources\n ? [\"@convex-dev/component-source\"]\n : [],\n verbose: options.verbose,\n includeSourcesContent:\n projectConfig.bundler?.includeSourcesContent ?? false,\n }),\n );\n if (options.debugBundlePath) {\n const { config: localConfig } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n options.verbose,\n );\n // TODO(ENG-6972): Actually write the bundles for components.\n await handleDebugBundlePath(ctx, options.debugBundlePath, localConfig);\n logMessage(\n `Wrote bundle and metadata for modules in the root to ${options.debugBundlePath}. Skipping rest of push.`,\n );\n return null;\n }\n\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n // TODO: This should be the version of the `convex` package used by each\n // component, and may be different for each component.\n const udfServerVersion = version;\n\n const { unchangedModuleHashes, changedModules } = options.pushAllModules\n ? {\n unchangedModuleHashes: [],\n changedModules: appImplementation.functions,\n }\n : await parentSpan.enterAsync(\"getUnchangedModuleHashesFromServer\", () =>\n getUnchangedModuleHashesFromServer(ctx, appImplementation, options),\n );\n\n const appDefinition: AppDefinitionConfig = {\n ...appDefinitionSpecWithoutImpls,\n schema: appImplementation.schema,\n changedModules,\n unchangedModuleHashes,\n udfServerVersion,\n };\n\n const componentDefinitions: ComponentDefinitionConfig[] = [];\n for (const componentDefinition of componentDefinitionSpecsWithoutImpls) {\n const impl = componentImplementations.filter(\n (impl) => impl.definitionPath === componentDefinition.definitionPath,\n )[0];\n if (!impl) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `missing! couldn't find ${componentDefinition.definitionPath} in ${componentImplementations.map((impl) => impl.definitionPath).toString()}`,\n });\n }\n componentDefinitions.push({\n ...componentDefinition,\n ...impl,\n udfServerVersion,\n });\n }\n const startPushRequest = {\n adminKey: options.adminKey,\n dryRun: options.dryRun,\n functions: projectConfig.functions,\n appDefinition,\n componentDefinitions,\n nodeDependencies: appImplementation.externalNodeDependencies,\n nodeVersion: projectConfig.node.nodeVersion,\n forCodegen: !!options.codegenOnlyThisComponent,\n };\n if (options.writePushRequest) {\n const pushRequestPath = path.resolve(options.writePushRequest);\n ctx.fs.writeUtf8File(\n `${pushRequestPath}.json`,\n JSON.stringify(startPushRequest),\n );\n return null;\n }\n logStartPushSizes(parentSpan, startPushRequest);\n\n const schemaEvaluation = sharedSchemaEvaluation(\n ctx,\n startPushRequest,\n options,\n );\n if (options.largeIndexDeletionCheck !== \"no verification\") {\n await parentSpan.enterAsync(\"checkForLargeIndexDeletion\", (span) =>\n checkForLargeIndexDeletion({\n ctx,\n span,\n request: startPushRequest,\n options,\n schemaEvaluation,\n askForConfirmation:\n options.largeIndexDeletionCheck === \"ask for confirmation\",\n }),\n );\n }\n\n const largeIndexBackfillCheck = options.largeIndexBackfillCheck;\n if (largeIndexBackfillCheck !== \"no verification\") {\n await parentSpan.enterAsync(\"checkForLargeIndexBackfill\", (span) =>\n checkForLargeIndexBackfill({\n ctx,\n span,\n schemaEvaluation,\n options,\n // A dry run never blocks on a backfill, so it only reports.\n mode: options.dryRun ? \"warn\" : largeIndexBackfillCheck,\n }),\n );\n }\n\n const stagedValidatorDeletionCheck = options.stagedValidatorDeletionCheck;\n if (stagedValidatorDeletionCheck !== \"no verification\") {\n await parentSpan.enterAsync(\n \"checkForStagedValidatorDeletion\",\n async (span) => {\n const response = await schemaEvaluation(span);\n await checkForStagedValidatorDeletion({\n ctx,\n response,\n askForConfirmation:\n stagedValidatorDeletionCheck === \"ask for confirmation\",\n // A dry run previews the confirmation required by a real push.\n dryRun: options.dryRun,\n });\n },\n );\n }\n\n // A real push evaluates the schema only when the evaluation is already\n // paid for by the unstaging check or the pushed schema stages a validator,\n // so `dev` pushes of ordinary schemas skip the isolate evaluation and round\n // trip that the status report would otherwise add on every save.\n if (\n options.warnOnSlowSchemaValidation &&\n (options.dryRun ||\n stagedValidatorDeletionCheck !== \"no verification\" ||\n pushStagesValidators(startPushRequest))\n ) {\n await parentSpan.enterAsync(\"checkForSlowSchemaValidation\", (span) =>\n checkForSlowSchemaValidation({\n span,\n schemaEvaluation,\n dryRun: options.dryRun,\n }),\n );\n }\n\n changeSpinner(\"Uploading functions to Convex...\");\n const startPushResponse = await parentSpan.enterAsync(\"startPush\", (span) =>\n startPush(ctx, span, startPushRequest, options),\n );\n\n if (options.verbose) {\n logMessage(\"startPush: \" + JSON.stringify(startPushResponse, null, 2));\n }\n\n if (options.codegen) {\n changeSpinner(\"Generating TypeScript bindings...\");\n await parentSpan.enterAsync(\"doFinalComponentCodegen\", () =>\n withTmpDir(async (tmpDir) => {\n // TODO generating code for the root component last might be better DX\n // When running codegen for a specific component, don't generate types for the root\n if (!rootComponent.syntheticComponentImport) {\n // Do the root first\n await doFinalComponentCodegen(\n ctx,\n tmpDir,\n rootComponent,\n rootComponent,\n startPushResponse,\n components,\n options,\n );\n }\n for (const directory of components.values()) {\n if (directory.isRoot) {\n continue;\n }\n // When --component-dir is used, only generate code for the target component\n if (\n rootComponent.syntheticComponentImport &&\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await doFinalComponentCodegen(\n ctx,\n tmpDir,\n rootComponent,\n directory,\n startPushResponse,\n components,\n options,\n );\n }\n }),\n );\n }\n\n changeSpinner(\"Running TypeScript...\");\n await parentSpan.enterAsync(\"typeCheckFunctionsInMode\", async () => {\n // When running codegen for a specific component, don't typecheck the root\n if (!rootComponent.syntheticComponentImport) {\n await typeCheckFunctionsInMode(\n ctx,\n options.typecheck,\n rootComponent.path,\n );\n }\n if (options.typecheckComponents) {\n for (const directory of components.values()) {\n if (!directory.isRoot) {\n await typeCheckFunctionsInMode(\n ctx,\n options.typecheck,\n directory.path,\n );\n }\n }\n } else if (rootComponent.syntheticComponentImport) {\n // When running codegen for a specific component, only typecheck that component.\n for (const directory of components.values()) {\n if (\n directory.isRoot ||\n directory.definitionPath !== rootComponent.syntheticComponentImport\n ) {\n continue;\n }\n await typeCheckFunctionsInMode(ctx, options.typecheck, directory.path);\n }\n }\n });\n\n return startPushResponse;\n}\n\nfunction logStartPushSizes(span: Span, startPushRequest: StartPushRequest) {\n let v8Size = 0;\n let v8Count = 0;\n let nodeSize = 0;\n let nodeCount = 0;\n\n for (const componentDefinition of startPushRequest.componentDefinitions) {\n for (const module of componentDefinition.functions) {\n if (module.environment === \"isolate\") {\n v8Size += module.source.length + (module.sourceMap ?? \"\").length;\n v8Count += 1;\n } else if (module.environment === \"node\") {\n nodeSize += module.source.length + (module.sourceMap ?? \"\").length;\n nodeCount += 1;\n }\n }\n }\n span.setProperty(\"v8_size\", v8Size.toString());\n span.setProperty(\"v8_count\", v8Count.toString());\n span.setProperty(\"node_size\", nodeSize.toString());\n span.setProperty(\"node_count\", nodeCount.toString());\n}\n\nexport async function runComponentsPush(\n ctx: Context,\n options: PushOptions,\n configPath: string,\n projectConfig: ProjectConfig,\n) {\n const reporter = new Reporter();\n const pushSpan = Span.root(reporter, \"runComponentsPush\");\n pushSpan.setProperty(\"cli_version\", version);\n const verbose = options.verbose || options.dryRun;\n\n await ensureHasConvexDependency(ctx, \"push\");\n\n const startPushResponse = await pushSpan.enterAsync(\n \"startComponentsPushAndCodegen\",\n (span) =>\n startComponentsPushAndCodegen(\n ctx,\n span,\n projectConfig,\n configPath,\n options,\n ),\n );\n if (!startPushResponse) {\n return;\n }\n\n await pushSpan.enterAsync(\"waitForSchema\", (span) =>\n waitForSchema(ctx, span, startPushResponse, options),\n );\n\n if (verbose) {\n const remoteConfigWithModuleHashes = await pullConfig(\n ctx,\n undefined,\n undefined,\n options.url,\n options.adminKey,\n );\n\n const { config: localConfig } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n options.verbose,\n );\n\n changeSpinner(\"Diffing local code and deployment state...\");\n const { diffString } = diffConfig(\n remoteConfigWithModuleHashes,\n localConfig,\n );\n\n logFinishedStep(\n `Remote config ${\n options.dryRun ? \"would\" : \"will\"\n } be overwritten with the following changes:\\n ` +\n diffString.replace(/\\n/g, \"\\n \"),\n );\n }\n\n const finishPushResponse = await pushSpan.enterAsync(\"finishPush\", (span) =>\n finishPush(ctx, span, startPushResponse, options),\n );\n printDiff(startPushResponse, finishPushResponse, options);\n pushSpan.end();\n\n // Asynchronously report that the push completed.\n if (!options.dryRun) {\n void reportPushCompleted(ctx, options.adminKey, options.url, reporter);\n }\n}\n\nfunction printDiff(\n startPushResponse: StartPushResponse,\n finishPushResponse: FinishPushDiff,\n opts: { verbose: boolean; dryRun: boolean; deploymentName: string | null },\n) {\n if (opts.verbose) {\n const diffString = JSON.stringify(finishPushResponse, null, 2);\n logMessage(diffString);\n return;\n }\n const indexDiffs = startPushResponse.schemaChange.indexDiffs;\n const { componentDiffs } = finishPushResponse;\n\n // Print out index diffs for the root component.\n let rootDiff = indexDiffs?.[\"\"] || componentDiffs[\"\"]?.indexDiff;\n if (rootDiff) {\n if (rootDiff.removed_indexes.length > 0) {\n let msg = `${opts.dryRun ? \"Would delete\" : \"Deleted\"} table indexes:\\n`;\n for (const index of rootDiff.removed_indexes) {\n msg += ` [-] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n const addedEnabled = rootDiff.added_indexes.filter((i) => !i.staged);\n if (addedEnabled.length > 0) {\n let msg = `${opts.dryRun ? \"Would add\" : \"Added\"} table indexes:\\n`;\n for (const index of addedEnabled) {\n msg += ` [+] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n const addedStaged = rootDiff.added_indexes.filter((i) => i.staged);\n if (addedStaged.length > 0) {\n let msg = `${opts.dryRun ? \"Would add\" : \"Added\"} staged table indexes:\\n`;\n for (const index of addedStaged) {\n const table = index.name.split(\".\")[0];\n const progressLink = deploymentDashboardUrlPage(\n opts.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg += ` [+] ${formatIndex(index)}\\n`;\n msg += ` See progress: ${progressLink}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n if (rootDiff.enabled_indexes && rootDiff.enabled_indexes.length > 0) {\n let msg = opts.dryRun\n ? `These indexes would be enabled:\\n`\n : `These indexes are now enabled:\\n`;\n for (const index of rootDiff.enabled_indexes) {\n msg += ` [*] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n\n if (rootDiff.disabled_indexes && rootDiff.disabled_indexes.length > 0) {\n let msg = opts.dryRun\n ? `These indexes would be staged:\\n`\n : `These indexes are now staged:\\n`;\n for (const index of rootDiff.disabled_indexes) {\n msg += ` [*] ${formatIndex(index)}\\n`;\n }\n msg = msg.slice(0, -1); // strip last new line\n logFinishedStep(msg);\n }\n }\n\n // Only show component level diffs for other components.\n for (const [componentPath, componentDiff] of Object.entries(componentDiffs)) {\n if (componentPath === \"\") {\n continue;\n }\n if (componentDiff.diffType.type === \"create\") {\n logFinishedStep(`Installed component ${componentPath}.`);\n }\n if (componentDiff.diffType.type === \"unmount\") {\n logFinishedStep(`Unmounted component ${componentPath}.`);\n }\n if (componentDiff.diffType.type === \"remount\") {\n logFinishedStep(`Remounted component ${componentPath}.`);\n }\n }\n}\n"],
5
+ "mappings": ";AAAA,OAAO,UAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,2BAA2B,oBAAoB;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAKP,SAAS,gCAA+C;AACxD,SAAS,kBAAkB;AAC3B,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAI5B,SAAS,UAAU,YAAY;AAC/B,SAAS,8BAA8B;AAEvC,SAAS,kCAAkC;AAC3C,SAAS,mBAA4C;AACrD,SAAS,kCAAkC;AAC3C,SAAS,oCAAoC;AAC7C;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,OAEK;AAEP,SAAS,kBAAkB;AA+B3B,sBAAsB,WACpB,KACA,aACA,SACA;AAEA,QAAM,0BAA0B,KAAK,SAAS;AAE9C,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,QAAM,yBAAyB,aAAa,YAAY,aAAa;AAErE,MAAI,QAAQ,MAAM;AAChB,UAAM,mBAAmB,KAAK,wBAAwB;AAAA,MACpD,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,YAAY;AACvB,QAAI,gBAAgB,MAAM;AACxB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,gBAAgB,YAAY,kBAAkB,kBAAkB;AAAA,QAChE,GAAI,YAAY,kBAAkB,mBAAmB,SACjD,EAAE,gBAAgB,YAAY,iBAAiB,eAAe,IAC9D,CAAC;AAAA,QACL,KAAK,YAAY;AAAA,QACjB,UAAU,YAAY;AAAA,QACtB,qBAAqB,QAAQ;AAAA,QAC7B,SAAS,CAAC,CAAC,QAAQ,IAAI;AAAA,QACvB,SAAS;AAAA,QACT,sBAAsB,QAAQ;AAAA,QAC9B,qBAAqB;AAAA,QACrB,eAAe,QAAQ;AAAA;AAAA,QAEvB,yBAAyB;AAAA,QACzB,yBAAyB;AAAA,QACzB,8BAA8B;AAAA,QAC9B,4BAA4B;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,QAAQ,cAAc,WAAW;AACnC,iBAAW,YAAY,KAAK,oCAA+B,CAAC;AAAA,IAC9D;AAEA,UAAM,UAAU,KAAK,wBAAwB,QAAQ,WAAW;AAAA,MAC9D,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,qBAAqB,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEA,sBAAsB,QAAQ,KAAc,SAAsB;AAChE,QAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,QAAM,kBAAkB,KAAK,SAAS,YAAY,aAAa;AACjE;AAEO,gBAAS,KAAK,QAAgB;AACnC,SAAO,WAAW,QAAQ,EACvB,OAAO,OAAO,MAAM,EACpB,OAAO,OAAO,aAAa,EAAE,EAC7B,OAAO,KAAK;AACjB;AAEA,SAAS,gBAAgB,WAAmB,eAA2B;AACrE,SACE,UAAU,gBAAgB,cAAc,eACxC,KAAK,SAAS,MAAM,cAAc;AAEtC;AAEO,gBAAS,0BACd,WACA,oBAIA;AAEA,QAAM,wBAAwB,UAC3B,OAAO,CAAC,cAAc;AACrB,UAAM,gBAAgB,mBAAmB,IAAI,UAAU,IAAI;AAC3D,WAAO,iBAAiB,gBAAgB,WAAW,aAAa;AAAA,EAClE,CAAC,EACA,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK,IAAI;AAAA,EACnB,EAAE;AACJ,QAAM,iBAAiB,UAAU,OAAO,CAAC,cAAc;AACrD,UAAM,gBAAgB,mBAAmB,IAAI,UAAU,IAAI;AAC3D,WAAO,CAAC,iBAAiB,CAAC,gBAAgB,WAAW,aAAa;AAAA,EACpE,CAAC;AACD,SAAO,EAAE,uBAAuB,eAAe;AACjD;AAEA,eAAe,mCACb,KACA,mBACA,SAIC;AACD,QAAM,+BAA+B,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,qBAAqB,IAAI;AAAA,IAC7B,6BAA6B,aAAa,IAAI,CAAC,eAAe;AAAA,MAC5D,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAe,8BACb,KACA,YACA,eACA,YACA,SAuBmC;AACnC,QAAM,YAAY,MAAM,0BAA0B,GAAG;AAQrD,QAAM,gBAAgB,KAAK,QAAQ,GAAG;AACtC,QAAM,cAAc,qBAAqB,KAAK,WAAW,IAAI;AAC7D,MAAI,YAAY,SAAS,OAAO;AAC9B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,qCAAqC,YAAY,GAAG,MAAM,SAAS;AAAA,IACrF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,YAAY;AAChC,MAAI,QAAQ,0BAA0B;AACpC,UAAM,eAAe,KAAK,QAAQ,QAAQ,wBAAwB;AAClE,QAAI;AAGJ,0BAAsB,KAAK,KAAK,cAAc,sBAAsB;AACpE,QAAI,CAAC,IAAI,GAAG,OAAO,mBAAmB,GAAG;AACvC,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,wFAAwF,YAAY;AAAA,MACtH,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd;AAAA,IACF;AACA,oBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,cAAc;AAAA,MACpB,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,IAC5B;AAAA,EACF;AAEA,gBAAc,kCAAkC;AAIhD,QAAM,EAAE,YAAY,gBAAgB,IAAI,MAAM,WAAW;AAAA,IACvD;AAAA,IACA,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,CAAC,QAAQ;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACJ;AAKA,MAAI,QAAQ,SAAS;AACnB,kBAAc,2BAA2B;AACzC,UAAM,WAAW;AAAA,MAAW;AAAA,MAA6B,MACvD,WAAW,OAAO,WAAW;AAE3B,YAAI,CAAC,cAAc,0BAA0B;AAE3C,gBAAM,0BAA0B,KAAK,QAAQ,eAAe,OAAO;AAAA,QACrE;AACA,mBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,cAAI,UAAU,QAAQ;AACpB;AAAA,UACF;AAEA,cACE,cAAc,4BACd,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,UACF;AACA,gBAAM,0BAA0B,KAAK,QAAQ,WAAW,OAAO;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,mCAAmC;AAEjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI,MAAM,WAAW;AAAA,IAAW;AAAA,IAAqB,MACnD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,MACvB,CAAC,CAAC,QAAQ;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe;AACzB,UAAM,4BAA4B,KAAK,eAAe,UAAU;AAChE;AAAA,MACE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,gBAAc,mDAAmD;AACjE,QAAM,EAAE,mBAAmB,yBAAyB,IAClD,MAAM,WAAW;AAAA,IAAW;AAAA,IAAyB,MACnD,sBAAsB;AAAA,MACpB;AAAA,MACA,wBAAwB;AAAA;AAAA,MAExB,sBAAsB,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,QAC7C,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,MAC/B;AAAA,MACA,sBAAsB,cAAc,KAAK;AAAA,MACzC,iBAAiB,QAAQ,uBACrB,CAAC,8BAA8B,IAC/B,CAAC;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,uBACE,cAAc,SAAS,yBAAyB;AAAA,IACpD,CAAC;AAAA,EACH;AACF,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,UAAM,sBAAsB,KAAK,QAAQ,iBAAiB,WAAW;AACrE;AAAA,MACE,wDAAwD,QAAQ,eAAe;AAAA,IACjF;AACA,WAAO;AAAA,EACT;AAOA,QAAM,mBAAmB;AAEzB,QAAM,EAAE,uBAAuB,eAAe,IAAI,QAAQ,iBACtD;AAAA,IACE,uBAAuB,CAAC;AAAA,IACxB,gBAAgB,kBAAkB;AAAA,EACpC,IACA,MAAM,WAAW;AAAA,IAAW;AAAA,IAAsC,MAChE,mCAAmC,KAAK,mBAAmB,OAAO;AAAA,EACpE;AAEJ,QAAM,gBAAqC;AAAA,IACzC,GAAG;AAAA,IACH,QAAQ,kBAAkB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,uBAAoD,CAAC;AAC3D,aAAW,uBAAuB,sCAAsC;AACtE,UAAM,OAAO,yBAAyB;AAAA,MACpC,CAACA,UAASA,MAAK,mBAAmB,oBAAoB;AAAA,IACxD,EAAE,CAAC;AACH,QAAI,CAAC,MAAM;AACT,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,0BAA0B,oBAAoB,cAAc,OAAO,yBAAyB,IAAI,CAACA,UAASA,MAAK,cAAc,EAAE,SAAS,CAAC;AAAA,MAC3J,CAAC;AAAA,IACH;AACA,yBAAqB,KAAK;AAAA,MACxB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,mBAAmB;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,WAAW,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,IACA,kBAAkB,kBAAkB;AAAA,IACpC,aAAa,cAAc,KAAK;AAAA,IAChC,YAAY,CAAC,CAAC,QAAQ;AAAA,EACxB;AACA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,kBAAkB,KAAK,QAAQ,QAAQ,gBAAgB;AAC7D,QAAI,GAAG;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,KAAK,UAAU,gBAAgB;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AACA,oBAAkB,YAAY,gBAAgB;AAE9C,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,4BAA4B,mBAAmB;AACzD,UAAM,WAAW;AAAA,MAAW;AAAA,MAA8B,CAAC,SACzD,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,oBACE,QAAQ,4BAA4B;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,0BAA0B,QAAQ;AACxC,MAAI,4BAA4B,mBAAmB;AACjD,UAAM,WAAW;AAAA,MAAW;AAAA,MAA8B,CAAC,SACzD,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA,MAAM,QAAQ,SAAS,SAAS;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,+BAA+B,QAAQ;AAC7C,MAAI,iCAAiC,mBAAmB;AACtD,UAAM,WAAW;AAAA,MACf;AAAA,MACA,OAAO,SAAS;AACd,cAAM,WAAW,MAAM,iBAAiB,IAAI;AAC5C,cAAM,gCAAgC;AAAA,UACpC;AAAA,UACA;AAAA,UACA,oBACE,iCAAiC;AAAA;AAAA,UAEnC,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAMA,MACE,QAAQ,+BACP,QAAQ,UACP,iCAAiC,qBACjC,qBAAqB,gBAAgB,IACvC;AACA,UAAM,WAAW;AAAA,MAAW;AAAA,MAAgC,CAAC,SAC3D,6BAA6B;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,kCAAkC;AAChD,QAAM,oBAAoB,MAAM,WAAW;AAAA,IAAW;AAAA,IAAa,CAAC,SAClE,UAAU,KAAK,MAAM,kBAAkB,OAAO;AAAA,EAChD;AAEA,MAAI,QAAQ,SAAS;AACnB,eAAW,gBAAgB,KAAK,UAAU,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACvE;AAEA,MAAI,QAAQ,SAAS;AACnB,kBAAc,mCAAmC;AACjD,UAAM,WAAW;AAAA,MAAW;AAAA,MAA2B,MACrD,WAAW,OAAO,WAAW;AAG3B,YAAI,CAAC,cAAc,0BAA0B;AAE3C,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,mBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,cAAI,UAAU,QAAQ;AACpB;AAAA,UACF;AAEA,cACE,cAAc,4BACd,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,UACF;AACA,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,uBAAuB;AACrC,QAAM,WAAW,WAAW,4BAA4B,YAAY;AAElE,QAAI,CAAC,cAAc,0BAA0B;AAC3C,YAAM;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF;AACA,QAAI,QAAQ,qBAAqB;AAC/B,iBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,YAAI,CAAC,UAAU,QAAQ;AACrB,gBAAM;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,cAAc,0BAA0B;AAEjD,iBAAW,aAAa,WAAW,OAAO,GAAG;AAC3C,YACE,UAAU,UACV,UAAU,mBAAmB,cAAc,0BAC3C;AACA;AAAA,QACF;AACA,cAAM,yBAAyB,KAAK,QAAQ,WAAW,UAAU,IAAI;AAAA,MACvE;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAY,kBAAoC;AACzE,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,aAAW,uBAAuB,iBAAiB,sBAAsB;AACvE,eAAW,UAAU,oBAAoB,WAAW;AAClD,UAAI,OAAO,gBAAgB,WAAW;AACpC,kBAAU,OAAO,OAAO,UAAU,OAAO,aAAa,IAAI;AAC1D,mBAAW;AAAA,MACb,WAAW,OAAO,gBAAgB,QAAQ;AACxC,oBAAY,OAAO,OAAO,UAAU,OAAO,aAAa,IAAI;AAC5D,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,OAAK,YAAY,WAAW,OAAO,SAAS,CAAC;AAC7C,OAAK,YAAY,YAAY,QAAQ,SAAS,CAAC;AAC/C,OAAK,YAAY,aAAa,SAAS,SAAS,CAAC;AACjD,OAAK,YAAY,cAAc,UAAU,SAAS,CAAC;AACrD;AAEA,sBAAsB,kBACpB,KACA,SACA,YACA,eACA;AACA,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,WAAW,KAAK,KAAK,UAAU,mBAAmB;AACxD,WAAS,YAAY,eAAe,OAAO;AAC3C,QAAM,UAAU,QAAQ,WAAW,QAAQ;AAE3C,QAAM,0BAA0B,KAAK,MAAM;AAE3C,QAAM,oBAAoB,MAAM,SAAS;AAAA,IACvC;AAAA,IACA,CAAC,SACC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACA,MAAI,CAAC,mBAAmB;AACtB;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IAAW;AAAA,IAAiB,CAAC,SAC1C,cAAc,KAAK,MAAM,mBAAmB,OAAO;AAAA,EACrD;AAEA,MAAI,SAAS;AACX,UAAM,+BAA+B,MAAM;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,UAAM,EAAE,QAAQ,YAAY,IAAI,MAAM;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,kBAAc,4CAA4C;AAC1D,UAAM,EAAE,WAAW,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAEA;AAAA,MACE,iBACE,QAAQ,SAAS,UAAU,MAC7B;AAAA,MACE,WAAW,QAAQ,OAAO,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM,SAAS;AAAA,IAAW;AAAA,IAAc,CAAC,SAClE,WAAW,KAAK,MAAM,mBAAmB,OAAO;AAAA,EAClD;AACA,YAAU,mBAAmB,oBAAoB,OAAO;AACxD,WAAS,IAAI;AAGb,MAAI,CAAC,QAAQ,QAAQ;AACnB,SAAK,oBAAoB,KAAK,QAAQ,UAAU,QAAQ,KAAK,QAAQ;AAAA,EACvE;AACF;AAEA,SAAS,UACP,mBACA,oBACA,MACA;AACA,MAAI,KAAK,SAAS;AAChB,UAAM,aAAa,KAAK,UAAU,oBAAoB,MAAM,CAAC;AAC7D,eAAW,UAAU;AACrB;AAAA,EACF;AACA,QAAM,aAAa,kBAAkB,aAAa;AAClD,QAAM,EAAE,eAAe,IAAI;AAG3B,MAAI,WAAW,aAAa,EAAE,KAAK,eAAe,EAAE,GAAG;AACvD,MAAI,UAAU;AACZ,QAAI,SAAS,gBAAgB,SAAS,GAAG;AACvC,UAAI,MAAM,GAAG,KAAK,SAAS,iBAAiB,SAAS;AAAA;AACrD,iBAAW,SAAS,SAAS,iBAAiB;AAC5C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,UAAM,eAAe,SAAS,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACnE,QAAI,aAAa,SAAS,GAAG;AAC3B,UAAI,MAAM,GAAG,KAAK,SAAS,cAAc,OAAO;AAAA;AAChD,iBAAW,SAAS,cAAc;AAChC,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,UAAM,cAAc,SAAS,cAAc,OAAO,CAAC,MAAM,EAAE,MAAM;AACjE,QAAI,YAAY,SAAS,GAAG;AAC1B,UAAI,MAAM,GAAG,KAAK,SAAS,cAAc,OAAO;AAAA;AAChD,iBAAW,SAAS,aAAa;AAC/B,cAAM,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AACrC,cAAM,eAAe;AAAA,UACnB,KAAK;AAAA,UACL,eAAe,KAAK;AAAA,QACtB;AACA,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAClC,eAAO,uBAAuB,YAAY;AAAA;AAAA,MAC5C;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,QAAI,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,GAAG;AACnE,UAAI,MAAM,KAAK,SACX;AAAA,IACA;AAAA;AACJ,iBAAW,SAAS,SAAS,iBAAiB;AAC5C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAEA,QAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,UAAI,MAAM,KAAK,SACX;AAAA,IACA;AAAA;AACJ,iBAAW,SAAS,SAAS,kBAAkB;AAC7C,eAAO,SAAS,YAAY,KAAK,CAAC;AAAA;AAAA,MACpC;AACA,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AAGA,aAAW,CAAC,eAAe,aAAa,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC3E,QAAI,kBAAkB,IAAI;AACxB;AAAA,IACF;AACA,QAAI,cAAc,SAAS,SAAS,UAAU;AAC5C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AACA,QAAI,cAAc,SAAS,SAAS,WAAW;AAC7C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AACA,QAAI,cAAc,SAAS,SAAS,WAAW;AAC7C,sBAAgB,uBAAuB,aAAa,GAAG;AAAA,IACzD;AAAA,EACF;AACF;",
6
6
  "names": ["impl"]
7
7
  }
@@ -34,6 +34,7 @@ import {
34
34
  printLocalDeploymentOnError
35
35
  } from "./localDeployment/errors.js";
36
36
  import { debugIsolateBundlesSerially } from "../../bundler/debugBundle.js";
37
+ import { isAnonymousDeployment } from "./deployment.js";
37
38
  export { productionProvisionHost, provisionHost } from "./utils/utils.js";
38
39
  const DEFAULT_FUNCTIONS_PATH = "convex/";
39
40
  export function usesTypeScriptCodegen(projectConfig) {
@@ -408,7 +409,7 @@ export async function configFromProjectConfig(ctx, projectConfig, configPath, ve
408
409
  }
409
410
  const modules = convexResult.modules;
410
411
  modules.push(...nodeResult.modules);
411
- modules.push(...await bundleAuthConfig(ctx, baseDir));
412
+ modules.push(...(await bundleAuthConfig(ctx, baseDir)).modules);
412
413
  const nodeDependencies = [];
413
414
  for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {
414
415
  nodeDependencies.push({ name: moduleName, version: moduleVersion });
@@ -555,7 +556,37 @@ export function diffConfig(oldConfig, newConfig) {
555
556
  }
556
557
  return { diffString: diff };
557
558
  }
558
- export async function handlePushConfigError(ctx, error, defaultMessage, deploymentName, deployment, _deploymentType) {
559
+ export function setEnvVarsInstructions(names, deploymentName, deploymentType, deploymentUrl) {
560
+ let deploymentFlag = "";
561
+ if (deploymentName !== null && deploymentType !== "local" && deploymentType !== "anonymous") {
562
+ deploymentFlag = ` --deployment ${deploymentName}`;
563
+ } else if (deploymentType === "prod") {
564
+ deploymentFlag = " --prod";
565
+ } else if (deploymentName === null && deploymentUrl !== void 0) {
566
+ deploymentFlag = ` --url ${deploymentUrl} --admin-key <admin key>`;
567
+ }
568
+ const commands = (names.length > 0 ? names : ["<NAME>"]).map(
569
+ (name) => ` ${chalkStderr.bold(`npx convex env set${deploymentFlag} ${name} <value>`)}`
570
+ );
571
+ let instructions = `Set ${names.length > 1 ? "them" : "it"} with:
572
+
573
+ ${commands.join("\n")}
574
+ `;
575
+ if (deploymentName !== null && !isAnonymousDeployment(deploymentName)) {
576
+ const variableQuery = names.length === 1 ? `?var=${names[0]}` : "";
577
+ const dashboardUrl = deploymentDashboardUrlPage(
578
+ deploymentName,
579
+ `/settings/environment-variables${variableQuery}`
580
+ );
581
+ instructions += `
582
+ or in the dashboard:
583
+
584
+ ${chalkStderr.bold(dashboardUrl)}
585
+ `;
586
+ }
587
+ return instructions;
588
+ }
589
+ export async function handlePushConfigError(ctx, error, defaultMessage, deploymentName, deployment, deploymentType) {
559
590
  const data = error instanceof ThrowingFetchError ? error.serverErrorData : void 0;
560
591
  if (data?.code === "AuthConfigMissingEnvironmentVariable") {
561
592
  const errorMessage = data.message || "(no error message given)";
@@ -572,26 +603,33 @@ export async function handlePushConfigError(ctx, error, defaultMessage, deployme
572
603
  const envVarMessage = `Environment variable ${chalkStderr.bold(
573
604
  variableName
574
605
  )} is used in auth config file but its value was not set.`;
575
- let setEnvVarInstructions = "Go set it in the dashboard or using `npx convex env set`";
576
- if (deploymentName !== null) {
577
- const variableQuery = variableName !== void 0 ? `?var=${variableName}` : "";
578
- const dashboardUrl = deploymentDashboardUrlPage(
606
+ await ctx.crash({
607
+ exitCode: 1,
608
+ errorType: "invalid filesystem or env vars",
609
+ errForSentry: error,
610
+ printedMessage: envVarMessage + "\n" + setEnvVarsInstructions(
611
+ variableName !== void 0 ? [variableName] : [],
579
612
  deploymentName,
580
- `/settings/environment-variables${variableQuery}`
581
- );
582
- setEnvVarInstructions = `Go to:
583
-
584
- ${chalkStderr.bold(
585
- dashboardUrl
586
- )}
587
-
588
- to set it up. `;
589
- }
613
+ deploymentType,
614
+ deployment?.deploymentUrl
615
+ )
616
+ });
617
+ }
618
+ if (data?.code === "MissingEnvironmentVariables") {
619
+ const errorMessage = data.message || "(no error message given)";
620
+ const [, namesList] = errorMessage.match(/are not set: ([^.]+)\./) ?? [];
621
+ const names = namesList?.split(", ") ?? [];
622
+ const envVarMessage = names.length === 0 ? errorMessage : names.length === 1 ? `Environment variable ${chalkStderr.bold(names[0])} is declared as required in convex.config.ts but its value was not set.` : `Environment variables ${names.map((name) => chalkStderr.bold(name)).join(", ")} are declared as required in convex.config.ts but their values were not set.`;
590
623
  await ctx.crash({
591
624
  exitCode: 1,
592
625
  errorType: "invalid filesystem or env vars",
593
626
  errForSentry: error,
594
- printedMessage: envVarMessage + "\n" + setEnvVarInstructions
627
+ printedMessage: envVarMessage + "\n" + setEnvVarsInstructions(
628
+ names,
629
+ deploymentName,
630
+ deploymentType,
631
+ deployment?.deploymentUrl
632
+ )
595
633
  });
596
634
  }
597
635
  if (data?.code === "RaceDetected") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/config.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\n// eslint-disable-next-line no-restricted-imports\nimport { promises as nodeFs } from \"fs\";\nimport { z } from \"zod\";\nimport { Context } from \"../../bundler/context.js\";\nimport { TypescriptCompiler } from \"./typecheck.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport {\n Bundle,\n BundleHash,\n bundle,\n bundleAuthConfig,\n entryPointsByEnvironment,\n} from \"../../bundler/index.js\";\nimport { version } from \"../version.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport {\n functionsDir,\n ErrorData,\n loadPackageJson,\n deploymentFetch,\n deprecationCheckWarning,\n logAndHandleFetchError,\n ThrowingFetchError,\n currentPackageHomepage,\n} from \"./utils/utils.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { NodeDependency } from \"./deployApi/modules.js\";\nimport { ComponentDefinitionPath } from \"./components/definition/directoryStructure.js\";\nimport {\n LocalDeploymentError,\n printLocalDeploymentOnError,\n} from \"./localDeployment/errors.js\";\nimport { debugIsolateBundlesSerially } from \"../../bundler/debugBundle.js\";\nimport { DeploymentType } from \"./api.js\";\nexport { productionProvisionHost, provisionHost } from \"./utils/utils.js\";\n\n/** Type representing WorkOS AuthKit integration configuration. */\nexport interface AuthKitConfigureSettings {\n redirectUris?: string[];\n appHomepageUrl?: string;\n corsOrigins?: string[];\n}\n\nexport interface AuthKitEnvironmentConfig {\n environmentType?: \"development\" | \"staging\" | \"production\";\n configure?: false | AuthKitConfigureSettings;\n localEnvVars?: false | Record<string, string>;\n}\n\nexport interface AuthKitConfig {\n dev?: AuthKitEnvironmentConfig;\n preview?: AuthKitEnvironmentConfig;\n prod?: AuthKitEnvironmentConfig;\n}\n/**\n * convex.json file parsing notes\n *\n * - Unknown fields at the top level and in node and codegen are preserved\n * so that older CLI versions can deploy new projects (this functionality\n * will be removed in the future).\n * - convex.json does not allow comments, but this could change in the future.\n * Previously it contained automatically set values like productionUrl\n * but it's more like a config file now.\n */\n\n/** Type representing Convex project configuration. */\nexport interface ProjectConfig {\n // \u26A0\uFE0F When updating this, please also update the file used by IDEs for autocompletion and validation:\n // -> npm-packages/convex/schemas/convex.schema.json\n\n functions: string;\n node: {\n externalPackages: string[];\n // nodeVersion has no default value, its presence/absence is meaningful\n nodeVersion?: string | undefined;\n };\n generateCommonJSApi: boolean;\n\n codegen: {\n staticApi: boolean;\n staticDataModel: boolean;\n legacyComponentApi?: boolean;\n fileType?: \"ts\" | \"js/dts\";\n };\n\n bundler?: {\n includeSourcesContent?: boolean;\n };\n\n typescriptCompiler?: TypescriptCompiler;\n\n // WorkOS AuthKit integration configuration\n authKit?: AuthKitConfig | undefined;\n\n // Convex AI files user preferences.\n aiFiles?: {\n // When false, disables all AI files prompts and staleness messages.\n enabled?: boolean;\n // @deprecated use `enabled` instead.\n disableStalenessMessage?: boolean;\n // Configuration for agent skills installed by Convex.\n skills?: {\n // List of agents to install skills for (e.g. 'claude-code', 'codex', 'cursor').\n // Defaults to ['claude-code', 'codex'].\n agents?: string[];\n };\n };\n}\n\nexport interface Config {\n projectConfig: ProjectConfig;\n modules: Bundle[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n nodeVersion?: string | undefined;\n}\n\nexport interface ConfigWithModuleHashes {\n projectConfig: ProjectConfig;\n moduleHashes: BundleHash[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n}\n\nconst DEFAULT_FUNCTIONS_PATH = \"convex/\";\n\n/** Whether .ts file extensions should be used for generated code (default is false). */\nexport function usesTypeScriptCodegen(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.fileType === \"ts\";\n}\n\n/** Whether the new component API import style should be used */\nexport function usesComponentApiImports(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.legacyComponentApi !== true;\n}\n\n/**\n * Get the authKit configuration from convex.json.\n */\nexport async function getAuthKitConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n): Promise<AuthKitConfig | undefined> {\n // If there's an explicit authKit config, use it\n if (\"authKit\" in projectConfig) {\n return projectConfig.authKit;\n }\n\n // TODO remove this after a few versions\n // Migration help: is this one of the hardcoded templates that has special\n // behavior without a convex.json? Encourage them to upgrade the template.\n const homepage = await currentPackageHomepage(ctx);\n const isOldWorkOSTemplate = !!(\n homepage &&\n [\n \"https://github.com/workos/template-convex-nextjs-authkit/#readme\",\n \"https://github.com/workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com:workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com/workos/template-convex-tanstack-start-authkit/#readme\",\n ].includes(homepage)\n );\n\n if (isOldWorkOSTemplate) {\n logWarning(\n \"The template this project is based on has been updated to work with this version of Convex.\",\n );\n logWarning(\n \"Please copy the convex.json from the latest template version or add an 'authKit' section.\",\n );\n logMessage(\"Learn more at https://docs.convex.dev/auth/authkit\");\n }\n}\n\nexport async function getAuthKitEnvironmentConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n deploymentType: \"dev\" | \"preview\" | \"prod\",\n): Promise<AuthKitEnvironmentConfig | undefined> {\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n return authKitConfig?.[deploymentType];\n}\n\n/** Error parsing ProjectConfig representation. */\nclass ParseError extends Error {}\n\n// WorkOS AuthKit configuration schemas\nconst AuthKitConfigureSchema = z.union([\n z.literal(false),\n z.object({\n redirectUris: z.array(z.string()).optional(),\n appHomepageUrl: z.string().optional(),\n corsOrigins: z.array(z.string()).optional(),\n }),\n]);\n\nconst AuthKitLocalEnvVarsSchema = z.union([\n z.literal(false),\n z.record(z.string()),\n]);\n\nconst AuthKitEnvironmentConfigSchema = z.object({\n environmentType: z.enum([\"development\", \"staging\", \"production\"]).optional(),\n configure: AuthKitConfigureSchema.optional(),\n localEnvVars: AuthKitLocalEnvVarsSchema.optional(),\n});\n\nconst AuthKitConfigSchema = z\n .object({\n dev: AuthKitEnvironmentConfigSchema.optional(),\n preview: AuthKitEnvironmentConfigSchema.optional(),\n prod: AuthKitEnvironmentConfigSchema.optional(),\n })\n .refine(\n (data) => {\n // Validation: environmentType only allowed in prod\n const devEnvType = data.dev?.environmentType;\n const previewEnvType = data.preview?.environmentType;\n if (devEnvType || previewEnvType) {\n return false;\n }\n return true;\n },\n {\n message: \"authKit.environmentType is only allowed in the prod section\",\n path: [\"environmentType\"],\n },\n )\n .refine(\n (data) => {\n // Validation: localEnvVars only allowed for dev\n // Check preview doesn't have localEnvVars\n if (\n data.preview?.localEnvVars !== undefined &&\n data.preview?.localEnvVars !== false\n ) {\n return false;\n }\n // Check prod doesn't have localEnvVars\n if (\n data.prod?.localEnvVars !== undefined &&\n data.prod?.localEnvVars !== false\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"authKit.localEnvVars is only supported for dev deployments. Preview and prod deployments must configure environment variables directly in the deployment platform.\",\n path: [\"localEnvVars\"],\n },\n );\n// Separate Node and Codegen schemas so we can parse these loose or strict\nconst NodeSchema = z.object({\n externalPackages: z\n .array(z.string())\n .default([])\n .describe(\n \"list of npm packages to install at deploy time instead of bundling. Packages with binaries should be added here.\",\n ),\n nodeVersion: z\n .string()\n .optional()\n .describe(\"The Node.js version to use for Node.js functions\"),\n});\n\nconst CodegenSchema = z.object({\n staticApi: z\n .boolean()\n .default(false)\n .describe(\n \"Use Convex function argument validators and return value validators to generate a typed API object\",\n ),\n staticDataModel: z.boolean().default(false),\n // These optional fields have no defaults - their presence/absence is meaningful\n legacyComponentApi: z.boolean().optional(),\n fileType: z.enum([\"ts\", \"js/dts\"]).optional(),\n});\n\nconst BundlerSchema = z.object({\n includeSourcesContent: z\n .boolean()\n .default(false)\n .describe(\n \"Whether to include original source code in source maps. Set to false to reduce bundle size.\",\n ),\n});\n\nconst AiFilesSchema = z.object({\n enabled: z.boolean().optional(),\n disableStalenessMessage: z.boolean().optional(),\n skills: z\n .object({\n agents: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst refineToObject = <T extends z.ZodTypeAny>(schema: T) =>\n schema.refine((val) => val !== null && !Array.isArray(val), {\n message: \"Expected `convex.json` to contain an object\",\n });\n\n// Factory function to create schema with strict or passthrough behavior\nconst createProjectConfigSchema = (strict: boolean) => {\n const nodeSchema = strict ? NodeSchema.strict() : NodeSchema.passthrough();\n const codegenSchema = strict\n ? CodegenSchema.strict()\n : CodegenSchema.passthrough();\n const bundlerSchema = strict\n ? BundlerSchema.strict()\n : BundlerSchema.passthrough();\n\n const baseObject = z.object({\n functions: z\n .string()\n .default(DEFAULT_FUNCTIONS_PATH)\n .describe(\"Relative file path to the convex directory\"),\n node: nodeSchema.default({ externalPackages: [] }),\n codegen: codegenSchema.default({\n staticApi: false,\n staticDataModel: false,\n }),\n bundler: bundlerSchema.default({ includeSourcesContent: false }).optional(),\n generateCommonJSApi: z.boolean().default(false),\n typescriptCompiler: z\n .enum([\"tsc\", \"tsgo\"])\n .optional()\n .describe(\n \"TypeScript compiler to use for typechecking (`@typescript/native-preview` must be installed to use `tsgo`)\",\n ),\n\n // Optional $schema field for JSON schema validation in editors\n $schema: z.string().optional(),\n // WorkOS AuthKit integration configuration\n authKit: AuthKitConfigSchema.optional(),\n aiFiles: AiFilesSchema.optional(),\n\n // Deprecated fields that have been deprecated for years, only here so we\n // know it's safe to delete them.\n project: z.string().optional(),\n team: z.string().optional(),\n prodUrl: z.string().optional(),\n });\n\n // Apply strict or passthrough BEFORE refine\n const withStrictness = strict\n ? baseObject.strict()\n : baseObject.passthrough();\n\n // Now apply the refinement\n return withStrictness.refine(\n (data) => {\n // Validate that generateCommonJSApi is not true when using TypeScript codegen\n if (data.generateCommonJSApi && data.codegen.fileType === \"ts\") {\n return false;\n }\n return true;\n },\n {\n message:\n 'Cannot use `generateCommonJSApi: true` with `codegen.fileType: \"ts\"`. ' +\n \"CommonJS modules require JavaScript generation. \" +\n 'Either set `codegen.fileType: \"js/dts\"` or remove `generateCommonJSApi`.',\n path: [\"generateCommonJSApi\"],\n },\n );\n};\n\n// Parse allowing extra fields (for forward compatibility)\nconst ProjectConfigSchema = refineToObject(createProjectConfigSchema(false));\n\n// Strict schema warn about extra keys\nconst ProjectConfigSchemaStrict = refineToObject(\n createProjectConfigSchema(true),\n);\n\nconst warnedUnknownKeys = new Set<string>();\nexport function resetUnknownKeyWarnings() {\n warnedUnknownKeys.clear();\n}\n\n/** Parse object to ProjectConfig. */\nexport async function parseProjectConfig(\n ctx: Context,\n obj: any,\n): Promise<ProjectConfig> {\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected `convex.json` to contain an object\",\n });\n }\n\n try {\n // Try strict parse first to detect unknown keys\n return ProjectConfigSchemaStrict.parse(obj);\n } catch (error) {\n if (error instanceof z.ZodError) {\n // Check if all issues are unrecognized_keys issues\n const unknownKeyIssues = error.issues.filter(\n (issue) => issue.code === \"unrecognized_keys\",\n );\n\n if (\n unknownKeyIssues.length > 0 &&\n unknownKeyIssues.length === error.issues.length\n ) {\n // All errors are just unknown keys - warn about them\n for (const issue of unknownKeyIssues) {\n if (issue.code === \"unrecognized_keys\") {\n const pathPrefix =\n issue.path.length > 0 ? issue.path.join(\".\") + \".\" : \"\";\n const unknownKeys = issue.keys as string[];\n const newUnknownKeys = unknownKeys.filter(\n (key) => !warnedUnknownKeys.has(pathPrefix + key),\n );\n\n if (newUnknownKeys.length > 0) {\n const fullPath =\n issue.path.length > 0\n ? `\\`${issue.path.join(\".\")}\\``\n : \"`convex.json`\";\n logMessage(\n chalkStderr.yellow(\n `Warning: Unknown ${newUnknownKeys.length === 1 ? \"property\" : \"properties\"} in ${fullPath}: ${newUnknownKeys.map((k) => `\\`${k}\\``).join(\", \")}`,\n ),\n );\n logMessage(\n chalkStderr.gray(\n \" These properties will be preserved but are not recognized by this version of Convex.\",\n ),\n );\n\n // Track that we've warned about these keys\n newUnknownKeys.forEach((key) =>\n warnedUnknownKeys.add(pathPrefix + key),\n );\n }\n }\n }\n // Re-parse with passthrough schema to preserve unknown keys\n return ProjectConfigSchema.parse(obj);\n }\n\n // Handle validation errors we won't ignore\n if (error instanceof z.ZodError) {\n const issue = error.issues[0];\n const pathStr = issue.path.join(\".\");\n const message = pathStr\n ? `\\`${pathStr}\\` in \\`convex.json\\`: ${issue.message}`\n : `\\`convex.json\\`: ${issue.message}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: (error as any).toString(),\n });\n }\n}\n\n// Parse a deployment config returned by the backend, picking out\n// the fields we care about.\nfunction parseBackendConfig(obj: any): {\n functions: string;\n nodeVersion?: string;\n} {\n function throwParseError(message: string) {\n // Unexpected error\n // eslint-disable-next-line no-restricted-syntax\n throw new ParseError(message);\n }\n if (typeof obj !== \"object\") {\n throwParseError(\"Expected an object\");\n }\n const { functions, nodeVersion } = obj;\n if (typeof functions !== \"string\") {\n throwParseError(\"Expected functions to be a string\");\n }\n\n if (typeof nodeVersion !== \"undefined\" && typeof nodeVersion !== \"string\") {\n throwParseError(\"Expected nodeVersion to be a string\");\n }\n\n return {\n functions,\n ...((nodeVersion ?? null) !== null ? { nodeVersion: nodeVersion } : {}),\n };\n}\n\nexport function configName(): string {\n return \"convex.json\";\n}\n\nexport async function configFilepath(ctx: Context): Promise<string> {\n const configFn = configName();\n // We used to allow src/convex.json, but no longer (as of 10/7/2022).\n // Leave an error message around to help people out. We can remove this\n // error message after a couple months.\n const preferredLocation = configFn;\n const wrongLocation = path.join(\"src\", configFn);\n\n // Allow either location, but not both.\n const preferredLocationExists = ctx.fs.exists(preferredLocation);\n const wrongLocationExists = ctx.fs.exists(wrongLocation);\n if (preferredLocationExists && wrongLocationExists) {\n const message = `${chalkStderr.red(`Error: both ${preferredLocation} and ${wrongLocation} files exist!`)}\\nConsolidate these and remove ${wrongLocation}.`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n if (!preferredLocationExists && wrongLocationExists) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Please move ${wrongLocation} to the root of your project`,\n });\n }\n\n return preferredLocation;\n}\n\nexport async function getFunctionsDirectoryPath(ctx: Context): Promise<string> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n return functionsDir(configPath, projectConfig);\n}\n\n/** Read configuration from a local `convex.json` file. */\nexport async function readProjectConfig(ctx: Context): Promise<{\n projectConfig: ProjectConfig;\n configPath: string;\n}> {\n if (!ctx.fs.exists(\"convex.json\")) {\n // create-react-app bans imports from outside of src, so we can just\n // put the functions directory inside of src/ to work around this issue.\n const packages = await loadPackageJson(ctx);\n const isCreateReactApp = \"react-scripts\" in packages;\n return {\n projectConfig: {\n functions: isCreateReactApp\n ? `src/${DEFAULT_FUNCTIONS_PATH}`\n : DEFAULT_FUNCTIONS_PATH,\n node: {\n externalPackages: [],\n },\n generateCommonJSApi: false,\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n aiFiles: {},\n },\n configPath: configName(),\n };\n }\n let projectConfig;\n const configPath = await configFilepath(ctx);\n try {\n projectConfig = await parseProjectConfig(\n ctx,\n JSON.parse(ctx.fs.readUtf8File(configPath)),\n );\n } catch (err) {\n if (err instanceof ParseError || err instanceof SyntaxError) {\n logError(chalkStderr.red(`Error: Parsing \"${configPath}\" failed`));\n logMessage(chalkStderr.gray(err.toString()));\n } else {\n logFailure(\n `Error: Unable to read project config file \"${configPath}\"\\n` +\n \" Are you running this command from the root directory of a Convex project? If so, run `npx convex dev` first.\",\n );\n if (err instanceof Error) {\n logError(chalkStderr.red(err.message));\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n // TODO -- move the logging above in here\n printedMessage: null,\n });\n }\n return {\n projectConfig,\n configPath,\n };\n}\n\n/**\n * Given a {@link ProjectConfig}, add in the bundled modules to produce the\n * complete config.\n */\nexport async function configFromProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n verbose: boolean,\n): Promise<{\n config: Config;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const baseDir = functionsDir(configPath, projectConfig);\n // We bundle Node.js and Convex JS runtime functions entry points separately\n // since they execute on different platforms.\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n // es-build prints errors to console which would clobber our spinner.\n if (verbose) {\n showSpinner(\"Bundling modules for Convex's runtime...\");\n }\n const convexResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.isolate,\n generateSourceMaps: true,\n platform: \"browser\",\n });\n if (verbose) {\n logMessage(\n \"Convex's runtime modules: \",\n convexResult.modules.map((m) => m.path),\n );\n }\n\n // Bundle node modules.\n if (verbose && entryPoints.node.length !== 0) {\n showSpinner(\"Bundling modules for Node.js runtime...\");\n }\n const nodeResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.node,\n generateSourceMaps: true,\n platform: \"node\",\n chunksFolder: path.join(\"_deps\", \"node\"),\n externalPackagesAllowList: projectConfig.node.externalPackages,\n });\n if (verbose && entryPoints.node.length !== 0) {\n logMessage(\n \"Node.js runtime modules: \",\n nodeResult.modules.map((m) => m.path),\n );\n if (projectConfig.node.externalPackages.length > 0) {\n logMessage(\n \"Node.js runtime external dependencies (to be installed on the server): \",\n [...nodeResult.externalDependencies.entries()].map(\n (a) => `${a[0]}: ${a[1]}`,\n ),\n );\n }\n }\n const modules = convexResult.modules;\n modules.push(...nodeResult.modules);\n modules.push(...(await bundleAuthConfig(ctx, baseDir)));\n\n const nodeDependencies: NodeDependency[] = [];\n for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {\n nodeDependencies.push({ name: moduleName, version: moduleVersion });\n }\n\n const bundledModuleInfos: BundledModuleInfo[] = Array.from(\n convexResult.bundledModuleNames.keys(),\n ).map((moduleName) => {\n return {\n name: moduleName,\n platform: \"convex\",\n };\n });\n bundledModuleInfos.push(\n ...Array.from(nodeResult.bundledModuleNames.keys()).map(\n (moduleName): BundledModuleInfo => {\n return {\n name: moduleName,\n platform: \"node\",\n };\n },\n ),\n );\n\n return {\n config: {\n projectConfig: projectConfig,\n modules: modules,\n nodeDependencies: nodeDependencies,\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n udfServerVersion: version,\n nodeVersion: projectConfig.node.nodeVersion,\n },\n bundledModuleInfos,\n };\n}\n\n/**\n * Bundle modules one by one for good bundler errors.\n */\nexport async function debugIsolateEndpointBundles(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n): Promise<void> {\n const baseDir = functionsDir(configPath, projectConfig);\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n if (entryPoints.isolate.length === 0) {\n logFinishedStep(\"No non-'use node' modules found.\");\n }\n await debugIsolateBundlesSerially(ctx, {\n entryPoints: entryPoints.isolate,\n extraConditions: [],\n dir: baseDir,\n });\n}\n\n/**\n * Read the config from `convex.json` and bundle all the modules.\n */\nexport async function readConfig(\n ctx: Context,\n verbose: boolean,\n): Promise<{\n config: Config;\n configPath: string;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n const { config, bundledModuleInfos } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n verbose,\n );\n return { config, configPath, bundledModuleInfos };\n}\n\n/**\n * Ensure the functions directory exists.\n *\n * Note: convex.json is treated as user-owned and is not modified by the CLI.\n * Use writeAiFilesConfig() to explicitly patch the aiFiles section.\n */\nexport async function ensureConvexFunctionsDir(\n ctx: Context,\n projectConfig: ProjectConfig,\n) {\n const configPath = await configFilepath(ctx);\n ctx.fs.mkdir(functionsDir(configPath, projectConfig), {\n allowExisting: true,\n });\n}\n\nexport function removedExistingConfig(\n ctx: Context,\n configPath: string,\n options: { allowExistingConfig?: boolean },\n) {\n if (!options.allowExistingConfig) {\n return false;\n }\n recursivelyDelete(ctx, configPath);\n logFinishedStep(`Removed existing ${configPath}`);\n return true;\n}\n\n/** Pull configuration for the root app component from the given remote origin. */\nexport async function pullConfig(\n ctx: Context,\n project: string | undefined,\n team: string | undefined,\n origin: string,\n adminKey: string,\n): Promise<ConfigWithModuleHashes> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: origin,\n adminKey,\n });\n\n changeSpinner(\"Downloading current deployment state...\");\n try {\n const res = await fetch(\"/api/get_config_hashes\", {\n method: \"POST\",\n body: JSON.stringify({ version, adminKey }),\n });\n deprecationCheckWarning(ctx, res);\n const data = await res.json();\n const backendConfig = parseBackendConfig(data.config);\n const projectConfig = {\n ...backendConfig,\n node: {\n // This field is not stored in the backend, which is ok since it is also\n // not used to diff configs.\n externalPackages: [],\n nodeVersion: data.nodeVersion,\n },\n // This field is not stored in the backend, it only affects the client.\n generateCommonJSApi: false,\n // This field is also not stored in the backend, it only affects the client.\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n project,\n team,\n prodUrl: origin,\n };\n return {\n projectConfig,\n moduleHashes: data.moduleHashes,\n // TODO(presley): Add this to diffConfig().\n nodeDependencies: data.nodeDependencies,\n udfServerVersion: data.udfServerVersion,\n };\n } catch (err: unknown) {\n logFailure(`Error: Unable to pull deployment config from ${origin}`);\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\ninterface BundledModuleInfo {\n name: string;\n platform: \"node\" | \"convex\";\n}\n\n/**\n * A component definition spec contains enough information to create bundles\n * of code that must be analyzed in order to construct a ComponentDefinition.\n *\n * Most paths are relative to the directory of the definitionPath.\n */\nexport type ComponentDefinitionSpec = {\n /** This path is relative to the app (root component) directory. */\n definitionPath: ComponentDefinitionPath;\n\n /** Dependencies are paths to the directory of the dependency component definition from the app (root component) directory */\n dependencies: ComponentDefinitionPath[];\n\n // All other paths are relative to the directory of the definitionPath above.\n definition: Bundle;\n schema: Bundle;\n functions: Bundle[];\n};\n\nexport type AppDefinitionSpec = Omit<\n ComponentDefinitionSpec,\n \"definitionPath\"\n> & {\n // Only app (root) component specs contain an auth bundle.\n auth: Bundle | null;\n};\n\nexport type ComponentDefinitionSpecWithoutImpls = Omit<\n ComponentDefinitionSpec,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionSpecWithoutImpls = Omit<\n AppDefinitionSpec,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\n/** Generate a human-readable diff between the two configs. */\nexport function diffConfig(\n oldConfig: ConfigWithModuleHashes,\n newConfig: Config,\n): { diffString: string } {\n let diff = \"\";\n\n let versionMessage = \"\";\n const matches = oldConfig.udfServerVersion === newConfig.udfServerVersion;\n if (oldConfig.udfServerVersion && (!newConfig.udfServerVersion || !matches)) {\n versionMessage += `[-] ${oldConfig.udfServerVersion}\\n`;\n }\n if (newConfig.udfServerVersion && (!oldConfig.udfServerVersion || !matches)) {\n versionMessage += `[+] ${newConfig.udfServerVersion}\\n`;\n }\n if (versionMessage) {\n diff += \"Change the server's function version:\\n\";\n diff += versionMessage;\n }\n\n if (oldConfig.projectConfig.node.nodeVersion !== newConfig.nodeVersion) {\n diff += \"Change the server's version for Node.js actions:\\n\";\n if (oldConfig.projectConfig.node.nodeVersion) {\n diff += `[-] ${oldConfig.projectConfig.node.nodeVersion}\\n`;\n }\n if (newConfig.nodeVersion) {\n diff += `[+] ${newConfig.nodeVersion}\\n`;\n }\n }\n\n return { diffString: diff };\n}\n\n/** Handle an error from\n * legacy push path:\n * - /api/push_config\n * modern push paths:\n * - /api/deploy2/evaluate_push\n * - /api/deploy2/start_push\n * - /api/deploy2/finish_push\n *\n * finish_push errors are different from start_push errors and in theory could\n * be handled differently, but starting over works for all of them.\n */\nexport async function handlePushConfigError(\n ctx: Context,\n error: unknown,\n defaultMessage: string,\n deploymentName: string | null,\n deployment:\n | {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n }\n | undefined,\n _deploymentType: DeploymentType | undefined,\n): Promise<never> {\n const data: ErrorData | undefined =\n error instanceof ThrowingFetchError ? error.serverErrorData : undefined;\n if (data?.code === \"AuthConfigMissingEnvironmentVariable\") {\n const errorMessage = data.message || \"(no error message given)\";\n const [, variableName] =\n errorMessage.match(/Environment variable (\\S+)/i) ?? [];\n\n // DEPRECATED: This error path provisioning is being phased out in favor of\n // pre-flight provisioning that happens before the client bundle build.\n // We keep minimal logic here for backwards compatibility with older templates\n // that may still rely on this path.\n if (variableName === \"WORKOS_CLIENT_ID\" && deploymentName && deployment) {\n // For backwards compatibility with templates that haven't been updated,\n // we'll still show a helpful error message directing users to configure WorkOS.\n // But we no longer do automatic provisioning here since it happens too late\n // (after the client bundle has already been built with missing env vars).\n logWarning(\n \"WORKOS_CLIENT_ID is not set; you can set it manually on the deployment or for hosted Convex deployments, use auto-provisioning.\",\n );\n logMessage(\n \"Learn more at https://docs.convex.dev/auth/authkit/auto-provision\",\n );\n logMessage(\"\");\n }\n\n const envVarMessage =\n `Environment variable ${chalkStderr.bold(\n variableName,\n )} is used in auth config file but ` + `its value was not set.`;\n let setEnvVarInstructions =\n \"Go set it in the dashboard or using `npx convex env set`\";\n\n // If `npx convex dev` is running using --url there might not be a configured deployment\n if (deploymentName !== null) {\n const variableQuery =\n variableName !== undefined ? `?var=${variableName}` : \"\";\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/settings/environment-variables${variableQuery}`,\n );\n setEnvVarInstructions = `Go to:\\n\\n ${chalkStderr.bold(\n dashboardUrl,\n )}\\n\\n to set it up. `;\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n errForSentry: error,\n printedMessage: envVarMessage + \"\\n\" + setEnvVarInstructions,\n });\n }\n\n if (data?.code === \"RaceDetected\") {\n // Environment variables or schema changed during push. This is a transient\n // error that should be retried immediately with exponential backoff.\n const message =\n data.message || \"Schema or environment variables changed during push\";\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: chalkStderr.yellow(message),\n });\n }\n\n if (data?.code === \"InternalServerError\") {\n if (deploymentName?.startsWith(\"local-\")) {\n printLocalDeploymentOnError();\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new LocalDeploymentError(\n \"InternalServerError while pushing to local deployment\",\n ),\n printedMessage: defaultMessage,\n });\n }\n }\n\n logFailure(defaultMessage);\n return await logAndHandleFetchError(ctx, error);\n}\n\nexport type AiFilesProjectConfig = NonNullable<ProjectConfig[\"aiFiles\"]>;\n\nfunction tryParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nfunction toRecord(val: unknown): Record<string, unknown> {\n if (val !== null && typeof val === \"object\" && !Array.isArray(val))\n return val as Record<string, unknown>;\n return {};\n}\n\n/**\n * Write the `aiFiles` section of `convex.json`, preserving all other keys.\n * Writes the given object as-is with no merging or default logic.\n * If `aiFiles` is undefined, the key is removed from the file.\n */\nexport async function writeAiFilesConfig({\n projectDir,\n aiFiles,\n}: {\n projectDir: string;\n aiFiles: AiFilesProjectConfig | undefined;\n}): Promise<void> {\n const filePath = path.join(projectDir, \"convex.json\");\n const raw = await nodeFs.readFile(filePath, \"utf8\").catch(() => null);\n const base = toRecord(raw !== null ? tryParseJson(raw) : {});\n\n const { $schema, aiFiles: _existing, ...rest } = base;\n\n const hasContent = aiFiles !== undefined && Object.keys(aiFiles).length > 0;\n\n const next: Record<string, unknown> = {\n $schema: $schema ?? \"node_modules/convex/schemas/convex.schema.json\",\n ...rest,\n ...(hasContent ? { aiFiles } : {}),\n };\n\n await nodeFs.writeFile(\n filePath,\n JSON.stringify(next, null, 2) + \"\\n\",\n \"utf8\",\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\n// eslint-disable-next-line no-restricted-imports\nimport { promises as nodeFs } from \"fs\";\nimport { z } from \"zod\";\nimport { Context } from \"../../bundler/context.js\";\nimport { TypescriptCompiler } from \"./typecheck.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport {\n Bundle,\n BundleHash,\n bundle,\n bundleAuthConfig,\n entryPointsByEnvironment,\n} from \"../../bundler/index.js\";\nimport { version } from \"../version.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport {\n functionsDir,\n ErrorData,\n loadPackageJson,\n deploymentFetch,\n deprecationCheckWarning,\n logAndHandleFetchError,\n ThrowingFetchError,\n currentPackageHomepage,\n} from \"./utils/utils.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { NodeDependency } from \"./deployApi/modules.js\";\nimport { ComponentDefinitionPath } from \"./components/definition/directoryStructure.js\";\nimport {\n LocalDeploymentError,\n printLocalDeploymentOnError,\n} from \"./localDeployment/errors.js\";\nimport { debugIsolateBundlesSerially } from \"../../bundler/debugBundle.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { isAnonymousDeployment } from \"./deployment.js\";\nexport { productionProvisionHost, provisionHost } from \"./utils/utils.js\";\n\n/** Type representing WorkOS AuthKit integration configuration. */\nexport interface AuthKitConfigureSettings {\n redirectUris?: string[];\n appHomepageUrl?: string;\n corsOrigins?: string[];\n}\n\nexport interface AuthKitEnvironmentConfig {\n environmentType?: \"development\" | \"staging\" | \"production\";\n configure?: false | AuthKitConfigureSettings;\n localEnvVars?: false | Record<string, string>;\n}\n\nexport interface AuthKitConfig {\n dev?: AuthKitEnvironmentConfig;\n preview?: AuthKitEnvironmentConfig;\n prod?: AuthKitEnvironmentConfig;\n}\n/**\n * convex.json file parsing notes\n *\n * - Unknown fields at the top level and in node and codegen are preserved\n * so that older CLI versions can deploy new projects (this functionality\n * will be removed in the future).\n * - convex.json does not allow comments, but this could change in the future.\n * Previously it contained automatically set values like productionUrl\n * but it's more like a config file now.\n */\n\n/** Type representing Convex project configuration. */\nexport interface ProjectConfig {\n // \u26A0\uFE0F When updating this, please also update the file used by IDEs for autocompletion and validation:\n // -> npm-packages/convex/schemas/convex.schema.json\n\n functions: string;\n node: {\n externalPackages: string[];\n // nodeVersion has no default value, its presence/absence is meaningful\n nodeVersion?: string | undefined;\n };\n generateCommonJSApi: boolean;\n\n codegen: {\n staticApi: boolean;\n staticDataModel: boolean;\n legacyComponentApi?: boolean;\n fileType?: \"ts\" | \"js/dts\";\n };\n\n bundler?: {\n includeSourcesContent?: boolean;\n };\n\n typescriptCompiler?: TypescriptCompiler;\n\n // WorkOS AuthKit integration configuration\n authKit?: AuthKitConfig | undefined;\n\n // Convex AI files user preferences.\n aiFiles?: {\n // When false, disables all AI files prompts and staleness messages.\n enabled?: boolean;\n // @deprecated use `enabled` instead.\n disableStalenessMessage?: boolean;\n // Configuration for agent skills installed by Convex.\n skills?: {\n // List of agents to install skills for (e.g. 'claude-code', 'codex', 'cursor').\n // Defaults to ['claude-code', 'codex'].\n agents?: string[];\n };\n };\n}\n\nexport interface Config {\n projectConfig: ProjectConfig;\n modules: Bundle[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n nodeVersion?: string | undefined;\n}\n\nexport interface ConfigWithModuleHashes {\n projectConfig: ProjectConfig;\n moduleHashes: BundleHash[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n}\n\nconst DEFAULT_FUNCTIONS_PATH = \"convex/\";\n\n/** Whether .ts file extensions should be used for generated code (default is false). */\nexport function usesTypeScriptCodegen(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.fileType === \"ts\";\n}\n\n/** Whether the new component API import style should be used */\nexport function usesComponentApiImports(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.legacyComponentApi !== true;\n}\n\n/**\n * Get the authKit configuration from convex.json.\n */\nexport async function getAuthKitConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n): Promise<AuthKitConfig | undefined> {\n // If there's an explicit authKit config, use it\n if (\"authKit\" in projectConfig) {\n return projectConfig.authKit;\n }\n\n // TODO remove this after a few versions\n // Migration help: is this one of the hardcoded templates that has special\n // behavior without a convex.json? Encourage them to upgrade the template.\n const homepage = await currentPackageHomepage(ctx);\n const isOldWorkOSTemplate = !!(\n homepage &&\n [\n \"https://github.com/workos/template-convex-nextjs-authkit/#readme\",\n \"https://github.com/workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com:workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com/workos/template-convex-tanstack-start-authkit/#readme\",\n ].includes(homepage)\n );\n\n if (isOldWorkOSTemplate) {\n logWarning(\n \"The template this project is based on has been updated to work with this version of Convex.\",\n );\n logWarning(\n \"Please copy the convex.json from the latest template version or add an 'authKit' section.\",\n );\n logMessage(\"Learn more at https://docs.convex.dev/auth/authkit\");\n }\n}\n\nexport async function getAuthKitEnvironmentConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n deploymentType: \"dev\" | \"preview\" | \"prod\",\n): Promise<AuthKitEnvironmentConfig | undefined> {\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n return authKitConfig?.[deploymentType];\n}\n\n/** Error parsing ProjectConfig representation. */\nclass ParseError extends Error {}\n\n// WorkOS AuthKit configuration schemas\nconst AuthKitConfigureSchema = z.union([\n z.literal(false),\n z.object({\n redirectUris: z.array(z.string()).optional(),\n appHomepageUrl: z.string().optional(),\n corsOrigins: z.array(z.string()).optional(),\n }),\n]);\n\nconst AuthKitLocalEnvVarsSchema = z.union([\n z.literal(false),\n z.record(z.string()),\n]);\n\nconst AuthKitEnvironmentConfigSchema = z.object({\n environmentType: z.enum([\"development\", \"staging\", \"production\"]).optional(),\n configure: AuthKitConfigureSchema.optional(),\n localEnvVars: AuthKitLocalEnvVarsSchema.optional(),\n});\n\nconst AuthKitConfigSchema = z\n .object({\n dev: AuthKitEnvironmentConfigSchema.optional(),\n preview: AuthKitEnvironmentConfigSchema.optional(),\n prod: AuthKitEnvironmentConfigSchema.optional(),\n })\n .refine(\n (data) => {\n // Validation: environmentType only allowed in prod\n const devEnvType = data.dev?.environmentType;\n const previewEnvType = data.preview?.environmentType;\n if (devEnvType || previewEnvType) {\n return false;\n }\n return true;\n },\n {\n message: \"authKit.environmentType is only allowed in the prod section\",\n path: [\"environmentType\"],\n },\n )\n .refine(\n (data) => {\n // Validation: localEnvVars only allowed for dev\n // Check preview doesn't have localEnvVars\n if (\n data.preview?.localEnvVars !== undefined &&\n data.preview?.localEnvVars !== false\n ) {\n return false;\n }\n // Check prod doesn't have localEnvVars\n if (\n data.prod?.localEnvVars !== undefined &&\n data.prod?.localEnvVars !== false\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"authKit.localEnvVars is only supported for dev deployments. Preview and prod deployments must configure environment variables directly in the deployment platform.\",\n path: [\"localEnvVars\"],\n },\n );\n// Separate Node and Codegen schemas so we can parse these loose or strict\nconst NodeSchema = z.object({\n externalPackages: z\n .array(z.string())\n .default([])\n .describe(\n \"list of npm packages to install at deploy time instead of bundling. Packages with binaries should be added here.\",\n ),\n nodeVersion: z\n .string()\n .optional()\n .describe(\"The Node.js version to use for Node.js functions\"),\n});\n\nconst CodegenSchema = z.object({\n staticApi: z\n .boolean()\n .default(false)\n .describe(\n \"Use Convex function argument validators and return value validators to generate a typed API object\",\n ),\n staticDataModel: z.boolean().default(false),\n // These optional fields have no defaults - their presence/absence is meaningful\n legacyComponentApi: z.boolean().optional(),\n fileType: z.enum([\"ts\", \"js/dts\"]).optional(),\n});\n\nconst BundlerSchema = z.object({\n includeSourcesContent: z\n .boolean()\n .default(false)\n .describe(\n \"Whether to include original source code in source maps. Set to false to reduce bundle size.\",\n ),\n});\n\nconst AiFilesSchema = z.object({\n enabled: z.boolean().optional(),\n disableStalenessMessage: z.boolean().optional(),\n skills: z\n .object({\n agents: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst refineToObject = <T extends z.ZodTypeAny>(schema: T) =>\n schema.refine((val) => val !== null && !Array.isArray(val), {\n message: \"Expected `convex.json` to contain an object\",\n });\n\n// Factory function to create schema with strict or passthrough behavior\nconst createProjectConfigSchema = (strict: boolean) => {\n const nodeSchema = strict ? NodeSchema.strict() : NodeSchema.passthrough();\n const codegenSchema = strict\n ? CodegenSchema.strict()\n : CodegenSchema.passthrough();\n const bundlerSchema = strict\n ? BundlerSchema.strict()\n : BundlerSchema.passthrough();\n\n const baseObject = z.object({\n functions: z\n .string()\n .default(DEFAULT_FUNCTIONS_PATH)\n .describe(\"Relative file path to the convex directory\"),\n node: nodeSchema.default({ externalPackages: [] }),\n codegen: codegenSchema.default({\n staticApi: false,\n staticDataModel: false,\n }),\n bundler: bundlerSchema.default({ includeSourcesContent: false }).optional(),\n generateCommonJSApi: z.boolean().default(false),\n typescriptCompiler: z\n .enum([\"tsc\", \"tsgo\"])\n .optional()\n .describe(\n \"TypeScript compiler to use for typechecking (`@typescript/native-preview` must be installed to use `tsgo`)\",\n ),\n\n // Optional $schema field for JSON schema validation in editors\n $schema: z.string().optional(),\n // WorkOS AuthKit integration configuration\n authKit: AuthKitConfigSchema.optional(),\n aiFiles: AiFilesSchema.optional(),\n\n // Deprecated fields that have been deprecated for years, only here so we\n // know it's safe to delete them.\n project: z.string().optional(),\n team: z.string().optional(),\n prodUrl: z.string().optional(),\n });\n\n // Apply strict or passthrough BEFORE refine\n const withStrictness = strict\n ? baseObject.strict()\n : baseObject.passthrough();\n\n // Now apply the refinement\n return withStrictness.refine(\n (data) => {\n // Validate that generateCommonJSApi is not true when using TypeScript codegen\n if (data.generateCommonJSApi && data.codegen.fileType === \"ts\") {\n return false;\n }\n return true;\n },\n {\n message:\n 'Cannot use `generateCommonJSApi: true` with `codegen.fileType: \"ts\"`. ' +\n \"CommonJS modules require JavaScript generation. \" +\n 'Either set `codegen.fileType: \"js/dts\"` or remove `generateCommonJSApi`.',\n path: [\"generateCommonJSApi\"],\n },\n );\n};\n\n// Parse allowing extra fields (for forward compatibility)\nconst ProjectConfigSchema = refineToObject(createProjectConfigSchema(false));\n\n// Strict schema warn about extra keys\nconst ProjectConfigSchemaStrict = refineToObject(\n createProjectConfigSchema(true),\n);\n\nconst warnedUnknownKeys = new Set<string>();\nexport function resetUnknownKeyWarnings() {\n warnedUnknownKeys.clear();\n}\n\n/** Parse object to ProjectConfig. */\nexport async function parseProjectConfig(\n ctx: Context,\n obj: any,\n): Promise<ProjectConfig> {\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected `convex.json` to contain an object\",\n });\n }\n\n try {\n // Try strict parse first to detect unknown keys\n return ProjectConfigSchemaStrict.parse(obj);\n } catch (error) {\n if (error instanceof z.ZodError) {\n // Check if all issues are unrecognized_keys issues\n const unknownKeyIssues = error.issues.filter(\n (issue) => issue.code === \"unrecognized_keys\",\n );\n\n if (\n unknownKeyIssues.length > 0 &&\n unknownKeyIssues.length === error.issues.length\n ) {\n // All errors are just unknown keys - warn about them\n for (const issue of unknownKeyIssues) {\n if (issue.code === \"unrecognized_keys\") {\n const pathPrefix =\n issue.path.length > 0 ? issue.path.join(\".\") + \".\" : \"\";\n const unknownKeys = issue.keys as string[];\n const newUnknownKeys = unknownKeys.filter(\n (key) => !warnedUnknownKeys.has(pathPrefix + key),\n );\n\n if (newUnknownKeys.length > 0) {\n const fullPath =\n issue.path.length > 0\n ? `\\`${issue.path.join(\".\")}\\``\n : \"`convex.json`\";\n logMessage(\n chalkStderr.yellow(\n `Warning: Unknown ${newUnknownKeys.length === 1 ? \"property\" : \"properties\"} in ${fullPath}: ${newUnknownKeys.map((k) => `\\`${k}\\``).join(\", \")}`,\n ),\n );\n logMessage(\n chalkStderr.gray(\n \" These properties will be preserved but are not recognized by this version of Convex.\",\n ),\n );\n\n // Track that we've warned about these keys\n newUnknownKeys.forEach((key) =>\n warnedUnknownKeys.add(pathPrefix + key),\n );\n }\n }\n }\n // Re-parse with passthrough schema to preserve unknown keys\n return ProjectConfigSchema.parse(obj);\n }\n\n // Handle validation errors we won't ignore\n if (error instanceof z.ZodError) {\n const issue = error.issues[0];\n const pathStr = issue.path.join(\".\");\n const message = pathStr\n ? `\\`${pathStr}\\` in \\`convex.json\\`: ${issue.message}`\n : `\\`convex.json\\`: ${issue.message}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: (error as any).toString(),\n });\n }\n}\n\n// Parse a deployment config returned by the backend, picking out\n// the fields we care about.\nfunction parseBackendConfig(obj: any): {\n functions: string;\n nodeVersion?: string;\n} {\n function throwParseError(message: string) {\n // Unexpected error\n // eslint-disable-next-line no-restricted-syntax\n throw new ParseError(message);\n }\n if (typeof obj !== \"object\") {\n throwParseError(\"Expected an object\");\n }\n const { functions, nodeVersion } = obj;\n if (typeof functions !== \"string\") {\n throwParseError(\"Expected functions to be a string\");\n }\n\n if (typeof nodeVersion !== \"undefined\" && typeof nodeVersion !== \"string\") {\n throwParseError(\"Expected nodeVersion to be a string\");\n }\n\n return {\n functions,\n ...((nodeVersion ?? null) !== null ? { nodeVersion: nodeVersion } : {}),\n };\n}\n\nexport function configName(): string {\n return \"convex.json\";\n}\n\nexport async function configFilepath(ctx: Context): Promise<string> {\n const configFn = configName();\n // We used to allow src/convex.json, but no longer (as of 10/7/2022).\n // Leave an error message around to help people out. We can remove this\n // error message after a couple months.\n const preferredLocation = configFn;\n const wrongLocation = path.join(\"src\", configFn);\n\n // Allow either location, but not both.\n const preferredLocationExists = ctx.fs.exists(preferredLocation);\n const wrongLocationExists = ctx.fs.exists(wrongLocation);\n if (preferredLocationExists && wrongLocationExists) {\n const message = `${chalkStderr.red(`Error: both ${preferredLocation} and ${wrongLocation} files exist!`)}\\nConsolidate these and remove ${wrongLocation}.`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n if (!preferredLocationExists && wrongLocationExists) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Please move ${wrongLocation} to the root of your project`,\n });\n }\n\n return preferredLocation;\n}\n\nexport async function getFunctionsDirectoryPath(ctx: Context): Promise<string> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n return functionsDir(configPath, projectConfig);\n}\n\n/** Read configuration from a local `convex.json` file. */\nexport async function readProjectConfig(ctx: Context): Promise<{\n projectConfig: ProjectConfig;\n configPath: string;\n}> {\n if (!ctx.fs.exists(\"convex.json\")) {\n // create-react-app bans imports from outside of src, so we can just\n // put the functions directory inside of src/ to work around this issue.\n const packages = await loadPackageJson(ctx);\n const isCreateReactApp = \"react-scripts\" in packages;\n return {\n projectConfig: {\n functions: isCreateReactApp\n ? `src/${DEFAULT_FUNCTIONS_PATH}`\n : DEFAULT_FUNCTIONS_PATH,\n node: {\n externalPackages: [],\n },\n generateCommonJSApi: false,\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n aiFiles: {},\n },\n configPath: configName(),\n };\n }\n let projectConfig;\n const configPath = await configFilepath(ctx);\n try {\n projectConfig = await parseProjectConfig(\n ctx,\n JSON.parse(ctx.fs.readUtf8File(configPath)),\n );\n } catch (err) {\n if (err instanceof ParseError || err instanceof SyntaxError) {\n logError(chalkStderr.red(`Error: Parsing \"${configPath}\" failed`));\n logMessage(chalkStderr.gray(err.toString()));\n } else {\n logFailure(\n `Error: Unable to read project config file \"${configPath}\"\\n` +\n \" Are you running this command from the root directory of a Convex project? If so, run `npx convex dev` first.\",\n );\n if (err instanceof Error) {\n logError(chalkStderr.red(err.message));\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n // TODO -- move the logging above in here\n printedMessage: null,\n });\n }\n return {\n projectConfig,\n configPath,\n };\n}\n\n/**\n * Given a {@link ProjectConfig}, add in the bundled modules to produce the\n * complete config.\n */\nexport async function configFromProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n verbose: boolean,\n): Promise<{\n config: Config;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const baseDir = functionsDir(configPath, projectConfig);\n // We bundle Node.js and Convex JS runtime functions entry points separately\n // since they execute on different platforms.\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n // es-build prints errors to console which would clobber our spinner.\n if (verbose) {\n showSpinner(\"Bundling modules for Convex's runtime...\");\n }\n const convexResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.isolate,\n generateSourceMaps: true,\n platform: \"browser\",\n });\n if (verbose) {\n logMessage(\n \"Convex's runtime modules: \",\n convexResult.modules.map((m) => m.path),\n );\n }\n\n // Bundle node modules.\n if (verbose && entryPoints.node.length !== 0) {\n showSpinner(\"Bundling modules for Node.js runtime...\");\n }\n const nodeResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.node,\n generateSourceMaps: true,\n platform: \"node\",\n chunksFolder: path.join(\"_deps\", \"node\"),\n externalPackagesAllowList: projectConfig.node.externalPackages,\n });\n if (verbose && entryPoints.node.length !== 0) {\n logMessage(\n \"Node.js runtime modules: \",\n nodeResult.modules.map((m) => m.path),\n );\n if (projectConfig.node.externalPackages.length > 0) {\n logMessage(\n \"Node.js runtime external dependencies (to be installed on the server): \",\n [...nodeResult.externalDependencies.entries()].map(\n (a) => `${a[0]}: ${a[1]}`,\n ),\n );\n }\n }\n const modules = convexResult.modules;\n modules.push(...nodeResult.modules);\n modules.push(...(await bundleAuthConfig(ctx, baseDir)).modules);\n\n const nodeDependencies: NodeDependency[] = [];\n for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {\n nodeDependencies.push({ name: moduleName, version: moduleVersion });\n }\n\n const bundledModuleInfos: BundledModuleInfo[] = Array.from(\n convexResult.bundledModuleNames.keys(),\n ).map((moduleName) => {\n return {\n name: moduleName,\n platform: \"convex\",\n };\n });\n bundledModuleInfos.push(\n ...Array.from(nodeResult.bundledModuleNames.keys()).map(\n (moduleName): BundledModuleInfo => {\n return {\n name: moduleName,\n platform: \"node\",\n };\n },\n ),\n );\n\n return {\n config: {\n projectConfig: projectConfig,\n modules: modules,\n nodeDependencies: nodeDependencies,\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n udfServerVersion: version,\n nodeVersion: projectConfig.node.nodeVersion,\n },\n bundledModuleInfos,\n };\n}\n\n/**\n * Bundle modules one by one for good bundler errors.\n */\nexport async function debugIsolateEndpointBundles(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n): Promise<void> {\n const baseDir = functionsDir(configPath, projectConfig);\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n if (entryPoints.isolate.length === 0) {\n logFinishedStep(\"No non-'use node' modules found.\");\n }\n await debugIsolateBundlesSerially(ctx, {\n entryPoints: entryPoints.isolate,\n extraConditions: [],\n dir: baseDir,\n });\n}\n\n/**\n * Read the config from `convex.json` and bundle all the modules.\n */\nexport async function readConfig(\n ctx: Context,\n verbose: boolean,\n): Promise<{\n config: Config;\n configPath: string;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n const { config, bundledModuleInfos } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n verbose,\n );\n return { config, configPath, bundledModuleInfos };\n}\n\n/**\n * Ensure the functions directory exists.\n *\n * Note: convex.json is treated as user-owned and is not modified by the CLI.\n * Use writeAiFilesConfig() to explicitly patch the aiFiles section.\n */\nexport async function ensureConvexFunctionsDir(\n ctx: Context,\n projectConfig: ProjectConfig,\n) {\n const configPath = await configFilepath(ctx);\n ctx.fs.mkdir(functionsDir(configPath, projectConfig), {\n allowExisting: true,\n });\n}\n\nexport function removedExistingConfig(\n ctx: Context,\n configPath: string,\n options: { allowExistingConfig?: boolean },\n) {\n if (!options.allowExistingConfig) {\n return false;\n }\n recursivelyDelete(ctx, configPath);\n logFinishedStep(`Removed existing ${configPath}`);\n return true;\n}\n\n/** Pull configuration for the root app component from the given remote origin. */\nexport async function pullConfig(\n ctx: Context,\n project: string | undefined,\n team: string | undefined,\n origin: string,\n adminKey: string,\n): Promise<ConfigWithModuleHashes> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: origin,\n adminKey,\n });\n\n changeSpinner(\"Downloading current deployment state...\");\n try {\n const res = await fetch(\"/api/get_config_hashes\", {\n method: \"POST\",\n body: JSON.stringify({ version, adminKey }),\n });\n deprecationCheckWarning(ctx, res);\n const data = await res.json();\n const backendConfig = parseBackendConfig(data.config);\n const projectConfig = {\n ...backendConfig,\n node: {\n // This field is not stored in the backend, which is ok since it is also\n // not used to diff configs.\n externalPackages: [],\n nodeVersion: data.nodeVersion,\n },\n // This field is not stored in the backend, it only affects the client.\n generateCommonJSApi: false,\n // This field is also not stored in the backend, it only affects the client.\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n project,\n team,\n prodUrl: origin,\n };\n return {\n projectConfig,\n moduleHashes: data.moduleHashes,\n // TODO(presley): Add this to diffConfig().\n nodeDependencies: data.nodeDependencies,\n udfServerVersion: data.udfServerVersion,\n };\n } catch (err: unknown) {\n logFailure(`Error: Unable to pull deployment config from ${origin}`);\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\ninterface BundledModuleInfo {\n name: string;\n platform: \"node\" | \"convex\";\n}\n\n/**\n * A component definition spec contains enough information to create bundles\n * of code that must be analyzed in order to construct a ComponentDefinition.\n *\n * Most paths are relative to the directory of the definitionPath.\n */\nexport type ComponentDefinitionSpec = {\n /** This path is relative to the app (root component) directory. */\n definitionPath: ComponentDefinitionPath;\n\n /** Dependencies are paths to the directory of the dependency component definition from the app (root component) directory */\n dependencies: ComponentDefinitionPath[];\n\n // All other paths are relative to the directory of the definitionPath above.\n definition: Bundle;\n schema: Bundle;\n functions: Bundle[];\n};\n\nexport type AppDefinitionSpec = Omit<\n ComponentDefinitionSpec,\n \"definitionPath\"\n> & {\n // Only app (root) component specs contain an auth bundle.\n auth: Bundle | null;\n};\n\nexport type ComponentDefinitionSpecWithoutImpls = Omit<\n ComponentDefinitionSpec,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionSpecWithoutImpls = Omit<\n AppDefinitionSpec,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\n/** Generate a human-readable diff between the two configs. */\nexport function diffConfig(\n oldConfig: ConfigWithModuleHashes,\n newConfig: Config,\n): { diffString: string } {\n let diff = \"\";\n\n let versionMessage = \"\";\n const matches = oldConfig.udfServerVersion === newConfig.udfServerVersion;\n if (oldConfig.udfServerVersion && (!newConfig.udfServerVersion || !matches)) {\n versionMessage += `[-] ${oldConfig.udfServerVersion}\\n`;\n }\n if (newConfig.udfServerVersion && (!oldConfig.udfServerVersion || !matches)) {\n versionMessage += `[+] ${newConfig.udfServerVersion}\\n`;\n }\n if (versionMessage) {\n diff += \"Change the server's function version:\\n\";\n diff += versionMessage;\n }\n\n if (oldConfig.projectConfig.node.nodeVersion !== newConfig.nodeVersion) {\n diff += \"Change the server's version for Node.js actions:\\n\";\n if (oldConfig.projectConfig.node.nodeVersion) {\n diff += `[-] ${oldConfig.projectConfig.node.nodeVersion}\\n`;\n }\n if (newConfig.nodeVersion) {\n diff += `[+] ${newConfig.nodeVersion}\\n`;\n }\n }\n\n return { diffString: diff };\n}\n\nexport function setEnvVarsInstructions(\n names: string[],\n deploymentName: string | null,\n deploymentType: DeploymentType | undefined,\n deploymentUrl: string | undefined,\n): string {\n // Name cloud deployments explicitly: without a flag `env set` targets the\n // project's default dev deployment, which may not be where this push went\n // (e.g. `npx convex dev --deployment <other dev deployment>`). Local and\n // anonymous deployments are always the default target.\n let deploymentFlag = \"\";\n if (\n deploymentName !== null &&\n deploymentType !== \"local\" &&\n deploymentType !== \"anonymous\"\n ) {\n deploymentFlag = ` --deployment ${deploymentName}`;\n } else if (deploymentType === \"prod\") {\n deploymentFlag = \" --prod\";\n } else if (deploymentName === null && deploymentUrl !== undefined) {\n // Pushes via `--url`/`--admin-key` or self-hosted env vars have no\n // deployment name. The admin key stays a placeholder to keep it out of\n // terminal output.\n deploymentFlag = ` --url ${deploymentUrl} --admin-key <admin key>`;\n }\n const commands = (names.length > 0 ? names : [\"<NAME>\"]).map(\n (name) =>\n ` ${chalkStderr.bold(`npx convex env set${deploymentFlag} ${name} <value>`)}`,\n );\n let instructions = `Set ${names.length > 1 ? \"them\" : \"it\"} with:\\n\\n${commands.join(\"\\n\")}\\n`;\n // Anonymous deployments are only reachable from the local dashboard, which\n // `deploymentDashboardUrlPage` can't address.\n if (deploymentName !== null && !isAnonymousDeployment(deploymentName)) {\n const variableQuery = names.length === 1 ? `?var=${names[0]}` : \"\";\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/settings/environment-variables${variableQuery}`,\n );\n instructions += `\\nor in the dashboard:\\n\\n ${chalkStderr.bold(dashboardUrl)}\\n`;\n }\n return instructions;\n}\n\n/** Handle an error from\n * legacy push path:\n * - /api/push_config\n * modern push paths:\n * - /api/deploy2/evaluate_push\n * - /api/deploy2/start_push\n * - /api/deploy2/finish_push\n *\n * finish_push errors are different from start_push errors and in theory could\n * be handled differently, but starting over works for all of them.\n */\nexport async function handlePushConfigError(\n ctx: Context,\n error: unknown,\n defaultMessage: string,\n deploymentName: string | null,\n deployment:\n | {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n }\n | undefined,\n deploymentType: DeploymentType | undefined,\n): Promise<never> {\n const data: ErrorData | undefined =\n error instanceof ThrowingFetchError ? error.serverErrorData : undefined;\n if (data?.code === \"AuthConfigMissingEnvironmentVariable\") {\n const errorMessage = data.message || \"(no error message given)\";\n const [, variableName] =\n errorMessage.match(/Environment variable (\\S+)/i) ?? [];\n\n // DEPRECATED: This error path provisioning is being phased out in favor of\n // pre-flight provisioning that happens before the client bundle build.\n // We keep minimal logic here for backwards compatibility with older templates\n // that may still rely on this path.\n if (variableName === \"WORKOS_CLIENT_ID\" && deploymentName && deployment) {\n // For backwards compatibility with templates that haven't been updated,\n // we'll still show a helpful error message directing users to configure WorkOS.\n // But we no longer do automatic provisioning here since it happens too late\n // (after the client bundle has already been built with missing env vars).\n logWarning(\n \"WORKOS_CLIENT_ID is not set; you can set it manually on the deployment or for hosted Convex deployments, use auto-provisioning.\",\n );\n logMessage(\n \"Learn more at https://docs.convex.dev/auth/authkit/auto-provision\",\n );\n logMessage(\"\");\n }\n\n const envVarMessage =\n `Environment variable ${chalkStderr.bold(\n variableName,\n )} is used in auth config file but ` + `its value was not set.`;\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n errForSentry: error,\n printedMessage:\n envVarMessage +\n \"\\n\" +\n setEnvVarsInstructions(\n variableName !== undefined ? [variableName] : [],\n deploymentName,\n deploymentType,\n deployment?.deploymentUrl,\n ),\n });\n }\n\n if (data?.code === \"MissingEnvironmentVariables\") {\n const errorMessage = data.message || \"(no error message given)\";\n const [, namesList] = errorMessage.match(/are not set: ([^.]+)\\./) ?? [];\n const names = namesList?.split(\", \") ?? [];\n const envVarMessage =\n names.length === 0\n ? errorMessage\n : names.length === 1\n ? `Environment variable ${chalkStderr.bold(names[0])} is ` +\n `declared as required in convex.config.ts but its value was not set.`\n : `Environment variables ${names\n .map((name) => chalkStderr.bold(name))\n .join(\", \")} are declared as required in convex.config.ts ` +\n `but their values were not set.`;\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n errForSentry: error,\n printedMessage:\n envVarMessage +\n \"\\n\" +\n setEnvVarsInstructions(\n names,\n deploymentName,\n deploymentType,\n deployment?.deploymentUrl,\n ),\n });\n }\n\n if (data?.code === \"RaceDetected\") {\n // Environment variables or schema changed during push. This is a transient\n // error that should be retried immediately with exponential backoff.\n const message =\n data.message || \"Schema or environment variables changed during push\";\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: chalkStderr.yellow(message),\n });\n }\n\n if (data?.code === \"InternalServerError\") {\n if (deploymentName?.startsWith(\"local-\")) {\n printLocalDeploymentOnError();\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new LocalDeploymentError(\n \"InternalServerError while pushing to local deployment\",\n ),\n printedMessage: defaultMessage,\n });\n }\n }\n\n logFailure(defaultMessage);\n return await logAndHandleFetchError(ctx, error);\n}\n\nexport type AiFilesProjectConfig = NonNullable<ProjectConfig[\"aiFiles\"]>;\n\nfunction tryParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nfunction toRecord(val: unknown): Record<string, unknown> {\n if (val !== null && typeof val === \"object\" && !Array.isArray(val))\n return val as Record<string, unknown>;\n return {};\n}\n\n/**\n * Write the `aiFiles` section of `convex.json`, preserving all other keys.\n * Writes the given object as-is with no merging or default logic.\n * If `aiFiles` is undefined, the key is removed from the file.\n */\nexport async function writeAiFilesConfig({\n projectDir,\n aiFiles,\n}: {\n projectDir: string;\n aiFiles: AiFilesProjectConfig | undefined;\n}): Promise<void> {\n const filePath = path.join(projectDir, \"convex.json\");\n const raw = await nodeFs.readFile(filePath, \"utf8\").catch(() => null);\n const base = toRecord(raw !== null ? tryParseJson(raw) : {});\n\n const { $schema, aiFiles: _existing, ...rest } = base;\n\n const hasContent = aiFiles !== undefined && Object.keys(aiFiles).length > 0;\n\n const next: Record<string, unknown> = {\n $schema: $schema ?? \"node_modules/convex/schemas/convex.schema.json\",\n ...rest,\n ...(hasContent ? { aiFiles } : {}),\n };\n\n await nodeFs.writeFile(\n filePath,\n JSON.stringify(next, null, 2) + \"\\n\",\n \"utf8\",\n );\n}\n"],
5
+ "mappings": ";AAAA,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AAEjB,SAAS,YAAY,cAAc;AACnC,SAAS,SAAS;AAGlB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,kCAAkC;AAC3C;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAGlC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,mCAAmC;AAE5C,SAAS,6BAA6B;AACtC,SAAS,yBAAyB,qBAAqB;AA4FvD,MAAM,yBAAyB;AAGxB,gBAAS,sBAAsB,eAAuC;AAC3E,SAAO,cAAc,QAAQ,aAAa;AAC5C;AAGO,gBAAS,wBAAwB,eAAuC;AAC7E,SAAO,cAAc,QAAQ,uBAAuB;AACtD;AAKA,sBAAsB,iBACpB,KACA,eACoC;AAEpC,MAAI,aAAa,eAAe;AAC9B,WAAO,cAAc;AAAA,EACvB;AAKA,QAAM,WAAW,MAAM,uBAAuB,GAAG;AACjD,QAAM,sBAAsB,CAAC,EAC3B,YACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,QAAQ;AAGrB,MAAI,qBAAqB;AACvB;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA,eAAW,oDAAoD;AAAA,EACjE;AACF;AAEA,sBAAsB,4BACpB,KACA,eACA,gBAC+C;AAC/C,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,aAAa;AAC/D,SAAO,gBAAgB,cAAc;AACvC;AAGA,MAAM,mBAAmB,MAAM;AAAC;AAGhC,MAAM,yBAAyB,EAAE,MAAM;AAAA,EACrC,EAAE,QAAQ,KAAK;AAAA,EACf,EAAE,OAAO;AAAA,IACP,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAC3C,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACpC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,CAAC;AACH,CAAC;AAED,MAAM,4BAA4B,EAAE,MAAM;AAAA,EACxC,EAAE,QAAQ,KAAK;AAAA,EACf,EAAE,OAAO,EAAE,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,iCAAiC,EAAE,OAAO;AAAA,EAC9C,iBAAiB,EAAE,KAAK,CAAC,eAAe,WAAW,YAAY,CAAC,EAAE,SAAS;AAAA,EAC3E,WAAW,uBAAuB,SAAS;AAAA,EAC3C,cAAc,0BAA0B,SAAS;AACnD,CAAC;AAED,MAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,KAAK,+BAA+B,SAAS;AAAA,EAC7C,SAAS,+BAA+B,SAAS;AAAA,EACjD,MAAM,+BAA+B,SAAS;AAChD,CAAC,EACA;AAAA,EACC,CAAC,SAAS;AAER,UAAM,aAAa,KAAK,KAAK;AAC7B,UAAM,iBAAiB,KAAK,SAAS;AACrC,QAAI,cAAc,gBAAgB;AAChC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM,CAAC,iBAAiB;AAAA,EAC1B;AACF,EACC;AAAA,EACC,CAAC,SAAS;AAGR,QACE,KAAK,SAAS,iBAAiB,UAC/B,KAAK,SAAS,iBAAiB,OAC/B;AACA,aAAO;AAAA,IACT;AAEA,QACE,KAAK,MAAM,iBAAiB,UAC5B,KAAK,MAAM,iBAAiB,OAC5B;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,SACE;AAAA,IACF,MAAM,CAAC,cAAc;AAAA,EACvB;AACF;AAEF,MAAM,aAAa,EAAE,OAAO;AAAA,EAC1B,kBAAkB,EACf,MAAM,EAAE,OAAO,CAAC,EAChB,QAAQ,CAAC,CAAC,EACV;AAAA,IACC;AAAA,EACF;AAAA,EACF,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,kDAAkD;AAChE,CAAC;AAED,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,WAAW,EACR,QAAQ,EACR,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF;AAAA,EACF,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAE1C,oBAAoB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,UAAU,EAAE,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,SAAS;AAC9C,CAAC;AAED,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,uBAAuB,EACpB,QAAQ,EACR,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAED,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,yBAAyB,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9C,QAAQ,EACL,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,SAAS;AACd,CAAC;AAED,MAAM,iBAAiB,CAAyB,WAC9C,OAAO,OAAO,CAAC,QAAQ,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAAA,EAC1D,SAAS;AACX,CAAC;AAGH,MAAM,4BAA4B,CAAC,WAAoB;AACrD,QAAM,aAAa,SAAS,WAAW,OAAO,IAAI,WAAW,YAAY;AACzE,QAAM,gBAAgB,SAClB,cAAc,OAAO,IACrB,cAAc,YAAY;AAC9B,QAAM,gBAAgB,SAClB,cAAc,OAAO,IACrB,cAAc,YAAY;AAE9B,QAAM,aAAa,EAAE,OAAO;AAAA,IAC1B,WAAW,EACR,OAAO,EACP,QAAQ,sBAAsB,EAC9B,SAAS,4CAA4C;AAAA,IACxD,MAAM,WAAW,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC;AAAA,IACjD,SAAS,cAAc,QAAQ;AAAA,MAC7B,WAAW;AAAA,MACX,iBAAiB;AAAA,IACnB,CAAC;AAAA,IACD,SAAS,cAAc,QAAQ,EAAE,uBAAuB,MAAM,CAAC,EAAE,SAAS;AAAA,IAC1E,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAC9C,oBAAoB,EACjB,KAAK,CAAC,OAAO,MAAM,CAAC,EACpB,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA;AAAA,IAGF,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAE7B,SAAS,oBAAoB,SAAS;AAAA,IACtC,SAAS,cAAc,SAAS;AAAA;AAAA;AAAA,IAIhC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,CAAC;AAGD,QAAM,iBAAiB,SACnB,WAAW,OAAO,IAClB,WAAW,YAAY;AAG3B,SAAO,eAAe;AAAA,IACpB,CAAC,SAAS;AAER,UAAI,KAAK,uBAAuB,KAAK,QAAQ,aAAa,MAAM;AAC9D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,SACE;AAAA,MAGF,MAAM,CAAC,qBAAqB;AAAA,IAC9B;AAAA,EACF;AACF;AAGA,MAAM,sBAAsB,eAAe,0BAA0B,KAAK,CAAC;AAG3E,MAAM,4BAA4B;AAAA,EAChC,0BAA0B,IAAI;AAChC;AAEA,MAAM,oBAAoB,oBAAI,IAAY;AACnC,gBAAS,0BAA0B;AACxC,oBAAkB,MAAM;AAC1B;AAGA,sBAAsB,mBACpB,KACA,KACwB;AACxB,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,MAAM,QAAQ,GAAG,GAAG;AACjE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI;AAEF,WAAO,0BAA0B,MAAM,GAAG;AAAA,EAC5C,SAAS,OAAO;AACd,QAAI,iBAAiB,EAAE,UAAU;AAE/B,YAAM,mBAAmB,MAAM,OAAO;AAAA,QACpC,CAAC,UAAU,MAAM,SAAS;AAAA,MAC5B;AAEA,UACE,iBAAiB,SAAS,KAC1B,iBAAiB,WAAW,MAAM,OAAO,QACzC;AAEA,mBAAW,SAAS,kBAAkB;AACpC,cAAI,MAAM,SAAS,qBAAqB;AACtC,kBAAM,aACJ,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI,MAAM;AACvD,kBAAM,cAAc,MAAM;AAC1B,kBAAM,iBAAiB,YAAY;AAAA,cACjC,CAAC,QAAQ,CAAC,kBAAkB,IAAI,aAAa,GAAG;AAAA,YAClD;AAEA,gBAAI,eAAe,SAAS,GAAG;AAC7B,oBAAM,WACJ,MAAM,KAAK,SAAS,IAChB,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,OACzB;AACN;AAAA,gBACE,YAAY;AAAA,kBACV,oBAAoB,eAAe,WAAW,IAAI,aAAa,YAAY,OAAO,QAAQ,KAAK,eAAe,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,gBACjJ;AAAA,cACF;AACA;AAAA,gBACE,YAAY;AAAA,kBACV;AAAA,gBACF;AAAA,cACF;AAGA,6BAAe;AAAA,gBAAQ,CAAC,QACtB,kBAAkB,IAAI,aAAa,GAAG;AAAA,cACxC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO,oBAAoB,MAAM,GAAG;AAAA,MACtC;AAGA,UAAI,iBAAiB,EAAE,UAAU;AAC/B,cAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,cAAM,UAAU,MAAM,KAAK,KAAK,GAAG;AACnC,cAAM,UAAU,UACZ,KAAK,OAAO,0BAA0B,MAAM,OAAO,KACnD,oBAAoB,MAAM,OAAO;AACrC,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAiB,MAAc,SAAS;AAAA,IAC1C,CAAC;AAAA,EACH;AACF;AAIA,SAAS,mBAAmB,KAG1B;AACA,WAAS,gBAAgB,SAAiB;AAGxC,UAAM,IAAI,WAAW,OAAO;AAAA,EAC9B;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,oBAAgB,oBAAoB;AAAA,EACtC;AACA,QAAM,EAAE,WAAW,YAAY,IAAI;AACnC,MAAI,OAAO,cAAc,UAAU;AACjC,oBAAgB,mCAAmC;AAAA,EACrD;AAEA,MAAI,OAAO,gBAAgB,eAAe,OAAO,gBAAgB,UAAU;AACzE,oBAAgB,qCAAqC;AAAA,EACvD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAK,eAAe,UAAU,OAAO,EAAE,YAAyB,IAAI,CAAC;AAAA,EACvE;AACF;AAEO,gBAAS,aAAqB;AACnC,SAAO;AACT;AAEA,sBAAsB,eAAe,KAA+B;AAClE,QAAM,WAAW,WAAW;AAI5B,QAAM,oBAAoB;AAC1B,QAAM,gBAAgB,KAAK,KAAK,OAAO,QAAQ;AAG/C,QAAM,0BAA0B,IAAI,GAAG,OAAO,iBAAiB;AAC/D,QAAM,sBAAsB,IAAI,GAAG,OAAO,aAAa;AACvD,MAAI,2BAA2B,qBAAqB;AAClD,UAAM,UAAU,GAAG,YAAY,IAAI,eAAe,iBAAiB,QAAQ,aAAa,eAAe,CAAC;AAAA,+BAAkC,aAAa;AACvJ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,MAAI,CAAC,2BAA2B,qBAAqB;AACnD,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,sBAAsB,aAAa;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,sBAAsB,0BAA0B,KAA+B;AAC7E,QAAM,EAAE,eAAe,WAAW,IAAI,MAAM,kBAAkB,GAAG;AACjE,SAAO,aAAa,YAAY,aAAa;AAC/C;AAGA,sBAAsB,kBAAkB,KAGrC;AACD,MAAI,CAAC,IAAI,GAAG,OAAO,aAAa,GAAG;AAGjC,UAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,UAAM,mBAAmB,mBAAmB;AAC5C,WAAO;AAAA,MACL,eAAe;AAAA,QACb,WAAW,mBACP,OAAO,sBAAsB,KAC7B;AAAA,QACJ,MAAM;AAAA,UACJ,kBAAkB,CAAC;AAAA,QACrB;AAAA,QACA,qBAAqB;AAAA,QACrB,SAAS;AAAA,UACP,WAAW;AAAA,UACX,iBAAiB;AAAA,QACnB;AAAA,QACA,SAAS,CAAC;AAAA,MACZ;AAAA,MACA,YAAY,WAAW;AAAA,IACzB;AAAA,EACF;AACA,MAAI;AACJ,QAAM,aAAa,MAAM,eAAe,GAAG;AAC3C,MAAI;AACF,oBAAgB,MAAM;AAAA,MACpB;AAAA,MACA,KAAK,MAAM,IAAI,GAAG,aAAa,UAAU,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,cAAc,eAAe,aAAa;AAC3D,eAAS,YAAY,IAAI,mBAAmB,UAAU,UAAU,CAAC;AACjE,iBAAW,YAAY,KAAK,IAAI,SAAS,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL;AAAA,QACE,8CAA8C,UAAU;AAAA;AAAA,MAE1D;AACA,UAAI,eAAe,OAAO;AACxB,iBAAS,YAAY,IAAI,IAAI,OAAO,CAAC;AAAA,MACvC;AAAA,IACF;AACA,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA;AAAA,MAEd,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAMA,sBAAsB,wBACpB,KACA,eACA,YACA,SAIC;AACD,QAAM,UAAU,aAAa,YAAY,aAAa;AAGtD,QAAM,cAAc,MAAM,yBAAyB,KAAK,OAAO;AAE/D,MAAI,SAAS;AACX,gBAAY,0CAA0C;AAAA,EACxD;AACA,QAAM,eAAe,MAAM,OAAO;AAAA,IAChC;AAAA,IACA,KAAK;AAAA,IACL,aAAa,YAAY;AAAA,IACzB,oBAAoB;AAAA,IACpB,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,SAAS;AACX;AAAA,MACE;AAAA,MACA,aAAa,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACxC;AAAA,EACF;AAGA,MAAI,WAAW,YAAY,KAAK,WAAW,GAAG;AAC5C,gBAAY,yCAAyC;AAAA,EACvD;AACA,QAAM,aAAa,MAAM,OAAO;AAAA,IAC9B;AAAA,IACA,KAAK;AAAA,IACL,aAAa,YAAY;AAAA,IACzB,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,cAAc,KAAK,KAAK,SAAS,MAAM;AAAA,IACvC,2BAA2B,cAAc,KAAK;AAAA,EAChD,CAAC;AACD,MAAI,WAAW,YAAY,KAAK,WAAW,GAAG;AAC5C;AAAA,MACE;AAAA,MACA,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACtC;AACA,QAAI,cAAc,KAAK,iBAAiB,SAAS,GAAG;AAClD;AAAA,QACE;AAAA,QACA,CAAC,GAAG,WAAW,qBAAqB,QAAQ,CAAC,EAAE;AAAA,UAC7C,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,aAAa;AAC7B,UAAQ,KAAK,GAAG,WAAW,OAAO;AAClC,UAAQ,KAAK,IAAI,MAAM,iBAAiB,KAAK,OAAO,GAAG,OAAO;AAE9D,QAAM,mBAAqC,CAAC;AAC5C,aAAW,CAAC,YAAY,aAAa,KAAK,WAAW,sBAAsB;AACzE,qBAAiB,KAAK,EAAE,MAAM,YAAY,SAAS,cAAc,CAAC;AAAA,EACpE;AAEA,QAAM,qBAA0C,MAAM;AAAA,IACpD,aAAa,mBAAmB,KAAK;AAAA,EACvC,EAAE,IAAI,CAAC,eAAe;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AACD,qBAAmB;AAAA,IACjB,GAAG,MAAM,KAAK,WAAW,mBAAmB,KAAK,CAAC,EAAE;AAAA,MAClD,CAAC,eAAkC;AACjC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,MAIA,kBAAkB;AAAA,MAClB,aAAa,cAAc,KAAK;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAKA,sBAAsB,4BACpB,KACA,eACA,YACe;AACf,QAAM,UAAU,aAAa,YAAY,aAAa;AACtD,QAAM,cAAc,MAAM,yBAAyB,KAAK,OAAO;AAC/D,MAAI,YAAY,QAAQ,WAAW,GAAG;AACpC,oBAAgB,kCAAkC;AAAA,EACpD;AACA,QAAM,4BAA4B,KAAK;AAAA,IACrC,aAAa,YAAY;AAAA,IACzB,iBAAiB,CAAC;AAAA,IAClB,KAAK;AAAA,EACP,CAAC;AACH;AAKA,sBAAsB,WACpB,KACA,SAKC;AACD,QAAM,EAAE,eAAe,WAAW,IAAI,MAAM,kBAAkB,GAAG;AACjE,QAAM,EAAE,QAAQ,mBAAmB,IAAI,MAAM;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,YAAY,mBAAmB;AAClD;AAQA,sBAAsB,yBACpB,KACA,eACA;AACA,QAAM,aAAa,MAAM,eAAe,GAAG;AAC3C,MAAI,GAAG,MAAM,aAAa,YAAY,aAAa,GAAG;AAAA,IACpD,eAAe;AAAA,EACjB,CAAC;AACH;AAEO,gBAAS,sBACd,KACA,YACA,SACA;AACA,MAAI,CAAC,QAAQ,qBAAqB;AAChC,WAAO;AAAA,EACT;AACA,oBAAkB,KAAK,UAAU;AACjC,kBAAgB,oBAAoB,UAAU,EAAE;AAChD,SAAO;AACT;AAGA,sBAAsB,WACpB,KACA,SACA,MACA,QACA,UACiC;AACjC,QAAM,QAAQ,gBAAgB,KAAK;AAAA,IACjC,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AAED,gBAAc,yCAAyC;AACvD,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,0BAA0B;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAS,SAAS,CAAC;AAAA,IAC5C,CAAC;AACD,4BAAwB,KAAK,GAAG;AAChC,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,gBAAgB,mBAAmB,KAAK,MAAM;AACpD,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,MAAM;AAAA;AAAA;AAAA,QAGJ,kBAAkB,CAAC;AAAA,QACnB,aAAa,KAAK;AAAA,MACpB;AAAA;AAAA,MAEA,qBAAqB;AAAA;AAAA,MAErB,SAAS;AAAA,QACP,WAAW;AAAA,QACX,iBAAiB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA;AAAA,MAEnB,kBAAkB,KAAK;AAAA,MACvB,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,SAAS,KAAc;AACrB,eAAW,gDAAgD,MAAM,EAAE;AACnE,WAAO,MAAM,uBAAuB,KAAK,GAAG;AAAA,EAC9C;AACF;AA4CO,gBAAS,WACd,WACA,WACwB;AACxB,MAAI,OAAO;AAEX,MAAI,iBAAiB;AACrB,QAAM,UAAU,UAAU,qBAAqB,UAAU;AACzD,MAAI,UAAU,qBAAqB,CAAC,UAAU,oBAAoB,CAAC,UAAU;AAC3E,sBAAkB,OAAO,UAAU,gBAAgB;AAAA;AAAA,EACrD;AACA,MAAI,UAAU,qBAAqB,CAAC,UAAU,oBAAoB,CAAC,UAAU;AAC3E,sBAAkB,OAAO,UAAU,gBAAgB;AAAA;AAAA,EACrD;AACA,MAAI,gBAAgB;AAClB,YAAQ;AACR,YAAQ;AAAA,EACV;AAEA,MAAI,UAAU,cAAc,KAAK,gBAAgB,UAAU,aAAa;AACtE,YAAQ;AACR,QAAI,UAAU,cAAc,KAAK,aAAa;AAC5C,cAAQ,OAAO,UAAU,cAAc,KAAK,WAAW;AAAA;AAAA,IACzD;AACA,QAAI,UAAU,aAAa;AACzB,cAAQ,OAAO,UAAU,WAAW;AAAA;AAAA,IACtC;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,KAAK;AAC5B;AAEO,gBAAS,uBACd,OACA,gBACA,gBACA,eACQ;AAKR,MAAI,iBAAiB;AACrB,MACE,mBAAmB,QACnB,mBAAmB,WACnB,mBAAmB,aACnB;AACA,qBAAiB,iBAAiB,cAAc;AAAA,EAClD,WAAW,mBAAmB,QAAQ;AACpC,qBAAiB;AAAA,EACnB,WAAW,mBAAmB,QAAQ,kBAAkB,QAAW;AAIjE,qBAAiB,UAAU,aAAa;AAAA,EAC1C;AACA,QAAM,YAAY,MAAM,SAAS,IAAI,QAAQ,CAAC,QAAQ,GAAG;AAAA,IACvD,CAAC,SACC,OAAO,YAAY,KAAK,qBAAqB,cAAc,IAAI,IAAI,UAAU,CAAC;AAAA,EAClF;AACA,MAAI,eAAe,OAAO,MAAM,SAAS,IAAI,SAAS,IAAI;AAAA;AAAA,EAAa,SAAS,KAAK,IAAI,CAAC;AAAA;AAG1F,MAAI,mBAAmB,QAAQ,CAAC,sBAAsB,cAAc,GAAG;AACrE,UAAM,gBAAgB,MAAM,WAAW,IAAI,QAAQ,MAAM,CAAC,CAAC,KAAK;AAChE,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,kCAAkC,aAAa;AAAA,IACjD;AACA,oBAAgB;AAAA;AAAA;AAAA,MAAiC,YAAY,KAAK,YAAY,CAAC;AAAA;AAAA,EACjF;AACA,SAAO;AACT;AAaA,sBAAsB,sBACpB,KACA,OACA,gBACA,gBACA,YAOA,gBACgB;AAChB,QAAM,OACJ,iBAAiB,qBAAqB,MAAM,kBAAkB;AAChE,MAAI,MAAM,SAAS,wCAAwC;AACzD,UAAM,eAAe,KAAK,WAAW;AACrC,UAAM,CAAC,EAAE,YAAY,IACnB,aAAa,MAAM,6BAA6B,KAAK,CAAC;AAMxD,QAAI,iBAAiB,sBAAsB,kBAAkB,YAAY;AAKvE;AAAA,QACE;AAAA,MACF;AACA;AAAA,QACE;AAAA,MACF;AACA,iBAAW,EAAE;AAAA,IACf;AAEA,UAAM,gBACJ,wBAAwB,YAAY;AAAA,MAClC;AAAA,IACF,CAAC;AACH,UAAM,IAAI,MAAM;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBACE,gBACA,OACA;AAAA,QACE,iBAAiB,SAAY,CAAC,YAAY,IAAI,CAAC;AAAA,QAC/C;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,SAAS,+BAA+B;AAChD,UAAM,eAAe,KAAK,WAAW;AACrC,UAAM,CAAC,EAAE,SAAS,IAAI,aAAa,MAAM,wBAAwB,KAAK,CAAC;AACvE,UAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,CAAC;AACzC,UAAM,gBACJ,MAAM,WAAW,IACb,eACA,MAAM,WAAW,IACf,wBAAwB,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,4EAElD,yBAAyB,MACtB,IAAI,CAAC,SAAS,YAAY,KAAK,IAAI,CAAC,EACpC,KAAK,IAAI,CAAC;AAErB,UAAM,IAAI,MAAM;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBACE,gBACA,OACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,SAAS,gBAAgB;AAGjC,UAAM,UACJ,KAAK,WAAW;AAClB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB,YAAY,OAAO,OAAO;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,SAAS,uBAAuB;AACxC,QAAI,gBAAgB,WAAW,QAAQ,GAAG;AACxC,kCAA4B;AAC5B,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,cAAc,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,cAAc;AACzB,SAAO,MAAM,uBAAuB,KAAK,KAAK;AAChD;AAIA,SAAS,aAAa,KAAsB;AAC1C,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,SAAS,KAAuC;AACvD,MAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG;AAC/D,WAAO;AACT,SAAO,CAAC;AACV;AAOA,sBAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AACF,GAGkB;AAChB,QAAM,WAAW,KAAK,KAAK,YAAY,aAAa;AACpD,QAAM,MAAM,MAAM,OAAO,SAAS,UAAU,MAAM,EAAE,MAAM,MAAM,IAAI;AACpE,QAAM,OAAO,SAAS,QAAQ,OAAO,aAAa,GAAG,IAAI,CAAC,CAAC;AAE3D,QAAM,EAAE,SAAS,SAAS,WAAW,GAAG,KAAK,IAAI;AAEjD,QAAM,aAAa,YAAY,UAAa,OAAO,KAAK,OAAO,EAAE,SAAS;AAE1E,QAAM,OAAgC;AAAA,IACpC,SAAS,WAAW;AAAA,IACpB,GAAG;AAAA,IACH,GAAI,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,EAClC;AAEA,QAAM,OAAO;AAAA,IACX;AAAA,IACA,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAAA,IAChC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -340,7 +340,9 @@ export async function deployToDeployment(ctx, credentials, options) {
340
340
  writePushRequest: options.writePushRequest,
341
341
  liveComponentSources: !!options.liveComponentSources,
342
342
  pushAllModules: !!options.pushAllModules,
343
- largeIndexDeletionCheck: options.allowDeletingLargeIndexes ? "has confirmation" : "ask for confirmation",
343
+ largeIndexDeletionCheck: options.skipLargeIndexesCheck || options.allowDeletingLargeIndexes ? "has confirmation" : "ask for confirmation",
344
+ largeIndexBackfillCheck: options.skipLargeIndexesCheck ? "has confirmation" : "ask for confirmation",
345
+ stagedValidatorDeletionCheck: options.allowUnstagingSchema ? "has confirmation" : "ask for confirmation",
344
346
  warnOnSlowSchemaValidation: true,
345
347
  message: options.message
346
348
  };