convex 1.40.0 → 1.42.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 (400) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/browser/simple_client-node.js +85 -27
  5. package/dist/cjs/browser/simple_client-node.js.map +3 -3
  6. package/dist/cjs/cli/aiFiles.js +2 -2
  7. package/dist/cjs/cli/aiFiles.js.map +1 -1
  8. package/dist/cjs/cli/configure.js +1 -4
  9. package/dist/cjs/cli/configure.js.map +2 -2
  10. package/dist/cjs/cli/convexExport.js +3 -3
  11. package/dist/cjs/cli/convexExport.js.map +1 -1
  12. package/dist/cjs/cli/convexImport.js +2 -2
  13. package/dist/cjs/cli/convexImport.js.map +1 -1
  14. package/dist/cjs/cli/dashboard.js +19 -6
  15. package/dist/cjs/cli/dashboard.js.map +3 -3
  16. package/dist/cjs/cli/data.js +2 -2
  17. package/dist/cjs/cli/data.js.map +1 -1
  18. package/dist/cjs/cli/deploy.js +5 -5
  19. package/dist/cjs/cli/deploy.js.map +2 -2
  20. package/dist/cjs/cli/deploymentCreate.js +11 -5
  21. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  22. package/dist/cjs/cli/deploymentSelect.js +5 -5
  23. package/dist/cjs/cli/deploymentSelect.js.map +1 -1
  24. package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
  25. package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
  26. package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
  27. package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
  28. package/dist/cjs/cli/dev.js +6 -5
  29. package/dist/cjs/cli/dev.js.map +2 -2
  30. package/dist/cjs/cli/env.js +25 -18
  31. package/dist/cjs/cli/env.js.map +2 -2
  32. package/dist/cjs/cli/envDefault.js +20 -15
  33. package/dist/cjs/cli/envDefault.js.map +2 -2
  34. package/dist/cjs/cli/insights.js +14 -4
  35. package/dist/cjs/cli/insights.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
  37. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +1 -1
  39. package/dist/cjs/cli/lib/command.js.map +1 -1
  40. package/dist/cjs/cli/lib/deployment.js.map +1 -1
  41. package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
  42. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  43. package/dist/cjs/cli/lib/dev.js +31 -0
  44. package/dist/cjs/cli/lib/dev.js.map +2 -2
  45. package/dist/cjs/cli/lib/env.js +5 -1
  46. package/dist/cjs/cli/lib/env.js.map +2 -2
  47. package/dist/cjs/cli/lib/generateDocs.js +256 -0
  48. package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
  49. package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
  50. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
  51. package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
  52. package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
  53. package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
  54. package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
  55. package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
  56. package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
  57. package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
  58. package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
  59. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
  60. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
  61. package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
  62. package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
  63. package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
  64. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  65. package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
  66. package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
  67. package/dist/cjs/cli/lib/login.js +16 -12
  68. package/dist/cjs/cli/lib/login.js.map +2 -2
  69. package/dist/cjs/cli/lib/logs.js +4 -1
  70. package/dist/cjs/cli/lib/logs.js.map +2 -2
  71. package/dist/cjs/cli/lib/run.js +27 -2
  72. package/dist/cjs/cli/lib/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/runTestFunction.js +3 -3
  74. package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
  75. package/dist/cjs/cli/lib/utils/utils.js +30 -0
  76. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  77. package/dist/cjs/cli/program.js +2 -1
  78. package/dist/cjs/cli/program.js.map +2 -2
  79. package/dist/cjs/cli/project.js +27 -0
  80. package/dist/cjs/cli/project.js.map +7 -0
  81. package/dist/cjs/cli/projectCreate.js +90 -0
  82. package/dist/cjs/cli/projectCreate.js.map +7 -0
  83. package/dist/cjs/cli/run.js +5 -5
  84. package/dist/cjs/cli/run.js.map +1 -1
  85. package/dist/cjs/index.js +1 -1
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/server/database.js.map +1 -1
  88. package/dist/cjs/server/impl/meta_impl.js +6 -6
  89. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  90. package/dist/cjs/server/impl/registration_impl.js +9 -3
  91. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  92. package/dist/cjs/server/index.js.map +2 -2
  93. package/dist/cjs/server/meta.js.map +1 -1
  94. package/dist/cjs/server/query.js.map +1 -1
  95. package/dist/cjs/server/registration.js.map +1 -1
  96. package/dist/cjs/server/storage.js.map +1 -1
  97. package/dist/cjs/server/system_fields.js.map +1 -1
  98. package/dist/cjs-types/cli/configure.d.ts +3 -2
  99. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
  101. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  104. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  106. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  107. package/dist/cjs-types/cli/insights.d.ts +1 -0
  108. package/dist/cjs-types/cli/insights.d.ts.map +1 -1
  109. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  110. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
  111. package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
  112. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
  114. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  115. package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
  116. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/lib/env.d.ts +3 -1
  118. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/lib/env.test.d.ts +2 -0
  120. package/dist/cjs-types/cli/lib/env.test.d.ts.map +1 -0
  121. package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
  122. package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
  123. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
  124. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  125. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  126. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  128. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  130. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
  132. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  134. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  136. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  138. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  139. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  140. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  141. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  142. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  143. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
  144. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/logs.d.ts +1 -1
  147. package/dist/cjs-types/cli/lib/logs.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/run.d.ts +1 -1
  149. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/utils/utils.d.ts +10 -0
  151. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
  153. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/project.d.ts +3 -0
  155. package/dist/cjs-types/cli/project.d.ts.map +1 -0
  156. package/dist/cjs-types/cli/projectCreate.d.ts +5 -0
  157. package/dist/cjs-types/cli/projectCreate.d.ts.map +1 -0
  158. package/dist/cjs-types/index.d.ts +1 -1
  159. package/dist/cjs-types/server/database.d.ts +21 -3
  160. package/dist/cjs-types/server/database.d.ts.map +1 -1
  161. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  162. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  163. package/dist/cjs-types/server/index.d.ts +2 -2
  164. package/dist/cjs-types/server/index.d.ts.map +1 -1
  165. package/dist/cjs-types/server/meta.d.ts +26 -0
  166. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  167. package/dist/cjs-types/server/query.d.ts +1 -1
  168. package/dist/cjs-types/server/registration.d.ts +23 -5
  169. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  170. package/dist/cjs-types/server/storage.d.ts +20 -3
  171. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  172. package/dist/cli.bundle.cjs +67155 -68245
  173. package/dist/cli.bundle.cjs.map +4 -4
  174. package/dist/esm/browser/simple_client-node.js +85 -27
  175. package/dist/esm/browser/simple_client-node.js.map +3 -3
  176. package/dist/esm/cli/aiFiles.js +2 -2
  177. package/dist/esm/cli/aiFiles.js.map +1 -1
  178. package/dist/esm/cli/configure.js +1 -4
  179. package/dist/esm/cli/configure.js.map +2 -2
  180. package/dist/esm/cli/convexExport.js +3 -3
  181. package/dist/esm/cli/convexExport.js.map +1 -1
  182. package/dist/esm/cli/convexImport.js +2 -2
  183. package/dist/esm/cli/convexImport.js.map +1 -1
  184. package/dist/esm/cli/dashboard.js +16 -3
  185. package/dist/esm/cli/dashboard.js.map +2 -2
  186. package/dist/esm/cli/data.js +2 -2
  187. package/dist/esm/cli/data.js.map +1 -1
  188. package/dist/esm/cli/deploy.js +5 -5
  189. package/dist/esm/cli/deploy.js.map +2 -2
  190. package/dist/esm/cli/deploymentCreate.js +13 -9
  191. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  192. package/dist/esm/cli/deploymentSelect.js +5 -5
  193. package/dist/esm/cli/deploymentSelect.js.map +1 -1
  194. package/dist/esm/cli/deploymentTokenCreate.js +9 -15
  195. package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
  196. package/dist/esm/cli/deploymentTokenDelete.js +8 -16
  197. package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
  198. package/dist/esm/cli/dev.js +6 -5
  199. package/dist/esm/cli/dev.js.map +2 -2
  200. package/dist/esm/cli/env.js +25 -18
  201. package/dist/esm/cli/env.js.map +2 -2
  202. package/dist/esm/cli/envDefault.js +20 -15
  203. package/dist/esm/cli/envDefault.js.map +2 -2
  204. package/dist/esm/cli/insights.js +14 -4
  205. package/dist/esm/cli/insights.js.map +2 -2
  206. package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
  207. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  208. package/dist/esm/cli/lib/command.js +1 -1
  209. package/dist/esm/cli/lib/command.js.map +1 -1
  210. package/dist/esm/cli/lib/deployment.js.map +1 -1
  211. package/dist/esm/cli/lib/deploymentSelection.js +38 -0
  212. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  213. package/dist/esm/cli/lib/dev.js +31 -0
  214. package/dist/esm/cli/lib/dev.js.map +2 -2
  215. package/dist/esm/cli/lib/env.js +5 -1
  216. package/dist/esm/cli/lib/env.js.map +2 -2
  217. package/dist/esm/cli/lib/generateDocs.js +233 -0
  218. package/dist/esm/cli/lib/generateDocs.js.map +7 -0
  219. package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
  220. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
  221. package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
  222. package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
  223. package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
  224. package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
  225. package/dist/esm/cli/lib/localDeployment/download.js +15 -2
  226. package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
  227. package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
  228. package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
  229. package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
  230. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
  231. package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
  232. package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
  233. package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
  234. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
  235. package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
  236. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  237. package/dist/esm/cli/lib/login.js +18 -13
  238. package/dist/esm/cli/lib/login.js.map +2 -2
  239. package/dist/esm/cli/lib/logs.js +5 -2
  240. package/dist/esm/cli/lib/logs.js.map +2 -2
  241. package/dist/esm/cli/lib/run.js +32 -3
  242. package/dist/esm/cli/lib/run.js.map +2 -2
  243. package/dist/esm/cli/lib/runTestFunction.js +3 -3
  244. package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
  245. package/dist/esm/cli/lib/utils/utils.js +29 -0
  246. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  247. package/dist/esm/cli/program.js +2 -1
  248. package/dist/esm/cli/program.js.map +2 -2
  249. package/dist/esm/cli/project.js +5 -0
  250. package/dist/esm/cli/project.js.map +7 -0
  251. package/dist/esm/cli/projectCreate.js +68 -0
  252. package/dist/esm/cli/projectCreate.js.map +7 -0
  253. package/dist/esm/cli/run.js +5 -5
  254. package/dist/esm/cli/run.js.map +1 -1
  255. package/dist/esm/index.js +1 -1
  256. package/dist/esm/index.js.map +1 -1
  257. package/dist/esm/server/impl/meta_impl.js +6 -6
  258. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  259. package/dist/esm/server/impl/registration_impl.js +9 -3
  260. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  261. package/dist/esm/server/index.js.map +2 -2
  262. package/dist/esm-types/cli/configure.d.ts +3 -2
  263. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  264. package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
  265. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  266. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  267. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  268. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  269. package/dist/esm-types/cli/env.d.ts.map +1 -1
  270. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  271. package/dist/esm-types/cli/insights.d.ts +1 -0
  272. package/dist/esm-types/cli/insights.d.ts.map +1 -1
  273. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  274. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
  275. package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
  276. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  277. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
  278. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  279. package/dist/esm-types/cli/lib/dev.d.ts +2 -1
  280. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  281. package/dist/esm-types/cli/lib/env.d.ts +3 -1
  282. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  283. package/dist/esm-types/cli/lib/env.test.d.ts +2 -0
  284. package/dist/esm-types/cli/lib/env.test.d.ts.map +1 -0
  285. package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
  286. package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
  287. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
  288. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  289. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  290. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  291. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  292. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  293. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  294. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  295. package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
  296. package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  297. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  298. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  299. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  300. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  301. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  302. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  303. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  304. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  305. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  306. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  307. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
  308. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  309. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  310. package/dist/esm-types/cli/lib/logs.d.ts +1 -1
  311. package/dist/esm-types/cli/lib/logs.d.ts.map +1 -1
  312. package/dist/esm-types/cli/lib/run.d.ts +1 -1
  313. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  314. package/dist/esm-types/cli/lib/utils/utils.d.ts +10 -0
  315. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  316. package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
  317. package/dist/esm-types/cli/program.d.ts.map +1 -1
  318. package/dist/esm-types/cli/project.d.ts +3 -0
  319. package/dist/esm-types/cli/project.d.ts.map +1 -0
  320. package/dist/esm-types/cli/projectCreate.d.ts +5 -0
  321. package/dist/esm-types/cli/projectCreate.d.ts.map +1 -0
  322. package/dist/esm-types/index.d.ts +1 -1
  323. package/dist/esm-types/server/database.d.ts +21 -3
  324. package/dist/esm-types/server/database.d.ts.map +1 -1
  325. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  326. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  327. package/dist/esm-types/server/index.d.ts +2 -2
  328. package/dist/esm-types/server/index.d.ts.map +1 -1
  329. package/dist/esm-types/server/meta.d.ts +26 -0
  330. package/dist/esm-types/server/meta.d.ts.map +1 -1
  331. package/dist/esm-types/server/query.d.ts +1 -1
  332. package/dist/esm-types/server/registration.d.ts +23 -5
  333. package/dist/esm-types/server/registration.d.ts.map +1 -1
  334. package/dist/esm-types/server/storage.d.ts +20 -3
  335. package/dist/esm-types/server/storage.d.ts.map +1 -1
  336. package/dist/react.bundle.js +1 -1
  337. package/dist/react.bundle.js.map +1 -1
  338. package/package.json +7 -5
  339. package/src/browser/sync/request_manager.test.ts +2 -2
  340. package/src/cli/aiFiles.ts +2 -2
  341. package/src/cli/configure.ts +4 -6
  342. package/src/cli/convexExport.ts +3 -3
  343. package/src/cli/convexImport.ts +2 -2
  344. package/src/cli/dashboard.ts +29 -3
  345. package/src/cli/data.ts +2 -2
  346. package/src/cli/deploy.ts +5 -5
  347. package/src/cli/deploymentCreate.test.ts +151 -24
  348. package/src/cli/deploymentCreate.ts +21 -11
  349. package/src/cli/deploymentSelect.ts +5 -5
  350. package/src/cli/deploymentSelection.test.ts +0 -3
  351. package/src/cli/deploymentToken.test.ts +34 -23
  352. package/src/cli/deploymentTokenCreate.ts +9 -21
  353. package/src/cli/deploymentTokenDelete.ts +8 -23
  354. package/src/cli/dev.ts +5 -4
  355. package/src/cli/env.ts +29 -19
  356. package/src/cli/envDefault.ts +21 -15
  357. package/src/cli/insights.ts +15 -3
  358. package/src/cli/lib/aiFiles/integration.test.ts +2 -0
  359. package/src/cli/lib/aiFiles/skills.ts +3 -3
  360. package/src/cli/lib/command.ts +2 -2
  361. package/src/cli/lib/deployment.ts +0 -5
  362. package/src/cli/lib/deploymentSelection.ts +67 -0
  363. package/src/cli/lib/dev.ts +39 -0
  364. package/src/cli/lib/env.test.ts +60 -0
  365. package/src/cli/lib/env.ts +9 -1
  366. package/src/cli/lib/generateDocs.test.ts +326 -0
  367. package/src/cli/lib/generateDocs.ts +393 -0
  368. package/src/cli/lib/localDeployment/anonymous.ts +48 -72
  369. package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
  370. package/src/cli/lib/localDeployment/dashboard.ts +48 -80
  371. package/src/cli/lib/localDeployment/download.ts +34 -3
  372. package/src/cli/lib/localDeployment/filePaths.ts +66 -6
  373. package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
  374. package/src/cli/lib/localDeployment/run.test.ts +6 -6
  375. package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
  376. package/src/cli/lib/localDeployment/secrets.ts +93 -0
  377. package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
  378. package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
  379. package/src/cli/lib/localDeployment/upgrade.ts +52 -38
  380. package/src/cli/lib/localDeployment/utils.ts +0 -10
  381. package/src/cli/lib/login.ts +18 -18
  382. package/src/cli/lib/logs.ts +7 -2
  383. package/src/cli/lib/run.ts +37 -3
  384. package/src/cli/lib/runTestFunction.ts +3 -3
  385. package/src/cli/lib/utils/utils.ts +56 -0
  386. package/src/cli/program.ts +2 -0
  387. package/src/cli/project.ts +7 -0
  388. package/src/cli/projectCreate.ts +99 -0
  389. package/src/cli/run.ts +5 -5
  390. package/src/index.ts +1 -1
  391. package/src/server/database.ts +21 -3
  392. package/src/server/impl/meta_impl.ts +7 -6
  393. package/src/server/impl/registration_impl.ts +11 -5
  394. package/src/server/index.ts +2 -0
  395. package/src/server/meta.ts +27 -0
  396. package/src/server/query.ts +1 -1
  397. package/src/server/registration.test.ts +16 -25
  398. package/src/server/registration.ts +25 -19
  399. package/src/server/storage.ts +22 -3
  400. package/src/server/system_fields.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/logs.ts"],
