convex 1.40.0 → 1.41.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 (290) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/aiFiles.js +2 -2
  5. package/dist/cjs/cli/aiFiles.js.map +1 -1
  6. package/dist/cjs/cli/configure.js +1 -4
  7. package/dist/cjs/cli/configure.js.map +2 -2
  8. package/dist/cjs/cli/convexExport.js +3 -3
  9. package/dist/cjs/cli/convexExport.js.map +1 -1
  10. package/dist/cjs/cli/convexImport.js +2 -2
  11. package/dist/cjs/cli/convexImport.js.map +1 -1
  12. package/dist/cjs/cli/dashboard.js +19 -6
  13. package/dist/cjs/cli/dashboard.js.map +3 -3
  14. package/dist/cjs/cli/data.js +2 -2
  15. package/dist/cjs/cli/data.js.map +1 -1
  16. package/dist/cjs/cli/deploy.js +5 -5
  17. package/dist/cjs/cli/deploy.js.map +2 -2
  18. package/dist/cjs/cli/deploymentCreate.js +11 -5
  19. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  20. package/dist/cjs/cli/deploymentSelect.js +5 -5
  21. package/dist/cjs/cli/deploymentSelect.js.map +1 -1
  22. package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
  23. package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
  24. package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
  25. package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
  26. package/dist/cjs/cli/dev.js +6 -5
  27. package/dist/cjs/cli/dev.js.map +2 -2
  28. package/dist/cjs/cli/env.js +16 -16
  29. package/dist/cjs/cli/env.js.map +2 -2
  30. package/dist/cjs/cli/envDefault.js +10 -10
  31. package/dist/cjs/cli/envDefault.js.map +1 -1
  32. package/dist/cjs/cli/insights.js +3 -3
  33. package/dist/cjs/cli/insights.js.map +1 -1
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/command.js +1 -1
  37. package/dist/cjs/cli/lib/command.js.map +1 -1
  38. package/dist/cjs/cli/lib/deployment.js.map +1 -1
  39. package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
  40. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  41. package/dist/cjs/cli/lib/dev.js +31 -0
  42. package/dist/cjs/cli/lib/dev.js.map +2 -2
  43. package/dist/cjs/cli/lib/generateDocs.js +256 -0
  44. package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
  45. package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
  46. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
  47. package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
  48. package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
  49. package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
  50. package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
  51. package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
  52. package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
  53. package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
  54. package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
  55. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
  56. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
  57. package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
  58. package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
  59. package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
  60. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  61. package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
  62. package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
  63. package/dist/cjs/cli/lib/runTestFunction.js +3 -3
  64. package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
  65. package/dist/cjs/cli/run.js +5 -5
  66. package/dist/cjs/cli/run.js.map +1 -1
  67. package/dist/cjs/index.js +1 -1
  68. package/dist/cjs/index.js.map +1 -1
  69. package/dist/cjs/server/impl/registration_impl.js +0 -1
  70. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  71. package/dist/cjs/server/index.js.map +2 -2
  72. package/dist/cjs/server/meta.js.map +1 -1
  73. package/dist/cjs/server/registration.js.map +1 -1
  74. package/dist/cjs-types/cli/configure.d.ts +3 -2
  75. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  76. package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
  77. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  78. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  79. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  80. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  81. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  82. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
  83. package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
  84. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  85. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
  86. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  87. package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
  88. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  89. package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
  90. package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
  91. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
  92. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  93. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  94. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  96. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  97. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  98. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
  100. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  101. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  102. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  104. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  106. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  107. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  108. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  109. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  110. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
  112. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
  114. package/dist/cjs-types/index.d.ts +1 -1
  115. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  116. package/dist/cjs-types/server/index.d.ts +1 -1
  117. package/dist/cjs-types/server/index.d.ts.map +1 -1
  118. package/dist/cjs-types/server/meta.d.ts +16 -0
  119. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  120. package/dist/cjs-types/server/registration.d.ts +11 -5
  121. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  122. package/dist/cli.bundle.cjs +66405 -67923
  123. package/dist/cli.bundle.cjs.map +4 -4
  124. package/dist/esm/cli/aiFiles.js +2 -2
  125. package/dist/esm/cli/aiFiles.js.map +1 -1
  126. package/dist/esm/cli/configure.js +1 -4
  127. package/dist/esm/cli/configure.js.map +2 -2
  128. package/dist/esm/cli/convexExport.js +3 -3
  129. package/dist/esm/cli/convexExport.js.map +1 -1
  130. package/dist/esm/cli/convexImport.js +2 -2
  131. package/dist/esm/cli/convexImport.js.map +1 -1
  132. package/dist/esm/cli/dashboard.js +16 -3
  133. package/dist/esm/cli/dashboard.js.map +2 -2
  134. package/dist/esm/cli/data.js +2 -2
  135. package/dist/esm/cli/data.js.map +1 -1
  136. package/dist/esm/cli/deploy.js +5 -5
  137. package/dist/esm/cli/deploy.js.map +2 -2
  138. package/dist/esm/cli/deploymentCreate.js +13 -9
  139. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  140. package/dist/esm/cli/deploymentSelect.js +5 -5
  141. package/dist/esm/cli/deploymentSelect.js.map +1 -1
  142. package/dist/esm/cli/deploymentTokenCreate.js +9 -15
  143. package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
  144. package/dist/esm/cli/deploymentTokenDelete.js +8 -16
  145. package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
  146. package/dist/esm/cli/dev.js +6 -5
  147. package/dist/esm/cli/dev.js.map +2 -2
  148. package/dist/esm/cli/env.js +16 -16
  149. package/dist/esm/cli/env.js.map +2 -2
  150. package/dist/esm/cli/envDefault.js +10 -10
  151. package/dist/esm/cli/envDefault.js.map +1 -1
  152. package/dist/esm/cli/insights.js +3 -3
  153. package/dist/esm/cli/insights.js.map +1 -1
  154. package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
  155. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  156. package/dist/esm/cli/lib/command.js +1 -1
  157. package/dist/esm/cli/lib/command.js.map +1 -1
  158. package/dist/esm/cli/lib/deployment.js.map +1 -1
  159. package/dist/esm/cli/lib/deploymentSelection.js +38 -0
  160. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  161. package/dist/esm/cli/lib/dev.js +31 -0
  162. package/dist/esm/cli/lib/dev.js.map +2 -2
  163. package/dist/esm/cli/lib/generateDocs.js +233 -0
  164. package/dist/esm/cli/lib/generateDocs.js.map +7 -0
  165. package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
  166. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
  167. package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
  168. package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
  169. package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
  170. package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
  171. package/dist/esm/cli/lib/localDeployment/download.js +15 -2
  172. package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
  173. package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
  174. package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
  175. package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
  176. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
  177. package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
  178. package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
  179. package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
  180. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
  181. package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
  182. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  183. package/dist/esm/cli/lib/runTestFunction.js +3 -3
  184. package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
  185. package/dist/esm/cli/run.js +5 -5
  186. package/dist/esm/cli/run.js.map +1 -1
  187. package/dist/esm/index.js +1 -1
  188. package/dist/esm/index.js.map +1 -1
  189. package/dist/esm/server/impl/registration_impl.js +0 -1
  190. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  191. package/dist/esm/server/index.js.map +2 -2
  192. package/dist/esm-types/cli/configure.d.ts +3 -2
  193. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  194. package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
  195. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  196. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  197. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  198. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  199. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  200. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
  201. package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
  202. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  203. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
  204. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  205. package/dist/esm-types/cli/lib/dev.d.ts +2 -1
  206. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  207. package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
  208. package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
  209. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
  210. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  211. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  212. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  213. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  214. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  215. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  216. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  217. package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
  218. package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  219. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  220. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  221. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  222. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  223. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  224. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  225. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  226. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  227. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  228. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  229. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
  230. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  231. package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
  232. package/dist/esm-types/index.d.ts +1 -1
  233. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  234. package/dist/esm-types/server/index.d.ts +1 -1
  235. package/dist/esm-types/server/index.d.ts.map +1 -1
  236. package/dist/esm-types/server/meta.d.ts +16 -0
  237. package/dist/esm-types/server/meta.d.ts.map +1 -1
  238. package/dist/esm-types/server/registration.d.ts +11 -5
  239. package/dist/esm-types/server/registration.d.ts.map +1 -1
  240. package/dist/react.bundle.js +1 -1
  241. package/dist/react.bundle.js.map +1 -1
  242. package/package.json +4 -2
  243. package/src/browser/sync/request_manager.test.ts +2 -2
  244. package/src/cli/aiFiles.ts +2 -2
  245. package/src/cli/configure.ts +4 -6
  246. package/src/cli/convexExport.ts +3 -3
  247. package/src/cli/convexImport.ts +2 -2
  248. package/src/cli/dashboard.ts +29 -3
  249. package/src/cli/data.ts +2 -2
  250. package/src/cli/deploy.ts +5 -5
  251. package/src/cli/deploymentCreate.test.ts +151 -24
  252. package/src/cli/deploymentCreate.ts +21 -11
  253. package/src/cli/deploymentSelect.ts +5 -5
  254. package/src/cli/deploymentSelection.test.ts +0 -3
  255. package/src/cli/deploymentToken.test.ts +34 -23
  256. package/src/cli/deploymentTokenCreate.ts +9 -21
  257. package/src/cli/deploymentTokenDelete.ts +8 -23
  258. package/src/cli/dev.ts +5 -4
  259. package/src/cli/env.ts +16 -16
  260. package/src/cli/envDefault.ts +10 -10
  261. package/src/cli/insights.ts +3 -3
  262. package/src/cli/lib/aiFiles/integration.test.ts +2 -0
  263. package/src/cli/lib/aiFiles/skills.ts +3 -3
  264. package/src/cli/lib/command.ts +2 -2
  265. package/src/cli/lib/deployment.ts +0 -5
  266. package/src/cli/lib/deploymentSelection.ts +67 -0
  267. package/src/cli/lib/dev.ts +39 -0
  268. package/src/cli/lib/generateDocs.test.ts +326 -0
  269. package/src/cli/lib/generateDocs.ts +393 -0
  270. package/src/cli/lib/localDeployment/anonymous.ts +48 -72
  271. package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
  272. package/src/cli/lib/localDeployment/dashboard.ts +48 -80
  273. package/src/cli/lib/localDeployment/download.ts +34 -3
  274. package/src/cli/lib/localDeployment/filePaths.ts +66 -6
  275. package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
  276. package/src/cli/lib/localDeployment/run.test.ts +6 -6
  277. package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
  278. package/src/cli/lib/localDeployment/secrets.ts +93 -0
  279. package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
  280. package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
  281. package/src/cli/lib/localDeployment/upgrade.ts +52 -38
  282. package/src/cli/lib/localDeployment/utils.ts +0 -10
  283. package/src/cli/lib/runTestFunction.ts +3 -3
  284. package/src/cli/run.ts +5 -5
  285. package/src/index.ts +1 -1
  286. package/src/server/impl/registration_impl.ts +0 -2
  287. package/src/server/index.ts +1 -0
  288. package/src/server/meta.ts +17 -0
  289. package/src/server/registration.test.ts +2 -35
  290. package/src/server/registration.ts +10 -19
