convex 1.45.0 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/CHANGELOG.md +48 -6
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/http_client.js.map +2 -2
  5. package/dist/cjs/browser/query_options.js.map +2 -2
  6. package/dist/cjs/browser/simple_client.js.map +2 -2
  7. package/dist/cjs/browser/sync/optimistic_updates.js.map +1 -1
  8. package/dist/cjs/browser/sync/optimistic_updates_impl.js.map +2 -2
  9. package/dist/cjs/cli/codegen.js +2 -0
  10. package/dist/cjs/cli/codegen.js.map +2 -2
  11. package/dist/cjs/cli/deploy.js +1 -0
  12. package/dist/cjs/cli/deploy.js.map +2 -2
  13. package/dist/cjs/cli/docs.js +3 -36
  14. package/dist/cjs/cli/docs.js.map +2 -2
  15. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +101 -60
  16. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  17. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +107 -0
  18. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  19. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  20. package/dist/cjs/cli/lib/components.js +12 -0
  21. package/dist/cjs/cli/lib/components.js.map +2 -2
  22. package/dist/cjs/cli/lib/deploy2.js +29 -2
  23. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  24. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +73 -0
  25. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  26. package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
  27. package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
  28. package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
  29. package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
  30. package/dist/cjs/cli/lib/dev.js +1 -0
  31. package/dist/cjs/cli/lib/dev.js.map +2 -2
  32. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  33. package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
  34. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  35. package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
  36. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  37. package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
  38. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  39. package/dist/cjs/cli/lib/run.js +1 -0
  40. package/dist/cjs/cli/lib/run.js.map +2 -2
  41. package/dist/cjs/cli/lib/utils/utils.js +36 -29
  42. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  43. package/dist/cjs/index.js +1 -1
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/nextjs/index.js.map +2 -2
  46. package/dist/cjs/react/client.js.map +2 -2
  47. package/dist/cjs/react/hydration.js.map +2 -2
  48. package/dist/cjs/react/queries_observer.js.map +2 -2
  49. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  50. package/dist/cjs/react/use_queries.js.map +2 -2
  51. package/dist/cjs/server/api.js.map +2 -2
  52. package/dist/cjs/server/components/index.js.map +2 -2
  53. package/dist/cjs/server/cron.js +10 -10
  54. package/dist/cjs/server/cron.js.map +2 -2
  55. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  56. package/dist/cjs/server/impl/meta_impl.js +8 -2
  57. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  58. package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
  59. package/dist/cjs/server/index.js.map +2 -2
  60. package/dist/cjs/server/meta.js.map +1 -1
  61. package/dist/cjs/server/registration.js.map +1 -1
  62. package/dist/cjs/server/scheduler.js.map +1 -1
  63. package/dist/cjs/server/schema.js +50 -3
  64. package/dist/cjs/server/schema.js.map +2 -2
  65. package/dist/cjs/values/validator.js +1 -1
  66. package/dist/cjs/values/validator.js.map +2 -2
  67. package/dist/cjs/values/validators.js +81 -25
  68. package/dist/cjs/values/validators.js.map +2 -2
  69. package/dist/cjs-types/browser/http_client.d.ts +5 -5
  70. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  71. package/dist/cjs-types/browser/query_options.d.ts +2 -2
  72. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  73. package/dist/cjs-types/browser/simple_client.d.ts +6 -6
  74. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  75. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
  76. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  77. package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  78. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  79. package/dist/cjs-types/cli/docs.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  81. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  83. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  84. package/dist/cjs-types/cli/lib/codegen.d.ts +1 -0
  85. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  86. package/dist/cjs-types/cli/lib/components.d.ts +1 -0
  87. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  88. package/dist/cjs-types/cli/lib/deploy2.d.ts +6 -0
  89. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  90. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  91. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  92. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  93. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  94. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  96. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  97. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
  98. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
  101. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -5
  104. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  105. package/dist/cjs-types/index.d.ts +1 -1
  106. package/dist/cjs-types/nextjs/index.d.ts +6 -6
  107. package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
  108. package/dist/cjs-types/react/client.d.ts +15 -15
  109. package/dist/cjs-types/react/client.d.ts.map +1 -1
  110. package/dist/cjs-types/react/hydration.d.ts +3 -3
  111. package/dist/cjs-types/react/hydration.d.ts.map +1 -1
  112. package/dist/cjs-types/react/queries_observer.d.ts +9 -9
  113. package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
  114. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  115. package/dist/cjs-types/react/use_queries.d.ts +14 -6
  116. package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
  117. package/dist/cjs-types/server/api.d.ts +157 -7
  118. package/dist/cjs-types/server/api.d.ts.map +1 -1
  119. package/dist/cjs-types/server/components/index.d.ts +2 -2
  120. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  121. package/dist/cjs-types/server/cron.d.ts +21 -20
  122. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  123. package/dist/cjs-types/server/impl/actions_impl.d.ts +4 -4
  124. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  125. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  126. package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
  127. package/dist/cjs-types/server/index.d.ts +1 -1
  128. package/dist/cjs-types/server/index.d.ts.map +1 -1
  129. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  130. package/dist/cjs-types/server/registration.d.ts +7 -7
  131. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  132. package/dist/cjs-types/server/scheduler.d.ts +9 -7
  133. package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
  134. package/dist/cjs-types/server/schema.d.ts +1 -0
  135. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  136. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  137. package/dist/cjs-types/values/validators.d.ts +30 -0
  138. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  139. package/dist/cli.bundle.cjs +347 -133
  140. package/dist/cli.bundle.cjs.map +4 -4
  141. package/dist/esm/browser/http_client.js.map +2 -2
  142. package/dist/esm/browser/query_options.js.map +2 -2
  143. package/dist/esm/browser/simple_client.js.map +2 -2
  144. package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
  145. package/dist/esm/cli/codegen.js +2 -0
  146. package/dist/esm/cli/codegen.js.map +2 -2
  147. package/dist/esm/cli/deploy.js +1 -0
  148. package/dist/esm/cli/deploy.js.map +2 -2
  149. package/dist/esm/cli/docs.js +3 -43
  150. package/dist/esm/cli/docs.js.map +2 -2
  151. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +100 -60
  152. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  153. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +85 -0
  154. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  155. package/dist/esm/cli/lib/codegen.js.map +2 -2
  156. package/dist/esm/cli/lib/components.js +12 -0
  157. package/dist/esm/cli/lib/components.js.map +2 -2
  158. package/dist/esm/cli/lib/deploy2.js +30 -2
  159. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  160. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +46 -0
  161. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  162. package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
  163. package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
  164. package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
  165. package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
  166. package/dist/esm/cli/lib/dev.js +1 -0
  167. package/dist/esm/cli/lib/dev.js.map +2 -2
  168. package/dist/esm/cli/lib/localDeployment/run.js +30 -2
  169. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  170. package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
  171. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  172. package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
  173. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  174. package/dist/esm/cli/lib/run.js +1 -0
  175. package/dist/esm/cli/lib/run.js.map +2 -2
  176. package/dist/esm/cli/lib/utils/utils.js +36 -30
  177. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  178. package/dist/esm/index.js +1 -1
  179. package/dist/esm/index.js.map +1 -1
  180. package/dist/esm/nextjs/index.js.map +2 -2
  181. package/dist/esm/react/client.js.map +2 -2
  182. package/dist/esm/react/hydration.js +3 -1
  183. package/dist/esm/react/hydration.js.map +2 -2
  184. package/dist/esm/react/queries_observer.js +3 -1
  185. package/dist/esm/react/queries_observer.js.map +2 -2
  186. package/dist/esm/react/use_paginated_query2.js +3 -1
  187. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  188. package/dist/esm/react/use_queries.js.map +2 -2
  189. package/dist/esm/server/api.js.map +2 -2
  190. package/dist/esm/server/components/index.js.map +2 -2
  191. package/dist/esm/server/cron.js +13 -11
  192. package/dist/esm/server/cron.js.map +2 -2
  193. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  194. package/dist/esm/server/impl/meta_impl.js +9 -3
  195. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  196. package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
  197. package/dist/esm/server/index.js.map +2 -2
  198. package/dist/esm/server/schema.js +50 -3
  199. package/dist/esm/server/schema.js.map +2 -2
  200. package/dist/esm/values/validator.js +1 -1
  201. package/dist/esm/values/validator.js.map +2 -2
  202. package/dist/esm/values/validators.js +81 -25
  203. package/dist/esm/values/validators.js.map +2 -2
  204. package/dist/esm-types/browser/http_client.d.ts +5 -5
  205. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  206. package/dist/esm-types/browser/query_options.d.ts +2 -2
  207. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  208. package/dist/esm-types/browser/simple_client.d.ts +6 -6
  209. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  210. package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
  211. package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  212. package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  213. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  214. package/dist/esm-types/cli/docs.d.ts.map +1 -1
  215. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  216. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  217. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  218. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  219. package/dist/esm-types/cli/lib/codegen.d.ts +1 -0
  220. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  221. package/dist/esm-types/cli/lib/components.d.ts +1 -0
  222. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  223. package/dist/esm-types/cli/lib/deploy2.d.ts +6 -0
  224. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  225. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  226. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  227. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  228. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  229. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  230. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  231. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  232. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
  233. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  234. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  235. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
  236. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  237. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  238. package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -5
  239. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  240. package/dist/esm-types/index.d.ts +1 -1
  241. package/dist/esm-types/nextjs/index.d.ts +6 -6
  242. package/dist/esm-types/nextjs/index.d.ts.map +1 -1
  243. package/dist/esm-types/react/client.d.ts +15 -15
  244. package/dist/esm-types/react/client.d.ts.map +1 -1
  245. package/dist/esm-types/react/hydration.d.ts +3 -3
  246. package/dist/esm-types/react/hydration.d.ts.map +1 -1
  247. package/dist/esm-types/react/queries_observer.d.ts +9 -9
  248. package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
  249. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  250. package/dist/esm-types/react/use_queries.d.ts +14 -6
  251. package/dist/esm-types/react/use_queries.d.ts.map +1 -1
  252. package/dist/esm-types/server/api.d.ts +157 -7
  253. package/dist/esm-types/server/api.d.ts.map +1 -1
  254. package/dist/esm-types/server/components/index.d.ts +2 -2
  255. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  256. package/dist/esm-types/server/cron.d.ts +21 -20
  257. package/dist/esm-types/server/cron.d.ts.map +1 -1
  258. package/dist/esm-types/server/impl/actions_impl.d.ts +4 -4
  259. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  260. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  261. package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
  262. package/dist/esm-types/server/index.d.ts +1 -1
  263. package/dist/esm-types/server/index.d.ts.map +1 -1
  264. package/dist/esm-types/server/meta.d.ts.map +1 -1
  265. package/dist/esm-types/server/registration.d.ts +7 -7
  266. package/dist/esm-types/server/registration.d.ts.map +1 -1
  267. package/dist/esm-types/server/scheduler.d.ts +9 -7
  268. package/dist/esm-types/server/scheduler.d.ts.map +1 -1
  269. package/dist/esm-types/server/schema.d.ts +1 -0
  270. package/dist/esm-types/server/schema.d.ts.map +1 -1
  271. package/dist/esm-types/values/validator.d.ts.map +1 -1
  272. package/dist/esm-types/values/validators.d.ts +30 -0
  273. package/dist/esm-types/values/validators.d.ts.map +1 -1
  274. package/dist/react.bundle.js +1 -1
  275. package/dist/react.bundle.js.map +2 -2
  276. package/package.json +5 -5
  277. package/src/browser/http_client.ts +43 -10
  278. package/src/browser/query_options.ts +11 -5
  279. package/src/browser/simple_client.ts +35 -14
  280. package/src/browser/sync/optimistic_updates.ts +17 -4
  281. package/src/browser/sync/optimistic_updates_impl.ts +17 -4
  282. package/src/cli/codegen.ts +1 -0
  283. package/src/cli/deploy.ts +1 -0
  284. package/src/cli/docs.ts +3 -44
  285. package/src/cli/lib/checkForLargeIndexDeletion.ts +154 -82
  286. package/src/cli/lib/checkForSlowSchemaValidation.ts +130 -0
  287. package/src/cli/lib/codegen.ts +1 -0
  288. package/src/cli/lib/components.ts +17 -0
  289. package/src/cli/lib/deploy2.ts +56 -1
  290. package/src/cli/lib/deployApi/evaluateSchema.ts +62 -0
  291. package/src/cli/lib/deployApi/finishPush.ts +1 -1
  292. package/src/cli/lib/deployApi/startPush.ts +1 -1
  293. package/src/cli/lib/dev.ts +1 -0
  294. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  295. package/src/cli/lib/localDeployment/run.ts +44 -2
  296. package/src/cli/lib/localDeployment/upgrade.ts +4 -6
  297. package/src/cli/lib/localDeployment/utils.ts +6 -0
  298. package/src/cli/lib/run.ts +1 -0
  299. package/src/cli/lib/utils/utils.ts +63 -35
  300. package/src/index.ts +1 -1
  301. package/src/nextjs/index.ts +19 -8
  302. package/src/react/client.ts +73 -30
  303. package/src/react/hydration.tsx +14 -6
  304. package/src/react/queries_observer.ts +19 -16
  305. package/src/react/use_paginated_query2.ts +10 -6
  306. package/src/react/use_queries.ts +23 -7
  307. package/src/server/api.ts +220 -14
  308. package/src/server/components/index.ts +4 -6
  309. package/src/server/cron.ts +34 -24
  310. package/src/server/impl/actions_impl.ts +13 -4
  311. package/src/server/impl/meta_impl.ts +8 -1
  312. package/src/server/impl/scheduler_impl.ts +13 -6
  313. package/src/server/index.ts +1 -0
  314. package/src/server/meta.ts +25 -0
  315. package/src/server/registration.ts +28 -7
  316. package/src/server/scheduler.ts +22 -7
  317. package/src/server/schema.ts +55 -0
  318. package/src/values/validator.ts +3 -1
  319. package/src/values/validators.ts +84 -26
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/codegen.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport { compareModulePaths } from \"../codegen_templates/common.js\";\nimport {\n dynamicDataModelDTS,\n dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return { codegenDir, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const { codegenDir } = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const { codegenDir } = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\n\n/* This component defined in a dist directory; it is probably in a node_module\n * directory, installed from a package. It is stuck with the files it has.\n * Heuristics for this:\n * - component definition has a dist/ directory as an ancestor\n * - component definition is a .js file\n * - presence of .js.map files\n * We may improve this heuristic.\n */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n // We never codegen for a published package (you need to link to the convex.config.ts file instead).\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(`Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort(compareModulePaths);\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(`# ${path.resolve(destination)}`);\n logOutput(formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(`Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport { compareModulePaths } from \"../codegen_templates/common.js\";\nimport {\n dynamicDataModelDTS,\n dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n warnOnSlowSchemaValidation: boolean;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return { codegenDir, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const { codegenDir } = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const { codegenDir } = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\n\n/* This component defined in a dist directory; it is probably in a node_module\n * directory, installed from a package. It is stuck with the files it has.\n * Heuristics for this:\n * - component definition has a dist/ directory as an ancestor\n * - component definition is a .js file\n * - presence of .js.map files\n * We may improve this heuristic.\n */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n // We never codegen for a published package (you need to link to the convex.config.ts file instead).\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(`Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort(compareModulePaths);\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(`# ${path.resolve(destination)}`);\n logOutput(formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(`Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["path", "functionsDir", "isPublishedPackage", "prettier"]
7
7
  }