4
- "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logMessage, logOutput, logWarning } from \"../../bundler/log.js\";\nimport { nextBackoff } from \"./dev.js\";\n// eslint-disable-next-line no-restricted-imports -- chalk used for writing to stdout\nimport chalk, { chalkStderr } from \"chalk\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport { format } from \"node:util\";\nimport { deploymentFetch } from \"./utils/utils.js\";\nimport { FunctionExecution } from \"./apiTypes.js\";\n\nexport type LogMode = \"always\" | \"pause-on-deploy\" | \"disable\";\n\nexport class LogManager {\n private paused: boolean = false;\n\n constructor(private mode: LogMode) {}\n\n async waitForUnpaused() {\n while (this.paused) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n beginDeploy() {\n if (this.mode === \"pause-on-deploy\") {\n this.paused = true;\n }\n }\n\n endDeploy() {\n if (this.mode === \"pause-on-deploy\") {\n this.paused = false;\n }\n }\n}\n\nconst MAX_UDF_STREAM_FAILURE_COUNT = 5;\n\ntype LogDestination = \"stdout\" | \"stderr\";\n\nexport async function logsForDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n },\n options: {\n success: boolean;\n history: number;\n jsonl: boolean;\n deploymentNotice: string;\n },\n) {\n logMessage(chalkStderr.yellow(`Watching logs${options.deploymentNotice}...`));\n await watchLogs(ctx, credentials.url, credentials.adminKey, \"stdout\", {\n history: options.history,\n success: options.success,\n jsonl: options.jsonl,\n });\n}\n\nexport async function watchLogs(\n ctx: Context,\n url: string,\n adminKey: string,\n dest: LogDestination,\n options?: {\n success: boolean;\n history?: number | boolean;\n jsonl?: boolean;\n logManager?: LogManager;\n },\n) {\n let numFailures = 0;\n let isFirst = true;\n let cursorMs = 0;\n\n // Select the appropriate chalk instance and write function based on destination\n const chalkInstance = dest === \"stdout\" ? chalk : chalkStderr;\n const write = (s: string) => logToDestination(dest, s);\n\n for (;;) {\n try {\n const { entries, newCursor } = await pollUdfLog(\n ctx,\n cursorMs,\n url,\n adminKey,\n );\n cursorMs = newCursor;\n numFailures = 0;\n\n // Delay printing logs until the log manager is unpaused.\n await options?.logManager?.waitForUnpaused();\n\n // The first execution, we just want to fetch the current head cursor so we don't send stale\n // logs to the client.\n if (isFirst) {\n isFirst = false;\n if (\n options?.history === true ||\n (typeof options?.history === \"number\" && options?.history > 0)\n ) {\n const entriesSlice =\n options?.history === true\n ? entries\n : entries.slice(entries.length - options?.history);\n processLogs(\n entriesSlice,\n write,\n options?.success,\n chalkInstance,\n options?.jsonl,\n );\n }\n } else {\n processLogs(\n entries,\n write,\n options?.success === true,\n chalkInstance,\n options?.jsonl,\n );\n }\n } catch {\n numFailures += 1;\n }\n // Handle backoff\n if (numFailures > 0) {\n const backoff = nextBackoff(numFailures);\n\n // If we exceed a threshold number of failures, warn the user and display backoff.\n if (numFailures > MAX_UDF_STREAM_FAILURE_COUNT) {\n logWarning(\n `Convex [WARN] Failed to fetch logs. Waiting ${backoff}ms before next retry.`,\n );\n }\n await new Promise((resolve) => {\n setTimeout(() => resolve(null), backoff);\n });\n }\n }\n}\n\ntype UdfType = \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n\ntype StructuredLogLine = {\n messages: string[];\n level: \"LOG\" | \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n timestamp: number;\n isTruncated: boolean;\n};\ntype LogLine = string | StructuredLogLine;\n\nasync function pollUdfLog(\n ctx: Context,\n cursor: number,\n url: string,\n adminKey: string,\n): Promise<{ entries: FunctionExecution[]; newCursor: number }> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n const response = await fetch(`/api/stream_function_logs?cursor=${cursor}`, {\n method: \"GET\",\n });\n return await response.json();\n}\n\nconst prefixForSource = (udfType: UdfType): string => {\n return udfType.charAt(0);\n};\n\nfunction processLogs(\n rawLogs: FunctionExecution[],\n write: (message: string) => void,\n shouldShowSuccessLogs: boolean,\n chalkInstance: typeof chalk,\n jsonl?: boolean,\n) {\n if (jsonl) {\n for (let i = 0; i < rawLogs.length; i++) {\n const log = rawLogs[i];\n write(JSON.stringify(log));\n }\n return;\n }\n\n for (let i = 0; i < rawLogs.length; i++) {\n const log = rawLogs[i];\n if (log.logLines) {\n const id = log.identifier;\n const udfType = log.udfType;\n const timestampMs = log.timestamp * 1000;\n const executionTimeMs =\n \"executionTime\" in log ? log.executionTime * 1000 : NaN;\n\n for (let j = 0; j < log.logLines.length; j++) {\n const formatted = formatLogLineMessage(\n \"info\",\n timestampMs,\n udfType,\n id,\n log.logLines[j],\n chalkInstance,\n );\n write(formatted);\n }\n\n if (\"error\" in log && log.error) {\n const formatted = formatLogLineMessage(\n \"error\",\n timestampMs,\n udfType,\n id,\n log.error!,\n chalkInstance,\n );\n write(formatted);\n } else if (log.kind === \"Completion\" && shouldShowSuccessLogs) {\n const formatted = chalkInstance.green(\n formatFunctionExecutionMessage(\n timestampMs,\n udfType,\n id,\n executionTimeMs,\n ),\n );\n write(formatted);\n }\n }\n }\n}\n\nexport function formatFunctionExecutionMessage(\n timestampMs: number,\n udfType: UdfType,\n udfPath: string,\n executionTimeMs: number,\n): string {\n return `${prefixLog(timestampMs, udfType, udfPath)} Function executed in ${Math.ceil(executionTimeMs)} ms`;\n}\n\nexport function formatLogLineMessage(\n type: \"info\" | \"error\",\n timestampMs: number,\n udfType: UdfType,\n udfPath: string,\n message: LogLine,\n chalkInstance: typeof chalk = chalk,\n): string {\n const prefix = prefixForSource(udfType);\n if (typeof message === \"string\") {\n if (type === \"info\") {\n const match = message.match(/^\\[.*?\\] /);\n if (match === null) {\n return chalkInstance.red(\n `[CONVEX ${prefix}(${udfPath})] Could not parse console.log`,\n );\n }\n const level = message.slice(1, match[0].length - 2);\n const args = message.slice(match[0].length);\n return `${chalkInstance.cyan(`${prefixLog(timestampMs, udfType, udfPath)} [${level}]`)} ${format(args)}`;\n } else {\n return chalkInstance.red(\n `${prefixLog(timestampMs, udfType, udfPath)} ${message}`,\n );\n }\n } else {\n const level = message.level;\n const formattedMessage = `${message.messages.join(\" \")}${message.isTruncated ? \" (truncated due to length)\" : \"\"}`;\n return `${chalkInstance.cyan(\n `${prefixLog(message.timestamp, udfType, udfPath)} [${level}]`,\n )} ${formattedMessage}`;\n }\n}\n\nfunction logToDestination(dest: LogDestination, s: string) {\n switch (dest) {\n case \"stdout\":\n logOutput(s);\n break;\n case \"stderr\":\n logMessage(s);\n break;\n }\n}\n\nfunction prefixLog(timestampMs: number, udfType: UdfType, udfPath: string) {\n const prefix = prefixForSource(udfType);\n const localizedTimestamp = new Date(timestampMs).toLocaleString();\n\n return `${localizedTimestamp} [CONVEX ${prefix}(${udfPath})]`;\n}\n\nexport function formatLogsAsText(\n rawLogs: FunctionExecution[],\n shouldShowSuccessLogs: boolean = false,\n): string {\n const lines: string[] = [];\n const write = (message: string) =>\n lines.push(stripVTControlCharacters(message));\n processLogs(rawLogs, write, shouldShowSuccessLogs, chalk);\n return lines.join(\"\\n\");\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logMessage, logOutput, logWarning } from \"../../bundler/log.js\";\nimport { nextBackoff } from \"./dev.js\";\n// eslint-disable-next-line no-restricted-imports -- chalk used for writing to stdout\nimport chalk, { chalkStderr } from \"chalk\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport { format } from \"node:util\";\nimport { deploymentFetch, ThrowingFetchError } from \"./utils/utils.js\";\nimport { FunctionExecution } from \"./apiTypes.js\";\n\nexport type LogMode = \"always\" | \"pause-on-deploy\" | \"disable\";\n\nexport class LogManager {\n private paused: boolean = false;\n\n constructor(private mode: LogMode) {}\n\n async waitForUnpaused() {\n while (this.paused) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n beginDeploy() {\n if (this.mode === \"pause-on-deploy\") {\n this.paused = true;\n }\n }\n\n endDeploy() {\n if (this.mode === \"pause-on-deploy\") {\n this.paused = false;\n }\n }\n}\n\nconst MAX_UDF_STREAM_FAILURE_COUNT = 5;\n\ntype LogDestination = \"stdout\" | \"stderr\";\n\nexport async function logsForDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n },\n options: {\n success: boolean;\n history: number;\n jsonl: boolean;\n deploymentNotice: string;\n },\n) {\n logMessage(chalkStderr.yellow(`Watching logs${options.deploymentNotice}...`));\n await watchLogs(ctx, credentials.url, credentials.adminKey, \"stdout\", {\n history: options.history,\n success: options.success,\n jsonl: options.jsonl,\n });\n}\n\nexport async function watchLogs(\n ctx: Context,\n url: string,\n adminKey: string,\n dest: LogDestination,\n options?: {\n success: boolean;\n history?: number | boolean;\n jsonl?: boolean;\n logManager?: LogManager;\n },\n) {\n let numFailures = 0;\n let isFirst = true;\n let cursorMs = 0;\n\n // Select the appropriate chalk instance and write function based on destination\n const chalkInstance = dest === \"stdout\" ? chalk : chalkStderr;\n const write = (s: string) => logToDestination(dest, s);\n\n for (;;) {\n try {\n const { entries, newCursor } = await pollUdfLog(\n ctx,\n cursorMs,\n url,\n adminKey,\n );\n cursorMs = newCursor;\n numFailures = 0;\n\n // Delay printing logs until the log manager is unpaused.\n await options?.logManager?.waitForUnpaused();\n\n // The first execution, we just want to fetch the current head cursor so we don't send stale\n // logs to the client.\n if (isFirst) {\n isFirst = false;\n if (\n options?.history === true ||\n (typeof options?.history === \"number\" && options?.history > 0)\n ) {\n const entriesSlice =\n options?.history === true\n ? entries\n : entries.slice(entries.length - options?.history);\n processLogs(\n entriesSlice,\n write,\n options?.success,\n chalkInstance,\n options?.jsonl,\n );\n }\n } else {\n processLogs(\n entries,\n write,\n options?.success === true,\n chalkInstance,\n options?.jsonl,\n );\n }\n } catch (e) {\n // A 403 means the admin key isn't authorized for this deployment.\n // Retrying won't help, so surface the error and fail immediately.\n if (e instanceof ThrowingFetchError && e.response.status === 403) {\n return await e.handle(ctx);\n }\n numFailures += 1;\n }\n // Handle backoff\n if (numFailures > 0) {\n const backoff = nextBackoff(numFailures);\n\n // If we exceed a threshold number of failures, warn the user and display backoff.\n if (numFailures > MAX_UDF_STREAM_FAILURE_COUNT) {\n logWarning(\n `Convex [WARN] Failed to fetch logs. Waiting ${backoff}ms before next retry.`,\n );\n }\n await new Promise((resolve) => {\n setTimeout(() => resolve(null), backoff);\n });\n }\n }\n}\n\ntype UdfType = \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n\ntype StructuredLogLine = {\n messages: string[];\n level: \"LOG\" | \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n timestamp: number;\n isTruncated: boolean;\n};\ntype LogLine = string | StructuredLogLine;\n\nasync function pollUdfLog(\n ctx: Context,\n cursor: number,\n url: string,\n adminKey: string,\n): Promise<{ entries: FunctionExecution[]; newCursor: number }> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n const response = await fetch(`/api/stream_function_logs?cursor=${cursor}`, {\n method: \"GET\",\n });\n return await response.json();\n}\n\nconst prefixForSource = (udfType: UdfType): string => {\n return udfType.charAt(0);\n};\n\nfunction processLogs(\n rawLogs: FunctionExecution[],\n write: (message: string) => void,\n shouldShowSuccessLogs: boolean,\n chalkInstance: typeof chalk,\n jsonl?: boolean,\n) {\n if (jsonl) {\n for (let i = 0; i < rawLogs.length; i++) {\n const log = rawLogs[i];\n write(JSON.stringify(log));\n }\n return;\n }\n\n for (let i = 0; i < rawLogs.length; i++) {\n const log = rawLogs[i];\n if (log.logLines) {\n const id = log.identifier;\n const udfType = log.udfType;\n const timestampMs = log.timestamp * 1000;\n const executionTimeMs =\n \"executionTime\" in log ? log.executionTime * 1000 : NaN;\n\n for (let j = 0; j < log.logLines.length; j++) {\n const formatted = formatLogLineMessage(\n \"info\",\n timestampMs,\n udfType,\n id,\n log.logLines[j],\n chalkInstance,\n );\n write(formatted);\n }\n\n if (\"error\" in log && log.error) {\n const formatted = formatLogLineMessage(\n \"error\",\n timestampMs,\n udfType,\n id,\n log.error!,\n chalkInstance,\n );\n write(formatted);\n } else if (log.kind === \"Completion\" && shouldShowSuccessLogs) {\n const formatted = chalkInstance.green(\n formatFunctionExecutionMessage(\n timestampMs,\n udfType,\n id,\n executionTimeMs,\n ),\n );\n write(formatted);\n }\n }\n }\n}\n\nexport function formatFunctionExecutionMessage(\n timestampMs: number,\n udfType: UdfType,\n udfPath: string,\n executionTimeMs: number,\n): string {\n return `${prefixLog(timestampMs, udfType, udfPath)} Function executed in ${Math.ceil(executionTimeMs)} ms`;\n}\n\nexport function formatLogLineMessage(\n type: \"info\" | \"error\",\n timestampMs: number,\n udfType: UdfType,\n udfPath: string,\n message: LogLine,\n chalkInstance: typeof chalk = chalk,\n): string {\n const prefix = prefixForSource(udfType);\n if (typeof message === \"string\") {\n if (type === \"info\") {\n const match = message.match(/^\\[.*?\\] /);\n if (match === null) {\n return chalkInstance.red(\n `[CONVEX ${prefix}(${udfPath})] Could not parse console.log`,\n );\n }\n const level = message.slice(1, match[0].length - 2);\n const args = message.slice(match[0].length);\n return `${chalkInstance.cyan(`${prefixLog(timestampMs, udfType, udfPath)} [${level}]`)} ${format(args)}`;\n } else {\n return chalkInstance.red(\n `${prefixLog(timestampMs, udfType, udfPath)} ${message}`,\n );\n }\n } else {\n const level = message.level;\n const formattedMessage = `${message.messages.join(\" \")}${message.isTruncated ? \" (truncated due to length)\" : \"\"}`;\n return `${chalkInstance.cyan(\n `${prefixLog(message.timestamp, udfType, udfPath)} [${level}]`,\n )} ${formattedMessage}`;\n }\n}\n\nfunction logToDestination(dest: LogDestination, s: string) {\n switch (dest) {\n case \"stdout\":\n logOutput(s);\n break;\n case \"stderr\":\n logMessage(s);\n break;\n }\n}\n\nfunction prefixLog(timestampMs: number, udfType: UdfType, udfPath: string) {\n const prefix = prefixForSource(udfType);\n const localizedTimestamp = new Date(timestampMs).toLocaleString();\n\n return `${localizedTimestamp} [CONVEX ${prefix}(${udfPath})]`;\n}\n\nexport function formatLogsAsText(\n rawLogs: FunctionExecution[],\n shouldShowSuccessLogs: boolean = false,\n): string {\n const lines: string[] = [];\n const write = (message: string) =>\n lines.push(stripVTControlCharacters(message));\n processLogs(rawLogs, write, shouldShowSuccessLogs, chalk);\n return lines.join(\"\\n\");\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,11 @@ import {
9
9
  } from "../../server/index.js";