@@ -8,7 +8,6 @@ import {
8
8
  import { runSystemQuery } from "../run.js";
9
9
  import {
10
10
  deploymentStateDir,
11
- loadDeploymentConfig,
12
11
  saveDeploymentConfig
13
12
  } from "./filePaths.js";
14
13
  import {
@@ -30,12 +29,28 @@ import { promptOptions, promptYesNo } from "../utils/prompts.js";
30
29
  import { recursivelyDelete } from "../fsUtils.js";
31
30
  import { LocalDeploymentError } from "./errors.js";
32
31
  import { ensureBackendBinaryDownloaded } from "./download.js";
33
- export async function handlePotentialUpgrade(ctx, args) {
32
+ import {
33
+ generateLocalDevSecretsWithLatestBinary,
34
+ LEGACY_LOCAL_BACKEND_INSTANCE_SECRET
35
+ } from "./secrets.js";
36
+ export async function handlePotentialUpgradeAndStart(ctx, args) {
37
+ const { adminKey, instanceSecret } = args.existingCredentials === null || args.existingCredentials.instanceSecret === LEGACY_LOCAL_BACKEND_INSTANCE_SECRET ? (
38
+ // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`
39
+ // here, because `newBinaryPath` can be a binary that doesn’t support
40
+ // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)
41
+ //
42
+ // In most cases (the user is not using the flag), we have already downloaded the latest binary
43
+ // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn’t cause an
44
+ // extra download (even if the user chooses later not to upgrade their deployment)
45
+ await generateLocalDevSecretsWithLatestBinary(ctx, {
46
+ deploymentName: args.deploymentName
47
+ })
48
+ ) : args.existingCredentials;
34
49
  const newConfig = {
35
50
  ports: args.ports,
36
51
  backendVersion: args.newVersion,
37
- adminKey: args.adminKey,
38
- instanceSecret: args.instanceSecret,
52
+ adminKey,
53
+ instanceSecret,
39
54
  cloudProjectId: args.cloudProjectId
40
55
  };
41
56
  if (args.oldVersion === null || args.oldVersion === args.newVersion) {
@@ -45,14 +60,15 @@ export async function handlePotentialUpgrade(ctx, args) {
45
60
  args.deploymentName,
46
61
  newConfig
47
62
  );
48
- return runLocalBackend(ctx, {
63
+ const { cleanupHandle: cleanupHandle2 } = await runLocalBackend(ctx, {
49
64
  binaryPath: args.newBinaryPath,
50
65
  deploymentKind: args.deploymentKind,
51
66
  deploymentName: args.deploymentName,
52
67
  ports: args.ports,
53
- instanceSecret: args.instanceSecret,
68
+ instanceSecret,
54
69
  isLatestVersion: true
55
70
  });
71
+ return { cleanupHandle: cleanupHandle2, adminKey };
56
72
  }
57
73
  logVerbose(
58
74
  `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`
@@ -73,14 +89,15 @@ export async function handlePotentialUpgrade(ctx, args) {
73
89
  ...newConfig,
74
90
  backendVersion: args.oldVersion
75
91
  });
76
- return runLocalBackend(ctx, {
92
+ const { cleanupHandle: cleanupHandle2 } = await runLocalBackend(ctx, {
77
93
  binaryPath: oldBinaryPath,
78
94
  ports: args.ports,
79
95
  deploymentKind: args.deploymentKind,
80
96
  deploymentName: args.deploymentName,
81
- instanceSecret: args.instanceSecret,
97
+ instanceSecret,
82
98
  isLatestVersion: false
83
99
  });
100
+ return { cleanupHandle: cleanupHandle2, adminKey };
84
101
  }
85
102
  const choice = args.forceUpgrade || !process.stdin.isTTY ? "transfer" : await promptOptions(ctx, {
86
103
  message: "Transfer data from existing deployment?",
@@ -103,31 +120,31 @@ export async function handlePotentialUpgrade(ctx, args) {
103
120
  args.deploymentName,
104
121
  newConfig
105
122
  );
106
- return runLocalBackend(ctx, {
123
+ const { cleanupHandle: cleanupHandle2 } = await runLocalBackend(ctx, {
107
124
  binaryPath: args.newBinaryPath,
108
125
  deploymentKind: args.deploymentKind,
109
126
  deploymentName: args.deploymentName,
110
127
  ports: args.ports,
111
- instanceSecret: args.instanceSecret,
128
+ instanceSecret,
112
129
  isLatestVersion: true
113
130
  });
131
+ return { cleanupHandle: cleanupHandle2, adminKey };
114
132
  }
115
- const newAdminKey = args.adminKey;
116
- const oldAdminKey = loadDeploymentConfig(ctx, args.deploymentKind, args.deploymentName)?.adminKey ?? args.adminKey;
117
- return handleUpgrade(ctx, {
133
+ const { cleanupHandle } = await handleUpgrade(ctx, {
118
134
  deploymentKind: args.deploymentKind,
119
135
  deploymentName: args.deploymentName,
120
136
  oldVersion: args.oldVersion,
121
137
  newBinaryPath: args.newBinaryPath,
122
138
  newVersion: args.newVersion,
123
139
  ports: args.ports,
124
- oldAdminKey,
125
- newAdminKey,
126
- instanceSecret: args.instanceSecret,
140
+ adminKey,
141
+ instanceSecret,
127
142
  cloudProjectId: args.cloudProjectId
128
143
  });
144
+ return { cleanupHandle, adminKey };
129
145
  }
130
146
  async function handleUpgrade(ctx, args) {
147
+ const { adminKey } = args;
131
148
  const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(
132
149
  ctx,
133
150
  {
@@ -148,7 +165,7 @@ async function handleUpgrade(ctx, args) {
148
165
  const deploymentUrl = localDeploymentUrl(args.ports.cloud);
149
166
  const envs = await runSystemQuery(ctx, {
150
167
  deploymentUrl,
151
- adminKey: args.oldAdminKey,
168
+ adminKey,
152
169
  functionName: "_system/cli/queryEnvironmentVariables",
153
170
  componentPath: void 0,
154
171
  args: {}
@@ -161,13 +178,13 @@ async function handleUpgrade(ctx, args) {
161
178
  if (ctx.fs.exists(exportPath)) {
162
179
  ctx.fs.unlink(exportPath);
163
180
  }
164
- const snaphsotExportState = await startSnapshotExport(ctx, {
181
+ const snapshotExportState = await startSnapshotExport(ctx, {
165
182
  deploymentUrl,
166
- adminKey: args.oldAdminKey,
183
+ adminKey,
167
184
  includeStorage: true,
168
185
  inputPath: exportPath
169
186
  });
170
- if (snaphsotExportState.state !== "completed") {
187
+ if (snapshotExportState.state !== "completed") {
171
188
  return ctx.crash({
172
189
  exitCode: 1,
173
190
  errorType: "fatal",
@@ -175,9 +192,9 @@ async function handleUpgrade(ctx, args) {
175
192
  });
176
193
  }
177
194
  await downloadSnapshotExport(ctx, {
178
- snapshotExportTs: snaphsotExportState.start_ts,
195
+ snapshotExportTs: snapshotExportState.start_ts,
179
196
  inputPath: exportPath,
180
- adminKey: args.oldAdminKey,
197
+ adminKey,
181
198
  deploymentUrl
182
199
  });
183
200
  logVerbose("Stopping the backend on the old version");
@@ -204,7 +221,7 @@ async function handleUpgrade(ctx, args) {
204
221
  if (envs.length > 0) {
205
222
  const fetch = deploymentFetch(ctx, {
206
223
  deploymentUrl,
207
- adminKey: args.newAdminKey
224
+ adminKey
208
225
  });
209
226
  try {
210
227
  await fetch("/api/update_environment_variables", {
@@ -218,7 +235,7 @@ async function handleUpgrade(ctx, args) {
218
235
  logVerbose("Doing a snapshot import");
219
236
  const importId = await uploadForImport(ctx, {
220
237
  deploymentUrl,
221
- adminKey: args.newAdminKey,
238
+ adminKey,
222
239
  filePath: exportPath,
223
240
  importArgs: { format: "zip", mode: "replace", tableName: void 0 },
224
241
  onImportFailed: async (e) => {
@@ -229,7 +246,7 @@ async function handleUpgrade(ctx, args) {
229
246
  let status = await waitForStableImportState(ctx, {
230
247
  importId,
231
248
  deploymentUrl,
232
- adminKey: args.newAdminKey,
249
+ adminKey,
233
250
  onProgress: () => {
234
251
  return 0;
235
252
  }
@@ -245,7 +262,7 @@ async function handleUpgrade(ctx, args) {
245
262
  }
246
263
  await confirmImport(ctx, {
247
264
  importId,
248
- adminKey: args.newAdminKey,
265
+ adminKey,
249
266
  deploymentUrl,
250
267
  onError: async (e) => {
251
268
  logFailure(`Failed to confirm import: ${e}`);
@@ -255,7 +272,7 @@ async function handleUpgrade(ctx, args) {
255
272
  status = await waitForStableImportState(ctx, {
256
273
  importId,
257
274
  deploymentUrl,
258
- adminKey: args.newAdminKey,
275
+ adminKey,
259
276
  onProgress: () => {
260
277
  return 0;
261
278
  }
@@ -274,7 +291,7 @@ async function handleUpgrade(ctx, args) {
274
291
  saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {
275
292
  ports: args.ports,
276
293
  backendVersion: args.newVersion,
277
- adminKey: args.newAdminKey,
294
+ adminKey,
278
295
  instanceSecret: args.instanceSecret,
279
296
  cloudProjectId: args.cloudProjectId
280
297
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/upgrade.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logVerbose,\n} from \"../../../bundler/log.js\";\nimport { runSystemQuery } from \"../run.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport {\n ensureBackendStopped,\n localDeploymentUrl,\n runLocalBackend,\n} from \"./run.js\";\nimport {\n downloadSnapshotExport,\n startSnapshotExport,\n} from \"../convexExport.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"../utils/utils.js\";\nimport {\n confirmImport,\n uploadForImport,\n waitForStableImportState,\n} from \"../convexImport.js\";\nimport { promptOptions, promptYesNo } from \"../utils/prompts.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nexport async function handlePotentialUpgrade(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n adminKey: string;\n instanceSecret: string;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n return runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n }\n const choice =\n args.forceUpgrade || !process.stdin.isTTY\n ? \"transfer\"\n : await promptOptions(ctx, {\n message: \"Transfer data from existing deployment?\",\n default: \"transfer\",\n choices: [\n { name: \"transfer data\", value: \"transfer\" },\n { name: \"start fresh\", value: \"reset\" },\n ],\n });\n const deploymentStatePath = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n if (choice === \"reset\") {\n recursivelyDelete(ctx, deploymentStatePath, { force: true });\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n const newAdminKey = args.adminKey;\n const oldAdminKey =\n loadDeploymentConfig(ctx, args.deploymentKind, args.deploymentName)\n ?.adminKey ?? args.adminKey;\n return handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion!,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n oldAdminKey,\n newAdminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n}\n\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n // In most of the cases the admin key is the same for the old and new version.\n // This is helpful when we start generating new admin key formats that might\n // be incompatible with older backend versions.\n oldAdminKey: string;\n newAdminKey: string;\n instanceSecret: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n\n logVerbose(\"Running backend on old version\");\n const { cleanupHandle: oldCleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n\n logVerbose(\"Downloading env vars\");\n const deploymentUrl = localDeploymentUrl(args.ports.cloud);\n const envs = (await runSystemQuery(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as Array<{\n name: string;\n value: string;\n }>;\n\n logVerbose(\"Doing a snapshot export\");\n const exportPath = path.join(\n deploymentStateDir(ctx, args.deploymentKind, args.deploymentName),\n \"export.zip\",\n );\n if (ctx.fs.exists(exportPath)) {\n ctx.fs.unlink(exportPath);\n }\n const snaphsotExportState = await startSnapshotExport(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n includeStorage: true,\n inputPath: exportPath,\n });\n if (snaphsotExportState.state !== \"completed\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to export snapshot\",\n });\n }\n await downloadSnapshotExport(ctx, {\n snapshotExportTs: snaphsotExportState.start_ts,\n inputPath: exportPath,\n adminKey: args.oldAdminKey,\n deploymentUrl,\n });\n\n logVerbose(\"Stopping the backend on the old version\");\n const oldCleanupFunc = ctx.removeCleanup(oldCleanupHandle);\n if (oldCleanupFunc) {\n await oldCleanupFunc(0);\n }\n await ensureBackendStopped(ctx, {\n ports: args.ports,\n maxTimeSecs: 5,\n deploymentName: args.deploymentName,\n allowOtherDeployments: false,\n });\n\n // TODO(ENG-7078) save old artifacts to backup files\n logVerbose(\"Running backend on new version\");\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logVerbose(\"Importing the env vars\");\n if (envs.length > 0) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n });\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes: envs }),\n method: \"POST\",\n });\n } catch (e) {\n // TODO: this should ideally have a `LocalDeploymentError`\n return await logAndHandleFetchError(ctx, e);\n }\n }\n\n logVerbose(\"Doing a snapshot import\");\n const importId = await uploadForImport(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n filePath: exportPath,\n importArgs: { format: \"zip\", mode: \"replace\", tableName: undefined },\n onImportFailed: async (e) => {\n logFailure(`Failed to import snapshot: ${e}`);\n },\n });\n logVerbose(`Snapshot import started`);\n let status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n if (status.state !== \"waiting_for_confirmation\") {\n const message = \"Error while transferring data: Failed to upload snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n await confirmImport(ctx, {\n importId,\n adminKey: args.newAdminKey,\n deploymentUrl,\n onError: async (e) => {\n logFailure(`Failed to confirm import: ${e}`);\n },\n });\n logVerbose(`Snapshot import confirmed`);\n status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n logVerbose(`Snapshot import status: ${status.state}`);\n if (status.state !== \"completed\") {\n const message = \"Error while transferring data: Failed to import snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n logFinishedStep(\"Successfully upgraded to a new backend version\");\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.newAdminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logVerbose,\n} from \"../../../bundler/log.js\";\nimport { runSystemQuery } from \"../run.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n deploymentStateDir,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport {\n ensureBackendStopped,\n localDeploymentUrl,\n runLocalBackend,\n} from \"./run.js\";\nimport {\n downloadSnapshotExport,\n startSnapshotExport,\n} from \"../convexExport.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"../utils/utils.js\";\nimport {\n confirmImport,\n uploadForImport,\n waitForStableImportState,\n} from \"../convexImport.js\";\nimport { promptOptions, promptYesNo } from \"../utils/prompts.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handlePotentialUpgradeAndStart(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n existingCredentials: { adminKey: string; instanceSecret: string } | null;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string; adminKey: string }> {\n const { adminKey, instanceSecret } =\n args.existingCredentials === null ||\n args.existingCredentials.instanceSecret ===\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET\n ? // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`\n // here, because `newBinaryPath` can be a binary that doesn\u2019t support\n // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)\n //\n // In most cases (the user is not using the flag), we have already downloaded the latest binary\n // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn\u2019t cause an\n // extra download (even if the user chooses later not to upgrade their deployment)\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: args.deploymentName,\n })\n : args.existingCredentials;\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: false,\n });\n return { cleanupHandle, adminKey };\n }\n const choice =\n args.forceUpgrade || !process.stdin.isTTY\n ? \"transfer\"\n : await promptOptions(ctx, {\n message: \"Transfer data from existing deployment?\",\n default: \"transfer\",\n choices: [\n { name: \"transfer data\", value: \"transfer\" },\n { name: \"start fresh\", value: \"reset\" },\n ],\n });\n const deploymentStatePath = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n if (choice === \"reset\") {\n recursivelyDelete(ctx, deploymentStatePath, { force: true });\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n const { cleanupHandle } = await handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion!,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n return { cleanupHandle, adminKey };\n}\n\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n instanceSecret: string;\n adminKey: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const { adminKey } = args;\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n\n logVerbose(\"Running backend on old version\");\n const { cleanupHandle: oldCleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n\n logVerbose(\"Downloading env vars\");\n const deploymentUrl = localDeploymentUrl(args.ports.cloud);\n const envs = (await runSystemQuery(ctx, {\n deploymentUrl,\n adminKey,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as Array<{\n name: string;\n value: string;\n }>;\n\n logVerbose(\"Doing a snapshot export\");\n const exportPath = path.join(\n deploymentStateDir(ctx, args.deploymentKind, args.deploymentName),\n \"export.zip\",\n );\n if (ctx.fs.exists(exportPath)) {\n ctx.fs.unlink(exportPath);\n }\n const snapshotExportState = await startSnapshotExport(ctx, {\n deploymentUrl,\n adminKey,\n includeStorage: true,\n inputPath: exportPath,\n });\n if (snapshotExportState.state !== \"completed\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to export snapshot\",\n });\n }\n await downloadSnapshotExport(ctx, {\n snapshotExportTs: snapshotExportState.start_ts,\n inputPath: exportPath,\n adminKey,\n deploymentUrl,\n });\n\n logVerbose(\"Stopping the backend on the old version\");\n const oldCleanupFunc = ctx.removeCleanup(oldCleanupHandle);\n if (oldCleanupFunc) {\n await oldCleanupFunc(0);\n }\n await ensureBackendStopped(ctx, {\n ports: args.ports,\n maxTimeSecs: 5,\n deploymentName: args.deploymentName,\n allowOtherDeployments: false,\n });\n\n // TODO(ENG-7078) save old artifacts to backup files\n logVerbose(\"Running backend on new version\");\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logVerbose(\"Importing the env vars\");\n if (envs.length > 0) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl,\n adminKey,\n });\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes: envs }),\n method: \"POST\",\n });\n } catch (e) {\n // TODO: this should ideally have a `LocalDeploymentError`\n return await logAndHandleFetchError(ctx, e);\n }\n }\n\n logVerbose(\"Doing a snapshot import\");\n const importId = await uploadForImport(ctx, {\n deploymentUrl,\n adminKey,\n filePath: exportPath,\n importArgs: { format: \"zip\", mode: \"replace\", tableName: undefined },\n onImportFailed: async (e) => {\n logFailure(`Failed to import snapshot: ${e}`);\n },\n });\n logVerbose(`Snapshot import started`);\n let status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n if (status.state !== \"waiting_for_confirmation\") {\n const message = \"Error while transferring data: Failed to upload snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n await confirmImport(ctx, {\n importId,\n adminKey,\n deploymentUrl,\n onError: async (e) => {\n logFailure(`Failed to confirm import: ${e}`);\n },\n });\n logVerbose(`Snapshot import confirmed`);\n status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n logVerbose(`Snapshot import status: ${status.state}`);\n if (status.state !== \"completed\") {\n const message = \"Error while transferring data: Failed to import snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n logFinishedStep(\"Successfully upgraded to a new backend version\");\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["cleanupHandle"]
7
7
  }
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  import { logMessage } from "../../../bundler/log.js";
3
3
  import { detect } from "detect-port";
4
- import crypto from "crypto";
5
4
  import { chalkStderr } from "chalk";
6
5
  export async function choosePorts(ctx, {
7
6
  count,
@@ -54,9 +53,6 @@ export async function chooseLocalBackendPorts(ctx, options) {
54
53
  });
55
54
  return { cloudPort, sitePort };
56
55
  }
57
- export async function isOffline() {
58
- return false;
59
- }
60
56
  export function printLocalDeploymentWelcomeMessage() {
61
57
  logMessage(
62
58
  chalkStderr.cyan("You're trying out the beta local deployment feature!")
@@ -67,8 +63,5 @@ export function printLocalDeploymentWelcomeMessage() {
67
63
  )
68
64
  );
69
65
  }
70
- export function generateInstanceSecret() {
71
- return crypto.randomBytes(32).toString("hex");
72
- }
73
66
  export const LOCAL_BACKEND_INSTANCE_SECRET = "4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974";
74
67
  //# 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 crypto from \"crypto\";\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 async function isOffline(): Promise<boolean> {\n // TODO(ENG-7080) -- implement this for real\n return false;\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 function generateInstanceSecret(): string {\n return crypto.randomBytes(32).toString(\"hex\");\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
5
- "mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,OAAO,YAAY;AACnB,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;AAEA,sBAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,gBAAS,yBAAiC;AAC/C,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;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"],
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;",
6
6
  "names": ["port"]
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
  }
@@ -29,11 +29,11 @@ export const run = new Command("run").summary(
29
29
  [
30
30
  "Run a function or evaluate an inline readonly query on your deployment.",
31
31
  "",
32
- '- Run a function with JSON arguments: `npx convex run messages:send \'{"body": "hello", "author": "me"}\'`',
33
- "- Run a function on prod: `npx convex run messages:list --prod`",
34
- "- Live-update a query's result: `npx convex run messages:list --watch`",
35
- "- Push local code before running: `npx convex run messages:send '{}' --push`",
36
- "- Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\"messages\").take(5)'`",
32
+ '\u2022 Run a function with JSON arguments: `npx convex run messages:send \'{"body": "hello", "author": "me"}\'`',
33
+ "\u2022 Run a function on prod: `npx convex run messages:list --prod`",
34
+ "\u2022 Live-update a query's result: `npx convex run messages:list --watch`",
35
+ "\u2022 Push local code before running: `npx convex run messages:send '{}' --push`",
36
+ "\u2022 Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\"messages\").take(5)'`",
37
37
  "",
38
38
  "Arguments are specified as a JSON object. By default, this runs on your dev deployment."
39
39
  ].join("\n")
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/run.ts"],
4
- "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { logMessage, logOutput } from \"../bundler/log.js\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { jsonToConvex, type JSONValue } from \"../values/value.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport {\n formatValue,\n pushToDeployment,\n runInDeployment,\n runSystemQuery,\n} from \"./lib/run.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { withRunningBackend } from \"./lib/localDeployment/run.js\";\nimport {\n inlineQueryToQuerySource,\n runTestFunctionQuery,\n} from \"./lib/runTestFunction.js\";\nimport {\n logAndHandleFetchError,\n ThrowingFetchError,\n} from \"./lib/utils/utils.js\";\n\nexport const run = new Command(\"run\")\n .summary(\n \"Run a function or evaluate an inline readonly query on your deployment\",\n )\n .description(\n [\n \"Run a function or evaluate an inline readonly query on your deployment.\",\n \"\",\n '- Run a function with JSON arguments: `npx convex run messages:send \\'{\"body\": \"hello\", \"author\": \"me\"}\\'`',\n \"- Run a function on prod: `npx convex run messages:list --prod`\",\n \"- Live-update a query's result: `npx convex run messages:list --watch`\",\n \"- Push local code before running: `npx convex run messages:send '{}' --push`\",\n \"- Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\\\"messages\\\").take(5)'`\",\n \"\",\n \"Arguments are specified as a JSON object. By default, this runs on your dev deployment.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .addRunOptions()\n .addDeploymentSelectionOptions(actionDescription(\"Run the function on\"))\n .showHelpAfterError()\n .action(async (functionName, argsString, options) => {\n const ctx = await oneoffContext(options);\n const target = await resolveRunTarget({\n ctx,\n functionName,\n argsString,\n options,\n });\n if (target.kind === \"function\" || options.push) {\n await ensureHasConvexDependency(ctx, \"run\");\n }\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n { ensureLocalRunning: false },\n );\n\n if (\n deployment.deploymentFields?.deploymentType === \"prod\" &&\n options.push\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `\\`convex run\\` doesn't support pushing functions to prod deployments. ` +\n `Remove the --push flag. To push to production use \\`npx convex deploy\\`.`,\n });\n }\n\n await withRunningBackend({\n ctx,\n deployment: {\n deploymentUrl: deployment.url,\n deploymentFields: deployment.deploymentFields,\n },\n action: async () => {\n if (target.kind === \"inlineQuery\") {\n if (options.push) {\n await pushToDeployment(ctx, {\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentName:\n deployment.deploymentFields?.deploymentName ?? null,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n codegen: options.codegen === \"enable\",\n liveComponentSources: Boolean(options.liveComponentSources),\n });\n }\n return await runInlineQueryInDeployment({\n ctx,\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n inlineQuery: target.inlineQuery,\n ...(options.component !== undefined\n ? { componentPath: options.component }\n : {}),\n });\n }\n\n await runInDeployment(ctx, {\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentName: deployment.deploymentFields?.deploymentName ?? null,\n functionName: target.functionName,\n argsString: target.argsString,\n componentPath: options.component,\n identityString: options.identity,\n push: Boolean(options.push),\n watch: Boolean(options.watch),\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n codegen: options.codegen === \"enable\",\n liveComponentSources: Boolean(options.liveComponentSources),\n });\n },\n });\n });\n\ntype RunTarget =\n | {\n kind: \"function\";\n functionName: string;\n argsString: string;\n }\n | {\n kind: \"inlineQuery\";\n inlineQuery: string;\n };\n\nasync function resolveRunTarget(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n functionName: string | undefined;\n argsString: string | undefined;\n options: {\n inlineQuery?: string;\n watch?: boolean;\n push?: boolean;\n identity?: string;\n component?: string;\n };\n}): Promise<RunTarget> {\n const inlineQuery = args.options.inlineQuery?.trim();\n if (inlineQuery !== undefined && args.functionName !== undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex run` accepts either <functionName> or `--inline-query`, not both.\",\n });\n }\n if (inlineQuery === undefined) {\n if (args.functionName === undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex run` requires either <functionName> or `--inline-query`.\",\n });\n }\n return {\n kind: \"function\",\n functionName: args.functionName,\n argsString: args.argsString ?? \"{}\",\n };\n }\n if (inlineQuery.length === 0) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--inline-query` must not be empty.\",\n });\n }\n if (args.options.watch) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--inline-query` can't be combined with `--watch`. Use `convex run <functionName> --watch` for named deployed queries.\",\n });\n }\n if (args.options.identity !== undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--inline-query` can't be combined with `--identity`.\",\n });\n }\n return { kind: \"inlineQuery\", inlineQuery };\n}\n\nasync function runInlineQueryInDeployment(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n deploymentUrl: string;\n adminKey: string;\n inlineQuery: string;\n componentPath?: string;\n}) {\n try {\n const componentId = await resolveInlineQueryComponentId(args);\n const outcome = await runTestFunctionQuery(args.ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n querySource: inlineQueryToQuerySource(args.inlineQuery),\n ...(componentId !== undefined ? { componentId } : {}),\n });\n if (outcome.kind === \"applicationFailure\") {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(\n `Query failed: ${JSON.stringify(outcome.payload, null, 2)}`,\n ),\n });\n }\n\n for (const line of outcome.logLines) {\n logMessage(line);\n }\n\n const convexValue = jsonToConvex(outcome.value as JSONValue);\n if (convexValue !== null) logOutput(formatValue(convexValue));\n } catch (err) {\n if (err instanceof ThrowingFetchError) return await err.handle(args.ctx);\n return await logAndHandleFetchError(args.ctx, err);\n }\n}\n\nasync function resolveInlineQueryComponentId(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n deploymentUrl: string;\n adminKey: string;\n componentPath?: string;\n}) {\n const componentPath = args.componentPath?.trim();\n if (componentPath === undefined || componentPath === \"_App\") {\n return undefined;\n }\n if (componentPath.length === 0) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--component` must not be empty.\",\n });\n }\n\n const components = (await runSystemQuery(args.ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/frontend/components:list\",\n componentPath: undefined,\n args: {},\n })) as { id: string; path: string }[];\n\n const component = components.find(({ path }) => path === componentPath);\n if (component !== undefined) {\n return component.id;\n }\n\n const availableComponents = components\n .map(({ path }) => path)\n .filter((path) => path.length > 0)\n .sort();\n const availableComponentsMessage =\n availableComponents.length === 0\n ? \"This deployment has no mounted components.\"\n : `Available components:\\n${availableComponents.map((path) => `\u2022 ${chalkStderr.gray(path)}`).join(\"\\n\")}`;\n\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `Component path \"${componentPath}\" was not found.\\n\\n` +\n `${availableComponentsMessage}\\n` +\n \"Omit `--component` to target the app root.\",\n });\n}\n"],
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { logMessage, logOutput } from \"../bundler/log.js\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { jsonToConvex, type JSONValue } from \"../values/value.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport {\n formatValue,\n pushToDeployment,\n runInDeployment,\n runSystemQuery,\n} from \"./lib/run.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { withRunningBackend } from \"./lib/localDeployment/run.js\";\nimport {\n inlineQueryToQuerySource,\n runTestFunctionQuery,\n} from \"./lib/runTestFunction.js\";\nimport {\n logAndHandleFetchError,\n ThrowingFetchError,\n} from \"./lib/utils/utils.js\";\n\nexport const run = new Command(\"run\")\n .summary(\n \"Run a function or evaluate an inline readonly query on your deployment\",\n )\n .description(\n [\n \"Run a function or evaluate an inline readonly query on your deployment.\",\n \"\",\n '\u2022 Run a function with JSON arguments: `npx convex run messages:send \\'{\"body\": \"hello\", \"author\": \"me\"}\\'`',\n \"\u2022 Run a function on prod: `npx convex run messages:list --prod`\",\n \"\u2022 Live-update a query's result: `npx convex run messages:list --watch`\",\n \"\u2022 Push local code before running: `npx convex run messages:send '{}' --push`\",\n \"\u2022 Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\\\"messages\\\").take(5)'`\",\n \"\",\n \"Arguments are specified as a JSON object. By default, this runs on your dev deployment.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .addRunOptions()\n .addDeploymentSelectionOptions(actionDescription(\"Run the function on\"))\n .showHelpAfterError()\n .action(async (functionName, argsString, options) => {\n const ctx = await oneoffContext(options);\n const target = await resolveRunTarget({\n ctx,\n functionName,\n argsString,\n options,\n });\n if (target.kind === \"function\" || options.push) {\n await ensureHasConvexDependency(ctx, \"run\");\n }\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n { ensureLocalRunning: false },\n );\n\n if (\n deployment.deploymentFields?.deploymentType === \"prod\" &&\n options.push\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `\\`convex run\\` doesn't support pushing functions to prod deployments. ` +\n `Remove the --push flag. To push to production use \\`npx convex deploy\\`.`,\n });\n }\n\n await withRunningBackend({\n ctx,\n deployment: {\n deploymentUrl: deployment.url,\n deploymentFields: deployment.deploymentFields,\n },\n action: async () => {\n if (target.kind === \"inlineQuery\") {\n if (options.push) {\n await pushToDeployment(ctx, {\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentName:\n deployment.deploymentFields?.deploymentName ?? null,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n codegen: options.codegen === \"enable\",\n liveComponentSources: Boolean(options.liveComponentSources),\n });\n }\n return await runInlineQueryInDeployment({\n ctx,\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n inlineQuery: target.inlineQuery,\n ...(options.component !== undefined\n ? { componentPath: options.component }\n : {}),\n });\n }\n\n await runInDeployment(ctx, {\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentName: deployment.deploymentFields?.deploymentName ?? null,\n functionName: target.functionName,\n argsString: target.argsString,\n componentPath: options.component,\n identityString: options.identity,\n push: Boolean(options.push),\n watch: Boolean(options.watch),\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n codegen: options.codegen === \"enable\",\n liveComponentSources: Boolean(options.liveComponentSources),\n });\n },\n });\n });\n\ntype RunTarget =\n | {\n kind: \"function\";\n functionName: string;\n argsString: string;\n }\n | {\n kind: \"inlineQuery\";\n inlineQuery: string;\n };\n\nasync function resolveRunTarget(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n functionName: string | undefined;\n argsString: string | undefined;\n options: {\n inlineQuery?: string;\n watch?: boolean;\n push?: boolean;\n identity?: string;\n component?: string;\n };\n}): Promise<RunTarget> {\n const inlineQuery = args.options.inlineQuery?.trim();\n if (inlineQuery !== undefined && args.functionName !== undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex run` accepts either <functionName> or `--inline-query`, not both.\",\n });\n }\n if (inlineQuery === undefined) {\n if (args.functionName === undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex run` requires either <functionName> or `--inline-query`.\",\n });\n }\n return {\n kind: \"function\",\n functionName: args.functionName,\n argsString: args.argsString ?? \"{}\",\n };\n }\n if (inlineQuery.length === 0) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--inline-query` must not be empty.\",\n });\n }\n if (args.options.watch) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--inline-query` can't be combined with `--watch`. Use `convex run <functionName> --watch` for named deployed queries.\",\n });\n }\n if (args.options.identity !== undefined) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--inline-query` can't be combined with `--identity`.\",\n });\n }\n return { kind: \"inlineQuery\", inlineQuery };\n}\n\nasync function runInlineQueryInDeployment(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n deploymentUrl: string;\n adminKey: string;\n inlineQuery: string;\n componentPath?: string;\n}) {\n try {\n const componentId = await resolveInlineQueryComponentId(args);\n const outcome = await runTestFunctionQuery(args.ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n querySource: inlineQueryToQuerySource(args.inlineQuery),\n ...(componentId !== undefined ? { componentId } : {}),\n });\n if (outcome.kind === \"applicationFailure\") {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(\n `Query failed: ${JSON.stringify(outcome.payload, null, 2)}`,\n ),\n });\n }\n\n for (const line of outcome.logLines) {\n logMessage(line);\n }\n\n const convexValue = jsonToConvex(outcome.value as JSONValue);\n if (convexValue !== null) logOutput(formatValue(convexValue));\n } catch (err) {\n if (err instanceof ThrowingFetchError) return await err.handle(args.ctx);\n return await logAndHandleFetchError(args.ctx, err);\n }\n}\n\nasync function resolveInlineQueryComponentId(args: {\n ctx: Awaited<ReturnType<typeof oneoffContext>>;\n deploymentUrl: string;\n adminKey: string;\n componentPath?: string;\n}) {\n const componentPath = args.componentPath?.trim();\n if (componentPath === undefined || componentPath === \"_App\") {\n return undefined;\n }\n if (componentPath.length === 0) {\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"`--component` must not be empty.\",\n });\n }\n\n const components = (await runSystemQuery(args.ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/frontend/components:list\",\n componentPath: undefined,\n args: {},\n })) as { id: string; path: string }[];\n\n const component = components.find(({ path }) => path === componentPath);\n if (component !== undefined) {\n return component.id;\n }\n\n const availableComponents = components\n .map(({ path }) => path)\n .filter((path) => path.length > 0)\n .sort();\n const availableComponentsMessage =\n availableComponents.length === 0\n ? \"This deployment has no mounted components.\"\n : `Available components:\\n${availableComponents.map((path) => `\u2022 ${chalkStderr.gray(path)}`).join(\"\\n\")}`;\n\n return await args.ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `Component path \"${componentPath}\" was not found.\\n\\n` +\n `${availableComponentsMessage}\\n` +\n \"Omit `--component` to target the app root.\",\n });\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
- export const version = "1.40.0";
2
+ export const version = "1.41.0";
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export const version = \"1.40.0\";\n"],
4
+ "sourcesContent": ["export const version = \"1.41.0\";\n"],
5
5
  "mappings": ";AAAO,aAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -37,7 +37,6 @@ async function invokeMutation(func, argsStr, visibility) {
37
37
  scheduler: setupMutationScheduler(),
38
38
  meta: setupMutationMeta(visibility),
39
39
  runQuery: (reference, args2, options) => runUdf("query", reference, args2, options?.transactionLimits),
40
- runSnapshotQuery: (reference, args2, options) => runUdf("snapshotQuery", reference, args2, options?.transactionLimits),
41
40
  runMutation: (reference, args2, options) => runUdf("mutation", reference, args2, options?.transactionLimits)
42
41
  };
43
42
  const result = await invokeFunction(func, mutationCtx, args);