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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/dev.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\nimport { handleDashboard } from \"./localDeployment/dashboard.js\";\nimport { loadDeploymentConfig } from \"./localDeployment/filePaths.js\";\nimport { LocalDeploymentError } from \"./localDeployment/errors.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n backendVersion?: string | undefined;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.\n if (\n !devOptions.once &&\n !devOptions.untilSuccess &&\n credentials.deploymentType === \"anonymous\" &&\n credentials.deploymentName !== null\n ) {\n const deploymentConfig = loadDeploymentConfig(\n ctx,\n \"anonymous\",\n credentials.deploymentName,\n );\n if (deploymentConfig === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find local deployment config. This is a bug in Convex.`,\n errForSentry: new LocalDeploymentError(\n `Could not find local deployment config to start the anonymous dashboard.`,\n ),\n });\n }\n await handleDashboard(\n ctx,\n {\n name: credentials.deploymentName,\n cloudPort: deploymentConfig.ports.cloud,\n adminKey: deploymentConfig.adminKey,\n },\n {\n backendVersion: credentials.backendVersion,\n },\n );\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
5
+ "mappings": ";AAAA,SAAS,mBAAmB;AAC5B,SAAS,aAA2B;AAEpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AACjB,SAAS,YAAqB,iBAAiB;AAE/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,OAAO,cAAc,eAAe;AAC7C,SAAS,mBAAmB,iBAAiB;AAG7C,SAAS,mBAAmB,wBAAwB;AACpD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AAErC,sBAAsB,qBACpB,KACA,aAOA,YAkBA;AACA,QAAM,aAAa,IAAI,WAAW,WAAW,QAAQ;AAGrD,QAAM,EAAE,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACrD,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,aAAa;AAE/D,MAAI,iBAAiB,YAAY,gBAAgB;AAG/C,UAAM,iBAAiB,YAAY;AACnC,QACE,mBAAmB,SACnB,mBAAmB,aACnB,mBAAmB,QACnB;AACA,YAAM;AAAA,QACJ;AAAA,QACA,YAAY;AAAA,QACZ,EAAE,eAAe,YAAY,KAAK,UAAU,YAAY,SAAS;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MACE,CAAC,WAAW,QACZ,CAAC,WAAW,gBACZ,YAAY,mBAAmB,eAC/B,YAAY,mBAAmB,MAC/B;AACA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd;AACA,QAAI,qBAAqB,MAAM;AAC7B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,cAAc,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM,YAAY;AAAA,QAClB,WAAW,iBAAiB,MAAM;AAAA,QAClC,UAAU,iBAAiB;AAAA,MAC7B;AAAA,MACA;AAAA,QACE,gBAAgB,YAAY;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,CAAC;AAClB,MAAI,WAAW,aAAa,WAAW;AACrC,aAAS;AAAA,MACP,UAAU,KAAK,YAAY,KAAK,YAAY,UAAU,UAAU;AAAA,QAC9D;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS;AAAA,IACP;AAAA,MACE;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,SAAS,WAAW;AAAA,QACpB,QAAQ;AAAA,QACR,WAAW,WAAW;AAAA,QACtB,qBAAqB,WAAW;AAAA,QAChC,OAAO;AAAA,QACP,iBAAiB,WAAW;AAAA,QAC5B,eAAe,WAAW;AAAA,QAC1B,SAAS,WAAW;AAAA,QACpB,sBAAsB,WAAW;AAAA,QACjC,gBAAgB,WAAW;AAAA,QAC3B;AAAA;AAAA,QACA,yBAAyB;AAAA;AAAA,QACzB,SAAS;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAM,IAAI,aAAa,CAAC;AAC1B;AAEA,sBAAsB,aACpB,UACA,SACA,YASA;AACA,QAAM,QAA0C,EAAE,SAAS,OAAU;AACrE,QAAM,eAA0D;AAAA,IAC9D,mBAAmB;AAAA,EACrB;AACA,MAAI,cAAc;AAClB,MAAI,MAAM;AACV,MAAI,SAAS;AACb,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,cAAc;AAElB,MAAI;AACF,WAAO,MAAM;AACX,YAAM,QAAQ,YAAY,IAAI;AAC9B,iCAA2B;AAC3B,4CAAsC;AAEtC,YAAM,MAAM,IAAI;AAAA,QACd,WAAW;AAAA,QACX,SAAS,aAAa;AAAA,QACtB;AAAA,MACF;AACA,cAAQ,YAAY,YAAY;AAChC,kBAAY,+BAA+B;AAC3C,UAAI;AACF,cAAM,QAAQ,KAAK,OAAO;AAC1B,cAAM,MAAM,YAAY,IAAI;AAI5B,gBAAQ,YAAY,UAAU;AAC9B,sBAAc;AACd;AAAA,UACE,GAAG,qBAAqB,CAAC,6BAA6B;AAAA,YACpD,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,cAAM,EAAE,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACrD,cAAM,gBAAgB,MAAM,iBAAiB,KAAK,aAAa;AAG/D,cAAM,sBAAsB,gBACxB,KAAK,UAAU,aAAa,IAC5B;AAGJ,YACE,CAAC,eACD,wBAAwB,aAAa,mBACrC;AAEA,gBAAM,2BAA2B,KAAK,eAAe;AAAA,YACnD,eAAe,QAAQ;AAAA,YACvB,UAAU,QAAQ;AAAA,UACpB,CAAC;AAAA,QACH;AAGA,qBAAa,oBAAoB;AACjC,sBAAc;AACd,YAAI,WAAW,QAAQ,UAAa,CAAC,KAAK;AACxC,kBAAQ,WAAW,IAAI,MAAM;AAAA,YAC3B,KAAK;AACH,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,WAAW,IAAI;AAAA,gBACf,WAAW,IAAI;AAAA,cACjB;AACA;AAAA,YACF,KAAK,SAAS;AAIZ,oBAAM,eAAe,WAAW,IAAI;AACpC,oBAAM,mBAAmB,CAAC,WAA2B;AACnD,oBAAI,CAAC,YAAY;AACf;AAAA,gBACF;AACA,sBAAM,QAAQ;AAGd,oBAAI;AACF,sBAAI,MAAM,QAAQ,QAAW;AAI3B,wBAAI;AACF,8BAAQ,KAAK,CAAC,MAAM,KAAK,MAAM;AAAA,oBACjC,QAAQ;AACN,4BAAM,KAAK,MAAM;AAAA,oBACnB;AAAA,kBACF,OAAO;AACL,0BAAM,KAAK,MAAM;AAAA,kBACnB;AAAA,gBACF,QAAQ;AAAA,gBAER;AAAA,cACF;AACA,oBAAM,2BAA2B,MAAM;AACrC,oBAAI,qBAAqB;AACvB,0BAAQ,IAAI,UAAU,mBAAmB;AACzC,wCAAsB;AAAA,gBACxB;AAAA,cACF;AACA,2BAAa,MAAM,cAAc,CAAC,GAAG;AAAA,gBACnC,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,UAAU;AAAA,cACZ,CAAC;AACD,oCAAsB,MAAM;AAC1B,yCAAyB;AACzB,iCAAiB,QAAQ;AAAA,cAC3B;AACA,sBAAQ,gBAAgB,UAAU,mBAAmB;AACrD,mCAAqB,SAAS,gBAAgB,YAAY;AACxD,oBAAI,qBAAqB;AACvB,2CAAyB;AAAA,gBAC3B,OAAO;AAIL,wBAAM,wBAAwB;AAC9B,wBAAM,QAAQ,KAAK;AAAA,oBACjB;AAAA,oBACA,IAAI;AAAA,sBAAQ,CAAC,YACX,WAAW,SAAS,qBAAqB;AAAA,oBAC3C;AAAA,kBACF,CAAC;AAAA,gBACH;AACA,oBAAI,YAAY;AACd,mCAAiB,SAAS;AAAA,gBAC5B;AACA,sBAAM;AAAA,cACR,CAAC;AACD,4BAAc,IAAI,QAAc,CAAC,YAAY;AAC3C,2BAAY,GAAG,SAAS,CAAC,UAAU;AACjC;AAAA,oBACE,2BAA2B,YAAY,OAAO,MAAM,OAAO;AAAA,kBAC7D;AACA,+BAAa;AACb,0BAAQ;AACR,uBAAK,SAAS,aAAa,CAAC;AAAA,gBAC9B,CAAC;AACD,2BAAY,GAAG,QAAQ,CAAC,MAAM,WAAW;AACvC,+BAAa;AACb,0BAAQ;AAIR,sBAAI,QAAQ;AACV;AAAA,kBACF;AACA,sBAAI,SAAS,QAAQ,SAAS,GAAG;AAC/B;AAAA,sBACE,aAAa,YAAY,uBAAuB,IAAI;AAAA,oBACtD;AACA,yBAAK,SAAS,aAAa,CAAC;AAAA,kBAC9B;AAAA,gBACF,CAAC;AAAA,cACH,CAAC;AACD;AAAA,YACF;AAAA,YACA,SAAS;AACP,yBAAW;AAEX,oBAAM,IAAI,MAAM;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,gBAAgB;AAAA,gBAChB,cAAc,mCAAmC,KAAK;AAAA,kBACpD,WAAW;AAAA,gBACb,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AACA,iBAAS;AAAA,MACX,SAAS,GAAQ;AAEf,YAAI,EAAE,aAAa,UAAU,CAAC,EAAE,WAAW;AAEzC,gBAAM;AAAA,QACR;AACA,YAAI,EAAE,cAAc,SAAS;AAC3B;AAAA,QACF;AAEA,YAAI,EAAE,cAAc,eAAe,EAAE,cAAc,mBAAmB;AACpE,gBAAM,QAAQ,YAAY,WAAW;AACrC,yBAAe;AACf,cAAI,EAAE,cAAc,aAAa;AAC/B;AAAA,cACE,YAAY;AAAA,gBACV,4CAA4C;AAAA,kBAC1C;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AACA,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AACzD;AAAA,QACF;AAKA,gBAAQ;AAAA,UACN,EAAE,cAAc,6BACd,EAAE,cAAc,oCAChB,EAAE,UAAU,+BAA+B,MAAM;AAAA,QACrD;AACA,YAAI,EAAE,cAAc,kCAAkC;AACpD,gDAAsC;AAAA,QACxC,WACE,EAAE,cAAc,6BAChB,EAAE,UAAU,+BAA+B,MAAM,QACjD;AACA,qCACE,EAAE,UAAU,+BAA+B;AAAA,QAC/C;AACA,YAAI,WAAW,MAAM;AACnB,gBAAM,SAAS,aAAa,GAAG,EAAE,SAAS;AAAA,QAC5C;AAIA,oBAAY;AAAA,MACd;AACA,UAAI,WAAW,MAAM;AACnB;AAAA,MACF;AACA,UAAI,UAAU,WAAW,cAAc;AACrC;AAAA,MACF;AACA,YAAM,kBAAkB,mBAAmB,KAAK,OAAO,UAAU;AACjE,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA,0BAA0B,aAAa;AAAA,QACvC,0BAA0B;AAAA,MAC5B;AACA,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ,KAAK;AAAA,QACjB,gBAAgB,MAAM;AAAA,QACtB,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,MACpB,CAAC;AACD,sBAAgB,KAAK;AACrB,WAAK,WAAW,KAAK;AACrB,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF,UAAE;AAMA,QAAI,aAAa;AACf,YAAM;AAAA,IACR;AACA,QAAI,qBAAqB;AACvB,cAAQ,IAAI,UAAU,mBAAmB;AACzC,4BAAsB;AAAA,IACxB;AACA,QAAI,oBAAoB;AACtB,eAAS,cAAc,kBAAkB;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,eAAe,iBACb,KACA,aAIA,cACA,eACA;AACA,QAAM,kBAAkB,KAAK;AAAA,IAC3B,eAAe,YAAY;AAAA,IAC3B,UAAU,YAAY;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,WAAW,MAAM;AACf,wBAAgB,8BAA8B,YAAY,GAAG;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cACP,KACA,aAIA,WACA,eACA;AACA,SAAO,iBAAiB,KAAK;AAAA,IAC3B,eAAe,YAAY;AAAA,IAC3B,UAAU,YAAY;AAAA,IACtB,oBAAoB;AAAA,IACpB,SAAS,MAAO,cAAc,OAAO,EAAE,UAAU,IAAI;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBACP,KACA,aAIA,qCACA;AACA,SAAO,iBAAiB,KAAK;AAAA,IAC3B,eAAe,YAAY;AAAA,IAC3B,UAAU,YAAY;AAAA,IACtB,oBAAoB;AAAA,IACpB,SAAS,MAAO,sCAAsC,CAAC,IAAI;AAAA,IAC3D,eAAe;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,iBACP,KACA,MAOA;AACA,QAAM,CAAC,aAAa,IAAI,IAAI,gBAAgB;AAC5C,SAAO;AAAA,IACL,OAAO,YAAY;AACjB,YAAM,eAAe,KAAK,QAAQ;AAClC,UAAI,iBAAiB,MAAM;AACzB,eAAO,YAAY;AAAA,MACrB;AACA,UAAI,UAAU;AACd,aAAO,UAAU,KAAK;AAAA,QACpB,eAAe,KAAK;AAAA,QACpB,UAAU,KAAK;AAAA,QACf,oBAAoB,KAAK;AAAA,QACzB,oBAAoB;AAAA,QACpB,eAAe,KAAK;AAAA,QACpB,OAAO;AAAA,QACP,WAAW;AAAA,UACT,UAAU,MAAM;AACd;AAEA,gBAAI,UAAU,GAAG;AACf,mBAAK;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,MAAM;AACV,WAAK;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAAS,mBACP,KACA,OACA,YACA;AACA,MAAI,aAAa;AACjB,SAAO;AAAA,IACL,OAAO,YAAY;AACjB,YAAM,eAAe,IAAI,GAAG,SAAS;AACrC,UAAI,iBAAiB,eAAe;AAClC,mBAAW,6CAA6C;AACxD;AAAA,MACF;AAIA,UAAI,CAAC,MAAM,SAAS;AAClB,cAAM,UAAU,IAAI,QAAQ,YAAY;AACxC,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,YAAY;AACV,kBAAM,MAAM,QAAS,MAAM;AAAA,UAC7B;AAAA,QACF;AACA,oBAAY;AAAA,MACd;AAEA,YAAM,QAAQ,OAAO,YAAY;AAGjC,UAAI,aAAa;AACjB,SAAG;AACD,cAAM,MAAM,QAAQ,aAAa;AACjC,YAAI,YAAY;AACd;AAAA,QACF;AACA,mBAAW,SAAS,MAAM,QAAQ,YAAY,GAAG;AAC/C,cAAI,WAAW,aAAa;AAC1B;AAAA,cACE;AAAA,cACA,MAAM;AAAA,cACN,KAAK,SAAS,IAAI,MAAM,OAAO;AAAA,YACjC;AAAA,UACF;AACA,gBAAM,SAAS,aAAa,SAAS,KAAK;AAC1C,cAAI,OAAO,UAAU;AACnB,kBAAM,UAAU,KAAK,SAAS,IAAI,MAAM,OAAO;AAC/C,gBAAI,WAAW,aAAa;AAC1B,yBAAW,GAAG,OAAO,IAAI,OAAO,MAAM,iBAAiB;AAAA,YACzD;AACA,yBAAa;AACb;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,CAAC;AAKV,UAAI,WAAW,YAAY,IAAI,IAAI;AACnC,aAAO,MAAM;AACX,cAAM,MAAM,YAAY,IAAI;AAC5B,YAAI,OAAO,UAAU;AACnB;AAAA,QACF;AACA,cAAM,YAAY,WAAW;AAC7B,YAAI,WAAW,aAAa;AAC1B,qBAAW,eAAe,eAAe,SAAS,CAAC,gBAAgB;AAAA,QACrE;AACA,cAAM,gBAAgB,IAAI;AAAA,UAAmB,CAAC,YAC5C,WAAW,MAAM,QAAQ,SAAS,GAAG,WAAW,GAAG;AAAA,QACrD;AACA,cAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,UAChC;AAAA,UACA,MAAM,QAAQ,aAAa,EAAE,KAAkB,MAAM,WAAW;AAAA,QAClE,CAAC;AACD,YAAI,WAAW,aAAa;AAC1B,qBAAW,SAAS,MAAM,QAAQ,YAAY,GAAG;AAC/C,kBAAMA,UAAS,aAAa,SAAS,KAAK;AAE1C,gBAAIA,QAAO,UAAU;AACnB,kBAAI,WAAW,aAAa;AAC1B;AAAA,kBACE,oCAAoC,MAAM,OAAO;AAAA,gBACnD;AAAA,cACF;AACA,yBAAW,YAAY,IAAI,IAAI;AAAA,YACjC;AAAA,UACF;AAAA,QACF,OAAO;AAEL,cAAI,WAAW,WAAW;AACxB;AAAA,cACE,uDAAuD;AAAA,YACzD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,MAAM;AACV,mBAAa;AAAA,IACf;AAAA,EACF;AACF;AAEA,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,kBAAkB;AAEjB,gBAAS,YAAY,cAA8B;AACxD,QAAM,cAAc,iBAAiB,KAAK,IAAI,GAAG,YAAY;AAC7D,QAAM,gBAAgB,KAAK,IAAI,aAAa,UAAU;AACtD,QAAM,SAAS,iBAAiB,KAAK,OAAO,IAAI;AAChD,SAAO,gBAAgB;AACzB;",
6
6
  "names": ["result"]
