convex 1.45.0 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +105 -6
  2. package/dist/browser.bundle.js +7 -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/bundler/index.js +5 -4
  10. package/dist/cjs/bundler/index.js.map +2 -2
  11. package/dist/cjs/cli/codegen.js +0 -2
  12. package/dist/cjs/cli/codegen.js.map +2 -2
  13. package/dist/cjs/cli/configure.js +13 -4
  14. package/dist/cjs/cli/configure.js.map +2 -2
  15. package/dist/cjs/cli/deploy.js +28 -2
  16. package/dist/cjs/cli/deploy.js.map +2 -2
  17. package/dist/cjs/cli/deploymentSelect.js +2 -2
  18. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  19. package/dist/cjs/cli/dev.js +6 -0
  20. package/dist/cjs/cli/dev.js.map +2 -2
  21. package/dist/cjs/cli/docs.js +3 -36
  22. package/dist/cjs/cli/docs.js.map +2 -2
  23. package/dist/cjs/cli/env.js +10 -5
  24. package/dist/cjs/cli/env.js.map +2 -2
  25. package/dist/cjs/cli/envDefault.js +7 -2
  26. package/dist/cjs/cli/envDefault.js.map +2 -2
  27. package/dist/cjs/cli/generatedApi.js.map +1 -1
  28. package/dist/cjs/cli/lib/api.js +2 -0
  29. package/dist/cjs/cli/lib/api.js.map +2 -2
  30. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  31. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  32. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +100 -70
  33. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  34. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +126 -0
  35. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  36. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  37. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  38. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  39. package/dist/cjs/cli/lib/command.js +2 -1
  40. package/dist/cjs/cli/lib/command.js.map +2 -2
  41. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  42. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  43. package/dist/cjs/cli/lib/components.js +56 -1
  44. package/dist/cjs/cli/lib/components.js.map +2 -2
  45. package/dist/cjs/cli/lib/config.js +56 -17
  46. package/dist/cjs/cli/lib/config.js.map +2 -2
  47. package/dist/cjs/cli/lib/deploy2.js +32 -3
  48. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  49. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +101 -0
  50. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  51. package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
  52. package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
  53. package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
  54. package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
  55. package/dist/cjs/cli/lib/dev.js +6 -0
  56. package/dist/cjs/cli/lib/dev.js.map +2 -2
  57. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  58. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  59. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  60. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  61. package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
  62. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  63. package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
  64. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  65. package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
  66. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  67. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  68. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  69. package/dist/cjs/cli/lib/run.js +5 -0
  70. package/dist/cjs/cli/lib/run.js.map +2 -2
  71. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  72. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  73. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  74. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  75. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  76. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  77. package/dist/cjs/cli/lib/utils/utils.js +84 -47
  78. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  79. package/dist/cjs/cli/projectCreate.js +1 -1
  80. package/dist/cjs/cli/projectCreate.js.map +1 -1
  81. package/dist/cjs/index.js +1 -1
  82. package/dist/cjs/index.js.map +1 -1
  83. package/dist/cjs/nextjs/index.js.map +2 -2
  84. package/dist/cjs/react/client.js.map +2 -2
  85. package/dist/cjs/react/hydration.js.map +2 -2
  86. package/dist/cjs/react/queries_observer.js.map +2 -2
  87. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  88. package/dist/cjs/react/use_queries.js.map +2 -2
  89. package/dist/cjs/server/api.js.map +2 -2
  90. package/dist/cjs/server/components/index.js.map +2 -2
  91. package/dist/cjs/server/cron.js +10 -10
  92. package/dist/cjs/server/cron.js.map +2 -2
  93. package/dist/cjs/server/impl/actions_impl.js +8 -3
  94. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  95. package/dist/cjs/server/impl/meta_impl.js +8 -2
  96. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  97. package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
  98. package/dist/cjs/server/impl/storage_impl.js +29 -0
  99. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  100. package/dist/cjs/server/index.js +1 -0
  101. package/dist/cjs/server/index.js.map +2 -2
  102. package/dist/cjs/server/meta.js.map +1 -1
  103. package/dist/cjs/server/registration.js.map +1 -1
  104. package/dist/cjs/server/scheduler.js.map +1 -1
  105. package/dist/cjs/server/schema.js +72 -3
  106. package/dist/cjs/server/schema.js.map +2 -2
  107. package/dist/cjs/server/storage.js.map +1 -1
  108. package/dist/cjs/values/validator.js +1 -1
  109. package/dist/cjs/values/validator.js.map +2 -2
  110. package/dist/cjs/values/validators.js +82 -26
  111. package/dist/cjs/values/validators.js.map +2 -2
  112. package/dist/cjs/values/value.js +6 -0
  113. package/dist/cjs/values/value.js.map +2 -2
  114. package/dist/cjs-types/browser/http_client.d.ts +5 -5
  115. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  116. package/dist/cjs-types/browser/query_options.d.ts +2 -2
  117. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  118. package/dist/cjs-types/browser/simple_client.d.ts +6 -6
  119. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  120. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
  121. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  122. package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  123. package/dist/cjs-types/bundler/index.d.ts +9 -2
  124. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  126. package/dist/cjs-types/cli/configure.d.ts +6 -0
  127. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  128. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  129. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  130. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  131. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/dev.d.ts +1 -0
  133. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  134. package/dist/cjs-types/cli/docs.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  138. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  140. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  141. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  142. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +25 -6
  143. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  144. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
  145. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  146. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  147. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  148. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -2
  149. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  151. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  153. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/lib/components.d.ts +5 -0
  155. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  157. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploy2.d.ts +8 -0
  159. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
  161. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  162. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  163. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  164. package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
  165. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
  167. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  169. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
  171. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  173. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
  174. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts +8 -5
  176. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  178. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  179. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  180. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  181. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  183. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -7
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/nextjs/index.d.ts +6 -6
  188. package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
  189. package/dist/cjs-types/react/client.d.ts +15 -15
  190. package/dist/cjs-types/react/client.d.ts.map +1 -1
  191. package/dist/cjs-types/react/hydration.d.ts +3 -3
  192. package/dist/cjs-types/react/hydration.d.ts.map +1 -1
  193. package/dist/cjs-types/react/queries_observer.d.ts +9 -9
  194. package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
  195. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  196. package/dist/cjs-types/react/use_queries.d.ts +14 -6
  197. package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
  198. package/dist/cjs-types/server/api.d.ts +157 -7
  199. package/dist/cjs-types/server/api.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +2 -2
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/cron.d.ts +21 -20
  203. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/actions_impl.d.ts +22 -7
  205. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  206. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
  208. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  209. package/dist/cjs-types/server/index.d.ts +2 -2
  210. package/dist/cjs-types/server/index.d.ts.map +1 -1
  211. package/dist/cjs-types/server/meta.d.ts +63 -0
  212. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  213. package/dist/cjs-types/server/registration.d.ts +17 -7
  214. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  215. package/dist/cjs-types/server/scheduler.d.ts +9 -7
  216. package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
  217. package/dist/cjs-types/server/schema.d.ts +34 -0
  218. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  219. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  220. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  221. package/dist/cjs-types/values/validators.d.ts +30 -0
  222. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  223. package/dist/cjs-types/values/value.d.ts.map +1 -1
  224. package/dist/cli.bundle.cjs +2728 -1627
  225. package/dist/cli.bundle.cjs.map +4 -4
  226. package/dist/esm/browser/http_client.js.map +2 -2
  227. package/dist/esm/browser/query_options.js.map +2 -2
  228. package/dist/esm/browser/simple_client.js.map +2 -2
  229. package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
  230. package/dist/esm/bundler/index.js +5 -4
  231. package/dist/esm/bundler/index.js.map +2 -2
  232. package/dist/esm/cli/codegen.js +0 -2
  233. package/dist/esm/cli/codegen.js.map +2 -2
  234. package/dist/esm/cli/configure.js +12 -4
  235. package/dist/esm/cli/configure.js.map +2 -2
  236. package/dist/esm/cli/deploy.js +28 -2
  237. package/dist/esm/cli/deploy.js.map +2 -2
  238. package/dist/esm/cli/deploymentSelect.js +6 -3
  239. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  240. package/dist/esm/cli/dev.js +6 -0
  241. package/dist/esm/cli/dev.js.map +2 -2
  242. package/dist/esm/cli/docs.js +3 -43
  243. package/dist/esm/cli/docs.js.map +2 -2
  244. package/dist/esm/cli/env.js +11 -6
  245. package/dist/esm/cli/env.js.map +2 -2
  246. package/dist/esm/cli/envDefault.js +7 -2
  247. package/dist/esm/cli/envDefault.js.map +2 -2
  248. package/dist/esm/cli/lib/api.js +2 -0
  249. package/dist/esm/cli/lib/api.js.map +2 -2
  250. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  251. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  252. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +98 -69
  253. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  254. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +107 -0
  255. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  256. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  257. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  258. package/dist/esm/cli/lib/codegen.js.map +2 -2
  259. package/dist/esm/cli/lib/command.js +2 -1
  260. package/dist/esm/cli/lib/command.js.map +2 -2
  261. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  262. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  263. package/dist/esm/cli/lib/components.js +63 -1
  264. package/dist/esm/cli/lib/components.js.map +2 -2
  265. package/dist/esm/cli/lib/config.js +55 -17
  266. package/dist/esm/cli/lib/config.js.map +2 -2
  267. package/dist/esm/cli/lib/deploy2.js +33 -3
  268. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  269. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +72 -0
  270. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  271. package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
  272. package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
  273. package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
  274. package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
  275. package/dist/esm/cli/lib/dev.js +6 -0
  276. package/dist/esm/cli/lib/dev.js.map +2 -2
  277. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  278. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  279. package/dist/esm/cli/lib/indexes.js.map +1 -1
  280. package/dist/esm/cli/lib/localDeployment/run.js +30 -2
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  287. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  288. package/dist/esm/cli/lib/run.js +5 -0
  289. package/dist/esm/cli/lib/run.js.map +2 -2
  290. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  291. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  292. package/dist/esm/cli/lib/usageLimits.js +4 -2
  293. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  295. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  296. package/dist/esm/cli/lib/utils/utils.js +84 -49
  297. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  298. package/dist/esm/cli/projectCreate.js +1 -1
  299. package/dist/esm/cli/projectCreate.js.map +1 -1
  300. package/dist/esm/index.js +1 -1
  301. package/dist/esm/index.js.map +1 -1
  302. package/dist/esm/nextjs/index.js.map +2 -2
  303. package/dist/esm/react/client.js.map +2 -2
  304. package/dist/esm/react/hydration.js +3 -1
  305. package/dist/esm/react/hydration.js.map +2 -2
  306. package/dist/esm/react/queries_observer.js +3 -1
  307. package/dist/esm/react/queries_observer.js.map +2 -2
  308. package/dist/esm/react/use_paginated_query2.js +3 -1
  309. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  310. package/dist/esm/react/use_queries.js.map +2 -2
  311. package/dist/esm/server/api.js.map +2 -2
  312. package/dist/esm/server/components/index.js.map +2 -2
  313. package/dist/esm/server/cron.js +13 -11
  314. package/dist/esm/server/cron.js.map +2 -2
  315. package/dist/esm/server/impl/actions_impl.js +7 -3
  316. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  317. package/dist/esm/server/impl/meta_impl.js +9 -3
  318. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  319. package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
  320. package/dist/esm/server/impl/storage_impl.js +29 -0
  321. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  322. package/dist/esm/server/index.js +4 -1
  323. package/dist/esm/server/index.js.map +2 -2
  324. package/dist/esm/server/schema.js +72 -3
  325. package/dist/esm/server/schema.js.map +2 -2
  326. package/dist/esm/values/validator.js +1 -1
  327. package/dist/esm/values/validator.js.map +2 -2
  328. package/dist/esm/values/validators.js +82 -26
  329. package/dist/esm/values/validators.js.map +2 -2
  330. package/dist/esm/values/value.js +6 -0
  331. package/dist/esm/values/value.js.map +2 -2
  332. package/dist/esm-types/browser/http_client.d.ts +5 -5
  333. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  334. package/dist/esm-types/browser/query_options.d.ts +2 -2
  335. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  336. package/dist/esm-types/browser/simple_client.d.ts +6 -6
  337. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  338. package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
  339. package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  340. package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  341. package/dist/esm-types/bundler/index.d.ts +9 -2
  342. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  343. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  344. package/dist/esm-types/cli/configure.d.ts +6 -0
  345. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  346. package/dist/esm-types/cli/deploy.d.ts +2 -0
  347. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  348. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  349. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  350. package/dist/esm-types/cli/dev.d.ts +1 -0
  351. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  352. package/dist/esm-types/cli/docs.d.ts.map +1 -1
  353. package/dist/esm-types/cli/env.d.ts.map +1 -1
  354. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  355. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  356. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  358. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  359. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  360. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +25 -6
  361. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  362. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
  363. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  364. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  365. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  366. package/dist/esm-types/cli/lib/codegen.d.ts +0 -2
  367. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  368. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  369. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  370. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  371. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  372. package/dist/esm-types/cli/lib/components.d.ts +5 -0
  373. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  374. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  375. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/deploy2.d.ts +8 -0
  377. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
  379. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  380. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  381. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  382. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  383. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  384. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  385. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  386. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  387. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
  389. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  391. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
  392. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  393. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  394. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  395. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  396. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  397. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  398. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  399. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  400. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  401. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  402. package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -7
  403. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  404. package/dist/esm-types/index.d.ts +1 -1
  405. package/dist/esm-types/nextjs/index.d.ts +6 -6
  406. package/dist/esm-types/nextjs/index.d.ts.map +1 -1
  407. package/dist/esm-types/react/client.d.ts +15 -15
  408. package/dist/esm-types/react/client.d.ts.map +1 -1
  409. package/dist/esm-types/react/hydration.d.ts +3 -3
  410. package/dist/esm-types/react/hydration.d.ts.map +1 -1
  411. package/dist/esm-types/react/queries_observer.d.ts +9 -9
  412. package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
  413. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  414. package/dist/esm-types/react/use_queries.d.ts +14 -6
  415. package/dist/esm-types/react/use_queries.d.ts.map +1 -1
  416. package/dist/esm-types/server/api.d.ts +157 -7
  417. package/dist/esm-types/server/api.d.ts.map +1 -1
  418. package/dist/esm-types/server/components/index.d.ts +2 -2
  419. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  420. package/dist/esm-types/server/cron.d.ts +21 -20
  421. package/dist/esm-types/server/cron.d.ts.map +1 -1
  422. package/dist/esm-types/server/impl/actions_impl.d.ts +22 -7
  423. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  424. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  425. package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
  426. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  427. package/dist/esm-types/server/index.d.ts +2 -2
  428. package/dist/esm-types/server/index.d.ts.map +1 -1
  429. package/dist/esm-types/server/meta.d.ts +63 -0
  430. package/dist/esm-types/server/meta.d.ts.map +1 -1
  431. package/dist/esm-types/server/registration.d.ts +17 -7
  432. package/dist/esm-types/server/registration.d.ts.map +1 -1
  433. package/dist/esm-types/server/scheduler.d.ts +9 -7
  434. package/dist/esm-types/server/scheduler.d.ts.map +1 -1
  435. package/dist/esm-types/server/schema.d.ts +34 -0
  436. package/dist/esm-types/server/schema.d.ts.map +1 -1
  437. package/dist/esm-types/server/storage.d.ts.map +1 -1
  438. package/dist/esm-types/values/validator.d.ts.map +1 -1
  439. package/dist/esm-types/values/validators.d.ts +30 -0
  440. package/dist/esm-types/values/validators.d.ts.map +1 -1
  441. package/dist/esm-types/values/value.d.ts.map +1 -1
  442. package/dist/react.bundle.js +7 -1
  443. package/dist/react.bundle.js.map +2 -2
  444. package/package.json +9 -9
  445. package/schemas/convex.schema.json +5 -5
  446. package/src/browser/http_client.ts +43 -10
  447. package/src/browser/query_options.ts +11 -5
  448. package/src/browser/simple_client.ts +35 -14
  449. package/src/browser/sync/optimistic_updates.ts +17 -4
  450. package/src/browser/sync/optimistic_updates_impl.ts +17 -4
  451. package/src/bundler/index.ts +9 -4
  452. package/src/cli/codegen.ts +0 -1
  453. package/src/cli/configure.ts +27 -7
  454. package/src/cli/deploy.ts +37 -5
  455. package/src/cli/deploymentSelect.ts +7 -4
  456. package/src/cli/dev.ts +9 -0
  457. package/src/cli/docs.ts +3 -44
  458. package/src/cli/env.ts +12 -6
  459. package/src/cli/envDefault.ts +8 -2
  460. package/src/cli/generatedApi.ts +1 -1
  461. package/src/cli/lib/api.ts +5 -1
  462. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  463. package/src/cli/lib/checkForLargeIndexDeletion.ts +150 -91
  464. package/src/cli/lib/checkForSlowSchemaValidation.ts +141 -0
  465. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  466. package/src/cli/lib/codegen.ts +0 -2
  467. package/src/cli/lib/command.ts +3 -0
  468. package/src/cli/lib/components/definition/bundle.ts +68 -14
  469. package/src/cli/lib/components.ts +84 -0
  470. package/src/cli/lib/config.ts +85 -18
  471. package/src/cli/lib/deploy2.ts +66 -2
  472. package/src/cli/lib/deployApi/evaluateSchema.ts +97 -0
  473. package/src/cli/lib/deployApi/finishPush.ts +1 -1
  474. package/src/cli/lib/deployApi/startPush.ts +1 -1
  475. package/src/cli/lib/dev.ts +15 -0
  476. package/src/cli/lib/formatValidationProgress.ts +35 -0
  477. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  478. package/src/cli/lib/indexes.ts +1 -1
  479. package/src/cli/lib/localDeployment/run.ts +44 -2
  480. package/src/cli/lib/localDeployment/upgrade.ts +4 -6
  481. package/src/cli/lib/localDeployment/utils.ts +6 -0
  482. package/src/cli/lib/mcp/tools/env.ts +17 -3
  483. package/src/cli/lib/run.ts +3 -0
  484. package/src/cli/lib/schemaEvaluation.ts +88 -0
  485. package/src/cli/lib/usageLimits.ts +2 -0
  486. package/src/cli/lib/utils/mutex.ts +9 -27
  487. package/src/cli/lib/utils/utils.ts +127 -56
  488. package/src/cli/projectCreate.ts +1 -1
  489. package/src/index.ts +1 -1
  490. package/src/nextjs/index.ts +19 -8
  491. package/src/react/client.ts +73 -30
  492. package/src/react/hydration.tsx +14 -6
  493. package/src/react/queries_observer.ts +19 -16
  494. package/src/react/use_paginated_query2.ts +10 -6
  495. package/src/react/use_queries.ts +23 -7
  496. package/src/server/api.ts +220 -14
  497. package/src/server/components/index.ts +4 -6
  498. package/src/server/cron.ts +34 -24
  499. package/src/server/impl/actions_impl.ts +39 -10
  500. package/src/server/impl/meta_impl.ts +8 -1
  501. package/src/server/impl/scheduler_impl.ts +13 -6
  502. package/src/server/impl/storage_impl.ts +30 -0
  503. package/src/server/index.ts +6 -1
  504. package/src/server/meta.ts +79 -0
  505. package/src/server/registration.ts +38 -7
  506. package/src/server/scheduler.ts +22 -7
  507. package/src/server/schema.ts +77 -0
  508. package/src/server/storage.ts +17 -0
  509. package/src/values/validator.ts +3 -1
  510. package/src/values/validators.ts +85 -27
  511. package/src/values/value.ts +9 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/run.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport {\n permissionDeniedErrorMessage,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n const permissionError = permissionDeniedErrorMessage(errorMessage);\n if (permissionError !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n }\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n let result: Value;\n try {\n result = client.localQueryResultByToken(queryToken)!;\n } catch (err) {\n // A failed query (e.g. a permission error) throws here. Surface\n // permission errors cleanly instead of an uncaught stack trace, and\n // let any other error propagate as before.\n const permissionError = permissionDeniedErrorMessage(\n (err as Error).toString(),\n );\n if (permissionError !== null) {\n void ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n args.callbacks?.onChange?.(result);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) await pushToDeployment(ctx, args);\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nexport async function pushToDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n liveComponentSources: boolean;\n },\n) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n pushAllModules: false,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n message: null,\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport {\n permissionDeniedErrorMessage,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n const permissionError = permissionDeniedErrorMessage(errorMessage);\n if (permissionError !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n }\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n let result: Value;\n try {\n result = client.localQueryResultByToken(queryToken)!;\n } catch (err) {\n // A failed query (e.g. a permission error) throws here. Surface\n // permission errors cleanly instead of an uncaught stack trace, and\n // let any other error propagate as before.\n const permissionError = permissionDeniedErrorMessage(\n (err as Error).toString(),\n );\n if (permissionError !== null) {\n void ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n args.callbacks?.onChange?.(result);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) await pushToDeployment(ctx, args);\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nexport async function pushToDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n liveComponentSources: boolean;\n },\n) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n pushAllModules: false,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n largeIndexBackfillCheck: \"no verification\", // ditto\n stagedValidatorDeletionCheck: \"no verification\", // ditto\n warnOnSlowSchemaValidation: true,\n message: null,\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,kBAAiB;AACjB,gBAAe;AACf,yBAAiC;AACjC,qBAAiC;AACjC,oBAIO;AACP,mBAAkD;AAElD,iBAAuD;AACvD,mBAIO;AACP,mBAAkB;AAClB,kBAAiB;AACjB,oBAAkC;AAClC,iBAA6B;AAC7B,qBAAsC;AAEtC,eAAsB,kBACpB,KACA,MAaA;AACA,QAAM,SAAS,IAAI,oCAAiB,KAAK,eAAe;AAAA,IACtD,QAAQ,wBAAwB;AAAA,EAClC,CAAC;AACD,QAAM,WAAW,KAAK,iBAClB,MAAM,gBAAgB,KAAK,KAAK,cAAc,IAC9C;AACJ,SAAO,aAAa,KAAK,UAAU,QAAQ;AAE3C,QAAM,eAAe,MAAM,UAAU,KAAK,KAAK,UAAU;AACzD,QAAM,EAAE,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACrD,QAAM,qBAAqB,MAAM;AAAA,IAC/B;AAAA,IACA,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,OAAO;AAAA,UACpB,qCAAsB,kBAAkB;AAAA,MACxC,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,eAAgB,IAAc,SAAS,EAAE,KAAK;AAEpD,UAAM,sBAAkB,2CAA6B,YAAY;AACjE,QAAI,oBAAoB,MAAM;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,yBAAY,IAAI,eAAe;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,QAAI,aAAa,SAAS,yBAAyB,GAAG;AACpD,YAAM,YAAa,MAAM,eAAe,KAAK;AAAA,QAC3C,eAAe,KAAK;AAAA,QACpB,UAAU,KAAK;AAAA,QACf,cAAc;AAAA,QACd,eAAe,KAAK;AAAA,QACpB,MAAM,CAAC;AAAA,MACT,CAAC;AAUD,YAAM,gBAAgB,UACnB;AAAA,QACC,CACE,OAIG,GAAG,iBAAiB;AAAA,MAC3B,EACC,IAAI,CAAC,EAAE,WAAW,MAAM;AACvB,cAAM,eAAe,WAAW,QAAQ,GAAG;AAE3C,cAAMA,QACJ,iBAAiB,KACb,KACA,WAAW,UAAU,GAAG,YAAY,EAAE,QAAQ,SAAS,EAAE;AAC/D,cAAM,OACJ,iBAAiB,KACb,aACA,WAAW,UAAU,eAAe,CAAC;AAE3C,eAAO,UAAK,yBAAY,KAAK,GAAGA,KAAI,GAAG,CAAC,GAAG,IAAI;AAAA,MACjD,CAAC;AAEH,YAAM,4BACJ,cAAc,SAAS,IACnB;AAAA,EAAyB,cAAc,KAAK,IAAI,CAAC,KACjD;AAEN,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,2BAA2B,KAAK,YAAY;AAAA,EAAO,yBAAY,IAAI,YAAY,CAAC;AAAA;AAAA,EAAO,yBAAyB;AAAA,MAClI,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,2BAA2B,KAAK,YAAY;AAAA,EAAO,yBAAY,IAAI,YAAY,CAAC;AAAA,IAClG,CAAC;AAAA,EACH;AAEA,OAAK,WAAW,YAAY;AAG5B,MAAI,WAAW,MAAM;AACnB,8BAAU,YAAY,MAAM,CAAC;AAAA,EAC/B;AACF;AAEA,eAAe,gBAAgB,KAAc,gBAAwB;AACnE,MAAI;AACJ,MAAI;AACF,eAAW,aAAAC,QAAM,MAAM,cAAc;AAAA,EACvC,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,sCAAsC,cAAc;AAAA,EAAM,yBAAY,IAAK,IAAc,SAAS,EAAE,KAAK,CAAC,CAAC;AAAA,IAC7H,CAAC;AAAA,EACH;AACA,QAAM,UAAU,SAAS,WAAW,KAAK,WAAW,KAAK,UAAU,QAAQ,CAAC;AAC5E,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,kBACJ,SAAS,mBAAmB,GAAG,OAAO,SAAS,CAAC,IAAI,QAAQ,SAAS,CAAC;AACxE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,UAAU,KAAc,YAAoB;AAChE,MAAI;AACF,UAAM,WAAW,aAAAA,QAAM,MAAM,UAAU;AACvC,eAAO,2BAAa,QAAQ;AAAA,EAC9B,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,uCAAuC,UAAU;AAAA,EAAM,yBAAY,IAAK,IAAc,SAAS,EAAE,KAAK,CAAC,CAAC;AAAA,IAC1H,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,kBACpB,KACA,cAEA,iBACA;AAOA,MAAI,aAAa,WAAW,MAAM,KAAK,aAAa,WAAW,WAAW,GAAG;AAC3E,UAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,qCAAqC,YAAY;AAAA,MACnE,CAAC;AAAA,IACH;AACA,UAAMC,cAAa,MAAM,IAAI;AAC7B,UAAM,aAAa,GAAG,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,IAAIA,WAAU;AAC5D,WAAO;AAAA,EACT;AAOA,QAAM,WAAW,aAAa,MAAM,GAAG,EAAE,CAAC;AAC1C,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,eAAe;AACnB,MAAI,qBAA6B;AACjC,aAAW,aAAa,oBAAoB;AAC1C,QAAI,SAAS,SAAS,SAAS,GAAG;AAChC,2BAAqB,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM;AACxD,qBAAe;AACf;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,MAAM,GAAG,EAAE,CAAC,KAAK;AACjD,QAAM,iBAAiB,GAAG,kBAAkB,IAAI,UAAU;AAG1D,MAAI,CAAC,SAAS,WAAW,eAAe,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,mBAAmB;AAAA,IAC/C,gBAAgB;AAAA,EAClB;AACA,QAAM,4BAA4B,GAAG,qBAAqB,IAAI,UAAU;AAExE,MAAI,cAAc;AAChB,QAAI,IAAI,GAAG,OAAO,YAAAF,QAAK,KAAK,iBAAiB,QAAQ,CAAC,GAAG;AACvD,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,UAAM,SAAS,mBAAmB;AAAA,MAAK,CAAC,cACtC,IAAI,GAAG,OAAO,YAAAA,QAAK,KAAK,iBAAiB,WAAW,SAAS,CAAC;AAAA,IAChE;AACA,QAAI,QAAQ;AACV,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,WAAW,QAAgB;AAClC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,WAAW,CAAC;AAChC,YAAQ,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAsB,wBACpB,KACA,MAQA;AACA,QAAM,UAAU,CAAC;AACjB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,SAAO,CAAC,WAAW,KAAK,UAAU,UAAa,QAAQ,SAAS,KAAK,QAAQ;AAC3E,UAAM,mBAAoB,MAAM,eAAe,KAAK;AAAA,MAClD,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAG,KAAK;AAAA,QACR,gBAAgB;AAAA,UACd;AAAA,UACA,UACE,KAAK,UAAU,SAAY,MAAQ,KAAK,QAAQ,QAAQ;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,CAAC;AACD,aAAS,iBAAiB;AAC1B,aAAS,iBAAiB;AAC1B,YAAQ,KAAK,GAAG,iBAAiB,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,KACA,MAOgB;AAChB,MAAI;AACJ,QAAM,gBAAgB,IAAI,QAAe,CAAC,YAAY;AACpD,eAAW;AAAA,EACb,CAAC;AACD,QAAM,CAAC,aAAa,MAAM,QAAI,8BAAgB;AAC9C,QAAM,UAAU,KAAK;AAAA,IACnB,GAAG;AAAA,IACH,oBAAoB,KAAK;AAAA,IACzB,oBAAoB,KAAK;AAAA,IACzB,OAAO;AAAA,IACP,WAAW;AAAA,MACT,UAAU,CAAC,WAAW;AACpB,eAAO;AACP,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEO,SAAS,YAAY,OAAc;AACxC,QAAM,WAAO,2BAAa,KAAK;AAC/B,MAAI,QAAQ,OAAO,OAAO;AAGxB,WAAO,YAAAG,QAAK,QAAQ,OAAO,EAAE,QAAQ,MAAM,OAAO,KAAK,CAAC;AAAA,EAC1D,OAAO;AACL,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACrC;AACF;AAEA,eAAsB,gBACpB,KACA,MAQA;AACA,QAAM,EAAE,cAAc,IAAI,UAAM,iCAAkB,GAAG;AAErD,QAAM,qBAAqB,MAAM;AAAA,IAC/B;AAAA,IACA,KAAK;AAAA,IACL,cAAc;AAAA,EAChB;AACA,QAAM,WAAW,KAAK,iBAClB,MAAM,gBAAgB,KAAK,KAAK,cAAc,IAC9C;AACJ,QAAM,eAAe,MAAM,UAAU,KAAK,KAAK,UAAU;AACzD,SAAO,UAAU,KAAK;AAAA,IACpB,eAAe,KAAK;AAAA,IACpB,UAAU,KAAK;AAAA,IACf;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,eAAe,KAAK;AAAA,IACpB,WAAO,0BAAY;AAAA,IACnB,WAAW;AAAA,MACT,UAAU;AACR;AAAA,UACE,kBAAkB,KAAK,YAAY,OAAO,KAAK,aAAa;AAAA,QAC9D;AAAA,MACF;AAAA,MACA,SAAS,QAAQ;AACf,kCAAU,YAAY,MAAM,CAAC;AAAA,MAC/B;AAAA,MACA,SAAS;AACP,mCAAW,yBAAyB,KAAK,aAAa,KAAK;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,UACpB,KACA,MAgBA;AACA,QAAM,SAAS,IAAI;AAAA,IACjB,KAAK;AAAA,IACL,CAAC,mBAAmB;AAClB,iBAAW,cAAc,gBAAgB;AACvC,YAAI;AACJ,YAAI;AACF,mBAAS,OAAO,wBAAwB,UAAU;AAAA,QACpD,SAAS,KAAK;AAIZ,gBAAM,sBAAkB;AAAA,YACrB,IAAc,SAAS;AAAA,UAC1B;AACA,cAAI,oBAAoB,MAAM;AAC5B,iBAAK,IAAI,MAAM;AAAA,cACb,UAAU;AAAA,cACV,WAAW;AAAA,cACX,gBAAgB,yBAAY,IAAI,eAAe;AAAA,YACjD,CAAC;AACD;AAAA,UACF;AAEA,gBAAM;AAAA,QACR;AACA,aAAK,WAAW,WAAW,MAAM;AAAA,MACnC;AAAA,IACF;AAAA,IACA;AAAA;AAAA,MAEE,sBAAsB,UAAAC;AAAA,MACtB,uBAAuB;AAAA,IACzB;AAAA,EACF;AACA,SAAO,aAAa,KAAK,UAAU,KAAK,QAAQ;AAChD,QAAM,EAAE,YAAY,IAAI,OAAO;AAAA,IAC7B,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,MACE,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,OAAK,WAAW,UAAU;AAE1B,MAAI,OAAO;AACX,QAAM,CAAC,aAAa,MAAM,QAAI,8BAAgB;AAC9C,QAAM,eAAe,MAAM;AACzB,QAAI,MAAM;AACR;AAAA,IACF;AACA,WAAO;AACP,gBAAY;AACZ,SAAK,OAAO,MAAM;AAClB,YAAQ,IAAI,UAAU,cAAc;AACpC,WAAO;AACP,SAAK,WAAW,SAAS;AAAA,EAC3B;AACA,WAAS,iBAAiB;AACxB,iBAAa;AAAA,EACf;AACA,UAAQ,GAAG,UAAU,cAAc;AACnC,OAAK,KAAK,MAAM,QAAQ,YAAY;AACpC,SAAO,CAAC,MAAM;AAEZ,UAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,UAAM,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,MAAM,CAAC;AAAA,IACtD,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,gBACpB,KACA,MAeA;AACA,MAAI,KAAK,KAAM,OAAM,iBAAiB,KAAK,IAAI;AAE/C,MAAI,KAAK,OAAO;AACd,WAAO,MAAM,gBAAgB,KAAK,IAAI;AAAA,EACxC;AACA,SAAO,MAAM,kBAAkB,KAAK,IAAI;AAC1C;AAEA,eAAsB,iBACpB,KACA,MASA;AACA,YAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW,KAAK;AAAA,MAChB,qBAAqB,KAAK;AAAA,MAC1B,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS,KAAK;AAAA,MACd,sBAAsB,KAAK;AAAA,MAC3B,gBAAgB;AAAA,MAChB,yBAAyB;AAAA;AAAA,MACzB,yBAAyB;AAAA;AAAA,MACzB,8BAA8B;AAAA;AAAA,MAC9B,4BAA4B;AAAA,MAC5B,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,0BAAkC;AACzC,QAAM,SAAS,IAAI,6BAAc,EAAE,SAAS,MAAM,CAAC;AACnD,SAAO,mBAAmB,CAAC,WAAW,SAAS;AAE7C,YAAQ,MAAM,GAAG,IAAI;AAAA,EACvB,CAAC;AACD,SAAO;AACT;",
6
6
  "names": ["path", "JSON5", "exportName", "util", "ws"]
7
7
  }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var schemaEvaluation_exports = {};
20
+ __export(schemaEvaluation_exports, {
21
+ pushStagesValidators: () => pushStagesValidators,
22
+ sharedSchemaEvaluation: () => sharedSchemaEvaluation
23
+ });
24
+ module.exports = __toCommonJS(schemaEvaluation_exports);
25
+ var import_log = require("../../bundler/log.js");
26
+ var import_deploy2 = require("./deploy2.js");
27
+ function pushStagesValidators(request) {
28
+ return [
29
+ request.appDefinition.schema,
30
+ ...request.componentDefinitions.map((definition) => definition.schema)
31
+ ].some((schema) => schema?.source.includes(".staged(") ?? false);
32
+ }
33
+ function sharedSchemaEvaluation(ctx, request, options) {
34
+ let evaluation;
35
+ return (span) => {
36
+ evaluation ?? (evaluation = evaluateSchemaBestEffort({ ctx, span, request, options }));
37
+ return evaluation;
38
+ };
39
+ }
40
+ async function evaluateSchemaBestEffort({
41
+ ctx,
42
+ span,
43
+ request,
44
+ options
45
+ }) {
46
+ try {
47
+ return await (0, import_deploy2.evaluateSchema)(
48
+ ctx,
49
+ span,
50
+ request,
51
+ options,
52
+ /* bestEffort */
53
+ true
54
+ );
55
+ } catch (error) {
56
+ (0, import_log.logVerbose)(
57
+ `Skipping schema evaluation checks: ${error instanceof Error ? error.message : String(error)}`
58
+ );
59
+ return null;
60
+ }
61
+ }
62
+ //# sourceMappingURL=schemaEvaluation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/lib/schemaEvaluation.ts"],
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport { EvaluateSchemaResponse } from \"./deployApi/evaluateSchema.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport { evaluateSchema } from \"./deploy2.js\";\nimport { Span } from \"./tracing.js\";\n\ntype EvaluateOptions = {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n};\n\n/**\n * A schema evaluation shared by the pre-push checks. Resolves to `null` when\n * the deployment doesn't support `evaluate_schema` or the request failed, in\n * which case each check skips itself.\n */\nexport type SchemaEvaluation = (\n span: Span,\n) => Promise<EvaluateSchemaResponse | null>;\n\n/**\n * Evaluate the schema at most once per push however many checks consume it:\n * the first check to call sends the request under its own span, and the rest\n * await the same promise. Each request makes the backend evaluate the schema\n * module in an isolate and predict against a fresh snapshot, so repeating it\n * per check would add that work and a round trip to the deploy's critical\n * path for every check.\n */\n/**\n * Whether a schema module in the push calls `.staged(`. Bundles aren't\n * minified, so the call survives bundling. A false positive from a comment or\n * string costs one evaluation, while a push without staged validators skips\n * the evaluation round trip on its critical path.\n */\nexport function pushStagesValidators(request: StartPushRequest): boolean {\n return [\n request.appDefinition.schema,\n ...request.componentDefinitions.map((definition) => definition.schema),\n ].some((schema) => schema?.source.includes(\".staged(\") ?? false);\n}\n\nexport function sharedSchemaEvaluation(\n ctx: Context,\n request: StartPushRequest,\n options: EvaluateOptions,\n): SchemaEvaluation {\n let evaluation: Promise<EvaluateSchemaResponse | null> | undefined;\n return (span) => {\n evaluation ??= evaluateSchemaBestEffort({ ctx, span, request, options });\n return evaluation;\n };\n}\n\n// The checks are advisory: if evaluation fails, fall back to skipping them\n// rather than aborting the push over a check that isn't required for\n// correctness. Plausibly transient failures \u2014 network errors and 5xx\n// responses (e.g. table summaries still bootstrapping) \u2014 are retried with\n// backoff by the shared fetch wrapper (see `pushCode`); anything else is\n// deterministic, including a 2xx whose shape the CLI doesn't recognize, so\n// it skips the checks immediately.\nasync function evaluateSchemaBestEffort({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: EvaluateOptions;\n}): Promise<EvaluateSchemaResponse | null> {\n try {\n return await evaluateSchema(\n ctx,\n span,\n request,\n options,\n /* bestEffort */ true,\n );\n } catch (error: unknown) {\n logVerbose(\n `Skipping schema evaluation checks: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAG3B,qBAA+B;AAgCxB,SAAS,qBAAqB,SAAoC;AACvE,SAAO;AAAA,IACL,QAAQ,cAAc;AAAA,IACtB,GAAG,QAAQ,qBAAqB,IAAI,CAAC,eAAe,WAAW,MAAM;AAAA,EACvE,EAAE,KAAK,CAAC,WAAW,QAAQ,OAAO,SAAS,UAAU,KAAK,KAAK;AACjE;AAEO,SAAS,uBACd,KACA,SACA,SACkB;AAClB,MAAI;AACJ,SAAO,CAAC,SAAS;AACf,gCAAe,yBAAyB,EAAE,KAAK,MAAM,SAAS,QAAQ,CAAC;AACvE,WAAO;AAAA,EACT;AACF;AASA,eAAe,yBAAyB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK2C;AACzC,MAAI;AACF,WAAO,UAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACiB;AAAA,IACnB;AAAA,EACF,SAAS,OAAgB;AACvB;AAAA,MACE,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC9F;AACA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -43,7 +43,8 @@ const USAGE_LIMIT_METRICS = [
43
43
  "actionComputeCpuGbHours",
44
44
  "databaseIoGb",
45
45
  "searchQueryGb",
46
- "dataEgressGb"
46
+ "dataEgressGb",
47
+ "aiGatewayCostDollars"
47
48
  ];
