convex 1.45.0-alpha.0 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/CHANGELOG.md +55 -6
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/http_client.js.map +2 -2
  5. package/dist/cjs/browser/query_options.js.map +2 -2
  6. package/dist/cjs/browser/simple_client.js.map +2 -2
  7. package/dist/cjs/browser/sync/optimistic_updates.js.map +1 -1
  8. package/dist/cjs/browser/sync/optimistic_updates_impl.js.map +2 -2
  9. package/dist/cjs/cli/codegen.js +2 -0
  10. package/dist/cjs/cli/codegen.js.map +2 -2
  11. package/dist/cjs/cli/deploy.js +1 -0
  12. package/dist/cjs/cli/deploy.js.map +2 -2
  13. package/dist/cjs/cli/docs.js +3 -36
  14. package/dist/cjs/cli/docs.js.map +2 -2
  15. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +101 -60
  16. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  17. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +107 -0
  18. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  19. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  20. package/dist/cjs/cli/lib/components.js +12 -0
  21. package/dist/cjs/cli/lib/components.js.map +2 -2
  22. package/dist/cjs/cli/lib/deploy2.js +29 -2
  23. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  24. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +73 -0
  25. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  26. package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
  27. package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
  28. package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
  29. package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
  30. package/dist/cjs/cli/lib/dev.js +1 -0
  31. package/dist/cjs/cli/lib/dev.js.map +2 -2
  32. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  33. package/dist/cjs/cli/lib/indexes.js +1 -1
  34. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  35. package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
  36. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  37. package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
  38. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  39. package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
  40. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  41. package/dist/cjs/cli/lib/run.js +1 -0
  42. package/dist/cjs/cli/lib/run.js.map +2 -2
  43. package/dist/cjs/cli/lib/utils/utils.js +36 -29
  44. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  45. package/dist/cjs/cli/mcp.js +16 -6
  46. package/dist/cjs/cli/mcp.js.map +2 -2
  47. package/dist/cjs/index.js +1 -1
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/nextjs/index.js.map +2 -2
  50. package/dist/cjs/react/client.js.map +2 -2
  51. package/dist/cjs/react/hydration.js.map +2 -2
  52. package/dist/cjs/react/queries_observer.js.map +2 -2
  53. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  54. package/dist/cjs/react/use_queries.js.map +2 -2
  55. package/dist/cjs/server/api.js.map +2 -2
  56. package/dist/cjs/server/components/index.js.map +2 -2
  57. package/dist/cjs/server/cron.js +10 -10
  58. package/dist/cjs/server/cron.js.map +2 -2
  59. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  60. package/dist/cjs/server/impl/meta_impl.js +8 -2
  61. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  62. package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
  63. package/dist/cjs/server/index.js.map +2 -2
  64. package/dist/cjs/server/meta.js.map +1 -1
  65. package/dist/cjs/server/registration.js.map +1 -1
  66. package/dist/cjs/server/scheduler.js.map +1 -1
  67. package/dist/cjs/server/schema.js +50 -3
  68. package/dist/cjs/server/schema.js.map +2 -2
  69. package/dist/cjs/values/validator.js +1 -1
  70. package/dist/cjs/values/validator.js.map +2 -2
  71. package/dist/cjs/values/validators.js +81 -25
  72. package/dist/cjs/values/validators.js.map +2 -2
  73. package/dist/cjs-types/browser/http_client.d.ts +5 -5
  74. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  75. package/dist/cjs-types/browser/query_options.d.ts +2 -2
  76. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  77. package/dist/cjs-types/browser/simple_client.d.ts +6 -6
  78. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  79. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
  80. package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  81. package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  83. package/dist/cjs-types/cli/docs.d.ts.map +1 -1
  84. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  85. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  86. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  87. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  88. package/dist/cjs-types/cli/lib/codegen.d.ts +1 -0
  89. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  90. package/dist/cjs-types/cli/lib/components.d.ts +1 -0
  91. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  92. package/dist/cjs-types/cli/lib/deploy2.d.ts +6 -0
  93. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  94. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  95. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  96. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  97. package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  98. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  100. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  101. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
  102. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  104. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
  105. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  106. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  107. package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -5
  108. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  109. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  110. package/dist/cjs-types/index.d.ts +1 -1
  111. package/dist/cjs-types/index.d.ts.map +1 -1
  112. package/dist/cjs-types/nextjs/index.d.ts +6 -6
  113. package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
  114. package/dist/cjs-types/react/client.d.ts +15 -15
  115. package/dist/cjs-types/react/client.d.ts.map +1 -1
  116. package/dist/cjs-types/react/hydration.d.ts +3 -3
  117. package/dist/cjs-types/react/hydration.d.ts.map +1 -1
  118. package/dist/cjs-types/react/queries_observer.d.ts +9 -9
  119. package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
  120. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  121. package/dist/cjs-types/react/use_queries.d.ts +14 -6
  122. package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
  123. package/dist/cjs-types/server/api.d.ts +157 -7
  124. package/dist/cjs-types/server/api.d.ts.map +1 -1
  125. package/dist/cjs-types/server/components/index.d.ts +2 -2
  126. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  127. package/dist/cjs-types/server/cron.d.ts +21 -20
  128. package/dist/cjs-types/server/cron.d.ts.map +1 -1
  129. package/dist/cjs-types/server/impl/actions_impl.d.ts +18 -4
  130. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  131. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  132. package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
  133. package/dist/cjs-types/server/index.d.ts +2 -1
  134. package/dist/cjs-types/server/index.d.ts.map +1 -1
  135. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  136. package/dist/cjs-types/server/registration.d.ts +7 -7
  137. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  138. package/dist/cjs-types/server/scheduler.d.ts +9 -7
  139. package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
  140. package/dist/cjs-types/server/schema.d.ts +1 -0
  141. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  142. package/dist/cjs-types/values/validator.d.ts.map +1 -1
  143. package/dist/cjs-types/values/validators.d.ts +30 -0
  144. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  145. package/dist/cli.bundle.cjs +1753 -140
  146. package/dist/cli.bundle.cjs.map +4 -4
  147. package/dist/esm/browser/http_client.js.map +2 -2
  148. package/dist/esm/browser/query_options.js.map +2 -2
  149. package/dist/esm/browser/simple_client.js.map +2 -2
  150. package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
  151. package/dist/esm/cli/codegen.js +2 -0
  152. package/dist/esm/cli/codegen.js.map +2 -2
  153. package/dist/esm/cli/deploy.js +1 -0
  154. package/dist/esm/cli/deploy.js.map +2 -2
  155. package/dist/esm/cli/docs.js +3 -43
  156. package/dist/esm/cli/docs.js.map +2 -2
  157. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +100 -60
  158. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  159. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +85 -0
  160. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
  161. package/dist/esm/cli/lib/codegen.js.map +2 -2
  162. package/dist/esm/cli/lib/components.js +12 -0
  163. package/dist/esm/cli/lib/components.js.map +2 -2
  164. package/dist/esm/cli/lib/deploy2.js +30 -2
  165. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  166. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +46 -0
  167. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
  168. package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
  169. package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
  170. package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
  171. package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
  172. package/dist/esm/cli/lib/dev.js +1 -0
  173. package/dist/esm/cli/lib/dev.js.map +2 -2
  174. package/dist/esm/cli/lib/indexes.js +1 -1
  175. package/dist/esm/cli/lib/indexes.js.map +1 -1
  176. package/dist/esm/cli/lib/localDeployment/run.js +30 -2
  177. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  178. package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
  179. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  180. package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
  181. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  182. package/dist/esm/cli/lib/run.js +1 -0
  183. package/dist/esm/cli/lib/run.js.map +2 -2
  184. package/dist/esm/cli/lib/utils/utils.js +36 -30
  185. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  186. package/dist/esm/cli/mcp.js +17 -7
  187. package/dist/esm/cli/mcp.js.map +2 -2
  188. package/dist/esm/index.js +1 -1
  189. package/dist/esm/index.js.map +1 -1
  190. package/dist/esm/nextjs/index.js.map +2 -2
  191. package/dist/esm/react/client.js.map +2 -2
  192. package/dist/esm/react/hydration.js +3 -1
  193. package/dist/esm/react/hydration.js.map +2 -2
  194. package/dist/esm/react/queries_observer.js +3 -1
  195. package/dist/esm/react/queries_observer.js.map +2 -2
  196. package/dist/esm/react/use_paginated_query2.js +3 -1
  197. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  198. package/dist/esm/react/use_queries.js.map +2 -2
  199. package/dist/esm/server/api.js.map +2 -2
  200. package/dist/esm/server/components/index.js.map +2 -2
  201. package/dist/esm/server/cron.js +13 -11
  202. package/dist/esm/server/cron.js.map +2 -2
  203. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  204. package/dist/esm/server/impl/meta_impl.js +9 -3
  205. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  206. package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
  207. package/dist/esm/server/index.js.map +2 -2
  208. package/dist/esm/server/schema.js +50 -3
  209. package/dist/esm/server/schema.js.map +2 -2
  210. package/dist/esm/values/validator.js +1 -1
  211. package/dist/esm/values/validator.js.map +2 -2
  212. package/dist/esm/values/validators.js +81 -25
  213. package/dist/esm/values/validators.js.map +2 -2
  214. package/dist/esm-types/browser/http_client.d.ts +5 -5
  215. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  216. package/dist/esm-types/browser/query_options.d.ts +2 -2
  217. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  218. package/dist/esm-types/browser/simple_client.d.ts +6 -6
  219. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  220. package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
  221. package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
  222. package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
  223. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  224. package/dist/esm-types/cli/docs.d.ts.map +1 -1
  225. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
  226. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  227. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
  228. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
  229. package/dist/esm-types/cli/lib/codegen.d.ts +1 -0
  230. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  231. package/dist/esm-types/cli/lib/components.d.ts +1 -0
  232. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  233. package/dist/esm-types/cli/lib/deploy2.d.ts +6 -0
  234. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  235. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
  236. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
  237. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
  238. package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
  239. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  240. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  241. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  242. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
  243. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  244. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  245. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
  246. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  247. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  248. package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -5
  249. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  250. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  251. package/dist/esm-types/index.d.ts +1 -1
  252. package/dist/esm-types/index.d.ts.map +1 -1
  253. package/dist/esm-types/nextjs/index.d.ts +6 -6
  254. package/dist/esm-types/nextjs/index.d.ts.map +1 -1
  255. package/dist/esm-types/react/client.d.ts +15 -15
  256. package/dist/esm-types/react/client.d.ts.map +1 -1
  257. package/dist/esm-types/react/hydration.d.ts +3 -3
  258. package/dist/esm-types/react/hydration.d.ts.map +1 -1
  259. package/dist/esm-types/react/queries_observer.d.ts +9 -9
  260. package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
  261. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  262. package/dist/esm-types/react/use_queries.d.ts +14 -6
  263. package/dist/esm-types/react/use_queries.d.ts.map +1 -1
  264. package/dist/esm-types/server/api.d.ts +157 -7
  265. package/dist/esm-types/server/api.d.ts.map +1 -1
  266. package/dist/esm-types/server/components/index.d.ts +2 -2
  267. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  268. package/dist/esm-types/server/cron.d.ts +21 -20
  269. package/dist/esm-types/server/cron.d.ts.map +1 -1
  270. package/dist/esm-types/server/impl/actions_impl.d.ts +18 -4
  271. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  272. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  273. package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
  274. package/dist/esm-types/server/index.d.ts +2 -1
  275. package/dist/esm-types/server/index.d.ts.map +1 -1
  276. package/dist/esm-types/server/meta.d.ts.map +1 -1
  277. package/dist/esm-types/server/registration.d.ts +7 -7
  278. package/dist/esm-types/server/registration.d.ts.map +1 -1
  279. package/dist/esm-types/server/scheduler.d.ts +9 -7
  280. package/dist/esm-types/server/scheduler.d.ts.map +1 -1
  281. package/dist/esm-types/server/schema.d.ts +1 -0
  282. package/dist/esm-types/server/schema.d.ts.map +1 -1
  283. package/dist/esm-types/values/validator.d.ts.map +1 -1
  284. package/dist/esm-types/values/validators.d.ts +30 -0
  285. package/dist/esm-types/values/validators.d.ts.map +1 -1
  286. package/dist/react.bundle.js +1 -1
  287. package/dist/react.bundle.js.map +2 -2
  288. package/package.json +5 -5
  289. package/src/browser/http_client.ts +43 -10
  290. package/src/browser/query_options.ts +11 -5
  291. package/src/browser/simple_client.ts +35 -14
  292. package/src/browser/sync/optimistic_updates.ts +17 -4
  293. package/src/browser/sync/optimistic_updates_impl.ts +17 -4
  294. package/src/cli/codegen.ts +1 -0
  295. package/src/cli/deploy.ts +1 -0
  296. package/src/cli/docs.ts +3 -44
  297. package/src/cli/lib/checkForLargeIndexDeletion.ts +154 -82
  298. package/src/cli/lib/checkForSlowSchemaValidation.ts +130 -0
  299. package/src/cli/lib/codegen.ts +1 -0
  300. package/src/cli/lib/components.ts +17 -0
  301. package/src/cli/lib/deploy2.ts +56 -1
  302. package/src/cli/lib/deployApi/evaluateSchema.ts +62 -0
  303. package/src/cli/lib/deployApi/finishPush.ts +1 -1
  304. package/src/cli/lib/deployApi/startPush.ts +1 -1
  305. package/src/cli/lib/dev.ts +1 -0
  306. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  307. package/src/cli/lib/indexes.ts +1 -1
  308. package/src/cli/lib/localDeployment/run.ts +44 -2
  309. package/src/cli/lib/localDeployment/upgrade.ts +4 -6
  310. package/src/cli/lib/localDeployment/utils.ts +6 -0
  311. package/src/cli/lib/run.ts +1 -0
  312. package/src/cli/lib/utils/utils.ts +63 -35
  313. package/src/cli/mcp.ts +29 -7
  314. package/src/index.ts +1 -1
  315. package/src/nextjs/index.ts +19 -8
  316. package/src/react/client.ts +73 -30
  317. package/src/react/hydration.tsx +14 -6
  318. package/src/react/queries_observer.ts +19 -16
  319. package/src/react/use_paginated_query2.ts +10 -6
  320. package/src/react/use_queries.ts +23 -7
  321. package/src/server/api.ts +220 -14
  322. package/src/server/components/index.ts +4 -6
  323. package/src/server/cron.ts +34 -24
  324. package/src/server/impl/actions_impl.ts +16 -5
  325. package/src/server/impl/meta_impl.ts +8 -1
  326. package/src/server/impl/scheduler_impl.ts +13 -6
  327. package/src/server/index.ts +1 -3
  328. package/src/server/meta.ts +25 -0
  329. package/src/server/registration.ts +28 -7
  330. package/src/server/scheduler.ts +22 -7
  331. package/src/server/schema.ts +55 -0
  332. package/src/values/validator.ts +3 -1
  333. package/src/values/validators.ts +84 -26