10
10
  import { convexToJson, jsonToConvex } from "../../values/value.js";
11
11
  import { logFinishedStep, logMessage, logOutput } from "../../bundler/log.js";
12
- import { waitForever, waitUntilCalled } from "./utils/utils.js";
12
+ import {
13
+ permissionDeniedErrorMessage,
14
+ waitForever,
15
+ waitUntilCalled
16
+ } from "./utils/utils.js";
13
17
  import JSON5 from "json5";
14
18
  import path from "path";
15
19
  import { readProjectConfig } from "./config.js";
@@ -37,6 +41,14 @@ export async function runFunctionAndLog(ctx, args) {
37
41
  );
38
42
  } catch (err) {
39
43
  const errorMessage = err.toString().trim();
44
+ const permissionError = permissionDeniedErrorMessage(errorMessage);
45
+ if (permissionError !== null) {
46
+ return await ctx.crash({
47
+ exitCode: 1,
48
+ errorType: "fatal",
49
+ printedMessage: chalkStderr.red(permissionError)
50
+ });
51
+ }
40
52
  if (errorMessage.includes("Could not find function")) {
41
53
  const functions = await runSystemQuery(ctx, {
42
54
  deploymentUrl: args.deploymentUrl,
@@ -261,12 +273,29 @@ export async function subscribeAndLog(ctx, args) {
261
273
  }
262
274
  });
263
275
  }
264
- export async function subscribe(_ctx, args) {
276
+ export async function subscribe(ctx, args) {
265
277
  const client = new BaseConvexClient(
266
278
  args.deploymentUrl,
267
279
  (updatedQueries) => {
268
280
  for (const queryToken of updatedQueries) {
269
- args.callbacks?.onChange?.(client.localQueryResultByToken(queryToken));
281
+ let result;
282
+ try {
283
+ result = client.localQueryResultByToken(queryToken);
284
+ } catch (err) {
285
+ const permissionError = permissionDeniedErrorMessage(
286
+ err.toString()
287
+ );
288
+ if (permissionError !== null) {
289
+ void ctx.crash({
290
+ exitCode: 1,
291
+ errorType: "fatal",
292
+ printedMessage: chalkStderr.red(permissionError)
293
+ });
294
+ return;
295
+ }
296
+ throw err;
297
+ }
298
+ args.callbacks?.onChange?.(result);
270
299
  }
271
300
  },
272
301
  {
@@ -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 { waitForever, waitUntilCalled } 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 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 args.callbacks?.onChange?.(client.localQueryResultByToken(queryToken)!);\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 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,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
  }
@@ -9,9 +9,9 @@ export const INLINE_QUERY_DESCRIPTION = [
9
9
  "Use `--component` to target a mounted component.",
10
10
  "",
11
11
  "To format the query:",
12
- '- Simple expressions are returned automatically, for example: `await ctx.db.query("messages").take(5)`.',
13
- '- For multi-statement queries, use an explicit return, for example: `const firstMessage = await ctx.db.query("messages").first(); console.log(firstMessage?._id); return firstMessage;`.',
14
- '- For full control, pass a module source that exports a default query, for example: `export default query({ handler: async (ctx) => { return await ctx.db.query("messages").take(10); } })`.'
12
+ '\u2022 Simple expressions are returned automatically, for example: `await ctx.db.query("messages").take(5)`.',
13
+ '\u2022 For multi-statement queries, use an explicit return, for example: `const firstMessage = await ctx.db.query("messages").first(); console.log(firstMessage?._id); return firstMessage;`.',
14
+ '\u2022 For full control, pass a module source that exports a default query, for example: `export default query({ handler: async (ctx) => { return await ctx.db.query("messages").take(10); } })`.'
15
15
  ].join("\n");
16
16
  export function inlineQueryToQuerySource(inlineQuery) {
17
17
  const trimmedQuery = inlineQuery.trim();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/runTestFunction.ts"],
4
- "sourcesContent": ["import type { Context } from \"../../bundler/context.js\";\nimport { deploymentFetch } from \"./utils/utils.js\";\n\nconst QUERY_MODULE_PREAMBLE =\n 'import { query, internalQuery } from \"convex:/_system/repl/wrappers.js\";';\n\n/** Shared help text for the query/module string (CLI argument + MCP input). */\nexport const RUN_ONEOFF_QUERY_SOURCE_DESCRIPTION =\n 'JavaScript module source for a single file (testQuery.js) that exports a default readonly query, for example: export default query({ handler: async (ctx) => ({ count: (await ctx.db.query(\"messages\").take(10)).length }) });';\n\nexport const INLINE_QUERY_DESCRIPTION = [\n \"JavaScript to evaluate as a readonly query. The query is completely sandboxed, so it can only read data and cannot modify the database or access the network.\",\n \"\",\n \"This is a one-shot query and cannot be combined with `--watch`.\",\n \"Use `--component` to target a mounted component.\",\n \"\",\n \"To format the query:\",\n '- Simple expressions are returned automatically, for example: `await ctx.db.query(\"messages\").take(5)`.',\n '- For multi-statement queries, use an explicit return, for example: `const firstMessage = await ctx.db.query(\"messages\").first(); console.log(firstMessage?._id); return firstMessage;`.',\n '- For full control, pass a module source that exports a default query, for example: `export default query({ handler: async (ctx) => { return await ctx.db.query(\"messages\").take(10); } })`.',\n].join(\"\\n\");\n\nexport type RunTestFunctionQuerySuccess = {\n kind: \"success\";\n value: unknown;\n logLines: string[];\n};\n\nexport type RunTestFunctionQueryApplicationFailure = {\n kind: \"applicationFailure\";\n payload: unknown;\n};\n\nexport type RunTestFunctionQueryResult =\n | RunTestFunctionQuerySuccess\n | RunTestFunctionQueryApplicationFailure;\n\nexport function inlineQueryToQuerySource(inlineQuery: string) {\n const trimmedQuery = inlineQuery.trim();\n if (looksLikeQueryModuleSource(trimmedQuery)) {\n return injectQueryModulePreamble(trimmedQuery);\n }\n\n const queryBody = inlineQueryBody(trimmedQuery);\n return `${QUERY_MODULE_PREAMBLE}\n\nexport default query({\n handler: async (ctx) => {\n${indent(queryBody, 4)}\n },\n});`;\n}\n\n/**\n * POST /api/run_test_function with the same body shape as the dashboard and MCP.\n * Uses deploymentFetch for Convex-Client, auth headers, retries, and error typing.\n * On HTTP failure, throws ThrowingFetchError (from deploymentFetch).\n */\nexport async function runTestFunctionQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n querySource: string;\n componentId?: string;\n },\n): Promise<RunTestFunctionQueryResult> {\n const fetchDeployment = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n const response = await fetchDeployment(\"/api/run_test_function\", {\n method: \"POST\",\n body: JSON.stringify({\n adminKey: args.adminKey,\n args: {},\n bundle: {\n path: \"testQuery.js\",\n source: args.querySource,\n },\n format: \"convex_encoded_json\",\n ...(args.componentId !== undefined\n ? { componentId: args.componentId }\n : {}),\n }),\n });\n const result: unknown = await response.json();\n if (\n typeof result !== \"object\" ||\n result === null ||\n !(\"status\" in result) ||\n (result as { status: string }).status !== \"success\"\n ) {\n return { kind: \"applicationFailure\", payload: result };\n }\n const ok = result as {\n status: \"success\";\n value: unknown;\n logLines?: string[];\n };\n return {\n kind: \"success\",\n value: ok.value,\n logLines: ok.logLines ?? [],\n };\n}\n\nfunction looksLikeQueryModuleSource(querySource: string) {\n if (!querySource.includes(\"export default\")) return false;\n return /\\b(?:query|internalQuery)\\s*\\(/.test(querySource);\n}\n\nfunction injectQueryModulePreamble(querySource: string) {\n if (querySource.includes(\"convex:/_system/repl/wrappers.js\"))\n return querySource;\n return `${QUERY_MODULE_PREAMBLE}\n\n${querySource}`;\n}\n\nfunction inlineQueryBody(inlineQuery: string) {\n const trimmed = inlineQuery.trim();\n if (!isExpression(trimmed)) return trimmed;\n return `return (${trimmed.replace(/;$/, \"\")});`;\n}\n\nfunction isExpression(inlineQuery: string) {\n if (inlineQuery.includes(\"\\n\")) return false;\n return !/^(const|let|var|if|for|while|switch|try|throw|return)\\b/.test(\n inlineQuery,\n );\n}\n\nfunction indent(text: string, spaces: number) {\n const prefix = \" \".repeat(spaces);\n return text\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n}\n"],
4
+ "sourcesContent": ["import type { Context } from \"../../bundler/context.js\";\nimport { deploymentFetch } from \"./utils/utils.js\";\n\nconst QUERY_MODULE_PREAMBLE =\n 'import { query, internalQuery } from \"convex:/_system/repl/wrappers.js\";';\n\n/** Shared help text for the query/module string (CLI argument + MCP input). */\nexport const RUN_ONEOFF_QUERY_SOURCE_DESCRIPTION =\n 'JavaScript module source for a single file (testQuery.js) that exports a default readonly query, for example: export default query({ handler: async (ctx) => ({ count: (await ctx.db.query(\"messages\").take(10)).length }) });';\n\nexport const INLINE_QUERY_DESCRIPTION = [\n \"JavaScript to evaluate as a readonly query. The query is completely sandboxed, so it can only read data and cannot modify the database or access the network.\",\n \"\",\n \"This is a one-shot query and cannot be combined with `--watch`.\",\n \"Use `--component` to target a mounted component.\",\n \"\",\n \"To format the query:\",\n '\u2022 Simple expressions are returned automatically, for example: `await ctx.db.query(\"messages\").take(5)`.',\n '\u2022 For multi-statement queries, use an explicit return, for example: `const firstMessage = await ctx.db.query(\"messages\").first(); console.log(firstMessage?._id); return firstMessage;`.',\n '\u2022 For full control, pass a module source that exports a default query, for example: `export default query({ handler: async (ctx) => { return await ctx.db.query(\"messages\").take(10); } })`.',\n].join(\"\\n\");\n\nexport type RunTestFunctionQuerySuccess = {\n kind: \"success\";\n value: unknown;\n logLines: string[];\n};\n\nexport type RunTestFunctionQueryApplicationFailure = {\n kind: \"applicationFailure\";\n payload: unknown;\n};\n\nexport type RunTestFunctionQueryResult =\n | RunTestFunctionQuerySuccess\n | RunTestFunctionQueryApplicationFailure;\n\nexport function inlineQueryToQuerySource(inlineQuery: string) {\n const trimmedQuery = inlineQuery.trim();\n if (looksLikeQueryModuleSource(trimmedQuery)) {\n return injectQueryModulePreamble(trimmedQuery);\n }\n\n const queryBody = inlineQueryBody(trimmedQuery);\n return `${QUERY_MODULE_PREAMBLE}\n\nexport default query({\n handler: async (ctx) => {\n${indent(queryBody, 4)}\n },\n});`;\n}\n\n/**\n * POST /api/run_test_function with the same body shape as the dashboard and MCP.\n * Uses deploymentFetch for Convex-Client, auth headers, retries, and error typing.\n * On HTTP failure, throws ThrowingFetchError (from deploymentFetch).\n */\nexport async function runTestFunctionQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n querySource: string;\n componentId?: string;\n },\n): Promise<RunTestFunctionQueryResult> {\n const fetchDeployment = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n const response = await fetchDeployment(\"/api/run_test_function\", {\n method: \"POST\",\n body: JSON.stringify({\n adminKey: args.adminKey,\n args: {},\n bundle: {\n path: \"testQuery.js\",\n source: args.querySource,\n },\n format: \"convex_encoded_json\",\n ...(args.componentId !== undefined\n ? { componentId: args.componentId }\n : {}),\n }),\n });\n const result: unknown = await response.json();\n if (\n typeof result !== \"object\" ||\n result === null ||\n !(\"status\" in result) ||\n (result as { status: string }).status !== \"success\"\n ) {\n return { kind: \"applicationFailure\", payload: result };\n }\n const ok = result as {\n status: \"success\";\n value: unknown;\n logLines?: string[];\n };\n return {\n kind: \"success\",\n value: ok.value,\n logLines: ok.logLines ?? [],\n };\n}\n\nfunction looksLikeQueryModuleSource(querySource: string) {\n if (!querySource.includes(\"export default\")) return false;\n return /\\b(?:query|internalQuery)\\s*\\(/.test(querySource);\n}\n\nfunction injectQueryModulePreamble(querySource: string) {\n if (querySource.includes(\"convex:/_system/repl/wrappers.js\"))\n return querySource;\n return `${QUERY_MODULE_PREAMBLE}\n\n${querySource}`;\n}\n\nfunction inlineQueryBody(inlineQuery: string) {\n const trimmed = inlineQuery.trim();\n if (!isExpression(trimmed)) return trimmed;\n return `return (${trimmed.replace(/;$/, \"\")});`;\n}\n\nfunction isExpression(inlineQuery: string) {\n if (inlineQuery.includes(\"\\n\")) return false;\n return !/^(const|let|var|if|for|while|switch|try|throw|return)\\b/.test(\n inlineQuery,\n );\n}\n\nfunction indent(text: string, spaces: number) {\n const prefix = \" \".repeat(spaces);\n return text\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n}\n"],
5
5
  "mappings": ";AACA,SAAS,uBAAuB;AAEhC,MAAM,wBACJ;AAGK,aAAM,sCACX;AAEK,aAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAiBJ,gBAAS,yBAAyB,aAAqB;AAC5D,QAAM,eAAe,YAAY,KAAK;AACtC,MAAI,2BAA2B,YAAY,GAAG;AAC5C,WAAO,0BAA0B,YAAY;AAAA,EAC/C;AAEA,QAAM,YAAY,gBAAgB,YAAY;AAC9C,SAAO,GAAG,qBAAqB;AAAA;AAAA;AAAA;AAAA,EAI/B,OAAO,WAAW,CAAC,CAAC;AAAA;AAAA;AAGtB;AAOA,sBAAsB,qBACpB,KACA,MAMqC;AACrC,QAAM,kBAAkB,gBAAgB,KAAK;AAAA,IAC3C,eAAe,KAAK;AAAA,IACpB,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,QAAM,WAAW,MAAM,gBAAgB,0BAA0B;AAAA,IAC/D,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,MAAM,CAAC;AAAA,MACP,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,MACR,GAAI,KAAK,gBAAgB,SACrB,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACD,QAAM,SAAkB,MAAM,SAAS,KAAK;AAC5C,MACE,OAAO,WAAW,YAClB,WAAW,QACX,EAAE,YAAY,WACb,OAA8B,WAAW,WAC1C;AACA,WAAO,EAAE,MAAM,sBAAsB,SAAS,OAAO;AAAA,EACvD;AACA,QAAM,KAAK;AAKX,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,GAAG;AAAA,IACV,UAAU,GAAG,YAAY,CAAC;AAAA,EAC5B;AACF;AAEA,SAAS,2BAA2B,aAAqB;AACvD,MAAI,CAAC,YAAY,SAAS,gBAAgB,EAAG,QAAO;AACpD,SAAO,iCAAiC,KAAK,WAAW;AAC1D;AAEA,SAAS,0BAA0B,aAAqB;AACtD,MAAI,YAAY,SAAS,kCAAkC;AACzD,WAAO;AACT,SAAO,GAAG,qBAAqB;AAAA;AAAA,EAE/B,WAAW;AACb;AAEA,SAAS,gBAAgB,aAAqB;AAC5C,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,aAAa,OAAO,EAAG,QAAO;AACnC,SAAO,WAAW,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAC7C;AAEA,SAAS,aAAa,aAAqB;AACzC,MAAI,YAAY,SAAS,IAAI,EAAG,QAAO;AACvC,SAAO,CAAC,0DAA0D;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,OAAO,MAAc,QAAgB;AAC5C,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,SAAO,KACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,EAAE,EAChC,KAAK,IAAI;AACd;",
6
6
  "names": []
7
7
  }
@@ -58,6 +58,27 @@ export function readDeployKeyFromEnv(getEnv) {
58
58
  const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);
59
59
  return fromDeployKey || fromToken || void 0;
60
60
  }
61
+ const PERMISSION_DENIED_MESSAGE_PREFIX = "You do not have permission to perform this operation";
62
+ function deployKeyPermissionAdvice() {
63
+ const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME : null;
64
+ if (envVarName === null) {
65
+ return null;
66
+ }
67
+ return `This is determined by the permissions granted to ${envVarName}.`;
68
+ }
69
+ export function permissionDeniedErrorMessage(errorMessage) {
70
+ const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);
71
+ if (index === -1) {
72
+ return null;
73
+ }
74
+ let msg = errorMessage.slice(index).split("\n")[0].trim();
75
+ const advice = deployKeyPermissionAdvice();
76
+ if (advice) {
77
+ msg = `${msg}
78
+ ${advice}`;
79
+ }
80
+ return msg;
81
+ }
61
82
  export function parsePositiveInteger(value) {
62
83
  const parsedValue = parseInteger(value);
63
84
  if (parsedValue <= 0) {
@@ -112,6 +133,14 @@ export class ThrowingFetchError extends Error {
112
133
  error_type = "fatal";
113
134
  msg = `${msg}
114
135
  Authenticate with \`npx convex dev\``;
136
+ } else if (this.response.status === 403) {
137
+ error_type = "fatal";
138
+ msg = this.serverErrorData?.message ?? msg;
139
+ const advice = deployKeyPermissionAdvice();
140
+ if (advice) {
141
+ msg = `${msg}
142
+ ${advice}`;
143
+ }
115
144
  } else if (this.response.status === 404) {
116
145
  error_type = "fatal";
117
146
  msg = `${msg}: ${this.response.url}`;