@@ -53,6 +53,7 @@ var import_constants = require("./components/constants.js");
53
53
  var import_dashboard = require("./dashboard.js");
54
54
  var import_indexes = require("./indexes.js");
55
55
  var import_checkForLargeIndexDeletion = require("./checkForLargeIndexDeletion.js");
56
+ var import_checkForSlowSchemaValidation = require("./checkForSlowSchemaValidation.js");
56
57
  var import_crypto = require("crypto");
57
58
  async function runCodegen(ctx, credentials, options) {
58
59
  await (0, import_utils.ensureHasConvexDependency)(ctx, "codegen");
@@ -325,6 +326,17 @@ async function startComponentsPushAndCodegen(ctx, parentSpan, projectConfig, con
325
326
  })
326
327
  );
327
328
  }
329
+ if (options.dryRun && options.warnOnSlowSchemaValidation) {
330
+ await parentSpan.enterAsync(
331
+ "checkForSlowSchemaValidation",
332
+ (span) => (0, import_checkForSlowSchemaValidation.checkForSlowSchemaValidation)({
333
+ ctx,
334
+ span,
335
+ request: startPushRequest,
336
+ options
337
+ })
338
+ );
339
+ }
328
340
  (0, import_log.changeSpinner)("Uploading functions to Convex...");
