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
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var upgrade_exports = {};
30
30
  __export(upgrade_exports, {
31
- handlePotentialUpgrade: () => handlePotentialUpgrade
31
+ handlePotentialUpgradeAndStart: () => handlePotentialUpgradeAndStart
32
32
  });
33
33
  module.exports = __toCommonJS(upgrade_exports);
34
34
  var import_path = __toESM(require("path"), 1);
@@ -43,12 +43,25 @@ var import_prompts = require("../utils/prompts.js");
43
43
  var import_fsUtils = require("../fsUtils.js");
44
44
  var import_errors = require("./errors.js");
45
45
  var import_download = require("./download.js");
46
- async function handlePotentialUpgrade(ctx, args) {
46
+ var import_secrets = require("./secrets.js");
47
+ async function handlePotentialUpgradeAndStart(ctx, args) {
48
+ const { adminKey, instanceSecret } = args.existingCredentials === null || args.existingCredentials.instanceSecret === import_secrets.LEGACY_LOCAL_BACKEND_INSTANCE_SECRET ? (
49
+ // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`
50
+ // here, because `newBinaryPath` can be a binary that doesn’t support
51
+ // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)
52
+ //
53
+ // In most cases (the user is not using the flag), we have already downloaded the latest binary
54
+ // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn’t cause an
55
+ // extra download (even if the user chooses later not to upgrade their deployment)
56
+ await (0, import_secrets.generateLocalDevSecretsWithLatestBinary)(ctx, {
57
+ deploymentName: args.deploymentName
58
+ })
59
+ ) : args.existingCredentials;
47
60
  const newConfig = {
48
61
  ports: args.ports,
49
62
  backendVersion: args.newVersion,
50
- adminKey: args.adminKey,
51
- instanceSecret: args.instanceSecret,
63
+ adminKey,
64
+ instanceSecret,
52
65
  cloudProjectId: args.cloudProjectId
53
66
  };
54
67
  if (args.oldVersion === null || args.oldVersion === args.newVersion) {
@@ -58,14 +71,15 @@ async function handlePotentialUpgrade(ctx, args) {
58
71
  args.deploymentName,
59
72
  newConfig
60
73
  );
61
- return (0, import_run2.runLocalBackend)(ctx, {
74
+ const { cleanupHandle: cleanupHandle2 } = await (0, import_run2.runLocalBackend)(ctx, {
62
75
  binaryPath: args.newBinaryPath,
63
76
  deploymentKind: args.deploymentKind,
64
77
  deploymentName: args.deploymentName,
65
78
  ports: args.ports,
66
- instanceSecret: args.instanceSecret,
79
+ instanceSecret,
67
80
  isLatestVersion: true
68
81
  });
82
+ return { cleanupHandle: cleanupHandle2, adminKey };
69
83
  }
70
84
  (0, import_log.logVerbose)(
71
85
  `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`
@@ -86,14 +100,15 @@ async function handlePotentialUpgrade(ctx, args) {
86
100
  ...newConfig,
87
101
  backendVersion: args.oldVersion
88
102
  });
89
- return (0, import_run2.runLocalBackend)(ctx, {
103
+ const { cleanupHandle: cleanupHandle2 } = await (0, import_run2.runLocalBackend)(ctx, {
90
104
  binaryPath: oldBinaryPath,
91
105
  ports: args.ports,
92
106
  deploymentKind: args.deploymentKind,
93
107
  deploymentName: args.deploymentName,
94
- instanceSecret: args.instanceSecret,
108
+ instanceSecret,
95
109
  isLatestVersion: false
96
110
  });
111
+ return { cleanupHandle: cleanupHandle2, adminKey };
97
112
  }
98
113
  const choice = args.forceUpgrade || !process.stdin.isTTY ? "transfer" : await (0, import_prompts.promptOptions)(ctx, {
99
114
  message: "Transfer data from existing deployment?",
@@ -116,31 +131,31 @@ async function handlePotentialUpgrade(ctx, args) {
116
131
  args.deploymentName,
117
132
  newConfig
118
133
  );
119
- return (0, import_run2.runLocalBackend)(ctx, {
134
+ const { cleanupHandle: cleanupHandle2 } = await (0, import_run2.runLocalBackend)(ctx, {
120
135
  binaryPath: args.newBinaryPath,
121
136
  deploymentKind: args.deploymentKind,
122
137
  deploymentName: args.deploymentName,
123
138
  ports: args.ports,
124
- instanceSecret: args.instanceSecret,
139
+ instanceSecret,
125
140
  isLatestVersion: true
126
141
  });
142
+ return { cleanupHandle: cleanupHandle2, adminKey };
127
143
  }
128
- const newAdminKey = args.adminKey;
129
- const oldAdminKey = (0, import_filePaths.loadDeploymentConfig)(ctx, args.deploymentKind, args.deploymentName)?.adminKey ?? args.adminKey;
130
- return handleUpgrade(ctx, {
144
+ const { cleanupHandle } = await handleUpgrade(ctx, {
131
145
  deploymentKind: args.deploymentKind,
132
146
  deploymentName: args.deploymentName,
133
147
  oldVersion: args.oldVersion,
134
148
  newBinaryPath: args.newBinaryPath,
135
149
  newVersion: args.newVersion,
136
150
  ports: args.ports,
137
- oldAdminKey,
138
- newAdminKey,
139
- instanceSecret: args.instanceSecret,
151
+ adminKey,
152
+ instanceSecret,
140
153
  cloudProjectId: args.cloudProjectId
141
154
  });
155
+ return { cleanupHandle, adminKey };
142
156
  }
143
157
  async function handleUpgrade(ctx, args) {
158
+ const { adminKey } = args;
144
159
  const { binaryPath: oldBinaryPath } = await (0, import_download.ensureBackendBinaryDownloaded)(
145
160
  ctx,
146
161
  {
@@ -161,7 +176,7 @@ async function handleUpgrade(ctx, args) {
161
176
  const deploymentUrl = (0, import_run2.localDeploymentUrl)(args.ports.cloud);
162
177
  const envs = await (0, import_run.runSystemQuery)(ctx, {
163
178
  deploymentUrl,
164
- adminKey: args.oldAdminKey,
179
+ adminKey,
165
180
  functionName: "_system/cli/queryEnvironmentVariables",
166
181
  componentPath: void 0,
167
182
  args: {}
@@ -174,13 +189,13 @@ async function handleUpgrade(ctx, args) {
174
189
  if (ctx.fs.exists(exportPath)) {
175
190
  ctx.fs.unlink(exportPath);
176
191
  }
177
- const snaphsotExportState = await (0, import_convexExport.startSnapshotExport)(ctx, {
192
+ const snapshotExportState = await (0, import_convexExport.startSnapshotExport)(ctx, {
178
193
  deploymentUrl,
179
- adminKey: args.oldAdminKey,
194
+ adminKey,
180
195
  includeStorage: true,
181
196
  inputPath: exportPath
182
197
  });
183
- if (snaphsotExportState.state !== "completed") {
198
+ if (snapshotExportState.state !== "completed") {
184
199
  return ctx.crash({
185
200
  exitCode: 1,
186
201
  errorType: "fatal",
@@ -188,9 +203,9 @@ async function handleUpgrade(ctx, args) {
188
203
  });
189
204
  }
190
205
  await (0, import_convexExport.downloadSnapshotExport)(ctx, {
191
- snapshotExportTs: snaphsotExportState.start_ts,
206
+ snapshotExportTs: snapshotExportState.start_ts,
192
207
  inputPath: exportPath,
193
- adminKey: args.oldAdminKey,
208
+ adminKey,
194
209
  deploymentUrl
195
210
  });
196
211
  (0, import_log.logVerbose)("Stopping the backend on the old version");
@@ -217,7 +232,7 @@ async function handleUpgrade(ctx, args) {
217
232
  if (envs.length > 0) {
218
233
  const fetch = (0, import_utils.deploymentFetch)(ctx, {
219
234
  deploymentUrl,
220
- adminKey: args.newAdminKey
235
+ adminKey
221
236
  });
222
237
  try {
223
238
  await fetch("/api/update_environment_variables", {
@@ -231,7 +246,7 @@ async function handleUpgrade(ctx, args) {
231
246
  (0, import_log.logVerbose)("Doing a snapshot import");
232
247
  const importId = await (0, import_convexImport.uploadForImport)(ctx, {
233
248
  deploymentUrl,
234
- adminKey: args.newAdminKey,
249
+ adminKey,
235
250
  filePath: exportPath,
236
251
  importArgs: { format: "zip", mode: "replace", tableName: void 0 },
237
252
  onImportFailed: async (e) => {
@@ -242,7 +257,7 @@ async function handleUpgrade(ctx, args) {
242
257
  let status = await (0, import_convexImport.waitForStableImportState)(ctx, {
243
258
  importId,
244
259
  deploymentUrl,
245
- adminKey: args.newAdminKey,
260
+ adminKey,
246
261
  onProgress: () => {
247
262
  return 0;
248
263
  }
@@ -258,7 +273,7 @@ async function handleUpgrade(ctx, args) {
258
273
  }
259
274
  await (0, import_convexImport.confirmImport)(ctx, {
260
275
  importId,
261
- adminKey: args.newAdminKey,
276
+ adminKey,
262
277
  deploymentUrl,
263
278
  onError: async (e) => {
264
279
  (0, import_log.logFailure)(`Failed to confirm import: ${e}`);
@@ -268,7 +283,7 @@ async function handleUpgrade(ctx, args) {
268
283
  status = await (0, import_convexImport.waitForStableImportState)(ctx, {
269
284
  importId,
270
285
  deploymentUrl,
271
- adminKey: args.newAdminKey,
286
+ adminKey,
272
287
  onProgress: () => {
273
288
  return 0;
274
289
  }
@@ -287,7 +302,7 @@ async function handleUpgrade(ctx, args) {
287
302
  (0, import_filePaths.saveDeploymentConfig)(ctx, args.deploymentKind, args.deploymentName, {
288
303
  ports: args.ports,
289
304
  backendVersion: args.newVersion,
290
- adminKey: args.newAdminKey,
305
+ adminKey,
291
306
  instanceSecret: args.instanceSecret,
292
307
  cloudProjectId: args.cloudProjectId
293
308
  });
@@ -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": ["import_run", "path"]
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": ["import_run", "cleanupHandle", "path"]
7
7
  }
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,28 +15,17 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
  var utils_exports = {};
30
20
  __export(utils_exports, {
31
21
  LOCAL_BACKEND_INSTANCE_SECRET: () => LOCAL_BACKEND_INSTANCE_SECRET,
32
22
  chooseLocalBackendPorts: () => chooseLocalBackendPorts,
33
23
  choosePorts: () => choosePorts,
34
- generateInstanceSecret: () => generateInstanceSecret,
35
- isOffline: () => isOffline,
36
24
  printLocalDeploymentWelcomeMessage: () => printLocalDeploymentWelcomeMessage
37
25
  });
38
26
  module.exports = __toCommonJS(utils_exports);
39
27
  var import_log = require("../../../bundler/log.js");
40
28
  var import_detect_port = require("detect-port");
41
- var import_crypto = __toESM(require("crypto"), 1);
42
29
  var import_chalk = require("chalk");
43
30
  async function choosePorts(ctx, {
44
31
  count,
@@ -91,9 +78,6 @@ async function chooseLocalBackendPorts(ctx, options) {
91
78
  });
92
79
  return { cloudPort, sitePort };
93
80
  }
94
- async function isOffline() {
95
- return false;
96
- }
97
81
  function printLocalDeploymentWelcomeMessage() {
98
82
  (0, import_log.logMessage)(
99
83
  import_chalk.chalkStderr.cyan("You're trying out the beta local deployment feature!")
@@ -104,8 +88,5 @@ function printLocalDeploymentWelcomeMessage() {
104
88
  )
105
89
  );
106
90
  }
107
- function generateInstanceSecret() {
108
- return import_crypto.default.randomBytes(32).toString("hex");
109
- }
110
91
  const LOCAL_BACKEND_INSTANCE_SECRET = "4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974";
111
92
  //# 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,oBAAmB;AACnB,mBAA4B;AAE5B,eAAsB,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,UAAM,2BAAO,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,UAAM,2BAAO,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,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,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,eAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,yBAAiC;AAC/C,SAAO,cAAAC,QAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AAEO,MAAM,gCACX;",
6
- "names": ["port", "crypto"]
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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,mBAA4B;AAE5B,eAAsB,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,UAAM,2BAAO,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,UAAM,2BAAO,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,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,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,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,gCACX;",
6
+ "names": ["port"]
7
7
  }
@@ -34,9 +34,9 @@ const INLINE_QUERY_DESCRIPTION = [
34
34
  "Use `--component` to target a mounted component.",
35
35
  "",
36
36
  "To format the query:",
37
- '- Simple expressions are returned automatically, for example: `await ctx.db.query("messages").take(5)`.',
38
- '- For multi-statement queries, use an explicit return, for example: `const firstMessage = await ctx.db.query("messages").first(); console.log(firstMessage?._id); return firstMessage;`.',
39
- '- 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); } })`.'
37
+ '\u2022 Simple expressions are returned automatically, for example: `await ctx.db.query("messages").take(5)`.',
38
+ '\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;`.',
39
+ '\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); } })`.'
40
40
  ].join("\n");
41
41
  function inlineQueryToQuerySource(inlineQuery) {
42
42
  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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAgC;AAEhC,MAAM,wBACJ;AAGK,MAAM,sCACX;AAEK,MAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAiBJ,SAAS,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,eAAsB,qBACpB,KACA,MAMqC;AACrC,QAAM,sBAAkB,8BAAgB,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
  }
@@ -40,11 +40,11 @@ const run = new import_extra_typings.Command("run").summary(
40
40
  [
41
41
  "Run a function or evaluate an inline readonly query on your deployment.",
42
42
  "",
43
- '- Run a function with JSON arguments: `npx convex run messages:send \'{"body": "hello", "author": "me"}\'`',
44
- "- Run a function on prod: `npx convex run messages:list --prod`",
45
- "- Live-update a query's result: `npx convex run messages:list --watch`",
46
- "- Push local code before running: `npx convex run messages:send '{}' --push`",
47
- "- Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\"messages\").take(5)'`",
43
+ '\u2022 Run a function with JSON arguments: `npx convex run messages:send \'{"body": "hello", "author": "me"}\'`',
44
+ "\u2022 Run a function on prod: `npx convex run messages:list --prod`",
45
+ "\u2022 Live-update a query's result: `npx convex run messages:list --watch`",
46
+ "\u2022 Push local code before running: `npx convex run messages:send '{}' --push`",
47
+ "\u2022 Evaluate an inline readonly query: `npx convex run --inline-query 'await ctx.db.query(\"messages\").take(5)'`",
48
48
  "",
49
49
  "Arguments are specified as a JSON object. By default, this runs on your dev deployment."
50
50
  ].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": ["import_run", "import_utils"]
7
7
  }
package/dist/cjs/index.js CHANGED
@@ -21,5 +21,5 @@ __export(index_exports, {
21
21
  version: () => version
22
22
  });
23
23
  module.exports = __toCommonJS(index_exports);
24
- const version = "1.40.0";
24
+ const version = "1.41.0";
25
25
  //# 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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -52,7 +52,6 @@ async function invokeMutation(func, argsStr, visibility) {
52
52
  scheduler: (0, import_scheduler_impl.setupMutationScheduler)(),
53
53
  meta: (0, import_meta_impl.setupMutationMeta)(visibility),
54
54
  runQuery: (reference, args2, options) => runUdf("query", reference, args2, options?.transactionLimits),
55
- runSnapshotQuery: (reference, args2, options) => runUdf("snapshotQuery", reference, args2, options?.transactionLimits),
56
55
  runMutation: (reference, args2, options) => runUdf("mutation", reference, args2, options?.transactionLimits)
57
56
  };
58
57
  const result = await invokeFunction(func, mutationCtx, args);