convex 1.47.0 → 1.48.0-alpha.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 (177) hide show
  1. package/dist/browser.bundle.js +1 -1
  2. package/dist/browser.bundle.js.map +1 -1
  3. package/dist/cjs/bundler/context.js +7 -5
  4. package/dist/cjs/bundler/context.js.map +2 -2
  5. package/dist/cjs/bundler/fs.js +47 -6
  6. package/dist/cjs/bundler/fs.js.map +2 -2
  7. package/dist/cjs/cli/account.js +237 -0
  8. package/dist/cjs/cli/account.js.map +7 -0
  9. package/dist/cjs/cli/configure.js +15 -2
  10. package/dist/cjs/cli/configure.js.map +2 -2
  11. package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
  12. package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
  13. package/dist/cjs/cli/lib/deployment.js +2 -0
  14. package/dist/cjs/cli/lib/deployment.js.map +2 -2
  15. package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
  16. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  17. package/dist/cjs/cli/lib/envvars.js +32 -0
  18. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  19. package/dist/cjs/cli/lib/fsUtils.js +1 -1
  20. package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
  21. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  22. package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
  23. package/dist/cjs/cli/lib/login.js +28 -4
  24. package/dist/cjs/cli/lib/login.js.map +2 -2
  25. package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
  26. package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
  27. package/dist/cjs/cli/lib/profileManagement.js +196 -0
  28. package/dist/cjs/cli/lib/profileManagement.js.map +7 -0
  29. package/dist/cjs/cli/lib/profiles.js +333 -0
  30. package/dist/cjs/cli/lib/profiles.js.map +7 -0
  31. package/dist/cjs/cli/lib/utils/utils.js +18 -9
  32. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  33. package/dist/cjs/cli/login.js +213 -114
  34. package/dist/cjs/cli/login.js.map +3 -3
  35. package/dist/cjs/cli/logout.js +113 -12
  36. package/dist/cjs/cli/logout.js.map +3 -3
  37. package/dist/cjs/cli/mcp.js +43 -10
  38. package/dist/cjs/cli/mcp.js.map +3 -3
  39. package/dist/cjs/cli/program.js +2 -1
  40. package/dist/cjs/cli/program.js.map +2 -2
  41. package/dist/cjs/index.js +1 -1
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/cjs-types/bundler/context.d.ts +5 -0
  44. package/dist/cjs-types/bundler/context.d.ts.map +1 -1
  45. package/dist/cjs-types/bundler/fs.d.ts +7 -2
  46. package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
  47. package/dist/cjs-types/cli/account.d.ts +6 -0
  48. package/dist/cjs-types/cli/account.d.ts.map +1 -0
  49. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  50. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
  51. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  52. package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
  53. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  54. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
  55. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  56. package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
  57. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  58. package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
  59. package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
  60. package/dist/cjs-types/cli/lib/login.d.ts +3 -1
  61. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  62. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  63. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  64. package/dist/cjs-types/cli/lib/profileManagement.d.ts +10 -0
  65. package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +1 -0
  66. package/dist/cjs-types/cli/lib/profiles.d.ts +59 -0
  67. package/dist/cjs-types/cli/lib/profiles.d.ts.map +1 -0
  68. package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -0
  69. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  70. package/dist/cjs-types/cli/login.d.ts +21 -0
  71. package/dist/cjs-types/cli/login.d.ts.map +1 -1
  72. package/dist/cjs-types/cli/logout.d.ts +8 -1
  73. package/dist/cjs-types/cli/logout.d.ts.map +1 -1
  74. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  75. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  76. package/dist/cjs-types/index.d.ts +1 -1
  77. package/dist/cjs-types/index.d.ts.map +1 -1
  78. package/dist/cli.bundle.cjs +2118 -1096
  79. package/dist/cli.bundle.cjs.map +4 -4
  80. package/dist/esm/bundler/context.js +7 -5
  81. package/dist/esm/bundler/context.js.map +2 -2
  82. package/dist/esm/bundler/fs.js +47 -6
  83. package/dist/esm/bundler/fs.js.map +2 -2
  84. package/dist/esm/cli/account.js +221 -0
  85. package/dist/esm/cli/account.js.map +7 -0
  86. package/dist/esm/cli/configure.js +15 -2
  87. package/dist/esm/cli/configure.js.map +2 -2
  88. package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
  89. package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
  90. package/dist/esm/cli/lib/deployment.js +2 -2
  91. package/dist/esm/cli/lib/deployment.js.map +2 -2
  92. package/dist/esm/cli/lib/deploymentSelection.js +35 -20
  93. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  94. package/dist/esm/cli/lib/envvars.js +35 -1
  95. package/dist/esm/cli/lib/envvars.js.map +2 -2
  96. package/dist/esm/cli/lib/fsUtils.js +1 -1
  97. package/dist/esm/cli/lib/fsUtils.js.map +2 -2
  98. package/dist/esm/cli/lib/generateDocs.js +1 -1
  99. package/dist/esm/cli/lib/generateDocs.js.map +1 -1
  100. package/dist/esm/cli/lib/login.js +36 -4
  101. package/dist/esm/cli/lib/login.js.map +2 -2
  102. package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
  103. package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
  104. package/dist/esm/cli/lib/profileManagement.js +179 -0
  105. package/dist/esm/cli/lib/profileManagement.js.map +7 -0
  106. package/dist/esm/cli/lib/profiles.js +288 -0
  107. package/dist/esm/cli/lib/profiles.js.map +7 -0
  108. package/dist/esm/cli/lib/utils/utils.js +16 -9
  109. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  110. package/dist/esm/cli/login.js +225 -112
  111. package/dist/esm/cli/login.js.map +3 -3
  112. package/dist/esm/cli/logout.js +110 -13
  113. package/dist/esm/cli/logout.js.map +2 -2
  114. package/dist/esm/cli/mcp.js +34 -10
  115. package/dist/esm/cli/mcp.js.map +2 -2
  116. package/dist/esm/cli/program.js +2 -1
  117. package/dist/esm/cli/program.js.map +2 -2
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm-types/bundler/context.d.ts +5 -0
  121. package/dist/esm-types/bundler/context.d.ts.map +1 -1
  122. package/dist/esm-types/bundler/fs.d.ts +7 -2
  123. package/dist/esm-types/bundler/fs.d.ts.map +1 -1
  124. package/dist/esm-types/cli/account.d.ts +6 -0
  125. package/dist/esm-types/cli/account.d.ts.map +1 -0
  126. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  127. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
  128. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  129. package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
  130. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  131. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
  132. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  133. package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
  134. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  135. package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
  136. package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
  137. package/dist/esm-types/cli/lib/login.d.ts +3 -1
  138. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  139. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  140. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  141. package/dist/esm-types/cli/lib/profileManagement.d.ts +10 -0
  142. package/dist/esm-types/cli/lib/profileManagement.d.ts.map +1 -0
  143. package/dist/esm-types/cli/lib/profiles.d.ts +59 -0
  144. package/dist/esm-types/cli/lib/profiles.d.ts.map +1 -0
  145. package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -0
  146. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  147. package/dist/esm-types/cli/login.d.ts +21 -0
  148. package/dist/esm-types/cli/login.d.ts.map +1 -1
  149. package/dist/esm-types/cli/logout.d.ts +8 -1
  150. package/dist/esm-types/cli/logout.d.ts.map +1 -1
  151. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  152. package/dist/esm-types/cli/program.d.ts.map +1 -1
  153. package/dist/esm-types/index.d.ts +1 -1
  154. package/dist/esm-types/index.d.ts.map +1 -1
  155. package/dist/react.bundle.js +1 -1
  156. package/dist/react.bundle.js.map +1 -1
  157. package/package.json +1 -1
  158. package/src/bundler/context.ts +9 -5
  159. package/src/bundler/fs.ts +54 -5
  160. package/src/cli/account.ts +320 -0
  161. package/src/cli/configure.ts +18 -2
  162. package/src/cli/lib/deployKeyWarning.ts +43 -0
  163. package/src/cli/lib/deployment.ts +2 -2
  164. package/src/cli/lib/deploymentSelection.ts +37 -18
  165. package/src/cli/lib/envvars.ts +43 -1
  166. package/src/cli/lib/fsUtils.ts +5 -2
  167. package/src/cli/lib/generateDocs.ts +1 -1
  168. package/src/cli/lib/login.ts +47 -3
  169. package/src/cli/lib/mcp/requestContext.ts +7 -1
  170. package/src/cli/lib/profileManagement.ts +262 -0
  171. package/src/cli/lib/profiles.ts +398 -0
  172. package/src/cli/lib/utils/utils.ts +19 -15
  173. package/src/cli/login.ts +293 -168
  174. package/src/cli/logout.ts +142 -17
  175. package/src/cli/mcp.ts +48 -11
  176. package/src/cli/program.ts +2 -0
  177. package/src/index.ts +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/account.ts"],
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport path from \"path\";\nimport { createLoginCommand } from \"./login.js\";\nimport { createLogoutCommand } from \"./logout.js\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logOutput,\n logWarning,\n} from \"../bundler/log.js\";\nimport { loadProjectEnvironmentVariables } from \"./lib/envvars.js\";\nimport { isAuthorizedHeader, performLogin } from \"./lib/login.js\";\nimport {\n getProfileSelection,\n initializeDefaultProfile,\n readProfileAuth,\n readProfileCredentials,\n readProfileSettings,\n savedProfileNames,\n validateProfileName,\n updateProfileSettings,\n} from \"./lib/profiles.js\";\nimport {\n bindProfileToDirectory,\n projectAccess,\n} from \"./lib/profileManagement.js\";\nimport { warnIfDeployKeyOverridesLogin } from \"./lib/deployKeyWarning.js\";\nimport { ProjectSelection } from \"./lib/deploymentSelection.js\";\nimport { promptOptions, promptString } from \"./lib/utils/prompts.js\";\n\nasync function profileContext() {\n const ctx = await oneoffContext({ skipAuth: true });\n loadProjectEnvironmentVariables();\n return ctx;\n}\n\nconst profileList = new Command(\"list\")\n .description(\n \"List saved accounts, credential status, and directory selections\",\n )\n .allowExcessArguments(false)\n .action(async () => {\n const ctx = await profileContext();\n const settings = await readProfileSettings(ctx);\n const selected = await getProfileSelection(ctx);\n const names = new Set([\n ...savedProfileNames(ctx),\n ...Object.values(settings.directories ?? {}),\n ...(settings.defaultProfile === undefined\n ? []\n : [settings.defaultProfile]),\n ...(selected === null ? [] : [selected.name]),\n ]);\n warnIfDeployKeyOverridesLogin(\n ctx,\n typeof settings.accessToken === \"string\" ||\n savedProfileNames(ctx).length > 0,\n );\n if (names.size === 0) {\n logMessage(\n typeof settings.accessToken === \"string\"\n ? (await isAuthorizedHeader(ctx, `Bearer ${settings.accessToken}`))\n ? \"Logged in without a named account. Name this login with `npx convex login --account personal --select`.\"\n : \"Your saved login is no longer valid. Run `npx convex login --account <name>`.\"\n : \"No saved accounts. Run `npx convex login --account <name>`.\",\n );\n return;\n }\n if (selected !== null)\n logMessage(`Selected account: ${selected.name} (${selected.source})`);\n if (settings.defaultProfile !== undefined)\n logMessage(`Default account: ${settings.defaultProfile}`);\n for (const name of [...names].sort()) {\n const credentials = await readProfileCredentials(\n ctx,\n { name, source: \"saved accounts\" },\n true,\n );\n const valid =\n credentials !== null &&\n (await isAuthorizedHeader(ctx, `Bearer ${credentials.accessToken}`));\n const label = `${name}${credentials?.email ? ` (${credentials.email})` : \"\"}`;\n const status =\n credentials === null\n ? \" \u26A0\uFE0F Not logged in\"\n : valid\n ? \"\"\n : \" \u26A0\uFE0F Invalid credentials\";\n logOutput(`${label}${status}`);\n for (const [directory, profile] of Object.entries(\n settings.directories ?? {},\n )) {\n if (profile === name) logOutput(` ${directory}`);\n }\n }\n });\n\nconst accountSelect = new Command(\"select\")\n .description(\"Use a saved account in this directory and its subdirectories\")\n .argument(\"<account>\", \"Account name, such as work or personal\")\n .option(\n \"--force\",\n \"Select this account even if deployment access cannot be verified\",\n )\n .allowExcessArguments(false)\n .action(async (name, options) => {\n const ctx = await profileContext();\n if (!(await bindProfileToDirectory(ctx, name, options.force))) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n });\n }\n });\n\nconst profileDefault = new Command(\"default\")\n .description(\n \"Show or set the default account for directories without a directory selection\",\n )\n .argument(\"[account]\", \"Account name\")\n .allowExcessArguments(false)\n .action(async (name) => {\n const ctx = await profileContext();\n if (name === undefined) {\n const settings = await readProfileSettings(ctx);\n logOutput(\n settings.defaultProfile === undefined\n ? \"No default account is set.\"\n : `Default account: ${settings.defaultProfile}`,\n );\n return;\n }\n await updateProfileSettings(ctx, async (settings) => {\n const credentials = await readProfileCredentials(ctx, {\n name,\n source: \"account default\",\n });\n settings.defaultProfile = name;\n settings.accessToken = credentials!.accessToken;\n });\n logFinishedStep(`Default account: ${name}`);\n });\n\nconst accountDeselect = new Command(\"deselect\")\n .description(\n \"Clear this directory's account selection, inheriting its parent's selection or the default\",\n )\n .allowExcessArguments(false)\n .action(async () => {\n const ctx = await profileContext();\n const directory = path.resolve(process.cwd());\n const removed = await updateProfileSettings(ctx, (settings) => {\n if (\n settings.directories &&\n Object.hasOwn(settings.directories, directory)\n ) {\n delete settings.directories[directory];\n return true;\n }\n return false;\n });\n if (removed)\n logFinishedStep(`Removed the directory selection for ${directory}.`);\n else logMessage(`No directory selection is saved for ${directory}.`);\n const selected = await getProfileSelection(ctx);\n if (selected !== null)\n logMessage(`Selected account: ${selected.name} (${selected.source})`);\n });\n\nconst profileSettings = new Command(\"settings\")\n .summary(\"Show or change account settings\")\n .description(\n \"Show or change account settings.\\n\\n\" +\n \"Renewing an account login revokes its replaced personal access token unless another saved login uses it. To keep replaced tokens active, run:\\n\\n\" +\n \" `npx convex@latest account settings revoke-replaced-tokens false`\",\n )\n .argument(\"[name]\", \"revoke-replaced-tokens\")\n .argument(\"[value]\", \"true or false\")\n .allowExcessArguments(false)\n .action(async (name, value, _options, cmd) => {\n const ctx = await profileContext();\n const settings = await readProfileSettings(ctx);\n if (name === undefined && value === undefined) {\n logOutput(\n `revoke-replaced-tokens: ${settings.revokeReplacedTokens ?? true}`,\n );\n return;\n }\n if (\n name !== \"revoke-replaced-tokens\" ||\n (value !== \"true\" && value !== \"false\")\n ) {\n cmd.error(\n \"Usage: npx convex account settings revoke-replaced-tokens <true|false>\",\n );\n }\n await updateProfileSettings(ctx, (settings) => {\n settings.revokeReplacedTokens = value === \"true\";\n });\n logFinishedStep(`Set revoke-replaced-tokens to ${value}.`);\n });\n\nexport const account = new Command(\"account\")\n .summary(\"Manage saved accounts and their directory selections\")\n .description(\n \"Manage saved accounts and their directory selections.\\n\\n\" +\n \"Save logins for multiple Convex accounts under names such as work and personal. `npx convex@latest account login` and `npx convex@latest account logout` are aliases for the top-level login and logout commands, with the same options. Select the appropriate account for each personal, work, or client project.\\n\\n\" +\n \"In your personal project directory, save an account:\\n\\n\" +\n \" `npx convex@latest login --account personal --select`\\n\\n\" +\n \"In your work project directory, log in with your work account and check its teams:\\n\\n\" +\n \" `npx convex@latest login --account work --select`\\n\" +\n \" `npx convex@latest login status`\\n\\n\" +\n \"Choose the appropriate account in the browser; sign out of the dashboard first if it is using another account. Upgrade each project's `convex` dependency to a version that supports saved accounts, then run `npx convex dev` to develop with its selected account.\\n\\n\" +\n \"`login --account` saves credentials without changing directory selections. Add `--select` to select the account for this directory and its subdirectories after checking deployment access. The first saved account becomes the default if no other account is saved. To select a saved account in another directory, run `npx convex@latest account select work`. Run `npx convex@latest account deselect` to remove this directory's selection and inherit its parent or default. Run `npx convex@latest account default` to show the default, or `npx convex@latest account default work` to change it. The closest directory selection wins. Selections use absolute paths, so select the account again after moving a project.\\n\\n\" +\n \"The first account name is assigned to your existing login if you are already logged in, and becomes the default for directories without a selection. Use `--force` to authenticate another account instead, keeping the existing login as the default. Names start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, and underscores.\\n\\n\" +\n \"`CONVEX_ACCOUNT` in the shell or project env file overrides directory selections and the default account. Deployment and project keys take priority over saved accounts.\\n\\n\" +\n \"Use `npx convex@latest logout --account work` to remove one account's credentials, or `npx convex@latest logout --all` to remove all saved credentials. Logout preserves directory selections; a logged-out account requires login before use.\\n\\n\" +\n \"After saving accounts, use `npx convex@latest` for login, logout, and account commands in every project directory on this machine. Plain `npx convex` can run the older version installed in that project. Specifying `@latest` runs the latest published CLI without updating the project's dependency.\\n\\n\" +\n \"Older CLIs ignore directory selections and `CONVEX_ACCOUNT`, using the shared login instead (normally the default account). Upgrade the project's `convex` dependency to use saved accounts with project commands such as `npx convex dev` and `npx convex deploy`.\\n\\n\" +\n \"Logging in with an older CLI can change the shared login independently of your saved accounts, or discard account settings if the shared login has been removed. Logging out with an older CLI deletes directory selections and the default selection but leaves named account credentials behind. Recreate any lost selections with `npx convex@latest account select <name>` and `npx convex@latest account default <name>`.\\n\\n\" +\n \"Renewing an account login can revoke its previous token and interrupt running CLI processes of any version that still use it. Restart those commands after renewing the login, or keep replaced tokens active with `npx convex@latest account settings revoke-replaced-tokens false`.\",\n )\n .addCommand(profileList)\n .addCommand(accountSelect)\n .addCommand(profileDefault)\n .addCommand(accountDeselect)\n .addCommand(profileSettings)\n .addCommand(createLoginCommand())\n .addCommand(createLogoutCommand())\n .addHelpCommand(false);\n\nexport async function handleNoAccessToConfiguredProject(\n ctx: Context,\n target: ProjectSelection,\n envFile?: string,\n): Promise<\"retry\" | \"chooseProject\"> {\n const auth = ctx.bigBrainAuth();\n const current = auth?.kind === \"accessToken\" ? auth.profile?.name : undefined;\n const project =\n target.kind === \"deploymentName\"\n ? `deployment \"${target.deploymentName}\"`\n : target.kind === \"teamAndProjectSlugs\"\n ? `project \"${target.teamSlug}/${target.projectSlug}\"`\n : \"the configured project\";\n logWarning(\n `${current ? `Account \"${current}\"` : \"Your account\"} cannot access ${project}. It may belong to another account.`,\n );\n const alternatives: string[] = [];\n if (target.kind !== \"projectDeployKey\") {\n for (const name of savedProfileNames(ctx)) {\n if (name === current) continue;\n const credentials = await readProfileCredentials(ctx, {\n name,\n source: \"saved accounts\",\n });\n if ((await projectAccess(credentials!.accessToken, target)) === \"yes\")\n alternatives.push(name);\n }\n }\n if (!process.stdin.isTTY) {\n const selection = await getProfileSelection(ctx, { envFile });\n const overrideHint = selection?.source.startsWith(\"CONVEX_ACCOUNT\")\n ? ` Update or unset CONVEX_ACCOUNT (${selection.source}) before retrying.`\n : \"\";\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `${\n alternatives.length > 0\n ? `A saved account can access it: ${alternatives.map((name) => `\\`npx convex account select ${name}\\``).join(\" or \")}.`\n : \"Log in to its account with `npx convex login --account <name> --select`.\"\n }${overrideHint} To select a different project, run \\`npx convex dev --configure\\` (this changes CONVEX_DEPLOYMENT).`,\n });\n }\n type Choice =\n | { kind: \"use\"; name: string }\n | { kind: \"login\" }\n | { kind: \"chooseProject\" };\n const choice = await promptOptions<Choice>(ctx, {\n message: \"Which account should this project use?\",\n choices: [\n ...alternatives.map((name) => ({\n name: `Use account \"${name}\"`,\n value: { kind: \"use\", name } as const,\n })),\n { name: \"Log in to another account\", value: { kind: \"login\" } as const },\n {\n name: \"Configure a different project (changes CONVEX_DEPLOYMENT)\",\n value: { kind: \"chooseProject\" } as const,\n },\n ],\n });\n if (choice.kind === \"chooseProject\") return \"chooseProject\";\n const name =\n choice.kind === \"use\"\n ? choice.name\n : await promptString(ctx, {\n message: \"Account name (for example, work):\",\n });\n await validateProfileName(ctx, name);\n if (choice.kind === \"login\") {\n const selection = { name, source: \"account recovery\" };\n await performLogin(ctx, { profile: selection });\n await initializeDefaultProfile(ctx, selection, false);\n }\n if (!(await bindProfileToDirectory(ctx, name, false, target)))\n return \"chooseProject\";\n const selection = await getProfileSelection(ctx, { envFile });\n if (selection?.name !== name) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Remove the account override from ${selection?.source} before retrying.`,\n });\n }\n ctx._updateBigBrainAuth(await readProfileAuth(ctx, selection));\n return \"retry\";\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,kBAAiB;AACjB,mBAAmC;AACnC,oBAAoC;AACpC,qBAAuC;AACvC,iBAKO;AACP,qBAAgD;AAChD,IAAAA,gBAAiD;AACjD,sBASO;AACP,+BAGO;AACP,8BAA8C;AAE9C,qBAA4C;AAE5C,eAAe,iBAAiB;AAC9B,QAAM,MAAM,UAAM,8BAAc,EAAE,UAAU,KAAK,CAAC;AAClD,sDAAgC;AAChC,SAAO;AACT;AAEA,MAAM,cAAc,IAAI,6BAAQ,MAAM,EACnC;AAAA,EACC;AACF,EACC,qBAAqB,KAAK,EAC1B,OAAO,YAAY;AAClB,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,WAAW,UAAM,qCAAoB,GAAG;AAC9C,QAAM,WAAW,UAAM,qCAAoB,GAAG;AAC9C,QAAM,QAAQ,oBAAI,IAAI;AAAA,IACpB,OAAG,mCAAkB,GAAG;AAAA,IACxB,GAAG,OAAO,OAAO,SAAS,eAAe,CAAC,CAAC;AAAA,IAC3C,GAAI,SAAS,mBAAmB,SAC5B,CAAC,IACD,CAAC,SAAS,cAAc;AAAA,IAC5B,GAAI,aAAa,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI;AAAA,EAC7C,CAAC;AACD;AAAA,IACE;AAAA,IACA,OAAO,SAAS,gBAAgB,gBAC9B,mCAAkB,GAAG,EAAE,SAAS;AAAA,EACpC;AACA,MAAI,MAAM,SAAS,GAAG;AACpB;AAAA,MACE,OAAO,SAAS,gBAAgB,WAC3B,UAAM,kCAAmB,KAAK,UAAU,SAAS,WAAW,EAAE,IAC7D,4GACA,kFACF;AAAA,IACN;AACA;AAAA,EACF;AACA,MAAI,aAAa;AACf,+BAAW,qBAAqB,SAAS,IAAI,KAAK,SAAS,MAAM,GAAG;AACtE,MAAI,SAAS,mBAAmB;AAC9B,+BAAW,oBAAoB,SAAS,cAAc,EAAE;AAC1D,aAAW,QAAQ,CAAC,GAAG,KAAK,EAAE,KAAK,GAAG;AACpC,UAAM,cAAc,UAAM;AAAA,MACxB;AAAA,MACA,EAAE,MAAM,QAAQ,iBAAiB;AAAA,MACjC;AAAA,IACF;AACA,UAAM,QACJ,gBAAgB,QACf,UAAM,kCAAmB,KAAK,UAAU,YAAY,WAAW,EAAE;AACpE,UAAM,QAAQ,GAAG,IAAI,GAAG,aAAa,QAAQ,KAAK,YAAY,KAAK,MAAM,EAAE;AAC3E,UAAM,SACJ,gBAAgB,OACZ,gCACA,QACE,KACA;AACR,8BAAU,GAAG,KAAK,GAAG,MAAM,EAAE;AAC7B,eAAW,CAAC,WAAW,OAAO,KAAK,OAAO;AAAA,MACxC,SAAS,eAAe,CAAC;AAAA,IAC3B,GAAG;AACD,UAAI,YAAY,KAAM,2BAAU,OAAO,SAAS,EAAE;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAEH,MAAM,gBAAgB,IAAI,6BAAQ,QAAQ,EACvC,YAAY,8DAA8D,EAC1E,SAAS,aAAa,wCAAwC,EAC9D;AAAA,EACC;AAAA,EACA;AACF,EACC,qBAAqB,KAAK,EAC1B,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,MAAM,MAAM,eAAe;AACjC,MAAI,CAAE,UAAM,iDAAuB,KAAK,MAAM,QAAQ,KAAK,GAAI;AAC7D,UAAM,IAAI,MAAM;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF,CAAC;AAEH,MAAM,iBAAiB,IAAI,6BAAQ,SAAS,EACzC;AAAA,EACC;AACF,EACC,SAAS,aAAa,cAAc,EACpC,qBAAqB,KAAK,EAC1B,OAAO,OAAO,SAAS;AACtB,QAAM,MAAM,MAAM,eAAe;AACjC,MAAI,SAAS,QAAW;AACtB,UAAM,WAAW,UAAM,qCAAoB,GAAG;AAC9C;AAAA,MACE,SAAS,mBAAmB,SACxB,+BACA,oBAAoB,SAAS,cAAc;AAAA,IACjD;AACA;AAAA,EACF;AACA,YAAM,uCAAsB,KAAK,OAAO,aAAa;AACnD,UAAM,cAAc,UAAM,wCAAuB,KAAK;AAAA,MACpD;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,aAAS,iBAAiB;AAC1B,aAAS,cAAc,YAAa;AAAA,EACtC,CAAC;AACD,kCAAgB,oBAAoB,IAAI,EAAE;AAC5C,CAAC;AAEH,MAAM,kBAAkB,IAAI,6BAAQ,UAAU,EAC3C;AAAA,EACC;AACF,EACC,qBAAqB,KAAK,EAC1B,OAAO,YAAY;AAClB,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,YAAY,YAAAC,QAAK,QAAQ,QAAQ,IAAI,CAAC;AAC5C,QAAM,UAAU,UAAM,uCAAsB,KAAK,CAAC,aAAa;AAC7D,QACE,SAAS,eACT,OAAO,OAAO,SAAS,aAAa,SAAS,GAC7C;AACA,aAAO,SAAS,YAAY,SAAS;AACrC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI;AACF,oCAAgB,uCAAuC,SAAS,GAAG;AAAA,MAChE,4BAAW,uCAAuC,SAAS,GAAG;AACnE,QAAM,WAAW,UAAM,qCAAoB,GAAG;AAC9C,MAAI,aAAa;AACf,+BAAW,qBAAqB,SAAS,IAAI,KAAK,SAAS,MAAM,GAAG;AACxE,CAAC;AAEH,MAAM,kBAAkB,IAAI,6BAAQ,UAAU,EAC3C,QAAQ,iCAAiC,EACzC;AAAA,EACC;AAGF,EACC,SAAS,UAAU,wBAAwB,EAC3C,SAAS,WAAW,eAAe,EACnC,qBAAqB,KAAK,EAC1B,OAAO,OAAO,MAAM,OAAO,UAAU,QAAQ;AAC5C,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,WAAW,UAAM,qCAAoB,GAAG;AAC9C,MAAI,SAAS,UAAa,UAAU,QAAW;AAC7C;AAAA,MACE,2BAA2B,SAAS,wBAAwB,IAAI;AAAA,IAClE;AACA;AAAA,EACF;AACA,MACE,SAAS,4BACR,UAAU,UAAU,UAAU,SAC/B;AACA,QAAI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,YAAM,uCAAsB,KAAK,CAACC,cAAa;AAC7C,IAAAA,UAAS,uBAAuB,UAAU;AAAA,EAC5C,CAAC;AACD,kCAAgB,iCAAiC,KAAK,GAAG;AAC3D,CAAC;AAEI,MAAM,UAAU,IAAI,6BAAQ,SAAS,EACzC,QAAQ,sDAAsD,EAC9D;AAAA,EACC;AAgBF,EACC,WAAW,WAAW,EACtB,WAAW,aAAa,EACxB,WAAW,cAAc,EACzB,WAAW,eAAe,EAC1B,WAAW,eAAe,EAC1B,eAAW,iCAAmB,CAAC,EAC/B,eAAW,mCAAoB,CAAC,EAChC,eAAe,KAAK;AAEvB,eAAsB,kCACpB,KACA,QACA,SACoC;AACpC,QAAM,OAAO,IAAI,aAAa;AAC9B,QAAM,UAAU,MAAM,SAAS,gBAAgB,KAAK,SAAS,OAAO;AACpE,QAAM,UACJ,OAAO,SAAS,mBACZ,eAAe,OAAO,cAAc,MACpC,OAAO,SAAS,wBACd,YAAY,OAAO,QAAQ,IAAI,OAAO,WAAW,MACjD;AACR;AAAA,IACE,GAAG,UAAU,YAAY,OAAO,MAAM,cAAc,kBAAkB,OAAO;AAAA,EAC/E;AACA,QAAM,eAAyB,CAAC;AAChC,MAAI,OAAO,SAAS,oBAAoB;AACtC,eAAWC,aAAQ,mCAAkB,GAAG,GAAG;AACzC,UAAIA,UAAS,QAAS;AACtB,YAAM,cAAc,UAAM,wCAAuB,KAAK;AAAA,QACpD,MAAAA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,UAAK,UAAM,wCAAc,YAAa,aAAa,MAAM,MAAO;AAC9D,qBAAa,KAAKA,KAAI;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAMC,aAAY,UAAM,qCAAoB,KAAK,EAAE,QAAQ,CAAC;AAC5D,UAAM,eAAeA,YAAW,OAAO,WAAW,gBAAgB,IAC9D,oCAAoCA,WAAU,MAAM,uBACpD;AACJ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,GACd,aAAa,SAAS,IAClB,kCAAkC,aAAa,IAAI,CAACD,UAAS,+BAA+BA,KAAI,IAAI,EAAE,KAAK,MAAM,CAAC,MAClH,0EACN,GAAG,YAAY;AAAA,IACjB,CAAC;AAAA,EACH;AAKA,QAAM,SAAS,UAAM,8BAAsB,KAAK;AAAA,IAC9C,SAAS;AAAA,IACT,SAAS;AAAA,MACP,GAAG,aAAa,IAAI,CAACA,WAAU;AAAA,QAC7B,MAAM,gBAAgBA,KAAI;AAAA,QAC1B,OAAO,EAAE,MAAM,OAAO,MAAAA,MAAK;AAAA,MAC7B,EAAE;AAAA,MACF,EAAE,MAAM,6BAA6B,OAAO,EAAE,MAAM,QAAQ,EAAW;AAAA,MACvE;AAAA,QACE,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,gBAAgB;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,gBAAiB,QAAO;AAC5C,QAAM,OACJ,OAAO,SAAS,QACZ,OAAO,OACP,UAAM,6BAAa,KAAK;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AACP,YAAM,qCAAoB,KAAK,IAAI;AACnC,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAMC,aAAY,EAAE,MAAM,QAAQ,mBAAmB;AACrD,cAAM,4BAAa,KAAK,EAAE,SAASA,WAAU,CAAC;AAC9C,cAAM,0CAAyB,KAAKA,YAAW,KAAK;AAAA,EACtD;AACA,MAAI,CAAE,UAAM,iDAAuB,KAAK,MAAM,OAAO,MAAM;AACzD,WAAO;AACT,QAAM,YAAY,UAAM,qCAAoB,KAAK,EAAE,QAAQ,CAAC;AAC5D,MAAI,WAAW,SAAS,MAAM;AAC5B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,oCAAoC,WAAW,MAAM;AAAA,IACvE,CAAC;AAAA,EACH;AACA,MAAI,oBAAoB,UAAM,iCAAgB,KAAK,SAAS,CAAC;AAC7D,SAAO;AACT;",
6
+ "names": ["import_login", "path", "settings", "name", "selection"]
7
+ }
@@ -36,6 +36,7 @@ __export(configure_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(configure_exports);
38
38
  var import_chalk = require("chalk");
39
+ var import_account = require("./account.js");
39
40
  var import_log = require("../bundler/log.js");
40
41
  var import_api = require("./lib/api.js");
41
42
  var import_config = require("./lib/config.js");
@@ -220,11 +221,23 @@ async function handleDeploymentWithinProject(ctx, {
220
221
  );
221
222
  return result;
222
223
  }
223
- const accessResult = await (0, import_api.checkAccessToSelectedProject)(
224
+ let accessResult = await (0, import_api.checkAccessToSelectedProject)(
224
225
  ctx,
225
226
  deploymentSelection.targetProject
226
227
  );
227
- if (accessResult.kind === "noAccess") {
228
+ while (accessResult.kind === "noAccess") {
229
+ const next = cmdOptions.team !== void 0 && cmdOptions.project !== void 0 ? "chooseProject" : await (0, import_account.handleNoAccessToConfiguredProject)(
230
+ ctx,
231
+ deploymentSelection.targetProject,
232
+ cmdOptions.envFile
233
+ );
234
+ if (next === "retry") {
235
+ accessResult = await (0, import_api.checkAccessToSelectedProject)(
236
+ ctx,
237
+ deploymentSelection.targetProject
238
+ );
239
+ continue;
240
+ }
228
241
  (0, import_log.logMessage)("You don't have access to the selected project.");
229
242
  const result = await handleChooseProject(
230
243
  ctx,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/configure.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentType,\n DeploymentName,\n fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows,\n createProject,\n loadSelectedDeploymentCredentials,\n checkAccessToSelectedProject,\n DeploymentSelectionWithinProject,\n} from \"./lib/api.js\";\nimport { readProjectConfig, ensureConvexFunctionsDir } from \"./lib/config.js\";\nimport {\n DeploymentDetails,\n eraseDeploymentEnvVar,\n writeDeploymentEnvVar,\n} from \"./lib/deployment.js\";\nimport { finalizeConfiguration } from \"./lib/init.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n functionsDir,\n hasProjects,\n logAndHandleFetchError,\n selectDevDeploymentType,\n selectRegionOrUseDefault,\n validateOrSelectProject,\n validateOrSelectTeam,\n} from \"./lib/utils/utils.js\";\nimport { writeUrlsToEnvFile } from \"./lib/envvars.js\";\nimport path from \"path\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\nimport { doInitConvexFolder } from \"./lib/codegen.js\";\nimport { handleLocalDeployment } from \"./lib/localDeployment/localDeployment.js\";\nimport {\n promptOptions,\n promptString,\n promptYesNo,\n} from \"./lib/utils/prompts.js\";\nimport { attemptSetupAiFiles } from \"./lib/aiFiles/index.js\";\nimport {\n DeploymentSelection,\n deploymentNameFromSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport { ensureLoggedIn } from \"./lib/login.js\";\nimport { handleAnonymousDeployment } from \"./lib/localDeployment/anonymous.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\ntype DeploymentCredentials = {\n url: string;\n adminKey: string;\n};\n\ntype ChosenConfiguration =\n // `--configure new`\n | \"new\"\n // `--configure existing`\n | \"existing\"\n // `--configure`\n | \"ask\"\n // `--configure` was not specified\n | null;\n\ntype ConfigureCmdOptions = {\n prod: boolean;\n localOptions: {\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n overrideAuthUrl?: string | undefined;\n overrideAuthClient?: string | undefined;\n overrideAuthUsername?: string | undefined;\n overrideAuthPassword?: string | undefined;\n};\n\n/**\n * As of writing, this is used by:\n * - `npx convex dev`\n * - `npx convex init`\n *\n * But is not used by `npx convex deploy`, `npx convex codegen`,\n * `npx convex env`, or other commands.\n */\nexport async function deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n siteUrl: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n }\n> {\n const selectedDeployment = await _deploymentCredentialsOrConfigure(\n ctx,\n deploymentSelection,\n chosenConfiguration,\n cmdOptions,\n );\n const { convexCloudUrl, convexSiteUrl: siteUrl } =\n await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: selectedDeployment.adminKey,\n deploymentUrl: selectedDeployment.url,\n });\n const applicationUrl = deploymentUrlForApplicationEnv(\n selectedDeployment,\n convexCloudUrl,\n );\n\n if (selectedDeployment.deploymentFields !== null) {\n // Set the `CONVEX_DEPLOYMENT` env var + the `CONVEX_URL` env var\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: applicationUrl,\n siteUrl,\n deploymentName: selectedDeployment.deploymentFields.deploymentName,\n teamSlug: selectedDeployment.deploymentFields.teamSlug,\n projectSlug: selectedDeployment.deploymentFields.projectSlug,\n deploymentType: selectedDeployment.deploymentFields.deploymentType,\n },\n deploymentNameFromSelection(deploymentSelection),\n );\n } else {\n // Clear the `CONVEX_DEPLOYMENT` env var + set the `CONVEX_URL` and\n // `CONVEX_SITE_URL` env vars.\n await handleManuallySetUrlAndAdminKey(ctx, {\n url: selectedDeployment.url,\n siteUrl,\n adminKey: selectedDeployment.adminKey,\n });\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields:\n selectedDeployment.deploymentFields === null\n ? null\n : { ...selectedDeployment.deploymentFields, siteUrl: siteUrl },\n };\n}\n\nexport function deploymentUrlForApplicationEnv(\n selectedDeployment: {\n url: string;\n deploymentFields: { deploymentType: DeploymentType } | null;\n },\n canonicalCloudUrl: string,\n): string {\n const deploymentType = selectedDeployment.deploymentFields?.deploymentType;\n return deploymentType !== undefined &&\n deploymentType !== \"local\" &&\n deploymentType !== \"anonymous\"\n ? canonicalCloudUrl\n : selectedDeployment.url;\n}\n\nexport async function _deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n }\n> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n return {\n url: deploymentSelection.deploymentToActOn.url,\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\": {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n case \"preview\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Use `npx convex deploy` to use preview deployments.\",\n });\n case \"deploymentWithinProject\": {\n return await handleDeploymentWithinProject(ctx, {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n });\n }\n case \"anonymous\": {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const isAgentMode = process.env.CONVEX_AGENT_MODE === \"anonymous\";\n if (\n !isAgentMode &&\n process.stdin.isTTY &&\n hasAuth &&\n deploymentSelection.deploymentName !== null\n ) {\n const shouldConfigure =\n chosenConfiguration !== null ||\n (await promptYesNo(ctx, {\n message: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is configured with deployment ${deploymentSelection.deploymentName}, which is not linked with your account. Would you like to link it now?`,\n }));\n if (shouldConfigure) {\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n const alreadyHasConfiguredAnonymousDeployment =\n deploymentSelection.deploymentName !== null &&\n chosenConfiguration === null;\n if (isAgentMode) {\n logWarning(\n chalkStderr.yellow.bold(\n \"CONVEX_AGENT_MODE=anonymous mode is in beta, functionality may change in the future.\",\n ),\n );\n }\n\n const shouldPromptForLogin =\n isAgentMode || !process.stdin.isTTY\n ? \"no\"\n : alreadyHasConfiguredAnonymousDeployment\n ? \"no\"\n : await promptOptions(ctx, {\n message:\n \"Welcome to Convex! Would you like to login to your account?\",\n choices: [\n {\n name: \"Start without an account (run Convex locally)\",\n value: \"no\",\n },\n { name: \"Login or create an account\", value: \"yes\" },\n ],\n default: \"no\",\n });\n if (shouldPromptForLogin === \"no\") {\n const result = await handleAnonymousDeployment(ctx, {\n chosenConfiguration,\n deploymentName: deploymentSelection.deploymentName,\n ...cmdOptions.localOptions,\n });\n return {\n adminKey: result.adminKey,\n url: result.deploymentUrl,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n}\n\nasync function handleDeploymentWithinProject(\n ctx: Context,\n {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n }: {\n chosenConfiguration: ChosenConfiguration;\n deploymentSelection: DeploymentSelection & {\n kind: \"deploymentWithinProject\";\n };\n cmdOptions: ConfigureCmdOptions;\n },\n) {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const loginMessage =\n hasAuth && shouldAllowAnonymousDevelopment()\n ? undefined\n : \"Tip: You can try out Convex without creating an account by clearing the \" +\n `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} environment variable (often in .env.local).`;\n await ensureLoggedIn(ctx, {\n message: loginMessage,\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n if (chosenConfiguration !== null) {\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n const accessResult = await checkAccessToSelectedProject(\n ctx,\n deploymentSelection.targetProject,\n );\n if (accessResult.kind === \"noAccess\") {\n logMessage(\"You don't have access to the selected project.\");\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n const selectedDeployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n // We'll start running it below\n { ensureLocalRunning: false },\n );\n if (\n selectedDeployment.deploymentFields !== null &&\n selectedDeployment.deploymentFields.deploymentType === \"local\"\n ) {\n // Start running the local backend, which may bind to different ports\n // than what was saved from a previous run.\n const localDeployment = await handleLocalDeployment(ctx, {\n teamSlug: selectedDeployment.deploymentFields.teamSlug!,\n projectSlug: selectedDeployment.deploymentFields.projectSlug!,\n forceUpgrade: cmdOptions.localOptions.forceUpgrade,\n ports: cmdOptions.localOptions.ports,\n backendVersion: cmdOptions.localOptions.backendVersion,\n });\n return {\n url: localDeployment.deploymentUrl,\n adminKey: localDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n }\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n}\n\nasync function handleChooseProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n selectionWithinProject: DeploymentSelectionWithinProject,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n };\n }\n> {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n const project = await selectProject(ctx, chosenConfiguration, {\n team: cmdOptions.team,\n project: cmdOptions.project,\n devDeployment: cmdOptions.devDeployment,\n });\n if (\n selectionWithinProject.kind === \"prod\" ||\n project.devDeployment !== \"local\"\n ) {\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n }\n const deploymentOptions: DeploymentOptions =\n selectionWithinProject.kind === \"prod\"\n ? { kind: \"prod\" }\n : project.devDeployment === \"local\"\n ? { kind: \"local\", ...cmdOptions.localOptions }\n : { kind: \"dev\" };\n const {\n deploymentName,\n deploymentUrl: url,\n adminKey,\n reference,\n isDefault,\n } = await ensureDeploymentProvisioned(ctx, {\n teamSlug: project.teamSlug,\n projectSlug: project.projectSlug,\n deploymentOptions,\n });\n return {\n url,\n adminKey,\n deploymentFields: {\n deploymentName,\n deploymentType: deploymentOptions.kind,\n projectSlug: project.projectSlug,\n teamSlug: project.teamSlug,\n reference,\n isDefault,\n },\n };\n}\n\nasync function handleManuallySetUrlAndAdminKey(\n ctx: Context,\n cmdOptions: { url: string; siteUrl: string; adminKey: string },\n) {\n const { url, siteUrl, adminKey } = cmdOptions;\n const didErase = await eraseDeploymentEnvVar(ctx);\n if (didErase) {\n logMessage(\n chalkStderr.yellowBright(\n `Removed the CONVEX_DEPLOYMENT environment variable from .env.local`,\n ),\n );\n }\n const envFileConfig = await writeUrlsToEnvFile(ctx, {\n convexUrl: url,\n siteUrl,\n });\n if (\n envFileConfig !== null &&\n (envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar)\n ) {\n // Join both names with \" and \" if both exist, otherwise just use one of them.\n const updatedVars = [\n envFileConfig.convexUrlEnvVar,\n envFileConfig.siteUrlEnvVar,\n ]\n .filter(Boolean)\n .join(\" and \");\n logMessage(\n chalkStderr.green(`Saved ${updatedVars} to ${envFileConfig.envFile}`),\n );\n }\n return { url, adminKey };\n}\n\nexport async function selectProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n defaultProjectName?: string | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n // Prompt the user to select a project.\n const choice =\n chosenConfiguration !== \"ask\" && chosenConfiguration !== null\n ? chosenConfiguration\n : await askToConfigure(ctx);\n switch (choice) {\n case \"new\":\n return selectNewProject(ctx, chosenConfiguration, cmdOptions);\n case \"existing\":\n return selectExistingProject(ctx, chosenConfiguration, cmdOptions);\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No project selected.\",\n });\n }\n}\n\nconst cwd = path.basename(process.cwd());\nasync function selectNewProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n defaultProjectName?: string | undefined;\n },\n) {\n const { team: selectedTeam, chosen: didChooseBetweenTeams } =\n await validateOrSelectTeam(ctx, config.team, \"Team:\");\n let projectName: string = config.project || cwd;\n let choseProjectInteractively = false;\n if (!config.project) {\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n default: config.defaultProjectName || cwd,\n });\n choseProjectInteractively = true;\n }\n\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"new\",\n teamSlug: selectedTeam.slug,\n userHasChosenSomethingInteractively:\n didChooseBetweenTeams || choseProjectInteractively,\n projectSlug: undefined,\n devDeploymentFromFlag: config.devDeployment,\n });\n\n const region =\n devDeployment === \"cloud\"\n ? await selectRegionOrUseDefault(ctx, selectedTeam, \"dev\")\n : null;\n\n showSpinner(\"Creating new Convex project...\");\n\n const deploymentToProvision =\n devDeployment === \"cloud\"\n ? {\n deploymentType: \"dev\" as const,\n region,\n }\n : null;\n\n let projectSlug;\n try {\n ({ projectSlug } = await createProject(ctx, {\n teamId: selectedTeam.id,\n projectName,\n deploymentToProvision,\n }));\n } catch (err) {\n logFailure(\"Unable to create project.\");\n return await logAndHandleFetchError(ctx, err);\n }\n const teamSlug = selectedTeam.slug;\n const teamMessage = didChooseBetweenTeams\n ? \" in team \" + chalkStderr.bold(teamSlug)\n : \"\";\n logFinishedStep(\n `Created project ${chalkStderr.bold(\n projectSlug,\n )}${teamMessage}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(teamSlug, projectSlug),\n )}`,\n );\n\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const folder = functionsDir(configPath, projectConfig);\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir: path.resolve(folder),\n projectDir: path.resolve(path.dirname(configPath)),\n });\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function selectExistingProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n const {\n team: { id: teamId, slug: teamSlug },\n chosen,\n } = await validateOrSelectTeam(ctx, config.team, \"Team:\");\n\n const projectSlug = await validateOrSelectProject(\n ctx,\n config.project,\n teamId,\n \"Configure project\",\n \"Project:\",\n );\n if (projectSlug === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Run the command again to create a new project instead.\",\n });\n }\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"existing\",\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively: chosen || !config.project,\n devDeploymentFromFlag: config.devDeployment,\n });\n\n logFinishedStep(`Reinitialized project ${chalkStderr.bold(projectSlug)}`);\n\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function askToConfigure(ctx: Context): Promise<\"new\" | \"existing\"> {\n if (!(await hasProjects(ctx))) {\n return \"new\";\n }\n return await promptOptions(ctx, {\n message: \"What would you like to configure?\",\n default: \"new\",\n choices: [\n { name: \"create a new project\", value: \"new\" },\n { name: \"choose an existing project\", value: \"existing\" },\n ],\n });\n}\n\ntype DeploymentOptions =\n | {\n kind: \"prod\";\n }\n | { kind: \"dev\" }\n | {\n kind: \"local\";\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n\n/**\n * This method assumes that the member has access to the selected project.\n */\nasync function ensureDeploymentProvisioned(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n deploymentOptions: DeploymentOptions;\n },\n): Promise<DeploymentDetails> {\n switch (options.deploymentOptions.kind) {\n case \"dev\":\n case \"prod\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n },\n options.deploymentOptions.kind,\n );\n return credentials;\n }\n case \"local\": {\n const credentials = await handleLocalDeployment(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n ...options.deploymentOptions,\n });\n return credentials;\n }\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n errForSentry: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n });\n }\n}\n\nexport async function updateEnvAndConfigForDeploymentSelection(\n ctx: Context,\n options: {\n url: string;\n siteUrl?: string | null;\n deploymentName: string;\n teamSlug: string | null;\n projectSlug: string | null;\n deploymentType: DeploymentType;\n },\n existingValue: string | null,\n) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n\n const { wroteToGitIgnore, changedDeploymentEnvVar } =\n options.deploymentType !== \"prod\"\n ? await writeDeploymentEnvVar(\n ctx,\n options.deploymentType,\n {\n team: options.teamSlug,\n project: options.projectSlug,\n deploymentName: options.deploymentName,\n },\n existingValue,\n )\n : { wroteToGitIgnore: false, changedDeploymentEnvVar: false };\n await ensureConvexFunctionsDir(ctx, projectConfig);\n await finalizeConfiguration(ctx, {\n deploymentType: options.deploymentType,\n deploymentName: options.deploymentName,\n url: options.url,\n siteUrl: options.siteUrl,\n wroteToGitIgnore,\n changedDeploymentEnvVar,\n functionsPath: functionsDir(configPath, projectConfig),\n });\n}\n\nasync function assertLocalOptionsAreDefault(\n ctx: Context,\n localOptions: ConfigureCmdOptions[\"localOptions\"],\n) {\n if (localOptions.ports.cloud !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-cloud-port` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.ports.site !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-site-port` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.backendVersion !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-backend-version` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.dashboardVersion !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-dashboard-version` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.forceUpgrade === true) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-force-upgrade` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { handleNoAccessToConfiguredProject } from \"./account.js\";\nimport { Context } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentType,\n DeploymentName,\n fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows,\n createProject,\n loadSelectedDeploymentCredentials,\n checkAccessToSelectedProject,\n DeploymentSelectionWithinProject,\n} from \"./lib/api.js\";\nimport { readProjectConfig, ensureConvexFunctionsDir } from \"./lib/config.js\";\nimport {\n DeploymentDetails,\n eraseDeploymentEnvVar,\n writeDeploymentEnvVar,\n} from \"./lib/deployment.js\";\nimport { finalizeConfiguration } from \"./lib/init.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n functionsDir,\n hasProjects,\n logAndHandleFetchError,\n selectDevDeploymentType,\n selectRegionOrUseDefault,\n validateOrSelectProject,\n validateOrSelectTeam,\n} from \"./lib/utils/utils.js\";\nimport { writeUrlsToEnvFile } from \"./lib/envvars.js\";\nimport path from \"path\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\nimport { doInitConvexFolder } from \"./lib/codegen.js\";\nimport { handleLocalDeployment } from \"./lib/localDeployment/localDeployment.js\";\nimport {\n promptOptions,\n promptString,\n promptYesNo,\n} from \"./lib/utils/prompts.js\";\nimport { attemptSetupAiFiles } from \"./lib/aiFiles/index.js\";\nimport {\n DeploymentSelection,\n deploymentNameFromSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport { ensureLoggedIn } from \"./lib/login.js\";\nimport { handleAnonymousDeployment } from \"./lib/localDeployment/anonymous.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\ntype DeploymentCredentials = {\n url: string;\n adminKey: string;\n};\n\ntype ChosenConfiguration =\n // `--configure new`\n | \"new\"\n // `--configure existing`\n | \"existing\"\n // `--configure`\n | \"ask\"\n // `--configure` was not specified\n | null;\n\ntype ConfigureCmdOptions = {\n prod: boolean;\n localOptions: {\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n overrideAuthUrl?: string | undefined;\n overrideAuthClient?: string | undefined;\n overrideAuthUsername?: string | undefined;\n overrideAuthPassword?: string | undefined;\n};\n\n/**\n * As of writing, this is used by:\n * - `npx convex dev`\n * - `npx convex init`\n *\n * But is not used by `npx convex deploy`, `npx convex codegen`,\n * `npx convex env`, or other commands.\n */\nexport async function deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n siteUrl: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n }\n> {\n const selectedDeployment = await _deploymentCredentialsOrConfigure(\n ctx,\n deploymentSelection,\n chosenConfiguration,\n cmdOptions,\n );\n const { convexCloudUrl, convexSiteUrl: siteUrl } =\n await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: selectedDeployment.adminKey,\n deploymentUrl: selectedDeployment.url,\n });\n const applicationUrl = deploymentUrlForApplicationEnv(\n selectedDeployment,\n convexCloudUrl,\n );\n\n if (selectedDeployment.deploymentFields !== null) {\n // Set the `CONVEX_DEPLOYMENT` env var + the `CONVEX_URL` env var\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: applicationUrl,\n siteUrl,\n deploymentName: selectedDeployment.deploymentFields.deploymentName,\n teamSlug: selectedDeployment.deploymentFields.teamSlug,\n projectSlug: selectedDeployment.deploymentFields.projectSlug,\n deploymentType: selectedDeployment.deploymentFields.deploymentType,\n },\n deploymentNameFromSelection(deploymentSelection),\n );\n } else {\n // Clear the `CONVEX_DEPLOYMENT` env var + set the `CONVEX_URL` and\n // `CONVEX_SITE_URL` env vars.\n await handleManuallySetUrlAndAdminKey(ctx, {\n url: selectedDeployment.url,\n siteUrl,\n adminKey: selectedDeployment.adminKey,\n });\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields:\n selectedDeployment.deploymentFields === null\n ? null\n : { ...selectedDeployment.deploymentFields, siteUrl: siteUrl },\n };\n}\n\nexport function deploymentUrlForApplicationEnv(\n selectedDeployment: {\n url: string;\n deploymentFields: { deploymentType: DeploymentType } | null;\n },\n canonicalCloudUrl: string,\n): string {\n const deploymentType = selectedDeployment.deploymentFields?.deploymentType;\n return deploymentType !== undefined &&\n deploymentType !== \"local\" &&\n deploymentType !== \"anonymous\"\n ? canonicalCloudUrl\n : selectedDeployment.url;\n}\n\nexport async function _deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n }\n> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n return {\n url: deploymentSelection.deploymentToActOn.url,\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\": {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n case \"preview\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Use `npx convex deploy` to use preview deployments.\",\n });\n case \"deploymentWithinProject\": {\n return await handleDeploymentWithinProject(ctx, {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n });\n }\n case \"anonymous\": {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const isAgentMode = process.env.CONVEX_AGENT_MODE === \"anonymous\";\n if (\n !isAgentMode &&\n process.stdin.isTTY &&\n hasAuth &&\n deploymentSelection.deploymentName !== null\n ) {\n const shouldConfigure =\n chosenConfiguration !== null ||\n (await promptYesNo(ctx, {\n message: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is configured with deployment ${deploymentSelection.deploymentName}, which is not linked with your account. Would you like to link it now?`,\n }));\n if (shouldConfigure) {\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n const alreadyHasConfiguredAnonymousDeployment =\n deploymentSelection.deploymentName !== null &&\n chosenConfiguration === null;\n if (isAgentMode) {\n logWarning(\n chalkStderr.yellow.bold(\n \"CONVEX_AGENT_MODE=anonymous mode is in beta, functionality may change in the future.\",\n ),\n );\n }\n\n const shouldPromptForLogin =\n isAgentMode || !process.stdin.isTTY\n ? \"no\"\n : alreadyHasConfiguredAnonymousDeployment\n ? \"no\"\n : await promptOptions(ctx, {\n message:\n \"Welcome to Convex! Would you like to login to your account?\",\n choices: [\n {\n name: \"Start without an account (run Convex locally)\",\n value: \"no\",\n },\n { name: \"Login or create an account\", value: \"yes\" },\n ],\n default: \"no\",\n });\n if (shouldPromptForLogin === \"no\") {\n const result = await handleAnonymousDeployment(ctx, {\n chosenConfiguration,\n deploymentName: deploymentSelection.deploymentName,\n ...cmdOptions.localOptions,\n });\n return {\n adminKey: result.adminKey,\n url: result.deploymentUrl,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n}\n\nasync function handleDeploymentWithinProject(\n ctx: Context,\n {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n }: {\n chosenConfiguration: ChosenConfiguration;\n deploymentSelection: DeploymentSelection & {\n kind: \"deploymentWithinProject\";\n };\n cmdOptions: ConfigureCmdOptions;\n },\n) {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const loginMessage =\n hasAuth && shouldAllowAnonymousDevelopment()\n ? undefined\n : \"Tip: You can try out Convex without creating an account by clearing the \" +\n `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} environment variable (often in .env.local).`;\n await ensureLoggedIn(ctx, {\n message: loginMessage,\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n if (chosenConfiguration !== null) {\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n let accessResult = await checkAccessToSelectedProject(\n ctx,\n deploymentSelection.targetProject,\n );\n while (accessResult.kind === \"noAccess\") {\n const next =\n cmdOptions.team !== undefined && cmdOptions.project !== undefined\n ? \"chooseProject\"\n : await handleNoAccessToConfiguredProject(\n ctx,\n deploymentSelection.targetProject,\n cmdOptions.envFile,\n );\n if (next === \"retry\") {\n accessResult = await checkAccessToSelectedProject(\n ctx,\n deploymentSelection.targetProject,\n );\n continue;\n }\n logMessage(\"You don't have access to the selected project.\");\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n const selectedDeployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n // We'll start running it below\n { ensureLocalRunning: false },\n );\n if (\n selectedDeployment.deploymentFields !== null &&\n selectedDeployment.deploymentFields.deploymentType === \"local\"\n ) {\n // Start running the local backend, which may bind to different ports\n // than what was saved from a previous run.\n const localDeployment = await handleLocalDeployment(ctx, {\n teamSlug: selectedDeployment.deploymentFields.teamSlug!,\n projectSlug: selectedDeployment.deploymentFields.projectSlug!,\n forceUpgrade: cmdOptions.localOptions.forceUpgrade,\n ports: cmdOptions.localOptions.ports,\n backendVersion: cmdOptions.localOptions.backendVersion,\n });\n return {\n url: localDeployment.deploymentUrl,\n adminKey: localDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n }\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n}\n\nasync function handleChooseProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n selectionWithinProject: DeploymentSelectionWithinProject,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n };\n }\n> {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n const project = await selectProject(ctx, chosenConfiguration, {\n team: cmdOptions.team,\n project: cmdOptions.project,\n devDeployment: cmdOptions.devDeployment,\n });\n if (\n selectionWithinProject.kind === \"prod\" ||\n project.devDeployment !== \"local\"\n ) {\n await assertLocalOptionsAreDefault(ctx, cmdOptions.localOptions);\n }\n const deploymentOptions: DeploymentOptions =\n selectionWithinProject.kind === \"prod\"\n ? { kind: \"prod\" }\n : project.devDeployment === \"local\"\n ? { kind: \"local\", ...cmdOptions.localOptions }\n : { kind: \"dev\" };\n const {\n deploymentName,\n deploymentUrl: url,\n adminKey,\n reference,\n isDefault,\n } = await ensureDeploymentProvisioned(ctx, {\n teamSlug: project.teamSlug,\n projectSlug: project.projectSlug,\n deploymentOptions,\n });\n return {\n url,\n adminKey,\n deploymentFields: {\n deploymentName,\n deploymentType: deploymentOptions.kind,\n projectSlug: project.projectSlug,\n teamSlug: project.teamSlug,\n reference,\n isDefault,\n },\n };\n}\n\nasync function handleManuallySetUrlAndAdminKey(\n ctx: Context,\n cmdOptions: { url: string; siteUrl: string; adminKey: string },\n) {\n const { url, siteUrl, adminKey } = cmdOptions;\n const didErase = await eraseDeploymentEnvVar(ctx);\n if (didErase) {\n logMessage(\n chalkStderr.yellowBright(\n `Removed the CONVEX_DEPLOYMENT environment variable from .env.local`,\n ),\n );\n }\n const envFileConfig = await writeUrlsToEnvFile(ctx, {\n convexUrl: url,\n siteUrl,\n });\n if (\n envFileConfig !== null &&\n (envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar)\n ) {\n // Join both names with \" and \" if both exist, otherwise just use one of them.\n const updatedVars = [\n envFileConfig.convexUrlEnvVar,\n envFileConfig.siteUrlEnvVar,\n ]\n .filter(Boolean)\n .join(\" and \");\n logMessage(\n chalkStderr.green(`Saved ${updatedVars} to ${envFileConfig.envFile}`),\n );\n }\n return { url, adminKey };\n}\n\nexport async function selectProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n defaultProjectName?: string | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n // Prompt the user to select a project.\n const choice =\n chosenConfiguration !== \"ask\" && chosenConfiguration !== null\n ? chosenConfiguration\n : await askToConfigure(ctx);\n switch (choice) {\n case \"new\":\n return selectNewProject(ctx, chosenConfiguration, cmdOptions);\n case \"existing\":\n return selectExistingProject(ctx, chosenConfiguration, cmdOptions);\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No project selected.\",\n });\n }\n}\n\nconst cwd = path.basename(process.cwd());\nasync function selectNewProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n defaultProjectName?: string | undefined;\n },\n) {\n const { team: selectedTeam, chosen: didChooseBetweenTeams } =\n await validateOrSelectTeam(ctx, config.team, \"Team:\");\n let projectName: string = config.project || cwd;\n let choseProjectInteractively = false;\n if (!config.project) {\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n default: config.defaultProjectName || cwd,\n });\n choseProjectInteractively = true;\n }\n\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"new\",\n teamSlug: selectedTeam.slug,\n userHasChosenSomethingInteractively:\n didChooseBetweenTeams || choseProjectInteractively,\n projectSlug: undefined,\n devDeploymentFromFlag: config.devDeployment,\n });\n\n const region =\n devDeployment === \"cloud\"\n ? await selectRegionOrUseDefault(ctx, selectedTeam, \"dev\")\n : null;\n\n showSpinner(\"Creating new Convex project...\");\n\n const deploymentToProvision =\n devDeployment === \"cloud\"\n ? {\n deploymentType: \"dev\" as const,\n region,\n }\n : null;\n\n let projectSlug;\n try {\n ({ projectSlug } = await createProject(ctx, {\n teamId: selectedTeam.id,\n projectName,\n deploymentToProvision,\n }));\n } catch (err) {\n logFailure(\"Unable to create project.\");\n return await logAndHandleFetchError(ctx, err);\n }\n const teamSlug = selectedTeam.slug;\n const teamMessage = didChooseBetweenTeams\n ? \" in team \" + chalkStderr.bold(teamSlug)\n : \"\";\n logFinishedStep(\n `Created project ${chalkStderr.bold(\n projectSlug,\n )}${teamMessage}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(teamSlug, projectSlug),\n )}`,\n );\n\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const folder = functionsDir(configPath, projectConfig);\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir: path.resolve(folder),\n projectDir: path.resolve(path.dirname(configPath)),\n });\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function selectExistingProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n const {\n team: { id: teamId, slug: teamSlug },\n chosen,\n } = await validateOrSelectTeam(ctx, config.team, \"Team:\");\n\n const projectSlug = await validateOrSelectProject(\n ctx,\n config.project,\n teamId,\n \"Configure project\",\n \"Project:\",\n );\n if (projectSlug === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Run the command again to create a new project instead.\",\n });\n }\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"existing\",\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively: chosen || !config.project,\n devDeploymentFromFlag: config.devDeployment,\n });\n\n logFinishedStep(`Reinitialized project ${chalkStderr.bold(projectSlug)}`);\n\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function askToConfigure(ctx: Context): Promise<\"new\" | \"existing\"> {\n if (!(await hasProjects(ctx))) {\n return \"new\";\n }\n return await promptOptions(ctx, {\n message: \"What would you like to configure?\",\n default: \"new\",\n choices: [\n { name: \"create a new project\", value: \"new\" },\n { name: \"choose an existing project\", value: \"existing\" },\n ],\n });\n}\n\ntype DeploymentOptions =\n | {\n kind: \"prod\";\n }\n | { kind: \"dev\" }\n | {\n kind: \"local\";\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n\n/**\n * This method assumes that the member has access to the selected project.\n */\nasync function ensureDeploymentProvisioned(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n deploymentOptions: DeploymentOptions;\n },\n): Promise<DeploymentDetails> {\n switch (options.deploymentOptions.kind) {\n case \"dev\":\n case \"prod\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n },\n options.deploymentOptions.kind,\n );\n return credentials;\n }\n case \"local\": {\n const credentials = await handleLocalDeployment(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n ...options.deploymentOptions,\n });\n return credentials;\n }\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n errForSentry: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n });\n }\n}\n\nexport async function updateEnvAndConfigForDeploymentSelection(\n ctx: Context,\n options: {\n url: string;\n siteUrl?: string | null;\n deploymentName: string;\n teamSlug: string | null;\n projectSlug: string | null;\n deploymentType: DeploymentType;\n },\n existingValue: string | null,\n) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n\n const { wroteToGitIgnore, changedDeploymentEnvVar } =\n options.deploymentType !== \"prod\"\n ? await writeDeploymentEnvVar(\n ctx,\n options.deploymentType,\n {\n team: options.teamSlug,\n project: options.projectSlug,\n deploymentName: options.deploymentName,\n },\n existingValue,\n )\n : { wroteToGitIgnore: false, changedDeploymentEnvVar: false };\n await ensureConvexFunctionsDir(ctx, projectConfig);\n await finalizeConfiguration(ctx, {\n deploymentType: options.deploymentType,\n deploymentName: options.deploymentName,\n url: options.url,\n siteUrl: options.siteUrl,\n wroteToGitIgnore,\n changedDeploymentEnvVar,\n functionsPath: functionsDir(configPath, projectConfig),\n });\n}\n\nasync function assertLocalOptionsAreDefault(\n ctx: Context,\n localOptions: ConfigureCmdOptions[\"localOptions\"],\n) {\n if (localOptions.ports.cloud !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-cloud-port` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.ports.site !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-site-port` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.backendVersion !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-backend-version` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.dashboardVersion !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-dashboard-version` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n if (localOptions.forceUpgrade === true) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`--local-force-upgrade` can only be used when developing with a local deployment. \" +\n \"Use `npx convex deployment select local` to use a local deployment.\",\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["path"]
7
7
  }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var deployKeyWarning_exports = {};
20
+ __export(deployKeyWarning_exports, {
21
+ warnIfDeployKeyOverridesLogin: () => warnIfDeployKeyOverridesLogin
22
+ });
23
+ module.exports = __toCommonJS(deployKeyWarning_exports);
24
+ var import_log = require("../../bundler/log.js");
25
+ var import_deployment = require("./deployment.js");
26
+ var import_envvars = require("./envvars.js");
27
+ var import_utils = require("./utils/utils.js");
28
+ const warnedContexts = /* @__PURE__ */ new WeakSet();
29
+ function warnIfDeployKeyOverridesLogin(ctx, hasAccount) {
30
+ if (!hasAccount || warnedContexts.has(ctx) || process.env.CONVEX_OVERRIDE_ACCESS_TOKEN)
31
+ return;
32
+ const key = (0, import_utils.readDeployKeyFromEnv)((name) => process.env[name]);
33
+ if (key === void 0 || key === import_utils.IGNORED_DEPLOY_KEY || (0, import_deployment.isPreviewDeployKey)(key))
34
+ return;
35
+ const { envVarName, source } = (0, import_envvars.getDeployKeySource)(key);
36
+ const type = (0, import_deployment.deploymentTypeFromAdminKey)(key);
37
+ const target = (0, import_deployment.isDeploymentKey)(key) ? `${type === "prod" ? "production" : type} deployment "${(0, import_deployment.deploymentNameFromAdminKey)(key)}"` : (0, import_deployment.isProjectKey)(key) ? "the project selected by the key" : "the deployment selected by the key";
38
+ (0, import_log.logWarning)(
39
+ `WARNING: ${envVarName} in ${source} overrides your Convex account for deployment commands. They target ${target}. Remove ${envVarName} to use the selected account.`
40
+ );
41
+ warnedContexts.add(ctx);
42
+ }
43
+ //# sourceMappingURL=deployKeyWarning.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/lib/deployKeyWarning.ts"],
4
+ "sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport {\n deploymentNameFromAdminKey,\n deploymentTypeFromAdminKey,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n} from \"./deployment.js\";\nimport { getDeployKeySource } from \"./envvars.js\";\nimport { IGNORED_DEPLOY_KEY, readDeployKeyFromEnv } from \"./utils/utils.js\";\n\nconst warnedContexts = new WeakSet<Context>();\n\nexport function warnIfDeployKeyOverridesLogin(\n ctx: Context,\n hasAccount: boolean,\n) {\n if (\n !hasAccount ||\n warnedContexts.has(ctx) ||\n process.env.CONVEX_OVERRIDE_ACCESS_TOKEN\n )\n return;\n const key = readDeployKeyFromEnv((name) => process.env[name]);\n if (\n key === undefined ||\n key === IGNORED_DEPLOY_KEY ||\n isPreviewDeployKey(key)\n )\n return;\n const { envVarName, source } = getDeployKeySource(key);\n const type = deploymentTypeFromAdminKey(key);\n const target = isDeploymentKey(key)\n ? `${type === \"prod\" ? \"production\" : type} deployment \"${deploymentNameFromAdminKey(key)}\"`\n : isProjectKey(key)\n ? \"the project selected by the key\"\n : \"the deployment selected by the key\";\n logWarning(\n `WARNING: ${envVarName} in ${source} overrides your Convex account for deployment commands. They target ${target}. Remove ${envVarName} to use the selected account.`,\n );\n warnedContexts.add(ctx);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,wBAMO;AACP,qBAAmC;AACnC,mBAAyD;AAEzD,MAAM,iBAAiB,oBAAI,QAAiB;AAErC,SAAS,8BACd,KACA,YACA;AACA,MACE,CAAC,cACD,eAAe,IAAI,GAAG,KACtB,QAAQ,IAAI;AAEZ;AACF,QAAM,UAAM,mCAAqB,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC;AAC5D,MACE,QAAQ,UACR,QAAQ,uCACR,sCAAmB,GAAG;AAEtB;AACF,QAAM,EAAE,YAAY,OAAO,QAAI,mCAAmB,GAAG;AACrD,QAAM,WAAO,8CAA2B,GAAG;AAC3C,QAAM,aAAS,mCAAgB,GAAG,IAC9B,GAAG,SAAS,SAAS,eAAe,IAAI,oBAAgB,8CAA2B,GAAG,CAAC,UACvF,gCAAa,GAAG,IACd,oCACA;AACN;AAAA,IACE,YAAY,UAAU,OAAO,MAAM,uEAAuE,MAAM,YAAY,UAAU;AAAA,EACxI;AACA,iBAAe,IAAI,GAAG;AACxB;",
6
+ "names": []
7
+ }
@@ -30,11 +30,13 @@ var deployment_exports = {};
30
30
  __export(deployment_exports, {
31
31
  changesToEnvVarFile: () => changesToEnvVarFile,
32
32
  changesToGitIgnore: () => changesToGitIgnore,
33
+ deploymentNameFromAdminKey: () => deploymentNameFromAdminKey,
33
34
  deploymentNameFromAdminKeyOrCrash: () => deploymentNameFromAdminKeyOrCrash,
34
35
  deploymentTypeFromAdminKey: () => deploymentTypeFromAdminKey,
35
36
  eraseDeploymentEnvVar: () => eraseDeploymentEnvVar,
36
37
  getDeploymentTypeFromConfiguredDeployment: () => getDeploymentTypeFromConfiguredDeployment,
37
38
  getTeamAndProjectFromPreviewAdminKey: () => getTeamAndProjectFromPreviewAdminKey,
39
+ gitIgnoreEnvVarFile: () => gitIgnoreEnvVarFile,
38
40
  isAnonymousDeployment: () => isAnonymousDeployment,
39
41
  isDeploymentKey: () => isDeploymentKey,
40
42
  isPreviewDeployKey: () => isPreviewDeployKey,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deployment.ts"],
4
- "sourcesContent": ["import * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport { changedEnvVarFile, getEnvVarRegex } from \"./envvars.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n} from \"./utils/utils.js\";\nimport { DeploymentType } from \"./api.js\";\n\n// Given a deployment string like \"dev:tall-forest-1234\"\n// returns only the slug \"tall-forest-1234\".\n// If there's no prefix returns the original string.\nexport function stripDeploymentTypePrefix(deployment: string) {\n return deployment.split(\":\").at(-1)!;\n}\n\n// Handling legacy CONVEX_DEPLOYMENT without type prefix as well\nexport function getDeploymentTypeFromConfiguredDeployment(raw: string) {\n const typeRaw = raw.split(\":\")[0];\n const type =\n typeRaw === \"prod\" ||\n typeRaw === \"dev\" ||\n typeRaw === \"preview\" ||\n typeRaw === \"local\"\n ? typeRaw\n : null;\n return type;\n}\n\nexport function isAnonymousDeployment(deploymentName: string) {\n return deploymentName.startsWith(\"anonymous-\");\n}\n\nexport function removeAnonymousPrefix(deploymentName: string) {\n if (isAnonymousDeployment(deploymentName)) {\n return deploymentName.slice(\"anonymous-\".length);\n }\n return deploymentName;\n}\n\nexport async function writeDeploymentEnvVar(\n ctx: Context,\n deploymentType: DeploymentType,\n deployment: {\n team: string | null;\n project: string | null;\n deploymentName: string;\n },\n existingValue: string | null,\n): Promise<{ wroteToGitIgnore: boolean; changedDeploymentEnvVar: boolean }> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n const changedFile = changesToEnvVarFile(\n existingFile,\n deploymentType,\n deployment,\n );\n const deploymentEnvVarValue =\n deploymentType + \":\" + deployment.deploymentName;\n // The `existingValue` that reaches this function is at least sometimes is missing its prefix.\n // Until this is cleaned up consider either of these values not a change.\n // Otherwise we spam the init instructions (Welcome to Convex etc.) on every run of `npx convex dev`.\n const changedDeploymentEnvVar =\n !!changedFile &&\n existingValue !== deployment.deploymentName &&\n existingValue !== deploymentEnvVarValue;\n\n if (changedFile !== null) {\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n // Only do this if we're not reinitializing an existing setup\n return {\n wroteToGitIgnore: await gitIgnoreEnvVarFile(ctx),\n changedDeploymentEnvVar,\n };\n }\n return {\n wroteToGitIgnore: false,\n changedDeploymentEnvVar,\n };\n}\n\n// Only used in the internal --url flow\nexport async function eraseDeploymentEnvVar(ctx: Context): Promise<boolean> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n if (existingFile === null) {\n return false;\n }\n const config = dotenv.parse(existingFile);\n const existing = config[CONVEX_DEPLOYMENT_ENV_VAR_NAME];\n if (existing === undefined) {\n return false;\n }\n const changedFile = existingFile.replace(\n getEnvVarRegex(CONVEX_DEPLOYMENT_ENV_VAR_NAME),\n \"\",\n );\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n return true;\n}\n\nasync function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {\n const gitIgnorePath = \".gitignore\";\n const gitIgnoreContents = ctx.fs.exists(gitIgnorePath)\n ? ctx.fs.readUtf8File(gitIgnorePath)\n : \"\";\n const changedGitIgnore = changesToGitIgnore(gitIgnoreContents);\n if (changedGitIgnore !== null) {\n ctx.fs.writeUtf8File(gitIgnorePath, changedGitIgnore);\n return true;\n }\n return false;\n}\n\n// exported for tests\nexport function changesToEnvVarFile(\n existingFile: string | null,\n deploymentType: DeploymentType,\n {\n team,\n project,\n deploymentName,\n }: { team: string | null; project: string | null; deploymentName: string },\n): string | null {\n const deploymentValue = deploymentType + \":\" + deploymentName;\n const commentOnPreviousLine = \"# Deployment used by `npx convex dev`\";\n const commentAfterValue =\n team !== null && project !== null\n ? `team: ${team}, project: ${project}`\n : null;\n return changedEnvVarFile({\n existingFileContent: existingFile,\n envVarName: CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n envVarValue: deploymentValue,\n commentAfterValue,\n commentOnPreviousLine,\n });\n}\n\n// exported for tests\nexport function changesToGitIgnore(existingFile: string | null): string | null {\n if (existingFile === null) {\n return `${ENV_VAR_FILE_PATH}\\n`;\n }\n const gitIgnoreLines = existingFile.split(\"\\n\");\n const envVarFileIgnored = gitIgnoreLines.some((line) => {\n if (line.startsWith(\"#\")) return false;\n if (line.startsWith(\"!\")) return false;\n\n // .gitignore ignores trailing whitespace, and also we need to remove\n // the trailing `\\r` from Windows-style newline since we split on `\\n`.\n const trimmedLine = line.trimEnd();\n\n const envIgnorePatterns = [\n /^\\.env\\.local$/,\n /^\\.env\\.\\*$/,\n /^\\.env\\*$/,\n /^.*\\.local$/,\n /^\\.env\\*\\.local$/,\n ];\n\n return envIgnorePatterns.some((pattern) => pattern.test(trimmedLine));\n });\n if (!envVarFileIgnored) {\n return `${existingFile}\\n${ENV_VAR_FILE_PATH}\\n`;\n } else {\n return null;\n }\n}\n\nexport async function deploymentNameFromAdminKeyOrCrash(\n ctx: Context,\n adminKey: string,\n) {\n const deploymentName = deploymentNameFromAdminKey(adminKey);\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Please set ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} to a new key which you can find on your Convex dashboard.`,\n });\n }\n return deploymentName;\n}\n\nfunction deploymentNameFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return null;\n }\n if (isPreviewDeployKey(adminKey)) {\n // Preview deploy keys do not contain a deployment name.\n return null;\n }\n return stripDeploymentTypePrefix(parts[0]);\n}\n\n// Needed to differentiate a preview deploy key\n// from a concrete preview deployment's deploy key.\n// preview deploy key: `preview:team:project|key`\n// preview deployment's deploy key: `preview:deploymentName|key`\nexport function isPreviewDeployKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return false;\n }\n const [prefix] = parts;\n const prefixParts = prefix.split(\":\");\n return prefixParts[0] === \"preview\" && prefixParts.length === 3;\n}\n\nexport function isProjectKey(adminKey: string) {\n return /^project:.*\\|/.test(adminKey);\n}\n\n// \"dev deploy keys\" and \"prod deploy keys\" are deployment keys.\n// On the client these are also known as admin keys.\nexport function isDeploymentKey(adminKey: string) {\n return /^(dev|prod):.*\\|/.test(adminKey);\n}\n\n// For current keys returns prod|dev|preview,\n// for legacy keys returns \"prod\".\n// Examples:\n// \"prod:deploymentName|key\" -> \"prod\"\n// \"preview:deploymentName|key\" -> \"preview\"\n// \"dev:deploymentName|key\" -> \"dev\"\n// \"custom:deploymentName|key\" -> \"custom\"\n// \"key\" -> \"prod\"\nexport function deploymentTypeFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\":\");\n if (parts.length === 1) {\n return \"prod\";\n }\n return parts.at(0)! as DeploymentType;\n}\n\nexport async function getTeamAndProjectFromPreviewAdminKey(\n ctx: Context,\n adminKey: string,\n) {\n const parts = adminKey.split(\"|\")[0].split(\":\");\n if (parts.length !== 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Malformed preview CONVEX_DEPLOY_KEY, get a new key from Project Settings.\",\n });\n }\n const [_preview, teamSlug, projectSlug] = parts;\n return { teamSlug, projectSlug };\n}\n\nexport type CleanupDeploymentFunc = () => Promise<void>;\nexport type DeploymentDetails = {\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n reference: string | null;\n isDefault: boolean;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport { changedEnvVarFile, getEnvVarRegex } from \"./envvars.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n} from \"./utils/utils.js\";\nimport { DeploymentType } from \"./api.js\";\n\n// Given a deployment string like \"dev:tall-forest-1234\"\n// returns only the slug \"tall-forest-1234\".\n// If there's no prefix returns the original string.\nexport function stripDeploymentTypePrefix(deployment: string) {\n return deployment.split(\":\").at(-1)!;\n}\n\n// Handling legacy CONVEX_DEPLOYMENT without type prefix as well\nexport function getDeploymentTypeFromConfiguredDeployment(raw: string) {\n const typeRaw = raw.split(\":\")[0];\n const type =\n typeRaw === \"prod\" ||\n typeRaw === \"dev\" ||\n typeRaw === \"preview\" ||\n typeRaw === \"local\"\n ? typeRaw\n : null;\n return type;\n}\n\nexport function isAnonymousDeployment(deploymentName: string) {\n return deploymentName.startsWith(\"anonymous-\");\n}\n\nexport function removeAnonymousPrefix(deploymentName: string) {\n if (isAnonymousDeployment(deploymentName)) {\n return deploymentName.slice(\"anonymous-\".length);\n }\n return deploymentName;\n}\n\nexport async function writeDeploymentEnvVar(\n ctx: Context,\n deploymentType: DeploymentType,\n deployment: {\n team: string | null;\n project: string | null;\n deploymentName: string;\n },\n existingValue: string | null,\n): Promise<{ wroteToGitIgnore: boolean; changedDeploymentEnvVar: boolean }> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n const changedFile = changesToEnvVarFile(\n existingFile,\n deploymentType,\n deployment,\n );\n const deploymentEnvVarValue =\n deploymentType + \":\" + deployment.deploymentName;\n // The `existingValue` that reaches this function is at least sometimes is missing its prefix.\n // Until this is cleaned up consider either of these values not a change.\n // Otherwise we spam the init instructions (Welcome to Convex etc.) on every run of `npx convex dev`.\n const changedDeploymentEnvVar =\n !!changedFile &&\n existingValue !== deployment.deploymentName &&\n existingValue !== deploymentEnvVarValue;\n\n if (changedFile !== null) {\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n // Only do this if we're not reinitializing an existing setup\n return {\n wroteToGitIgnore: await gitIgnoreEnvVarFile(ctx),\n changedDeploymentEnvVar,\n };\n }\n return {\n wroteToGitIgnore: false,\n changedDeploymentEnvVar,\n };\n}\n\n// Only used in the internal --url flow\nexport async function eraseDeploymentEnvVar(ctx: Context): Promise<boolean> {\n const existingFile = ctx.fs.exists(ENV_VAR_FILE_PATH)\n ? ctx.fs.readUtf8File(ENV_VAR_FILE_PATH)\n : null;\n if (existingFile === null) {\n return false;\n }\n const config = dotenv.parse(existingFile);\n const existing = config[CONVEX_DEPLOYMENT_ENV_VAR_NAME];\n if (existing === undefined) {\n return false;\n }\n const changedFile = existingFile.replace(\n getEnvVarRegex(CONVEX_DEPLOYMENT_ENV_VAR_NAME),\n \"\",\n );\n ctx.fs.writeUtf8File(ENV_VAR_FILE_PATH, changedFile);\n return true;\n}\n\nexport async function gitIgnoreEnvVarFile(ctx: Context): Promise<boolean> {\n const gitIgnorePath = \".gitignore\";\n const gitIgnoreContents = ctx.fs.exists(gitIgnorePath)\n ? ctx.fs.readUtf8File(gitIgnorePath)\n : \"\";\n const changedGitIgnore = changesToGitIgnore(gitIgnoreContents);\n if (changedGitIgnore !== null) {\n ctx.fs.writeUtf8File(gitIgnorePath, changedGitIgnore);\n return true;\n }\n return false;\n}\n\n// exported for tests\nexport function changesToEnvVarFile(\n existingFile: string | null,\n deploymentType: DeploymentType,\n {\n team,\n project,\n deploymentName,\n }: { team: string | null; project: string | null; deploymentName: string },\n): string | null {\n const deploymentValue = deploymentType + \":\" + deploymentName;\n const commentOnPreviousLine = \"# Deployment used by `npx convex dev`\";\n const commentAfterValue =\n team !== null && project !== null\n ? `team: ${team}, project: ${project}`\n : null;\n return changedEnvVarFile({\n existingFileContent: existingFile,\n envVarName: CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n envVarValue: deploymentValue,\n commentAfterValue,\n commentOnPreviousLine,\n });\n}\n\n// exported for tests\nexport function changesToGitIgnore(existingFile: string | null): string | null {\n if (existingFile === null) {\n return `${ENV_VAR_FILE_PATH}\\n`;\n }\n const gitIgnoreLines = existingFile.split(\"\\n\");\n const envVarFileIgnored = gitIgnoreLines.some((line) => {\n if (line.startsWith(\"#\")) return false;\n if (line.startsWith(\"!\")) return false;\n\n // .gitignore ignores trailing whitespace, and also we need to remove\n // the trailing `\\r` from Windows-style newline since we split on `\\n`.\n const trimmedLine = line.trimEnd();\n\n const envIgnorePatterns = [\n /^\\.env\\.local$/,\n /^\\.env\\.\\*$/,\n /^\\.env\\*$/,\n /^.*\\.local$/,\n /^\\.env\\*\\.local$/,\n ];\n\n return envIgnorePatterns.some((pattern) => pattern.test(trimmedLine));\n });\n if (!envVarFileIgnored) {\n return `${existingFile}\\n${ENV_VAR_FILE_PATH}\\n`;\n } else {\n return null;\n }\n}\n\nexport async function deploymentNameFromAdminKeyOrCrash(\n ctx: Context,\n adminKey: string,\n) {\n const deploymentName = deploymentNameFromAdminKey(adminKey);\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Please set ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} to a new key which you can find on your Convex dashboard.`,\n });\n }\n return deploymentName;\n}\n\nexport function deploymentNameFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return null;\n }\n if (isPreviewDeployKey(adminKey)) {\n // Preview deploy keys do not contain a deployment name.\n return null;\n }\n return stripDeploymentTypePrefix(parts[0]);\n}\n\n// Needed to differentiate a preview deploy key\n// from a concrete preview deployment's deploy key.\n// preview deploy key: `preview:team:project|key`\n// preview deployment's deploy key: `preview:deploymentName|key`\nexport function isPreviewDeployKey(adminKey: string) {\n const parts = adminKey.split(\"|\");\n if (parts.length === 1) {\n return false;\n }\n const [prefix] = parts;\n const prefixParts = prefix.split(\":\");\n return prefixParts[0] === \"preview\" && prefixParts.length === 3;\n}\n\nexport function isProjectKey(adminKey: string) {\n return /^project:.*\\|/.test(adminKey);\n}\n\n// \"dev deploy keys\" and \"prod deploy keys\" are deployment keys.\n// On the client these are also known as admin keys.\nexport function isDeploymentKey(adminKey: string) {\n return /^(dev|prod):.*\\|/.test(adminKey);\n}\n\n// For current keys returns prod|dev|preview,\n// for legacy keys returns \"prod\".\n// Examples:\n// \"prod:deploymentName|key\" -> \"prod\"\n// \"preview:deploymentName|key\" -> \"preview\"\n// \"dev:deploymentName|key\" -> \"dev\"\n// \"custom:deploymentName|key\" -> \"custom\"\n// \"key\" -> \"prod\"\nexport function deploymentTypeFromAdminKey(adminKey: string) {\n const parts = adminKey.split(\":\");\n if (parts.length === 1) {\n return \"prod\";\n }\n return parts.at(0)! as DeploymentType;\n}\n\nexport async function getTeamAndProjectFromPreviewAdminKey(\n ctx: Context,\n adminKey: string,\n) {\n const parts = adminKey.split(\"|\")[0].split(\":\");\n if (parts.length !== 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Malformed preview CONVEX_DEPLOY_KEY, get a new key from Project Settings.\",\n });\n }\n const [_preview, teamSlug, projectSlug] = parts;\n return { teamSlug, projectSlug };\n}\n\nexport type CleanupDeploymentFunc = () => Promise<void>;\nexport type DeploymentDetails = {\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n reference: string | null;\n isDefault: boolean;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -49,15 +49,17 @@ var import_projectMismatch = require("./localDeployment/projectMismatch.js");
49
49
  var import_chalk = require("chalk");
50
50
  var import_envvars = require("./envvars.js");
51
51
  var import_globalConfig = require("./utils/globalConfig.js");
52
+ var import_profiles = require("./profiles.js");
52
53
  var import_utils = require("./utils/utils.js");
53
54
  var dotenv = __toESM(require("dotenv"), 1);
54
55
  async function initializeBigBrainAuth(ctx, initialArgs) {
55
56
  if (initialArgs.url !== void 0 && initialArgs.adminKey !== void 0) {
56
57
  ctx._updateBigBrainAuth(
57
- getBigBrainAuth(ctx, {
58
+ await getBigBrainAuth(ctx, {
58
59
  previewDeployKey: null,
59
60
  projectKey: null,
60
- deploymentKey: null
61
+ deploymentKey: null,
62
+ skipProfile: true
61
63
  })
62
64
  );
63
65
  return;
@@ -75,29 +77,30 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
75
77
  const rawDeployKey2 = (0, import_utils.readDeployKeyFromEnv)((name) => config[name]);
76
78
  const deployKey2 = await (0, import_utils.processDeployKeyValue)(ctx, rawDeployKey2);
77
79
  if (deployKey2 !== void 0) {
78
- const bigBrainAuth = getBigBrainAuth(ctx, {
80
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
79
81
  previewDeployKey: (0, import_deployment.isPreviewDeployKey)(deployKey2) ? deployKey2 : null,
80
82
  projectKey: (0, import_deployment.isProjectKey)(deployKey2) ? deployKey2 : null,
81
- deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey2) ? deployKey2 : null
83
+ deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey2) ? deployKey2 : null,
84
+ envFile: initialArgs.envFile
82
85
  });
83
86
  ctx._updateBigBrainAuth(bigBrainAuth);
84
87
  return;
85
88
  }
86
89
  ctx._updateBigBrainAuth(
87
- getBigBrainAuth(ctx, {
90
+ await getBigBrainAuth(ctx, {
88
91
  previewDeployKey: null,
89
92
  projectKey: null,
90
- deploymentKey: null
93
+ deploymentKey: null,
94
+ envFile: initialArgs.envFile
91
95
  })
92
96
  );
93
97
  return;
94
98
  }
95
- dotenv.config({ path: import_utils.ENV_VAR_FILE_PATH });
96
- dotenv.config();
99
+ (0, import_envvars.loadProjectEnvironmentVariables)();
97
100
  const rawDeployKey = (0, import_utils.readDeployKeyFromEnv)((name) => process.env[name]);
98
101
  const deployKey = await (0, import_utils.processDeployKeyValue)(ctx, rawDeployKey);
99
102
  if (deployKey !== void 0) {
100
- const bigBrainAuth = getBigBrainAuth(ctx, {
103
+ const bigBrainAuth = await getBigBrainAuth(ctx, {
101
104
  previewDeployKey: (0, import_deployment.isPreviewDeployKey)(deployKey) ? deployKey : null,
102
105
  projectKey: (0, import_deployment.isProjectKey)(deployKey) ? deployKey : null,
103
106
  deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey) ? deployKey : null
@@ -106,7 +109,7 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
106
109
  return;
107
110
  }
108
111
  ctx._updateBigBrainAuth(
109
- getBigBrainAuth(ctx, {
112
+ await getBigBrainAuth(ctx, {
110
113
  previewDeployKey: null,
111
114
  projectKey: null,
112
115
  deploymentKey: null
@@ -114,7 +117,7 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
114
117
  );
115
118
  return;
116
119
  }
117
- async function updateBigBrainAuthAfterLogin(ctx, accessToken) {
120
+ async function updateBigBrainAuthAfterLogin(ctx, accessToken, profile) {
118
121
  const existingAuth = ctx.bigBrainAuth();
119
122
  if (existingAuth !== null && existingAuth.kind === "projectKey") {
120
123
  (0, import_log.logVerbose)(
@@ -125,18 +128,20 @@ async function updateBigBrainAuthAfterLogin(ctx, accessToken) {
125
128
  ctx._updateBigBrainAuth({
126
129
  accessToken,
127
130
  kind: "accessToken",
128
- header: `Bearer ${accessToken}`
131
+ header: `Bearer ${accessToken}`,
132
+ ...profile ? { profile } : {}
129
133
  });
130
134
  }
131
135
  async function clearBigBrainAuth(ctx) {
132
136
  ctx._updateBigBrainAuth(null);
133
137
  }
134
- function getBigBrainAuth(ctx, opts) {
138
+ async function getBigBrainAuth(ctx, opts) {
135
139
  if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
136
140
  return {
137
141
  accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,
138
142
  kind: "accessToken",
139
- header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`
143
+ header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,
144
+ profile: null
140
145
  };
141
146
  }
142
147
  if (opts.projectKey !== null) {
@@ -153,12 +158,17 @@ function getBigBrainAuth(ctx, opts) {
153
158
  deploymentKey: opts.deploymentKey
154
159
  };
155
160
  }
161
+ const profile = opts.skipProfile ? null : await (0, import_profiles.getProfileSelection)(ctx, { envFile: opts.envFile });
162
+ if (profile !== null) {
163
+ return await (0, import_profiles.readProfileAuth)(ctx, profile);
164
+ }
156
165
  const globalConfig = (0, import_globalConfig.readGlobalConfig)(ctx);
157
166
  if (globalConfig) {
158
167
  return {
159
168
  kind: "accessToken",
160
169
  header: `Bearer ${globalConfig.accessToken}`,
161
- accessToken: globalConfig.accessToken
170
+ accessToken: globalConfig.accessToken,
171
+ profile: null
162
172
  };
163
173
  }
164
174
  if (opts.previewDeployKey !== null) {
@@ -198,7 +208,7 @@ async function ensureAuthCanCreateDeployment(ctx) {
198
208
  )} and try again.`
199
209
  });
200
210
  }
201
- const envVar = process.env[import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME : import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
211
+ const envVar = (0, import_utils.readDeployKeyEnvVar)((name) => process.env[name])?.name ?? import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME;
202
212
  return await ctx.crash({
203
213
  exitCode: 1,
204
214
  errorType: "fatal",
@@ -368,8 +378,7 @@ async function resolveBaseDeploymentSelection(ctx, cliArgs, selectionWithinProje
368
378
  }
369
379
  return result2.metadata;
370
380
  }
371
- dotenv.config({ path: import_utils.ENV_VAR_FILE_PATH });
372
- dotenv.config();
381
+ (0, import_envvars.loadProjectEnvironmentVariables)();
373
382
  const result = await getDeploymentSelectionFromEnv(
374
383
  ctx,
375
384
  selectionWithinProject,