@@ -64,4 +64,7 @@ export function printLocalDeploymentWelcomeMessage() {
64
64
  );
65
65
  }
66
66
  export const LOCAL_BACKEND_INSTANCE_SECRET = "4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974";
67
+ export function releaseDate(version) {
68
+ return /^precompiled-(\d{4}-\d{2}-\d{2})-/.exec(version)?.[1] ?? null;
69
+ }
67
70
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/utils.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
5
- "mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,MAAM,OAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,aAAM,gCACX;",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n\n// Backend releases are tagged `precompiled-YYYY-MM-DD-<commit>`, so the dates\n// sort lexicographically.\nexport function releaseDate(version: string): string | null {\n return /^precompiled-(\\d{4}-\\d{2}-\\d{2})-/.exec(version)?.[1] ?? null;\n}\n"],
5
+ "mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,MAAM,OAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,aAAM,gCACX;AAIK,gBAAS,YAAY,SAAgC;AAC1D,SAAO,oCAAoC,KAAK,OAAO,IAAI,CAAC,KAAK;AACnE;",
6
6
  "names": ["port"]
7
7
  }
@@ -364,6 +364,7 @@ export async function pushToDeployment(ctx, args) {
364
364
  pushAllModules: false,
365
365
  largeIndexDeletionCheck: "no verification",
366
366
  // `convex run` can’t push to prod
367
+ warnOnSlowSchemaValidation: true,
367
368
  message: null
368
369
  },