7
7
  }
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ export function generateDocs(root) {
3
+ const docs = {};
4
+ const all = collectCommands(root, [root.name()]);
5
+ let mainCommandPosition = 0;
6
+ for (const entry of all) {
7
+ if (entry.path.length !== 2) continue;
8
+ const filePath = `${entry.path[1]}.mdx`;
9
+ const sidebarPosition = ++mainCommandPosition;
10
+ const summary = entry.command.summary() || entry.command.description() || "";
11
+ const description = JSON.stringify(summary.replace(/\s+/g, " ").trim());
12
+ const lines = [];
13
+ const sidebarLabel = `npx ${entry.path.join(" ")}`;
14
+ lines.push("---");
15
+ lines.push(`sidebar_position: ${sidebarPosition}`);
16
+ lines.push(`title: "${sidebarLabel}"`);
17
+ lines.push(`sidebar_label: "${sidebarLabel}"`);
18
+ lines.push(`description: ${description}`);
19
+ lines.push("---");
20
+ lines.push("");
21
+ lines.push(
22
+ "{/* @generated from the command definitions, do not edit manually (run `just regenerate-cli-docs` to regenerate) */}"
23
+ );
24
+ lines.push("");
25
+ lines.push(renderCommand(entry, all, { headingLevel: 1 }));
26
+ const descendants = all.filter(
27
+ (e) => e.path.length > entry.path.length && entry.path.every((p, i) => e.path[i] === p)
28
+ );
29
+ for (const d of descendants) {
30
+ lines.push(
31
+ renderCommand(d, all, {
32
+ headingLevel: d.path.length - 1,
33
+ includeSubcommandsList: false
34
+ })
35
+ );
36
+ }
37
+ docs[filePath] = lines.join("\n");
38
+ }
39
+ return docs;
40
+ }
41
+ function collectCommands(command, path) {
42
+ const result = [{ command, path }];
43
+ for (const sub of command.commands) {
44
+ if (sub._hidden) continue;
45
+ if (sub.name() === "help") continue;
46
+ result.push(...collectCommands(sub, [...path, sub.name()]));
47
+ }
48
+ return result;
49
+ }
50
+ function displayName(path) {
51
+ return `npx ${path.join(" ")}`;
52
+ }
53
+ function commandUsage(command) {
54
+ const args = command.registeredArguments ?? [];
55
+ if (args.length === 0) {
56
+ return command.usage();
57
+ }
58
+ const parts = ["[options]"];
59
+ if (command.commands.length > 0) {
60
+ parts.push("[command]");
61
+ }
62
+ for (const arg of args) {
63
+ const name = `${arg._name}${arg.variadic ? "..." : ""}`;
64
+ parts.push(arg.required ? `<${name}>` : `[${name}]`);
65
+ }
66
+ return parts.join(" ");
67
+ }
68
+ function anchorSlug(path) {
69
+ return path.slice(2).join("-");
70
+ }
71
+ function subcommandLink(parentPath, subPath) {
72
+ if (parentPath.length === 1) {
73
+ return `./${subPath[1]}`;
74
+ }
75
+ return `#${anchorSlug(subPath)}`;
76
+ }
77
+ function renderCommand(entry, all, options) {
78
+ const { headingLevel, includeSubcommandsList = true } = options;
79
+ const h1 = "#".repeat(headingLevel);
80
+ const h2 = "#".repeat(headingLevel + 1);
81
+ const { command, path } = entry;
82
+ const display = displayName(path);
83
+ const description = renderCopyableCommands(
84
+ escapeMdx(
85
+ formatExampleLines(
86
+ replaceBullets(command.description() || command.summary() || "")
87
+ )
88
+ )
89
+ );
90
+ const lines = [];
91
+ const headingSuffix = headingLevel > 1 ? ` \\{#${anchorSlug(path)}}` : "";
92
+ lines.push(`${h1} \`${display}\`${headingSuffix}`);
93
+ lines.push("");
94
+ if (description) {
95
+ lines.push(description);
96
+ lines.push("");
97
+ }
98
+ const usage = commandUsage(command);
99
+ lines.push(`${h2} Usage`);
100
+ lines.push("");
101
+ lines.push("```sh");
102
+ lines.push(`${display} ${usage}`.trim());
103
+ lines.push("```");
104
+ lines.push("");
105
+ const aliases = command.aliases();
106
+ if (aliases.length > 0) {
107
+ lines.push(`${h2} Aliases`);
108
+ lines.push("");
109
+ for (const alias of aliases) {
110
+ lines.push(`- \`${alias}\``);
111
+ }
112
+ lines.push("");
113
+ }
114
+ const args = command.registeredArguments ?? [];
115
+ if (args.length > 0) {
116
+ lines.push(`${h2} Arguments`);
117
+ lines.push("");
118
+ lines.push("<dl>");
119
+ for (const arg of args) {
120
+ const name = arg.required ? `<${arg._name}>` : `[${arg._name}]`;
121
+ const desc = escapeMdx(replaceBullets(arg.description || ""));
122
+ lines.push(`<dt>\`${name}\`</dt>`);
123
+ lines.push(`<dd>`);
124
+ lines.push("");
125
+ lines.push(desc);
126
+ lines.push("");
127
+ lines.push(`</dd>`);
128
+ }
129
+ lines.push("</dl>");
130
+ lines.push("");
131
+ }
132
+ const opts = command.options.filter((o) => !o.hidden);
133
+ if (opts.length > 0) {
134
+ lines.push(`${h2} Options`);
135
+ lines.push("");
136
+ lines.push("<dl>");
137
+ for (const opt of opts) {
138
+ const flags = opt.flags;
139
+ const desc = escapeMdx(replaceBullets(opt.description || ""));
140
+ lines.push(`<dt>\`${flags}\`</dt>`);
141
+ lines.push(`<dd>`);
142
+ lines.push("");
143
+ lines.push(desc);
144
+ lines.push("");
145
+ lines.push(`</dd>`);
146
+ }
147
+ lines.push("</dl>");
148
+ lines.push("");
149
+ }
150
+ if (includeSubcommandsList) {
151
+ const subEntries = all.filter(
152
+ (e) => e.path.length === path.length + 1 && path.every((p, i) => e.path[i] === p)
153
+ );
154
+ if (subEntries.length > 0) {
155
+ lines.push(`${h2} Subcommands`);
156
+ lines.push("");
157
+ for (const sub of subEntries) {
158
+ const subDisplay = displayName(sub.path);
159
+ const target = subcommandLink(path, sub.path);
160
+ const subDesc = indentContinuation(
161
+ escapeMdx(sub.command.summary() || sub.command.description() || "")
162
+ );
163
+ lines.push(`- [\`${subDisplay}\`](${target}) \u2014 ${subDesc}`.trimEnd());
164
+ }
165
+ lines.push("");
166
+ }
167
+ }
168
+ return lines.join("\n");
169
+ }
170
+ function escapeMdx(text) {
171
+ return text.split(/(`[^`]*`)/).map(
172
+ (segment, i) => (
173
+ // Odd indices are the captured code spans; even indices are prose.
174
+ i % 2 === 1 ? segment : segment.replace(/[<{]/g, (c) => `\\${c}`)
175
+ )
176
+ ).join("");
177
+ }
178
+ function renderCopyableCommands(text) {
179
+ return text.split("\n").map(
180
+ (line) => /^- /.test(line) ? line.replace(
181
+ /`(npx convex [^`]*)`/g,
182
+ (_, command) => `<CodeWithCopyButton text={${JSON.stringify(command)}} />`
183
+ ) : line
184
+ ).join("\n");
185
+ }
186
+ export function replaceBullets(text) {
187
+ return text.replace(/^( *)• /gm, "$1- ");
188
+ }
189
+ function formatExampleLines(text) {
190
+ const lines = text.split("\n");
191
+ const result = [];
192
+ let blockLines = [];
193
+ const flushBlock = () => {
194
+ if (blockLines.length === 0) {
195
+ return;
196
+ }
197
+ const prev = result[result.length - 1];
198
+ const followsListItem = prev !== void 0 && isListItem(prev);
199
+ const dedent = followsListItem ? 0 : Math.min(...blockLines.map(indentWidth));
200
+ for (const blockLine of blockLines) {
201
+ result.push(toListItem(blockLine.substring(dedent)));
202
+ }
203
+ blockLines = [];
204
+ };
205
+ for (const line of lines) {
206
+ if (/^ {2,}\S/.test(line)) {
207
+ blockLines.push(line);
208
+ } else {
209
+ flushBlock();
210
+ result.push(line);
211
+ }
212
+ }
213
+ flushBlock();
214
+ return result.join("\n");
215
+ }
216
+ function indentWidth(line) {
217
+ return line.length - line.trimStart().length;
218
+ }
219
+ function isListItem(line) {
220
+ const content = line.trimStart();
221
+ return content.startsWith("- ") || /^\d+\.\s/.test(content);
222
+ }
223
+ function toListItem(line) {
224
+ if (isListItem(line)) {
225
+ return line;
226
+ }
227
+ const indent = line.slice(0, indentWidth(line));
228
+ return `${indent}- ${line.trimStart()}`;
229
+ }
230
+ function indentContinuation(text) {
231
+ return text.replace(/\n/g, "\n ");
232
+ }
233
+ //# sourceMappingURL=generateDocs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/lib/generateDocs.ts"],
4
+ "sourcesContent": ["import type { CommandUnknownOpts } from \"@commander-js/extra-typings\";\n\nexport type GeneratedDocs = Record<string, string>;\n\ntype CommandInfo = {\n command: CommandUnknownOpts;\n // Full path of command names from the root, e.g. [\"convex\", \"env\", \"set\"].\n path: string[];\n};\n\n/**\n * Generate Markdown reference docs for a Commander main command.\n *\n * Returns a map of file paths (relative, e.g. `env.mdx`) to Markdown\n * contents. One file is generated for each visible main command (a direct\n * child of the root); the root itself gets no page, so \"Command Reference\"\n * is a sidebar section with no landing page. Descendant subcommands are\n * rendered as sections inside their main command's file, with their heading\n * level reflecting their depth: a direct subcommand (`env default`) is an\n * `## h2`, a sub-subcommand (`env default set`) an `### h3`, and so on.\n *\n * Each page carries a `description` frontmatter equal to the command's\n * summary; the `/cli` page reads these back via Docusaurus metadata to render\n * the list of commands dynamically.\n */\nexport function generateDocs(root: CommandUnknownOpts): GeneratedDocs {\n const docs: GeneratedDocs = {};\n const all = collectCommands(root, [root.name()]);\n\n let mainCommandPosition = 0;\n for (const entry of all) {\n // Skip the root command (no landing page) and any descendant beyond a\n // main command (those are rendered inside their main command's file).\n if (entry.path.length !== 2) continue;\n const filePath = `${entry.path[1]}.mdx`;\n const sidebarPosition = ++mainCommandPosition;\n const summary =\n entry.command.summary() || entry.command.description() || \"\";\n // Collapse to a single line so it's a valid YAML frontmatter scalar, and\n // quote it safely (summaries contain `[BETA]`, `:`, etc.).\n const description = JSON.stringify(summary.replace(/\\s+/g, \" \").trim());\n\n const lines: string[] = [];\n const sidebarLabel = `npx ${entry.path.join(\" \")}`;\n lines.push(\"---\");\n lines.push(`sidebar_position: ${sidebarPosition}`);\n // Set an explicit `title` so the Docusaurus <title> (and browser tab) reads\n // the full command, e.g. `npx convex dev | \u2026`. Without it Docusaurus\n // derives the title from the doc id (the file name), which would be just\n // `dev`.\n lines.push(`title: \"${sidebarLabel}\"`);\n lines.push(`sidebar_label: \"${sidebarLabel}\"`);\n lines.push(`description: ${description}`);\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\n \"{/* @generated from the command definitions, do not edit manually (run `just regenerate-cli-docs` to regenerate) */}\",\n );\n lines.push(\"\");\n lines.push(renderCommand(entry, all, { headingLevel: 1 }));\n\n const descendants = all.filter(\n (e) =>\n e.path.length > entry.path.length &&\n entry.path.every((p, i) => e.path[i] === p),\n );\n for (const d of descendants) {\n // Render the heading hierarchically by depth below the root: a direct\n // subcommand (`env default`, path length 3) is an h2, a sub-subcommand\n // (`env default set`, path length 4) is an h3, and so on. This nests\n // sub-subcommands under their parent group instead of flattening every\n // descendant to the same h2 level.\n lines.push(\n renderCommand(d, all, {\n headingLevel: d.path.length - 1,\n includeSubcommandsList: false,\n }),\n );\n }\n\n docs[filePath] = lines.join(\"\\n\");\n }\n\n return docs;\n}\n\nfunction collectCommands(\n command: CommandUnknownOpts,\n path: string[],\n): CommandInfo[] {\n const result: CommandInfo[] = [{ command, path }];\n for (const sub of command.commands) {\n // Skip hidden commands and Commander's built-in help command.\n if ((sub as any)._hidden) continue;\n if (sub.name() === \"help\") continue;\n result.push(...collectCommands(sub, [...path, sub.name()]));\n }\n return result;\n}\n\nfunction displayName(path: string[]): string {\n return `npx ${path.join(\" \")}`;\n}\n\n// Build the usage suffix (everything after the command name) for the Usage\n// code block. We derive the argument portion from the command's registered\n// arguments rather than trusting a manual `.usage()` override, so the Usage\n// line always agrees with the Arguments section below. For example `env set`\n// overrides `.usage()` to show `<name> <value>` (pretending the args are\n// required) for nicer `--help` output, even though it registers them as\n// optional `[name] [value]`; reproducing the override verbatim would make the\n// generated page contradict itself. Commands with no registered arguments keep\n// their `.usage()` string verbatim (e.g. the root's `<command> [options]`).\nfunction commandUsage(command: CommandUnknownOpts): string {\n const args = (command as any).registeredArguments ?? [];\n if (args.length === 0) {\n return command.usage();\n }\n // Mirror Commander's default usage order: options, then a subcommand\n // placeholder, then the positional arguments. `[options]` is always present\n // because the built-in `--help` option is always registered.\n const parts = [\"[options]\"];\n if (command.commands.length > 0) {\n parts.push(\"[command]\");\n }\n for (const arg of args) {\n const name = `${arg._name}${arg.variadic ? \"...\" : \"\"}`;\n parts.push(arg.required ? `<${name}>` : `[${name}]`);\n }\n return parts.join(\" \");\n}\n\n// Anchor id for a descendant command rendered as an h2 section inside its\n// main command's file. Built from the path segments below the main command,\n// joined with `-`, so sub-subcommands stay unique. For example, both\n// `deployment create` and `deployment token create` would collide on `#create`\n// if we used only the leaf name; instead they become `#create` and\n// `#token-create`.\nfunction anchorSlug(path: string[]): string {\n return path.slice(2).join(\"-\");\n}\n\n// Link target for a subcommand listed inside a command's \"Subcommands\"\n// section. From the root index, main commands live in sibling files. From a\n// main command page, descendants are rendered as h2 sections in the same\n// file, anchored by their path below the main command.\nfunction subcommandLink(parentPath: string[], subPath: string[]): string {\n if (parentPath.length === 1) {\n return `./${subPath[1]}`;\n }\n return `#${anchorSlug(subPath)}`;\n}\n\nfunction renderCommand(\n entry: CommandInfo,\n all: CommandInfo[],\n options: { headingLevel: number; includeSubcommandsList?: boolean },\n): string {\n const { headingLevel, includeSubcommandsList = true } = options;\n const h1 = \"#\".repeat(headingLevel);\n const h2 = \"#\".repeat(headingLevel + 1);\n\n const { command, path } = entry;\n const display = displayName(path);\n const description = renderCopyableCommands(\n escapeMdx(\n formatExampleLines(\n replaceBullets(command.description() || command.summary() || \"\"),\n ),\n ),\n );\n\n const lines: string[] = [];\n // For nested subcommand sections, pin the heading id to the path below the\n // main command so anchors like `#set` and `#token-create` stay unique even\n // when leaf names collide across different parents.\n const headingSuffix = headingLevel > 1 ? ` \\\\{#${anchorSlug(path)}}` : \"\";\n lines.push(`${h1} \\`${display}\\`${headingSuffix}`);\n lines.push(\"\");\n if (description) {\n lines.push(description);\n lines.push(\"\");\n }\n\n const usage = commandUsage(command);\n lines.push(`${h2} Usage`);\n lines.push(\"\");\n lines.push(\"```sh\");\n lines.push(`${display} ${usage}`.trim());\n lines.push(\"```\");\n lines.push(\"\");\n\n const aliases = command.aliases();\n if (aliases.length > 0) {\n lines.push(`${h2} Aliases`);\n lines.push(\"\");\n for (const alias of aliases) {\n lines.push(`- \\`${alias}\\``);\n }\n lines.push(\"\");\n }\n\n const args = (command as any).registeredArguments ?? [];\n if (args.length > 0) {\n lines.push(`${h2} Arguments`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const arg of args) {\n const name = arg.required ? `<${arg._name}>` : `[${arg._name}]`;\n const desc = escapeMdx(replaceBullets(arg.description || \"\"));\n lines.push(`<dt>\\`${name}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n const opts = command.options.filter((o: any) => !o.hidden);\n if (opts.length > 0) {\n lines.push(`${h2} Options`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const opt of opts) {\n const flags = (opt as any).flags as string;\n const desc = escapeMdx(replaceBullets(opt.description || \"\"));\n lines.push(`<dt>\\`${flags}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n if (includeSubcommandsList) {\n const subEntries = all.filter(\n (e) =>\n e.path.length === path.length + 1 &&\n path.every((p, i) => e.path[i] === p),\n );\n if (subEntries.length > 0) {\n lines.push(`${h2} Subcommands`);\n lines.push(\"\");\n for (const sub of subEntries) {\n const subDisplay = displayName(sub.path);\n const target = subcommandLink(path, sub.path);\n const subDesc = indentContinuation(\n escapeMdx(sub.command.summary() || sub.command.description() || \"\"),\n );\n lines.push(`- [\\`${subDisplay}\\`](${target}) \u2014 ${subDesc}`.trimEnd());\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// Escape characters that MDX would otherwise parse as JSX. Backslash-escaping\n// `<` and `{` keeps placeholder text like `<team_slug>` rendering as literal\n// text instead of being interpreted as a tag or expression.\n//\n// MDX only parses `<` and `{` specially in prose \u2014 inside an inline code span\n// (backticks) both are already literal, and a backslash there renders verbatim\n// (e.g. `` `\\<nameOrToken>` `` shows the backslash). So leave code spans\n// untouched and escape only the surrounding prose.\nfunction escapeMdx(text: string): string {\n return text\n .split(/(`[^`]*`)/)\n .map((segment, i) =>\n // Odd indices are the captured code spans; even indices are prose.\n i % 2 === 1 ? segment : segment.replace(/[<{]/g, (c) => `\\\\${c}`),\n )\n .join(\"\");\n}\n\n// Turn inline code spans that are full `npx convex ...` commands into a\n// CodeWithCopyButton component so readers can copy them with one click. The\n// component is registered globally in the docs site's MDXComponents, so no\n// import is needed in the generated page. This runs after escapeMdx, which\n// leaves code spans verbatim, so the command text inside the backticks is\n// unescaped and drops straight into the `text` attribute.\n//\n// We pass the command as a JSX expression containing a JSON-encoded string\n// (`text={\"...\"}`) rather than a plain attribute (`text=\"...\"`) because\n// commands routinely contain double quotes (e.g. JSON arguments like\n// `'{\"body\": \"hello\"}'`), which would otherwise terminate the attribute value\n// and produce invalid MDX. JSON.stringify escapes quotes and backslashes for\n// us.\nfunction renderCopyableCommands(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) =>\n /^- /.test(line)\n ? line.replace(\n /`(npx convex [^`]*)`/g,\n (_, command) =>\n `<CodeWithCopyButton text={${JSON.stringify(command)}} />`,\n )\n : line,\n )\n .join(\"\\n\");\n}\n\n// Replace \"\u2022\" bullet points with markdown \"-\" bullet points. Every line that is\n// (maybe leading spaces +) \"\u2022 \" becomes the same spaces + \"- \". This runs before\n// formatExampleLines and renderCopyableCommands so that `npx convex ...` commands\n// in bulleted help text are recognized as list items and get a copy button.\nexport function replaceBullets(text: string): string {\n return text.replace(/^( *)\u2022 /gm, \"$1- \");\n}\n\n// Convert indented example lines (e.g., from CLI help text) into markdown lists\n// so they render with proper line breaks instead of collapsing into one line.\n// Consecutive indented lines are gathered into a block; any line indented by at\n// least two spaces belongs to the block, regardless of how deeply it nests.\n//\n// How much the block is dedented depends on what precedes it:\n// - When the block follows a list item, its indentation encodes real nesting\n// (a sub-list under that item), so it is preserved verbatim. This keeps a\n// 3-level list like the deploy command's preview-key description intact\n// instead of flattening the 2-space sub-item to a top-level bullet.\n// - When the block follows prose (or starts the text), the indentation is\n// just help-text formatting, so the block is dedented by its smallest\n// indent to the left margin. Otherwise an indented list wouldn't interrupt\n// the preceding paragraph and would collapse into it.\nfunction formatExampleLines(text: string): string {\n const lines = text.split(\"\\n\");\n const result: string[] = [];\n let blockLines: string[] = [];\n\n const flushBlock = () => {\n if (blockLines.length === 0) {\n return;\n }\n const prev = result[result.length - 1];\n const followsListItem = prev !== undefined && isListItem(prev);\n const dedent = followsListItem\n ? 0\n : Math.min(...blockLines.map(indentWidth));\n for (const blockLine of blockLines) {\n result.push(toListItem(blockLine.substring(dedent)));\n }\n blockLines = [];\n };\n\n for (const line of lines) {\n // Any line indented by at least two spaces (and not blank) is part of an\n // example block, regardless of nesting depth.\n if (/^ {2,}\\S/.test(line)) {\n blockLines.push(line);\n } else {\n flushBlock();\n result.push(line);\n }\n }\n flushBlock();\n\n return result.join(\"\\n\");\n}\n\nfunction indentWidth(line: string): number {\n return line.length - line.trimStart().length;\n}\n\nfunction isListItem(line: string): boolean {\n const content = line.trimStart();\n return content.startsWith(\"- \") || /^\\d+\\.\\s/.test(content);\n}\n\n// Render an example line as a markdown list item, preserving any leading indent\n// so nested items stay nested. Lines that are already list items \u2014 either a\n// bullet (`- `) or an ordered-list item (`1. `) \u2014 are kept verbatim so they\n// render as their intended list type. Prefixing an ordered-list item with `- `\n// would nest it inside a bullet, which renders as roman numerals instead of the\n// numbered steps.\nfunction toListItem(line: string): string {\n if (isListItem(line)) {\n return line;\n }\n const indent = line.slice(0, indentWidth(line));\n return `${indent}- ${line.trimStart()}`;\n}\n\nfunction indentContinuation(text: string): string {\n return text.replace(/\\n/g, \"\\n \");\n}\n"],
5
+ "mappings": ";AAyBO,gBAAS,aAAa,MAAyC;AACpE,QAAM,OAAsB,CAAC;AAC7B,QAAM,MAAM,gBAAgB,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;AAE/C,MAAI,sBAAsB;AAC1B,aAAW,SAAS,KAAK;AAGvB,QAAI,MAAM,KAAK,WAAW,EAAG;AAC7B,UAAM,WAAW,GAAG,MAAM,KAAK,CAAC,CAAC;AACjC,UAAM,kBAAkB,EAAE;AAC1B,UAAM,UACJ,MAAM,QAAQ,QAAQ,KAAK,MAAM,QAAQ,YAAY,KAAK;AAG5D,UAAM,cAAc,KAAK,UAAU,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC;AAEtE,UAAM,QAAkB,CAAC;AACzB,UAAM,eAAe,OAAO,MAAM,KAAK,KAAK,GAAG,CAAC;AAChD,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,qBAAqB,eAAe,EAAE;AAKjD,UAAM,KAAK,WAAW,YAAY,GAAG;AACrC,UAAM,KAAK,mBAAmB,YAAY,GAAG;AAC7C,UAAM,KAAK,gBAAgB,WAAW,EAAE;AACxC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc,OAAO,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AAEzD,UAAM,cAAc,IAAI;AAAA,MACtB,CAAC,MACC,EAAE,KAAK,SAAS,MAAM,KAAK,UAC3B,MAAM,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;AAAA,IAC9C;AACA,eAAW,KAAK,aAAa;AAM3B,YAAM;AAAA,QACJ,cAAc,GAAG,KAAK;AAAA,UACpB,cAAc,EAAE,KAAK,SAAS;AAAA,UAC9B,wBAAwB;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,SACA,MACe;AACf,QAAM,SAAwB,CAAC,EAAE,SAAS,KAAK,CAAC;AAChD,aAAW,OAAO,QAAQ,UAAU;AAElC,QAAK,IAAY,QAAS;AAC1B,QAAI,IAAI,KAAK,MAAM,OAAQ;AAC3B,WAAO,KAAK,GAAG,gBAAgB,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAwB;AAC3C,SAAO,OAAO,KAAK,KAAK,GAAG,CAAC;AAC9B;AAWA,SAAS,aAAa,SAAqC;AACzD,QAAM,OAAQ,QAAgB,uBAAuB,CAAC;AACtD,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,QAAQ,MAAM;AAAA,EACvB;AAIA,QAAM,QAAQ,CAAC,WAAW;AAC1B,MAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,UAAM,KAAK,WAAW;AAAA,EACxB;AACA,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,WAAW,QAAQ,EAAE;AACrD,UAAM,KAAK,IAAI,WAAW,IAAI,IAAI,MAAM,IAAI,IAAI,GAAG;AAAA,EACrD;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAQA,SAAS,WAAW,MAAwB;AAC1C,SAAO,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAC/B;AAMA,SAAS,eAAe,YAAsB,SAA2B;AACvE,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,OAAO,CAAC;AAChC;AAEA,SAAS,cACP,OACA,KACA,SACQ;AACR,QAAM,EAAE,cAAc,yBAAyB,KAAK,IAAI;AACxD,QAAM,KAAK,IAAI,OAAO,YAAY;AAClC,QAAM,KAAK,IAAI,OAAO,eAAe,CAAC;AAEtC,QAAM,EAAE,SAAS,KAAK,IAAI;AAC1B,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,cAAc;AAAA,IAClB;AAAA,MACE;AAAA,QACE,eAAe,QAAQ,YAAY,KAAK,QAAQ,QAAQ,KAAK,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AAIzB,QAAM,gBAAgB,eAAe,IAAI,QAAQ,WAAW,IAAI,CAAC,MAAM;AACvE,QAAM,KAAK,GAAG,EAAE,MAAM,OAAO,KAAK,aAAa,EAAE;AACjD,QAAM,KAAK,EAAE;AACb,MAAI,aAAa;AACf,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,QAAQ,aAAa,OAAO;AAClC,QAAM,KAAK,GAAG,EAAE,QAAQ;AACxB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,KAAK,CAAC;AACvC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAEb,QAAM,UAAU,QAAQ,QAAQ;AAChC,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,GAAG,EAAE,UAAU;AAC1B,UAAM,KAAK,EAAE;AACb,eAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,OAAO,KAAK,IAAI;AAAA,IAC7B;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,OAAQ,QAAgB,uBAAuB,CAAC;AACtD,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,KAAK,GAAG,EAAE,YAAY;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM;AACjB,eAAW,OAAO,MAAM;AACtB,YAAM,OAAO,IAAI,WAAW,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK;AAC5D,YAAM,OAAO,UAAU,eAAe,IAAI,eAAe,EAAE,CAAC;AAC5D,YAAM,KAAK,SAAS,IAAI,SAAS;AACjC,YAAM,KAAK,MAAM;AACjB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO;AAAA,IACpB;AACA,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC,MAAW,CAAC,EAAE,MAAM;AACzD,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,KAAK,GAAG,EAAE,UAAU;AAC1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM;AACjB,eAAW,OAAO,MAAM;AACtB,YAAM,QAAS,IAAY;AAC3B,YAAM,OAAO,UAAU,eAAe,IAAI,eAAe,EAAE,CAAC;AAC5D,YAAM,KAAK,SAAS,KAAK,SAAS;AAClC,YAAM,KAAK,MAAM;AACjB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO;AAAA,IACpB;AACA,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,wBAAwB;AAC1B,UAAM,aAAa,IAAI;AAAA,MACrB,CAAC,MACC,EAAE,KAAK,WAAW,KAAK,SAAS,KAChC,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;AAAA,IACxC;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,KAAK,GAAG,EAAE,cAAc;AAC9B,YAAM,KAAK,EAAE;AACb,iBAAW,OAAO,YAAY;AAC5B,cAAM,aAAa,YAAY,IAAI,IAAI;AACvC,cAAM,SAAS,eAAe,MAAM,IAAI,IAAI;AAC5C,cAAM,UAAU;AAAA,UACd,UAAU,IAAI,QAAQ,QAAQ,KAAK,IAAI,QAAQ,YAAY,KAAK,EAAE;AAAA,QACpE;AACA,cAAM,KAAK,QAAQ,UAAU,OAAO,MAAM,YAAO,OAAO,GAAG,QAAQ,CAAC;AAAA,MACtE;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAUA,SAAS,UAAU,MAAsB;AACvC,SAAO,KACJ,MAAM,WAAW,EACjB;AAAA,IAAI,CAAC,SAAS;AAAA;AAAA,MAEb,IAAI,MAAM,IAAI,UAAU,QAAQ,QAAQ,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA;AAAA,EAClE,EACC,KAAK,EAAE;AACZ;AAeA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,KACJ,MAAM,IAAI,EACV;AAAA,IAAI,CAAC,SACJ,MAAM,KAAK,IAAI,IACX,KAAK;AAAA,MACH;AAAA,MACA,CAAC,GAAG,YACF,6BAA6B,KAAK,UAAU,OAAO,CAAC;AAAA,IACxD,IACA;AAAA,EACN,EACC,KAAK,IAAI;AACd;AAMO,gBAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,QAAQ,aAAa,MAAM;AACzC;AAgBA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,SAAmB,CAAC;AAC1B,MAAI,aAAuB,CAAC;AAE5B,QAAM,aAAa,MAAM;AACvB,QAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,IACF;AACA,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,UAAM,kBAAkB,SAAS,UAAa,WAAW,IAAI;AAC7D,UAAM,SAAS,kBACX,IACA,KAAK,IAAI,GAAG,WAAW,IAAI,WAAW,CAAC;AAC3C,eAAW,aAAa,YAAY;AAClC,aAAO,KAAK,WAAW,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,IACrD;AACA,iBAAa,CAAC;AAAA,EAChB;AAEA,aAAW,QAAQ,OAAO;AAGxB,QAAI,WAAW,KAAK,IAAI,GAAG;AACzB,iBAAW,KAAK,IAAI;AAAA,IACtB,OAAO;AACL,iBAAW;AACX,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AACA,aAAW;AAEX,SAAO,OAAO,KAAK,IAAI;AACzB;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KAAK,SAAS,KAAK,UAAU,EAAE;AACxC;AAEA,SAAS,WAAW,MAAuB;AACzC,QAAM,UAAU,KAAK,UAAU;AAC/B,SAAO,QAAQ,WAAW,IAAI,KAAK,WAAW,KAAK,OAAO;AAC5D;AAQA,SAAS,WAAW,MAAsB;AACxC,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,GAAG,YAAY,IAAI,CAAC;AAC9C,SAAO,GAAG,MAAM,KAAK,KAAK,UAAU,CAAC;AACvC;AAEA,SAAS,mBAAmB,MAAsB;AAChD,SAAO,KAAK,QAAQ,OAAO,MAAM;AACnC;",
6
+ "names": []
7
+ }
@@ -7,11 +7,7 @@ import {
7
7
  logWarning
8
8
  } from "../../../bundler/log.js";