48
49
  const _metricsExhaustive = true;
49
50
  void _metricsExhaustive;
@@ -57,7 +58,8 @@ const METRIC_LABELS = {
57
58
  actionComputeCpuGbHours: "Action compute (CPU)",
58
59
  databaseIoGb: "Database I/O",
59
60
  searchQueryGb: "Search queries",
60
- dataEgressGb: "Data egress"
61
+ dataEgressGb: "Data egress",
62
+ aiGatewayCostDollars: "AI Gateway"
61
63
  };
62
64
  function metricLabel(metric) {
63
65
  return METRIC_LABELS[metric] ?? metric;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/usageLimits.ts"],
4
- "sourcesContent": ["import type {\n GetCurrentUsageResponse,\n UsageLimitConfigRequest,\n UsageLimitConfigResponse,\n UsageLimitMetric,\n} from \"@convex-dev/platform/deploymentApi\";\nimport { Context } from \"../../bundler/context.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\n\nexport type UsageLimitDeployment = {\n deploymentUrl: string;\n adminKey: string;\n};\n\nexport const USAGE_LIMIT_METRICS = [\n \"functionCalls\",\n \"queryMutationComputeGbHours\",\n \"actionComputeConvexGbHours\",\n \"actionComputeNodeJsGbHours\",\n \"actionComputeCpuGbHours\",\n \"databaseIoGb\",\n \"searchQueryGb\",\n \"dataEgressGb\",\n] as const satisfies readonly UsageLimitMetric[];\n\n// Fails to compile if the backend's `UsageLimitMetric` gains a metric not listed\n// above, so the CLI's `--metric` choices and ordering stay complete.\ntype MissingMetric = Exclude<\n UsageLimitMetric,\n (typeof USAGE_LIMIT_METRICS)[number]\n>;\nconst _metricsExhaustive: [MissingMetric] extends [never] ? true : never = true;\nvoid _metricsExhaustive;\n\nexport const USAGE_LIMIT_WINDOWS = [\"day\", \"month\"] as const;\nexport type UsageLimitWindow = (typeof USAGE_LIMIT_WINDOWS)[number];\n\nexport const USAGE_LIMIT_TYPES = [\"warning\", \"disable\"] as const;\nexport type UsageLimitType = (typeof USAGE_LIMIT_TYPES)[number];\n\nexport const METRIC_LABELS: Record<UsageLimitMetric, string> = {\n functionCalls: \"Function calls\",\n queryMutationComputeGbHours: \"Query/Mutation compute\",\n actionComputeConvexGbHours: \"Action compute\",\n actionComputeNodeJsGbHours: \"Action compute (Node.js)\",\n actionComputeCpuGbHours: \"Action compute (CPU)\",\n databaseIoGb: \"Database I/O\",\n searchQueryGb: \"Search queries\",\n dataEgressGb: \"Data egress\",\n};\n\nexport function metricLabel(metric: string): string {\n // Look up permissively: a newer backend may report a metric this CLI's label\n // map doesn't know, in which case fall back to the raw id.\n return (METRIC_LABELS as Record<string, string>)[metric] ?? metric;\n}\n\nasync function usageLimitFetch(\n ctx: Context,\n deployment: UsageLimitDeployment,\n path: string,\n init?: { method?: string; body?: unknown },\n): Promise<unknown> {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n const response = await fetch(`/api/v1${path}`, {\n method: init?.method ?? \"GET\",\n ...(init?.body !== undefined ? { body: JSON.stringify(init.body) } : {}),\n });\n const text = await response.text();\n return text.length > 0 ? JSON.parse(text) : undefined;\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n}\n\nexport async function listUsageLimits(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<UsageLimitConfigResponse[]> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n \"/list_usage_limits\",\n )) as {\n usageLimits: UsageLimitConfigResponse[];\n };\n return result.usageLimits;\n}\n\nexport async function createUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n config: UsageLimitConfigRequest,\n): Promise<UsageLimitConfigResponse> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n \"/create_usage_limit\",\n {\n method: \"POST\",\n body: config,\n },\n )) as { usageLimit: UsageLimitConfigResponse };\n return result.usageLimit;\n}\n\nexport async function updateUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n id: string,\n config: UsageLimitConfigRequest,\n): Promise<UsageLimitConfigResponse> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n `/update_usage_limit/${id}`,\n { method: \"POST\", body: config },\n )) as { usageLimit: UsageLimitConfigResponse };\n return result.usageLimit;\n}\n\nexport async function deleteUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n id: string,\n): Promise<void> {\n await usageLimitFetch(ctx, deployment, `/delete_usage_limit/${id}`, {\n method: \"POST\",\n });\n}\n\nexport async function getCurrentUsage(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<GetCurrentUsageResponse> {\n return (await usageLimitFetch(\n ctx,\n deployment,\n \"/get_current_usage\",\n )) as GetCurrentUsageResponse;\n}\n\nfunction metricRank(metric: string): number {\n const i = (USAGE_LIMIT_METRICS as readonly string[]).indexOf(metric);\n // Unknown metrics (e.g. a newer backend adds one) sort last, stably.\n return i === -1 ? USAGE_LIMIT_METRICS.length : i;\n}\n\n// Windows coarsest-first and warning-before-disable,.\nconst windowRank = (w: string) => (w === \"month\" ? 0 : 1);\nconst typeRank = (t: string) => (t === \"warning\" ? 0 : 1);\n\nexport function compareUsageLimits(\n a: { metric: string; window: string; limitType: string },\n b: { metric: string; window: string; limitType: string },\n): number {\n return (\n metricRank(a.metric) - metricRank(b.metric) ||\n windowRank(a.window) - windowRank(b.window) ||\n typeRank(a.limitType) - typeRank(b.limitType)\n );\n}\n\nexport function compareMetricNames(a: string, b: string): number {\n return metricRank(a) - metricRank(b);\n}\n\n// A limit annotated with the current usage in its window and whether it's\n// currently triggered.\nexport type UsageLimitStatus = UsageLimitConfigResponse & {\n currentUsage: number | null;\n unit: string | null;\n triggered: boolean;\n};\n\nfunction usageInWindow(\n usage: GetCurrentUsageResponse,\n metric: string,\n window: string,\n): number | null {\n const m = usage.metrics[metric];\n if (m === undefined) {\n return null;\n }\n return window === \"day\" ? m.usage.current_day : m.usage.current_month;\n}\n\n// List usage limits annotated with current usage and triggered state, sorted in\n// dashboard order. Fetches the limits and current usage together.\nexport async function listUsageLimitsWithStatus(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<{\n limits: UsageLimitStatus[];\n seedStatus: GetCurrentUsageResponse[\"seedStatus\"];\n}> {\n const [limits, usage] = await Promise.all([\n listUsageLimits(ctx, deployment),\n getCurrentUsage(ctx, deployment),\n ]);\n const withStatus = limits\n .map((limit): UsageLimitStatus => {\n const currentUsage = usageInWindow(usage, limit.metric, limit.window);\n const unit = usage.metrics[limit.metric]?.unit ?? null;\n const triggered =\n limit.enabled && currentUsage !== null && currentUsage >= limit.limit;\n return { ...limit, currentUsage, unit, triggered };\n })\n .sort(compareUsageLimits);\n return { limits: withStatus, seedStatus: usage.seedStatus };\n}\n\n// A usage limit is uniquely identified by (metric, window, limitType) \u2014 the\n// same key the backend enforces uniqueness on. The HTTP API addresses limits by\n// document id, so callers who know the natural key list and resolve it here.\nexport type UsageLimitKey = {\n metric: UsageLimitMetric;\n window: string;\n limitType: string;\n};\n\nexport async function findUsageLimitByKey(\n ctx: Context,\n deployment: UsageLimitDeployment & { deploymentNotice: string },\n key: UsageLimitKey,\n): Promise<UsageLimitConfigResponse> {\n const match = (await listUsageLimits(ctx, deployment)).find(\n (limit) =>\n limit.metric === key.metric &&\n limit.window === key.window &&\n limit.limitType === key.limitType,\n );\n if (match === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: No ${key.limitType} usage limit on ${key.metric} per ${key.window}${deployment.deploymentNotice}.`,\n });\n }\n return match;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n GetCurrentUsageResponse,\n UsageLimitConfigRequest,\n UsageLimitConfigResponse,\n UsageLimitMetric,\n} from \"@convex-dev/platform/deploymentApi\";\nimport { Context } from \"../../bundler/context.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\n\nexport type UsageLimitDeployment = {\n deploymentUrl: string;\n adminKey: string;\n};\n\nexport const USAGE_LIMIT_METRICS = [\n \"functionCalls\",\n \"queryMutationComputeGbHours\",\n \"actionComputeConvexGbHours\",\n \"actionComputeNodeJsGbHours\",\n \"actionComputeCpuGbHours\",\n \"databaseIoGb\",\n \"searchQueryGb\",\n \"dataEgressGb\",\n \"aiGatewayCostDollars\",\n] as const satisfies readonly UsageLimitMetric[];\n\n// Fails to compile if the backend's `UsageLimitMetric` gains a metric not listed\n// above, so the CLI's `--metric` choices and ordering stay complete.\ntype MissingMetric = Exclude<\n UsageLimitMetric,\n (typeof USAGE_LIMIT_METRICS)[number]\n>;\nconst _metricsExhaustive: [MissingMetric] extends [never] ? true : never = true;\nvoid _metricsExhaustive;\n\nexport const USAGE_LIMIT_WINDOWS = [\"day\", \"month\"] as const;\nexport type UsageLimitWindow = (typeof USAGE_LIMIT_WINDOWS)[number];\n\nexport const USAGE_LIMIT_TYPES = [\"warning\", \"disable\"] as const;\nexport type UsageLimitType = (typeof USAGE_LIMIT_TYPES)[number];\n\nexport const METRIC_LABELS: Record<UsageLimitMetric, string> = {\n functionCalls: \"Function calls\",\n queryMutationComputeGbHours: \"Query/Mutation compute\",\n actionComputeConvexGbHours: \"Action compute\",\n actionComputeNodeJsGbHours: \"Action compute (Node.js)\",\n actionComputeCpuGbHours: \"Action compute (CPU)\",\n databaseIoGb: \"Database I/O\",\n searchQueryGb: \"Search queries\",\n dataEgressGb: \"Data egress\",\n aiGatewayCostDollars: \"AI Gateway\",\n};\n\nexport function metricLabel(metric: string): string {\n // Look up permissively: a newer backend may report a metric this CLI's label\n // map doesn't know, in which case fall back to the raw id.\n return (METRIC_LABELS as Record<string, string>)[metric] ?? metric;\n}\n\nasync function usageLimitFetch(\n ctx: Context,\n deployment: UsageLimitDeployment,\n path: string,\n init?: { method?: string; body?: unknown },\n): Promise<unknown> {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n const response = await fetch(`/api/v1${path}`, {\n method: init?.method ?? \"GET\",\n ...(init?.body !== undefined ? { body: JSON.stringify(init.body) } : {}),\n });\n const text = await response.text();\n return text.length > 0 ? JSON.parse(text) : undefined;\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n}\n\nexport async function listUsageLimits(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<UsageLimitConfigResponse[]> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n \"/list_usage_limits\",\n )) as {\n usageLimits: UsageLimitConfigResponse[];\n };\n return result.usageLimits;\n}\n\nexport async function createUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n config: UsageLimitConfigRequest,\n): Promise<UsageLimitConfigResponse> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n \"/create_usage_limit\",\n {\n method: \"POST\",\n body: config,\n },\n )) as { usageLimit: UsageLimitConfigResponse };\n return result.usageLimit;\n}\n\nexport async function updateUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n id: string,\n config: UsageLimitConfigRequest,\n): Promise<UsageLimitConfigResponse> {\n const result = (await usageLimitFetch(\n ctx,\n deployment,\n `/update_usage_limit/${id}`,\n { method: \"POST\", body: config },\n )) as { usageLimit: UsageLimitConfigResponse };\n return result.usageLimit;\n}\n\nexport async function deleteUsageLimit(\n ctx: Context,\n deployment: UsageLimitDeployment,\n id: string,\n): Promise<void> {\n await usageLimitFetch(ctx, deployment, `/delete_usage_limit/${id}`, {\n method: \"POST\",\n });\n}\n\nexport async function getCurrentUsage(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<GetCurrentUsageResponse> {\n return (await usageLimitFetch(\n ctx,\n deployment,\n \"/get_current_usage\",\n )) as GetCurrentUsageResponse;\n}\n\nfunction metricRank(metric: string): number {\n const i = (USAGE_LIMIT_METRICS as readonly string[]).indexOf(metric);\n // Unknown metrics (e.g. a newer backend adds one) sort last, stably.\n return i === -1 ? USAGE_LIMIT_METRICS.length : i;\n}\n\n// Windows coarsest-first and warning-before-disable,.\nconst windowRank = (w: string) => (w === \"month\" ? 0 : 1);\nconst typeRank = (t: string) => (t === \"warning\" ? 0 : 1);\n\nexport function compareUsageLimits(\n a: { metric: string; window: string; limitType: string },\n b: { metric: string; window: string; limitType: string },\n): number {\n return (\n metricRank(a.metric) - metricRank(b.metric) ||\n windowRank(a.window) - windowRank(b.window) ||\n typeRank(a.limitType) - typeRank(b.limitType)\n );\n}\n\nexport function compareMetricNames(a: string, b: string): number {\n return metricRank(a) - metricRank(b);\n}\n\n// A limit annotated with the current usage in its window and whether it's\n// currently triggered.\nexport type UsageLimitStatus = UsageLimitConfigResponse & {\n currentUsage: number | null;\n unit: string | null;\n triggered: boolean;\n};\n\nfunction usageInWindow(\n usage: GetCurrentUsageResponse,\n metric: string,\n window: string,\n): number | null {\n const m = usage.metrics[metric];\n if (m === undefined) {\n return null;\n }\n return window === \"day\" ? m.usage.current_day : m.usage.current_month;\n}\n\n// List usage limits annotated with current usage and triggered state, sorted in\n// dashboard order. Fetches the limits and current usage together.\nexport async function listUsageLimitsWithStatus(\n ctx: Context,\n deployment: UsageLimitDeployment,\n): Promise<{\n limits: UsageLimitStatus[];\n seedStatus: GetCurrentUsageResponse[\"seedStatus\"];\n}> {\n const [limits, usage] = await Promise.all([\n listUsageLimits(ctx, deployment),\n getCurrentUsage(ctx, deployment),\n ]);\n const withStatus = limits\n .map((limit): UsageLimitStatus => {\n const currentUsage = usageInWindow(usage, limit.metric, limit.window);\n const unit = usage.metrics[limit.metric]?.unit ?? null;\n const triggered =\n limit.enabled && currentUsage !== null && currentUsage >= limit.limit;\n return { ...limit, currentUsage, unit, triggered };\n })\n .sort(compareUsageLimits);\n return { limits: withStatus, seedStatus: usage.seedStatus };\n}\n\n// A usage limit is uniquely identified by (metric, window, limitType) \u2014 the\n// same key the backend enforces uniqueness on. The HTTP API addresses limits by\n// document id, so callers who know the natural key list and resolve it here.\nexport type UsageLimitKey = {\n metric: UsageLimitMetric;\n window: string;\n limitType: string;\n};\n\nexport async function findUsageLimitByKey(\n ctx: Context,\n deployment: UsageLimitDeployment & { deploymentNotice: string },\n key: UsageLimitKey,\n): Promise<UsageLimitConfigResponse> {\n const match = (await listUsageLimits(ctx, deployment)).find(\n (limit) =>\n limit.metric === key.metric &&\n limit.window === key.window &&\n limit.limitType === key.limitType,\n );\n if (match === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: No ${key.limitType} usage limit on ${key.metric} per ${key.window}${deployment.deploymentNotice}.`,\n });\n }\n return match;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,mBAAwD;AAOjD,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQA,MAAM,qBAAqE;AAC3E,KAAK;AAEE,MAAM,sBAAsB,CAAC,OAAO,OAAO;AAG3C,MAAM,oBAAoB,CAAC,WAAW,SAAS;AAG/C,MAAM,gBAAkD;AAAA,EAC7D,eAAe;AAAA,EACf,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,sBAAsB;AACxB;AAEO,SAAS,YAAY,QAAwB;AAGlD,SAAQ,cAAyC,MAAM,KAAK;AAC9D;AAEA,eAAe,gBACb,KACA,YACA,MACA,MACkB;AAClB,QAAM,YAAQ,8BAAgB,KAAK,UAAU;AAC7C,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,UAAU,IAAI,IAAI;AAAA,MAC7C,QAAQ,MAAM,UAAU;AAAA,MACxB,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,IACxE,CAAC;AACD,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI;AAAA,EAC9C,SAAS,GAAG;AACV,WAAO,UAAM,qCAAuB,KAAK,CAAC;AAAA,EAC5C;AACF;AAEA,eAAsB,gBACpB,KACA,YACqC;AACrC,QAAM,SAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,SAAO,OAAO;AAChB;AAEA,eAAsB,iBACpB,KACA,YACA,QACmC;AACnC,QAAM,SAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,iBACpB,KACA,YACA,IACA,QACmC;AACnC,QAAM,SAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA,uBAAuB,EAAE;AAAA,IACzB,EAAE,QAAQ,QAAQ,MAAM,OAAO;AAAA,EACjC;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,iBACpB,KACA,YACA,IACe;AACf,QAAM,gBAAgB,KAAK,YAAY,uBAAuB,EAAE,IAAI;AAAA,IAClE,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAsB,gBACpB,KACA,YACkC;AAClC,SAAQ,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,WAAW,QAAwB;AAC1C,QAAM,IAAK,oBAA0C,QAAQ,MAAM;AAEnE,SAAO,MAAM,KAAK,oBAAoB,SAAS;AACjD;AAGA,MAAM,aAAa,CAAC,MAAe,MAAM,UAAU,IAAI;AACvD,MAAM,WAAW,CAAC,MAAe,MAAM,YAAY,IAAI;AAEhD,SAAS,mBACd,GACA,GACQ;AACR,SACE,WAAW,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,KAC1C,WAAW,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,KAC1C,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,SAAS;AAEhD;AAEO,SAAS,mBAAmB,GAAW,GAAmB;AAC/D,SAAO,WAAW,CAAC,IAAI,WAAW,CAAC;AACrC;AAUA,SAAS,cACP,OACA,QACA,QACe;AACf,QAAM,IAAI,MAAM,QAAQ,MAAM;AAC9B,MAAI,MAAM,QAAW;AACnB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,QAAQ,EAAE,MAAM,cAAc,EAAE,MAAM;AAC1D;AAIA,eAAsB,0BACpB,KACA,YAIC;AACD,QAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,gBAAgB,KAAK,UAAU;AAAA,IAC/B,gBAAgB,KAAK,UAAU;AAAA,EACjC,CAAC;AACD,QAAM,aAAa,OAChB,IAAI,CAAC,UAA4B;AAChC,UAAM,eAAe,cAAc,OAAO,MAAM,QAAQ,MAAM,MAAM;AACpE,UAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,GAAG,QAAQ;AAClD,UAAM,YACJ,MAAM,WAAW,iBAAiB,QAAQ,gBAAgB,MAAM;AAClE,WAAO,EAAE,GAAG,OAAO,cAAc,MAAM,UAAU;AAAA,EACnD,CAAC,EACA,KAAK,kBAAkB;AAC1B,SAAO,EAAE,QAAQ,YAAY,YAAY,MAAM,WAAW;AAC5D;AAWA,eAAsB,oBACpB,KACA,YACA,KACmC;AACnC,QAAM,SAAS,MAAM,gBAAgB,KAAK,UAAU,GAAG;AAAA,IACrD,CAAC,UACC,MAAM,WAAW,IAAI,UACrB,MAAM,WAAW,IAAI,UACrB,MAAM,cAAc,IAAI;AAAA,EAC5B;AACA,MAAI,UAAU,QAAW;AACvB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,aAAa,IAAI,SAAS,mBAAmB,IAAI,MAAM,QAAQ,IAAI,MAAM,GAAG,WAAW,gBAAgB;AAAA,IACzH,CAAC;AAAA,EACH;AACA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -25,32 +25,17 @@ __export(mutex_exports, {
25
25
  module.exports = __toCommonJS(mutex_exports);
26
26
  class Mutex {
27
27
  constructor() {
28
- __publicField(this, "currentlyRunning", null);
29
- __publicField(this, "waiting", []);
28
+ __publicField(this, "tail", Promise.resolve());
30
29
  }
31
30
  async runExclusive(fn) {
32
- const outerPromise = new Promise((resolve, reject) => {
33
- const wrappedCallback = () => {
34
- return fn().then((v) => resolve(v)).catch((e) => reject(e));
35
- };
36
- this.enqueueCallbackForMutex(wrappedCallback);
37
- });
38
- return outerPromise;
39
- }
40
- enqueueCallbackForMutex(callback) {
41
- if (this.currentlyRunning === null) {
42
- this.currentlyRunning = callback().finally(() => {
43
- const nextCb = this.waiting.shift();
44
- if (nextCb === void 0) {
45
- this.currentlyRunning = null;
46
- } else {
47
- this.enqueueCallbackForMutex(nextCb);
48
- }
49
- });
50
- this.waiting.length = 0;
51
- } else {
52
- this.waiting.push(callback);
53
- }
31
+ const result = this.tail.then(fn);
32
+ this.tail = result.then(
33
+ () => {
34
+ },
35
+ () => {
36
+ }
37
+ );
38
+ return result;
54
39
  }
55
40
  }
56
41
  //# sourceMappingURL=mutex.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/utils/mutex.ts"],
4
- "sourcesContent": ["export class Mutex {\n currentlyRunning: Promise<void> | null = null;\n waiting: Array<() => Promise<void>> = [];\n\n async runExclusive<T>(fn: () => Promise<T>): Promise<T> {\n const outerPromise = new Promise<T>((resolve, reject) => {\n const wrappedCallback: () => Promise<void> = () => {\n return fn()\n .then((v: T) => resolve(v))\n .catch((e: any) => reject(e));\n };\n this.enqueueCallbackForMutex(wrappedCallback);\n });\n return outerPromise;\n }\n\n private enqueueCallbackForMutex(callback: () => Promise<void>) {\n if (this.currentlyRunning === null) {\n this.currentlyRunning = callback().finally(() => {\n const nextCb = this.waiting.shift();\n if (nextCb === undefined) {\n this.currentlyRunning = null;\n } else {\n this.enqueueCallbackForMutex(nextCb);\n }\n });\n this.waiting.length = 0;\n } else {\n this.waiting.push(callback);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,MAAM;AAAA,EAAZ;AACL,4CAAyC;AACzC,mCAAsC,CAAC;AAAA;AAAA,EAEvC,MAAM,aAAgB,IAAkC;AACtD,UAAM,eAAe,IAAI,QAAW,CAAC,SAAS,WAAW;AACvD,YAAM,kBAAuC,MAAM;AACjD,eAAO,GAAG,EACP,KAAK,CAAC,MAAS,QAAQ,CAAC,CAAC,EACzB,MAAM,CAAC,MAAW,OAAO,CAAC,CAAC;AAAA,MAChC;AACA,WAAK,wBAAwB,eAAe;AAAA,IAC9C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,UAA+B;AAC7D,QAAI,KAAK,qBAAqB,MAAM;AAClC,WAAK,mBAAmB,SAAS,EAAE,QAAQ,MAAM;AAC/C,cAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,YAAI,WAAW,QAAW;AACxB,eAAK,mBAAmB;AAAA,QAC1B,OAAO;AACL,eAAK,wBAAwB,MAAM;AAAA,QACrC;AAAA,MACF,CAAC;AACD,WAAK,QAAQ,SAAS;AAAA,IACxB,OAAO;AACL,WAAK,QAAQ,KAAK,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["export class Mutex {\n private tail: Promise<void> = Promise.resolve();\n\n async runExclusive<T>(fn: () => Promise<T>): Promise<T> {\n const result = this.tail.then(fn);\n // Reserve the next position before running fn, and allow the queue to\n // continue even if fn rejects or throws synchronously.\n this.tail = result.then(\n () => {},\n () => {},\n );\n return result;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,MAAM;AAAA,EAAZ;AACL,wBAAQ,QAAsB,QAAQ,QAAQ;AAAA;AAAA,EAE9C,MAAM,aAAgB,IAAkC;AACtD,UAAM,SAAS,KAAK,KAAK,KAAK,EAAE;AAGhC,SAAK,OAAO,OAAO;AAAA,MACjB,MAAM;AAAA,MAAC;AAAA,MACP,MAAM;AAAA,MAAC;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
@@ -55,6 +55,7 @@ __export(utils_exports, {
55
55
  hasProject: () => hasProject,
56
56
  hasProjects: () => hasProjects,
57
57
  hasTeam: () => hasTeam,
58
+ integerFromEnv: () => integerFromEnv,
58
59
  isInExistingProject: () => isInExistingProject,
59
60
  isWebContainer: () => isWebContainer,
60
61
  loadPackageJson: () => loadPackageJson,
@@ -68,6 +69,7 @@ __export(utils_exports, {
68
69
  productionProvisionHost: () => productionProvisionHost,
69
70
  provisionHost: () => provisionHost,
70
71
  readDeployKeyFromEnv: () => readDeployKeyFromEnv,
72
+ retryDelay: () => retryDelay,
71
73
  rootDirectory: () => rootDirectory,
72
74
  selectDevDeploymentType: () => selectDevDeploymentType,
73
75
  selectRegion: () => selectRegion,
@@ -402,6 +404,16 @@ async function selectRegionOrUseDefault(ctx, selectedTeam, deploymentType) {
402
404
  }
403
405
  return selectedRegionName;
404
406
  }
407
+ const REGION_ORDER = [
408
+ "aws-us-east-1",
409
+ "aws-eu-west-1",
410
+ "aws-ca-central-1",
411
+ "aws-ap-southeast-2"
412
+ ];
413
+ function regionSortIndex(regionName) {
414
+ const index = REGION_ORDER.indexOf(regionName);
415
+ return index === -1 ? REGION_ORDER.length : index;
416
+ }
405
417
  async function selectRegion(ctx, teamId, deploymentType) {
406
418
  const regionsResponse = (await typedPlatformClient(ctx).GET(
407
419
  "/teams/{team_id}/list_deployment_regions",
@@ -414,11 +426,7 @@ async function selectRegion(ctx, teamId, deploymentType) {
414
426
  const choices = regionsResponse.items.filter((item) => Boolean(item.available)).map((item) => ({
415
427
  name: item.displayName,
416
428
  value: item.name
417
- })).sort((a, b) => {
418
- if (a.value === "aws-us-east-1") return -1;
419
- if (b.value === "aws-us-east-1") return 1;
420
- return 0;
421
- });
429
+ })).sort((a, b) => regionSortIndex(a.value) - regionSortIndex(b.value));
422
430
  return await (0, import_prompts.promptOptions)(ctx, {
423
431
  message: `Where should this ${deploymentType} deployment run?`,
424
432
  suffix: `
@@ -430,14 +438,18 @@ ${import_chalk.chalkStderr.gray(
430
438
  }
431
439
  async function hasProject(ctx, teamSlug, projectSlug) {
432
440
  try {
433
- const projects = (await typedBigBrainClient(ctx).GET("/teams/{team_slug}/projects", {
434
- params: {
435
- path: {
436
- team_slug: teamSlug
441
+ await typedPlatformClient(ctx, { throw: true }).GET(
442
+ "/teams/{team_id_or_slug}/projects/{project_slug}",
443
+ {
444
+ params: {
445
+ path: {
446
+ team_id_or_slug: teamSlug,
447
+ project_slug: projectSlug
448
+ }
437
449
  }
438
450
  }
439
- })).data;
440
- return !!projects.find((project) => project.slug === projectSlug);
451
+ );
452
+ return true;
441
453
  } catch {
442
454
  return false;
443
455
  }
@@ -445,14 +457,20 @@ async function hasProject(ctx, teamSlug, projectSlug) {
445
457
  async function hasProjects(ctx) {
446
458
  return !!await bigBrainAPI({ ctx, method: "GET", path: `has_projects` });
447
459
  }
448
- async function validateOrSelectProject(ctx, projectSlug, teamSlug, singleProjectPrompt, multiProjectPrompt) {
449
- const projects = (await typedBigBrainClient(ctx).GET("/teams/{team_slug}/projects", {
450
- params: {
451
- path: {
452
- team_slug: teamSlug
460
+ async function validateOrSelectProject(ctx, projectSlug, teamId, singleProjectPrompt, multiProjectPrompt) {
461
+ const projects = [];
462
+ const client = typedPlatformClient(ctx);
463
+ let cursor;
464
+ do {
465
+ const { items, pagination } = (await client.GET("/teams/{team_id}/projects", {
466
+ params: {
467
+ path: { team_id: teamId },
468
+ query: cursor === void 0 ? {} : { cursor }
453
469
  }
454
- }
455
- })).data;
470
+ })).data;
471
+ projects.push(...items);
472
+ cursor = pagination.hasMore ? pagination.nextCursor ?? void 0 : void 0;
473
+ } while (cursor !== void 0);
456
474
  if (projects.length === 0) {
457
475
  return await ctx.crash({
458
476
  exitCode: 1,
@@ -705,32 +723,34 @@ function waitUntilCalled() {
705
723
  const waitPromise = new Promise((resolve) => onCalled = resolve);
706
724
  return [waitPromise, () => onCalled(null)];
707
725
  }
708
- const BYTE_UNITS = [
709
- [1 << 30, "GiB"],
710
- [1e9, "GB"],
711
- [1 << 20, "MiB"],
712
- [1e6, "MB"],
713
- [1 << 10, "KiB"],
714
- [1e3, "KB"]
715
- ];
726
+ const BYTE_UNITS = ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB"];
716
727
  function formatSize(n) {
717
- if (n === 0) {
718
- return "0 bytes";
728
+ let value = n;
729
+ let unitIndex = 0;
730
+ while (value >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
731
+ value /= 1024;
732
+ unitIndex++;
719
733
  }
720
- for (const [unitSize, unitName] of BYTE_UNITS) {
721
- if (n < unitSize) {
722
- continue;
723
- }
724
- if (n % unitSize === 0) {
725
- return `${n / unitSize} ${unitName}`;
726
- }
727
- if (n * 10 % unitSize === 0) {
728
- const whole = Math.floor(n / unitSize);
729
- const frac = Math.floor(n * 10 / unitSize) % 10;
730
- return `${whole}.${frac} ${unitName}`;
731
- }
734
+ const roundedValue = Number(value.toFixed(1));
735
+ if (roundedValue >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
736
+ value /= 1024;
737
+ unitIndex++;
738
+ }
739
+ const formatted = value.toFixed(1).replace(/\.0$/, "");
740
+ return `${formatted} ${BYTE_UNITS[unitIndex]}`;
741
+ }
742
+ function integerFromEnv(envVar, defaultValue) {
743
+ const envValue = process.env[envVar];
744
+ if (envValue === void 0) {
745
+ return defaultValue;
746
+ }
747
+ if (!/^[+-]?\d+$/.test(envValue.trim())) {
748
+ (0, import_log.logWarning)(
749
+ `Ignoring ${envVar}=${JSON.stringify(envValue)}: expected an integer, using ${defaultValue}`
750
+ );
751
+ return defaultValue;
732
752
  }
733
- return `${n} bytes`;
753
+ return Number(envValue);
734
754
  }
735
755
  function formatDuration(ms) {
736
756
  const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;
@@ -859,8 +879,8 @@ function retryDelay(attempt, _error, _response) {
859
879
  const randomSum = delay * 0.2 * Math.random();
860
880
  return delay + randomSum;
861
881
  }
862
- function deploymentFetchRetryOn(onError, method) {
863
- const shouldRetry = function(_attempt, error, response) {
882
+ function deploymentFetchRetryOn(onError, method, maxRetries = MAX_RETRIES, shouldRetryOverride) {
883
+ const defaultShouldRetry = function(_attempt, error, response) {
864
884
  if (error !== null) {
865
885
  return { kind: "retry", error };
866
886
  }
@@ -906,12 +926,18 @@ function deploymentFetchRetryOn(onError, method) {
906
926
  }
907
927
  return { kind: "stop" };
908
928
  };
929
+ const shouldRetry = shouldRetryOverride ? function(_attempt, error, response) {
930
+ return shouldRetryOverride(error, response) ? {
931
+ kind: "retry",
932
+ error: error ?? `Received response with status ${response?.status}`
933
+ } : { kind: "stop" };
934
+ } : defaultShouldRetry;
909
935
  return function(attempt, error, response) {
910
936
  const result = shouldRetry(attempt, error, response);
911
937
  if (result.kind === "retry") {
912
938
  onError?.(result.error, attempt);
913
939
  }
914
- if (attempt >= MAX_RETRIES) {
940
+ if (attempt >= maxRetries) {
915
941
  return false;
916
942
  }
917
943
  return result.kind === "retry";
@@ -940,13 +966,19 @@ function bareDeploymentFetch(_ctx, options) {
940
966
  };
941
967
  }
942
968
  function deploymentFetch(_ctx, options) {
943
- const { deploymentUrl, adminKey, onError } = options;
969
+ const {
970
+ deploymentUrl,
971
+ adminKey,
972
+ onError,
973
+ maxRetries = MAX_RETRIES,
974
+ shouldRetry
975
+ } = options;
944
976
  const onErrorWithAttempt = (err, attempt) => {
945
977
  onError?.(err);
946
978
  if (attempt >= RETRY_LOG_THRESHOLD) {
947
979
  (0, import_log.logMessage)(
948
980
  import_chalk.chalkStderr.gray(
949
- `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`
981
+ `Retrying request (attempt ${attempt}/${maxRetries})...`
950
982
  )
951
983
  );
952
984
  }
@@ -965,7 +997,12 @@ function deploymentFetch(_ctx, options) {
965
997
  }
966
998
  const func = throwingFetch(url, {
967
999
  retryDelay,
968
- retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options2?.method),
1000
+ retryOn: deploymentFetchRetryOn(
1001
+ onErrorWithAttempt,
1002
+ options2?.method,
1003
+ maxRetries,
1004
+ shouldRetry
1005
+ ),
969
1006
  ...options2,
970
1007
  headers
971
1008
  });