369
370
  {
@@ -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 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,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC;AAAA,EAGE;AAAA,OACK;AACP,SAAgB,cAAc,oBAAoB;AAElD,SAAS,iBAAiB,YAAY,iBAAiB;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAiB,qBAAqB;AAEtC,sBAAsB,kBACpB,KACA,MAaA;AACA,QAAM,SAAS,IAAI,iBAAiB,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,MAAM,kBAAkB,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,MACpB,sBAAsB,kBAAkB;AAAA,MACxC,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,eAAgB,IAAc,SAAS,EAAE,KAAK;AAEpD,UAAM,kBAAkB,6BAA6B,YAAY;AACjE,QAAI,oBAAoB,MAAM;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,YAAY,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,YAAY,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,YAAY,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,YAAY,IAAI,YAAY,CAAC;AAAA,IAClG,CAAC;AAAA,EACH;AAEA,OAAK,WAAW,YAAY;AAG5B,MAAI,WAAW,MAAM;AACnB,cAAU,YAAY,MAAM,CAAC;AAAA,EAC/B;AACF;AAEA,eAAe,gBAAgB,KAAc,gBAAwB;AACnE,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,cAAc;AAAA,EACvC,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,sCAAsC,cAAc;AAAA,EAAM,YAAY,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,sBAAsB,UAAU,KAAc,YAAoB;AAChE,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,UAAU;AACvC,WAAO,aAAa,QAAQ;AAAA,EAC9B,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,uCAAuC,UAAU;AAAA,EAAM,YAAY,IAAK,IAAc,SAAS,EAAE,KAAK,CAAC,CAAC;AAAA,IAC1H,CAAC;AAAA,EACH;AACF;AAEA,sBAAsB,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,KAAK,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,KAAK,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,sBAAsB,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,sBAAsB,eACpB,KACA,MAOgB;AAChB,MAAI;AACJ,QAAM,gBAAgB,IAAI,QAAe,CAAC,YAAY;AACpD,eAAW;AAAA,EACb,CAAC;AACD,QAAM,CAAC,aAAa,MAAM,IAAI,gBAAgB;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,gBAAS,YAAY,OAAc;AACxC,QAAM,OAAO,aAAa,KAAK;AAC/B,MAAI,QAAQ,OAAO,OAAO;AAGxB,WAAO,KAAK,QAAQ,OAAO,EAAE,QAAQ,MAAM,OAAO,KAAK,CAAC;AAAA,EAC1D,OAAO;AACL,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACrC;AACF;AAEA,sBAAsB,gBACpB,KACA,MAQA;AACA,QAAM,EAAE,cAAc,IAAI,MAAM,kBAAkB,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,OAAO,YAAY;AAAA,IACnB,WAAW;AAAA,MACT,UAAU;AACR;AAAA,UACE,kBAAkB,KAAK,YAAY,OAAO,KAAK,aAAa;AAAA,QAC9D;AAAA,MACF;AAAA,MACA,SAAS,QAAQ;AACf,kBAAU,YAAY,MAAM,CAAC;AAAA,MAC/B;AAAA,MACA,SAAS;AACP,mBAAW,yBAAyB,KAAK,aAAa,KAAK;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,sBAAsB,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,kBAAkB;AAAA,YACrB,IAAc,SAAS;AAAA,UAC1B;AACA,cAAI,oBAAoB,MAAM;AAC5B,iBAAK,IAAI,MAAM;AAAA,cACb,UAAU;AAAA,cACV,WAAW;AAAA,cACX,gBAAgB,YAAY,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;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,IAAI,gBAAgB;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,sBAAsB,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,sBAAsB,iBACpB,KACA,MASA;AACA,QAAM;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,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,cAAc,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", "exportName"]
7
7
  }