329
341
  const startPushResponse = await parentSpan.enterAsync(
330
342
  "startPush",
@@ -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 { 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 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 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 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": "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",
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": "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",
6
6
  "names": ["path", "impl", "module"]
7
7
  }
@@ -30,6 +30,7 @@ var deploy2_exports = {};
30
30
  __export(deploy2_exports, {
31
31
  deployToDeployment: () => deployToDeployment,
32
32
  evaluatePush: () => evaluatePush,
33
+ evaluateSchema: () => evaluateSchema,
33
34
  fetchDeploymentCanonicalUrls: () => fetchDeploymentCanonicalUrls,
34
35
  finishPush: () => finishPush,
35
36
  reportPushCompleted: () => reportPushCompleted,
@@ -42,6 +43,7 @@ var import_log = require("../../bundler/log.js");
42
43
  var import_child_process = require("child_process");
43
44
  var import_utils = require("./utils/utils.js");
44
45
  var import_startPush = require("./deployApi/startPush.js");
46
+ var import_evaluateSchema = require("./deployApi/evaluateSchema.js");
45
47
  var import_chalk = require("chalk");
46
48
  var import_finishPush = require("./deployApi/finishPush.js");
47
49
  var import_node_util = require("node:util");
@@ -88,7 +90,19 @@ async function evaluatePush(ctx, span, request, options) {
88
90
  );
89
91
  return import_startPush.evaluatePushResponse.parse(response);
90
92
  }
91
- async function pushCode(ctx, span, request, options, endpoint) {
93
+ async function evaluateSchema(ctx, span, request, options, bestEffort) {
94
+ const response = await pushCode(
95
+ ctx,
96
+ span,
97
+ request,
98
+ options,
99
+ "/api/deploy2/evaluate_schema",
100
+ bestEffort
101
+ );
102
+ return import_evaluateSchema.evaluateSchemaResponse.parse(response);
103
+ }
104
+ const BEST_EFFORT_RETRIES = 5;
105
+ async function pushCode(ctx, span, request, options, endpoint, bestEffort) {
92
106
  const unchangedModuleCount = request.appDefinition?.unchangedModuleHashes?.length ?? 0;
93
107
  const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;
94
108
  const requestSummary = {
@@ -108,7 +122,16 @@ async function pushCode(ctx, span, request, options, endpoint) {
108
122
  const fetch = (0, import_utils.deploymentFetch)(ctx, {
109
123
  deploymentUrl: options.url,
110
124
  adminKey: request.adminKey,
111
- onError
125
+ onError,
126
+ // Best-effort callers tolerate failure, so retry only plausibly
127
+ // transient conditions — network errors and 5xx responses (e.g. table
128
+ // summaries still bootstrapping) — and fail fast on everything else,
129
+ // like a 404 from a deployment whose backend doesn't yet expose the
130
+ // endpoint.
131
+ ...bestEffort ? {
132
+ maxRetries: BEST_EFFORT_RETRIES,
133
+ shouldRetry: (error, response) => error !== null || response !== null && response.status >= 500
134
+ } : {}
112
135
  });
113
136
  try {
114
137
  const response = await fetch(endpoint, {
@@ -122,6 +145,9 @@ async function pushCode(ctx, span, request, options, endpoint) {
122
145
  });
123
146
  return await response.json();
124
147
  } catch (error) {
148
+ if (bestEffort) {
149
+ throw error;
150
+ }
125
151
  return await (0, import_config.handlePushConfigError)(
126
152
  ctx,
127
153
  error,
@@ -334,6 +360,7 @@ async function deployToDeployment(ctx, credentials, options) {
334
360
  liveComponentSources: !!options.liveComponentSources,
335
361
  pushAllModules: !!options.pushAllModules,
336
362
  largeIndexDeletionCheck: options.allowDeletingLargeIndexes ? "has confirmation" : "ask for confirmation",
363
+ warnOnSlowSchemaValidation: true,
337
364
  message: options.message
338
365
  };
339
366
  (0, import_log.showSpinner)(`Deploying to ${url}...${options.dryRun ? " [dry run]" : ""}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deploy2.ts"],
4
- "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint: \"/api/deploy2/start_push\" | \"/api/deploy2/evaluate_push\",\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n EvaluateSchemaResponse,\n evaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nexport async function evaluateSchema(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n // When set, a failed evaluation throws the raw error instead of crashing\n // the process, so best-effort callers (e.g. advisory checks) can recover.\n bestEffort?: boolean,\n): Promise<EvaluateSchemaResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_schema\",\n bestEffort,\n );\n return evaluateSchemaResponse.parse(response);\n}\n\n// Retries for best-effort requests, where a transient failure should be\n// ridden out if possible but the command proceeds without the result\n// otherwise.\nconst BEST_EFFORT_RETRIES = 5;\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint:\n | \"/api/deploy2/start_push\"\n | \"/api/deploy2/evaluate_push\"\n | \"/api/deploy2/evaluate_schema\",\n bestEffort?: boolean,\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n // Best-effort callers tolerate failure, so retry only plausibly\n // transient conditions \u2014 network errors and 5xx responses (e.g. table\n // summaries still bootstrapping) \u2014 and fail fast on everything else,\n // like a 404 from a deployment whose backend doesn't yet expose the\n // endpoint.\n ...(bestEffort\n ? {\n maxRetries: BEST_EFFORT_RETRIES,\n shouldRetry: (error: Error | null, response: Response | null) =>\n error !== null || (response !== null && response.status >= 500),\n }\n : {}),\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n if (bestEffort) {\n // The caller handles this itself instead of crashing the process.\n // eslint-disable-next-line no-restricted-syntax\n throw error;\n }\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n warnOnSlowSchemaValidation: true,\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_components", "zlib", "startPush"]
7
7
  }