9
9
  import { promptSearch, promptYesNo } from "../utils/prompts.js";
10
- import {
11
- bigBrainGenerateAdminKeyForAnonymousDeployment,
12
- bigBrainPause,
13
- bigBrainStart
14
- } from "./bigBrain.js";
10
+ import { bigBrainPause, bigBrainStart } from "./bigBrain.js";
15
11
  import { LocalDeploymentError, printLocalDeploymentOnError } from "./errors.js";
16
12
  import {
17
13
  deploymentStateDir,
@@ -24,15 +20,8 @@ import {
24
20
  } from "./filePaths.js";
25
21
  import { rootDeploymentStateDir } from "./filePaths.js";
26
22
  import { ensureBackendStopped, localDeploymentUrl } from "./run.js";
27
- import { ensureBackendRunning } from "./run.js";
28
- import { handlePotentialUpgrade } from "./upgrade.js";
29
- import {
30
- isOffline,
31
- generateInstanceSecret,
32
- chooseLocalBackendPorts,
33
- LOCAL_BACKEND_INSTANCE_SECRET
34
- } from "./utils.js";
35
- import { handleDashboard } from "./dashboard.js";
23
+ import { handlePotentialUpgradeAndStart } from "./upgrade.js";
24
+ import { chooseLocalBackendPorts } from "./utils.js";
36
25
  import { recursivelyDelete, recursivelyCopy } from "../fsUtils.js";
37
26
  import { ensureBackendBinaryDownloaded } from "./download.js";
38
27
  import { isAnonymousDeployment } from "../deployment.js";
@@ -43,14 +32,11 @@ import { doInitConvexFolder } from "../codegen.js";
43
32
  import { readProjectConfig } from "../config.js";
44
33
  import { functionsDir } from "../utils/utils.js";
45
34
  import { attemptSetupAiFiles } from "../aiFiles/index.js";
35
+ import {
36
+ generateLocalDevSecretsWithLatestBinary,
37
+ LEGACY_LOCAL_BACKEND_INSTANCE_SECRET
38
+ } from "./secrets.js";
46
39
  export async function handleAnonymousDeployment(ctx, options) {
47
- if (await isOffline()) {
48
- return await ctx.crash({
49
- exitCode: 1,
50
- errorType: "fatal",
51
- printedMessage: "Cannot run a local deployment while offline"
52
- });
53
- }
54
40
  const deployment = await chooseDeployment(ctx, {
55
41
  deploymentName: options.deploymentName,
56
42
  chosenConfiguration: options.chosenConfiguration
@@ -91,12 +77,11 @@ export async function handleAnonymousDeployment(ctx, options) {
91
77
  kind: "latest"
92
78
  } : { kind: "version", version: options.backendVersion }
93
79
  );
94
- await handleDashboard(ctx, version);
95
- let adminKey;
96
- let instanceSecret;
80
+ const existingCredentials = deployment.kind === "existing" ? {
81
+ adminKey: deployment.config.adminKey,
82
+ instanceSecret: deployment.config.instanceSecret ?? LEGACY_LOCAL_BACKEND_INSTANCE_SECRET
83
+ } : null;
97
84
  if (deployment.kind === "existing") {
98
- adminKey = deployment.config.adminKey;
99
- instanceSecret = deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;
100
85
  await ensureBackendStopped(ctx, {
101
86
  ports: {
102
87
  cloud: deployment.config.ports.cloud
@@ -105,41 +90,26 @@ export async function handleAnonymousDeployment(ctx, options) {
105
90
  deploymentName: deployment.deploymentName,
106
91
  allowOtherDeployments: true
107
92
  });
108
- } else {
109
- instanceSecret = generateInstanceSecret();
110
- const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {
111
- instanceName: deployment.deploymentName,
112
- instanceSecret
113
- });
114
- adminKey = data.adminKey;
115
93
  }
116
94
  const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {
117
95
  requestedPorts: options.ports,
118
96
  suggestedPorts: deployment.kind === "existing" ? deployment.config.ports : void 0
119
97
  });
120
- const onActivity = async (isOffline2, _wasOffline) => {
121
- await ensureBackendRunning(ctx, {
122
- cloudPort,
98
+ const { cleanupHandle, adminKey } = await handlePotentialUpgradeAndStart(
99
+ ctx,
100
+ {
123
101
  deploymentName: deployment.deploymentName,
124
- maxTimeSecs: 5
125
- });
126
- if (isOffline2) {
127
- return;
102
+ deploymentKind: "anonymous",
103
+ oldVersion: deployment.kind === "existing" ? deployment.config.backendVersion : null,
104
+ newBinaryPath: binaryPath,
105
+ newVersion: version,
106
+ ports: { cloud: cloudPort, site: sitePort },
107
+ existingCredentials,
108
+ forceUpgrade: options.forceUpgrade,
109
+ // Anonymous deployments aren't registered against a cloud project.
110
+ cloudProjectId: void 0
128
111
  }
129
- };
130
- const { cleanupHandle } = await handlePotentialUpgrade(ctx, {
131
- deploymentName: deployment.deploymentName,
132
- deploymentKind: "anonymous",
133
- oldVersion: deployment.kind === "existing" ? deployment.config.backendVersion : null,
134
- newBinaryPath: binaryPath,
135
- newVersion: version,
136
- ports: { cloud: cloudPort, site: sitePort },
137
- adminKey,
138
- instanceSecret,
139
- forceUpgrade: options.forceUpgrade,
140
- // Anonymous deployments aren't registered against a cloud project.
141
- cloudProjectId: void 0
142
- });
112
+ );
143
113
  const cleanupFunc = ctx.removeCleanup(cleanupHandle);
144
114
  ctx.registerCleanup(async (exitCode, err) => {
145
115
  if (cleanupFunc !== null) {
@@ -163,8 +133,7 @@ export async function handleAnonymousDeployment(ctx, options) {
163
133
  deploymentName: deployment.deploymentName,
164
134
  deploymentUrl: localDeploymentUrl(cloudPort),
165
135
  reference: null,
166
- isDefault: false,
167
- onActivity
136
+ isDefault: false
168
137
  };
169
138
  }
170
139
  export async function loadAnonymousDeployment(ctx, deploymentName) {
@@ -328,16 +297,15 @@ export async function handleLinkToProject(ctx, args) {
328
297
  projectSlug = newProjectSlug;
329
298
  }
330
299
  logVerbose(`Creating local deployment in project ${projectSlug}`);
331
- const {
332
- deploymentName: localDeploymentName,
333
- adminKey,
334
- projectId
335
- } = await bigBrainStart(ctx, {
300
+ const { deploymentName: localDeploymentName, projectId } = await bigBrainStart(ctx, {
336
301
  port: config.ports.cloud,
337
302
  projectSlug,
338
303
  teamSlug: args.teamSlug,
339
304
  instanceName: null
340
305
  });
306
+ const { instanceSecret, adminKey } = await generateLocalDevSecretsWithLatestBinary(ctx, {
307
+ deploymentName: localDeploymentName
308
+ });
341
309
  const localConfig = loadDeploymentConfig(ctx, "local", localDeploymentName);
342
310
  if (localConfig !== null) {
343
311
  return ctx.crash({
@@ -360,6 +328,7 @@ export async function handleLinkToProject(ctx, args) {
360
328
  );
361
329
  logVerbose(`Saving deployment config for ${localDeploymentName}`);
362
330
  saveDeploymentConfig(ctx, "local", localDeploymentName, {
331
+ instanceSecret,
363
332
  adminKey,
364
333
  backendVersion: config.backendVersion,
365
334
  ports: config.ports,