@@ -631,32 +631,21 @@ export function waitUntilCalled() {
631
631
  const waitPromise = new Promise((resolve) => onCalled = resolve);
632
632
  return [waitPromise, () => onCalled(null)];
633
633
  }
634
- const BYTE_UNITS = [
635
- [1 << 30, "GiB"],
636
- [1e9, "GB"],
637
- [1 << 20, "MiB"],
638
- [1e6, "MB"],
639
- [1 << 10, "KiB"],
640
- [1e3, "KB"]
641
- ];
634
+ const BYTE_UNITS = ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB"];
642
635
  export function formatSize(n) {
643
- if (n === 0) {
644
- return "0 bytes";
636
+ let value = n;
637
+ let unitIndex = 0;
638
+ while (value >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
639
+ value /= 1024;
640
+ unitIndex++;
645
641
  }
646
- for (const [unitSize, unitName] of BYTE_UNITS) {
647
- if (n < unitSize) {
648
- continue;
649
- }
650
- if (n % unitSize === 0) {
651
- return `${n / unitSize} ${unitName}`;
652
- }
653
- if (n * 10 % unitSize === 0) {
654
- const whole = Math.floor(n / unitSize);
655
- const frac = Math.floor(n * 10 / unitSize) % 10;
656
- return `${whole}.${frac} ${unitName}`;
657
- }
642
+ const roundedValue = Number(value.toFixed(1));
643
+ if (roundedValue >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
644
+ value /= 1024;
645
+ unitIndex++;
658
646
  }
659
- return `${n} bytes`;
647
+ const formatted = value.toFixed(1).replace(/\.0$/, "");
648
+ return `${formatted} ${BYTE_UNITS[unitIndex]}`;
660
649
  }
661
650
  export function formatDuration(ms) {
662
651
  const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;
@@ -780,13 +769,13 @@ export function spawnAsync(_ctx, command, args, options) {
780
769
  });
781
770
  }
782
771
  const IDEMPOTENT_METHODS = ["GET", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE"];
783
- function retryDelay(attempt, _error, _response) {
772
+ export function retryDelay(attempt, _error, _response) {
784
773
  const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1e3;
785
774
  const randomSum = delay * 0.2 * Math.random();
786
775
  return delay + randomSum;
787
776
  }
788
- function deploymentFetchRetryOn(onError, method) {
789
- const shouldRetry = function(_attempt, error, response) {
777
+ function deploymentFetchRetryOn(onError, method, maxRetries = MAX_RETRIES, shouldRetryOverride) {
778
+ const defaultShouldRetry = function(_attempt, error, response) {
790
779
  if (error !== null) {
791
780
  return { kind: "retry", error };
792
781
  }
@@ -832,12 +821,18 @@ function deploymentFetchRetryOn(onError, method) {
832
821
  }
833
822
  return { kind: "stop" };
834
823
  };
824
+ const shouldRetry = shouldRetryOverride ? function(_attempt, error, response) {
825
+ return shouldRetryOverride(error, response) ? {
826
+ kind: "retry",
827
+ error: error ?? `Received response with status ${response?.status}`
828
+ } : { kind: "stop" };
829
+ } : defaultShouldRetry;
835
830
  return function(attempt, error, response) {
836
831
  const result = shouldRetry(attempt, error, response);
837
832
  if (result.kind === "retry") {
838
833
  onError?.(result.error, attempt);
839
834
  }
840
- if (attempt >= MAX_RETRIES) {
835
+ if (attempt >= maxRetries) {
841
836
  return false;
842
837
  }
843
838
  return result.kind === "retry";
@@ -866,13 +861,19 @@ export function bareDeploymentFetch(_ctx, options) {
866
861
  };
867
862
  }
868
863
  export function deploymentFetch(_ctx, options) {
869
- const { deploymentUrl, adminKey, onError } = options;
864
+ const {
865
+ deploymentUrl,
866
+ adminKey,
867
+ onError,
868
+ maxRetries = MAX_RETRIES,
869
+ shouldRetry
870
+ } = options;
870
871
  const onErrorWithAttempt = (err, attempt) => {
871
872
  onError?.(err);
872
873
  if (attempt >= RETRY_LOG_THRESHOLD) {
873
874
  logMessage(
874
875
  chalkStderr.gray(
875
- `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`
876
+ `Retrying request (attempt ${attempt}/${maxRetries})...`
876
877
  )
877
878
  );
878
879
  }
@@ -891,7 +892,12 @@ export function deploymentFetch(_ctx, options) {
891
892
  }
892
893
  const func = throwingFetch(url, {
893
894
  retryDelay,
894
- retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options2?.method),
895
+ retryOn: deploymentFetchRetryOn(
896
+ onErrorWithAttempt,
897
+ options2?.method,
898
+ maxRetries,
899
+ shouldRetry
900
+ ),
895
901
  ...options2,
896
902
  headers
897
903
  });