convex 1.48.0-alpha.0 → 1.48.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.
- package/CHANGELOG.md +28 -4
- package/README.md +1 -1
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/bundler/context.js +5 -7
- package/dist/cjs/bundler/context.js.map +2 -2
- package/dist/cjs/bundler/fs.js +6 -47
- package/dist/cjs/bundler/fs.js.map +2 -2
- package/dist/cjs/cli/aiFiles.js +26 -4
- package/dist/cjs/cli/aiFiles.js.map +2 -2
- package/dist/cjs/cli/configure.js +2 -15
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/env.js +6 -3
- package/dist/cjs/cli/env.js.map +2 -2
- package/dist/cjs/cli/envDefault.js +5 -2
- package/dist/cjs/cli/envDefault.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +2 -1
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/index.js +13 -2
- package/dist/cjs/cli/lib/aiFiles/index.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/skills.js +6 -5
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/state.js +1 -1
- package/dist/cjs/cli/lib/aiFiles/state.js.map +1 -1
- package/dist/cjs/cli/lib/components.js +12 -2
- package/dist/cjs/cli/lib/components.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/startPush.js +42 -1
- package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/cjs/cli/lib/deployment.js +0 -2
- package/dist/cjs/cli/lib/deployment.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +18 -27
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +9 -1
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/envvars.js +0 -32
- package/dist/cjs/cli/lib/envvars.js.map +2 -2
- package/dist/cjs/cli/lib/fsUtils.js +1 -1
- package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
- package/dist/cjs/cli/lib/generateDocs.js +1 -1
- package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/dashboard.js +11 -1
- package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/download.js +16 -1
- package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +4 -0
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/cjs/cli/lib/login.js +4 -28
- package/dist/cjs/cli/lib/login.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/requestContext.js +1 -5
- package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
- package/dist/cjs/cli/lib/utils/aiAgent.js +32 -0
- package/dist/cjs/cli/lib/utils/aiAgent.js.map +7 -0
- package/dist/cjs/cli/lib/utils/utils.js +9 -18
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/cli/login.js +114 -213
- package/dist/cjs/cli/login.js.map +3 -3
- package/dist/cjs/cli/logout.js +12 -113
- package/dist/cjs/cli/logout.js.map +3 -3
- package/dist/cjs/cli/mcp.js +10 -43
- package/dist/cjs/cli/mcp.js.map +3 -3
- package/dist/cjs/cli/program.js +1 -2
- package/dist/cjs/cli/program.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/authentication.js.map +1 -1
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/impl/authentication_impl.js +15 -1
- package/dist/cjs/server/impl/authentication_impl.js.map +2 -2
- package/dist/cjs/server/impl/registration_impl.js +1 -1
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs/server/schema.js +0 -2
- package/dist/cjs/server/schema.js.map +2 -2
- package/dist/cjs/server/storage.js.map +1 -1
- package/dist/cjs-types/bundler/context.d.ts +0 -5
- package/dist/cjs-types/bundler/context.d.ts.map +1 -1
- package/dist/cjs-types/bundler/fs.d.ts +2 -7
- package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
- package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +11 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +4 -1
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +13 -0
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +1 -2
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +1 -0
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/envvars.d.ts +0 -6
- package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/fsUtils.d.ts +0 -1
- package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +6 -0
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/login.d.ts +1 -3
- package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/cjs-types/cli/lib/utils/aiAgent.d.ts +8 -0
- package/dist/cjs-types/cli/lib/utils/aiAgent.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +0 -5
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/login.d.ts +0 -21
- package/dist/cjs-types/cli/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/logout.d.ts +1 -8
- package/dist/cjs-types/cli/logout.d.ts.map +1 -1
- package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
- package/dist/cjs-types/cli/program.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/index.d.ts.map +1 -1
- package/dist/cjs-types/server/authentication.d.ts +65 -0
- package/dist/cjs-types/server/authentication.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +6 -0
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/authentication_impl.d.ts +2 -1
- package/dist/cjs-types/server/impl/authentication_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +2 -2
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +8 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts +5 -3
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts +0 -2
- package/dist/cjs-types/server/schema.d.ts.map +1 -1
- package/dist/cjs-types/server/storage.d.ts +28 -25
- package/dist/cjs-types/server/storage.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +1379 -2142
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/bundler/context.js +5 -7
- package/dist/esm/bundler/context.js.map +2 -2
- package/dist/esm/bundler/fs.js +6 -47
- package/dist/esm/bundler/fs.js.map +2 -2
- package/dist/esm/cli/aiFiles.js +26 -4
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/configure.js +2 -15
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/env.js +6 -3
- package/dist/esm/cli/env.js.map +2 -2
- package/dist/esm/cli/envDefault.js +5 -2
- package/dist/esm/cli/envDefault.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +2 -1
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/index.js +13 -2
- package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js +6 -5
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/state.js +1 -1
- package/dist/esm/cli/lib/aiFiles/state.js.map +1 -1
- package/dist/esm/cli/lib/components.js +15 -2
- package/dist/esm/cli/lib/components.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/startPush.js +39 -0
- package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/esm/cli/lib/deployment.js +2 -2
- package/dist/esm/cli/lib/deployment.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js +20 -35
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/env.js +9 -1
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/envvars.js +1 -35
- package/dist/esm/cli/lib/envvars.js.map +2 -2
- package/dist/esm/cli/lib/fsUtils.js +1 -1
- package/dist/esm/cli/lib/fsUtils.js.map +2 -2
- package/dist/esm/cli/lib/generateDocs.js +1 -1
- package/dist/esm/cli/lib/generateDocs.js.map +1 -1
- package/dist/esm/cli/lib/localDeployment/dashboard.js +9 -0
- package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/download.js +16 -1
- package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/login.js +4 -36
- package/dist/esm/cli/lib/login.js.map +2 -2
- package/dist/esm/cli/lib/mcp/requestContext.js +1 -5
- package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
- package/dist/esm/cli/lib/utils/aiAgent.js +10 -0
- package/dist/esm/cli/lib/utils/aiAgent.js.map +7 -0
- package/dist/esm/cli/lib/utils/utils.js +9 -16
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/cli/login.js +112 -225
- package/dist/esm/cli/login.js.map +3 -3
- package/dist/esm/cli/logout.js +13 -110
- package/dist/esm/cli/logout.js.map +2 -2
- package/dist/esm/cli/mcp.js +10 -34
- package/dist/esm/cli/mcp.js.map +2 -2
- package/dist/esm/cli/program.js +1 -2
- package/dist/esm/cli/program.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/impl/authentication_impl.js +13 -0
- package/dist/esm/server/impl/authentication_impl.js.map +2 -2
- package/dist/esm/server/impl/registration_impl.js +2 -2
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/schema.js +0 -2
- package/dist/esm/server/schema.js.map +2 -2
- package/dist/esm-types/bundler/context.d.ts +0 -5
- package/dist/esm-types/bundler/context.d.ts.map +1 -1
- package/dist/esm-types/bundler/fs.d.ts +2 -7
- package/dist/esm-types/bundler/fs.d.ts.map +1 -1
- package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/env.d.ts.map +1 -1
- package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +11 -1
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +4 -1
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +13 -0
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
- package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +1 -2
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +1 -0
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/envvars.d.ts +0 -6
- package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/fsUtils.d.ts +0 -1
- package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +6 -0
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/login.d.ts +1 -3
- package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/esm-types/cli/lib/utils/aiAgent.d.ts +8 -0
- package/dist/esm-types/cli/lib/utils/aiAgent.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/utils/utils.d.ts +0 -5
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/login.d.ts +0 -21
- package/dist/esm-types/cli/login.d.ts.map +1 -1
- package/dist/esm-types/cli/logout.d.ts +1 -8
- package/dist/esm-types/cli/logout.d.ts.map +1 -1
- package/dist/esm-types/cli/mcp.d.ts.map +1 -1
- package/dist/esm-types/cli/program.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/index.d.ts.map +1 -1
- package/dist/esm-types/server/authentication.d.ts +65 -0
- package/dist/esm-types/server/authentication.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +6 -0
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/impl/authentication_impl.d.ts +2 -1
- package/dist/esm-types/server/impl/authentication_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +2 -2
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +8 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts +5 -3
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts +0 -2
- package/dist/esm-types/server/schema.d.ts.map +1 -1
- package/dist/esm-types/server/storage.d.ts +28 -25
- package/dist/esm-types/server/storage.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +3 -2
- package/schemas/convex.schema.json +1 -2
- package/src/bundler/context.ts +5 -9
- package/src/bundler/fs.ts +5 -54
- package/src/cli/aiFiles.ts +30 -4
- package/src/cli/configure.ts +2 -18
- package/src/cli/env.ts +4 -1
- package/src/cli/envDefault.ts +4 -1
- package/src/cli/lib/aiFiles/guidelinesmd.ts +7 -2
- package/src/cli/lib/aiFiles/index.ts +23 -3
- package/src/cli/lib/aiFiles/skills.ts +11 -7
- package/src/cli/lib/aiFiles/state.ts +1 -1
- package/src/cli/lib/components.ts +18 -3
- package/src/cli/lib/deployApi/startPush.ts +64 -0
- package/src/cli/lib/deployment.ts +2 -2
- package/src/cli/lib/deploymentSelection.ts +18 -37
- package/src/cli/lib/env.ts +13 -2
- package/src/cli/lib/envvars.ts +1 -43
- package/src/cli/lib/fsUtils.ts +2 -5
- package/src/cli/lib/generateDocs.ts +1 -1
- package/src/cli/lib/localDeployment/dashboard.ts +19 -0
- package/src/cli/lib/localDeployment/download.ts +17 -1
- package/src/cli/lib/localDeployment/utils.ts +4 -0
- package/src/cli/lib/login.ts +3 -47
- package/src/cli/lib/mcp/requestContext.ts +1 -7
- package/src/cli/lib/utils/aiAgent.ts +15 -0
- package/src/cli/lib/utils/utils.ts +15 -19
- package/src/cli/login.ts +168 -293
- package/src/cli/logout.ts +17 -142
- package/src/cli/mcp.ts +11 -48
- package/src/cli/program.ts +0 -2
- package/src/index.ts +1 -1
- package/src/server/authentication.ts +79 -0
- package/src/server/components/index.ts +11 -0
- package/src/server/impl/authentication_impl.ts +15 -1
- package/src/server/impl/registration_impl.ts +2 -2
- package/src/server/index.ts +6 -0
- package/src/server/meta.ts +0 -8
- package/src/server/registration.ts +5 -2
- package/src/server/schema.ts +0 -2
- package/src/server/storage.ts +29 -42
- package/dist/cjs/cli/account.js +0 -237
- package/dist/cjs/cli/account.js.map +0 -7
- package/dist/cjs/cli/lib/deployKeyWarning.js +0 -43
- package/dist/cjs/cli/lib/deployKeyWarning.js.map +0 -7
- package/dist/cjs/cli/lib/profileManagement.js +0 -196
- package/dist/cjs/cli/lib/profileManagement.js.map +0 -7
- package/dist/cjs/cli/lib/profiles.js +0 -333
- package/dist/cjs/cli/lib/profiles.js.map +0 -7
- package/dist/cjs-types/cli/account.d.ts +0 -6
- package/dist/cjs-types/cli/account.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +0 -3
- package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/profileManagement.d.ts +0 -10
- package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/profiles.d.ts +0 -59
- package/dist/cjs-types/cli/lib/profiles.d.ts.map +0 -1
- package/dist/esm/cli/account.js +0 -221
- package/dist/esm/cli/account.js.map +0 -7
- package/dist/esm/cli/lib/deployKeyWarning.js +0 -27
- package/dist/esm/cli/lib/deployKeyWarning.js.map +0 -7
- package/dist/esm/cli/lib/profileManagement.js +0 -179
- package/dist/esm/cli/lib/profileManagement.js.map +0 -7
- package/dist/esm/cli/lib/profiles.js +0 -288
- package/dist/esm/cli/lib/profiles.js.map +0 -7
- package/dist/esm-types/cli/account.d.ts +0 -6
- package/dist/esm-types/cli/account.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +0 -3
- package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/profileManagement.d.ts +0 -10
- package/dist/esm-types/cli/lib/profileManagement.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/profiles.d.ts +0 -59
- package/dist/esm-types/cli/lib/profiles.d.ts.map +0 -1
- package/src/cli/account.ts +0 -320
- package/src/cli/lib/deployKeyWarning.ts +0 -43
- package/src/cli/lib/profileManagement.ts +0 -262
- package/src/cli/lib/profiles.ts +0 -398
package/dist/cjs/cli/login.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,14 +17,22 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
var login_exports = {};
|
|
20
30
|
__export(login_exports, {
|
|
21
|
-
createLoginCommand: () => createLoginCommand,
|
|
22
31
|
login: () => login
|
|
23
32
|
});
|
|
24
33
|
module.exports = __toCommonJS(login_exports);
|
|
25
34
|
var import_extra_typings = require("@commander-js/extra-typings");
|
|
35
|
+
var dotenv = __toESM(require("dotenv"), 1);
|
|
26
36
|
var import_context = require("../bundler/context.js");
|
|
27
37
|
var import_log = require("../bundler/log.js");
|
|
28
38
|
var import_login = require("./lib/login.js");
|
|
@@ -36,16 +46,25 @@ var import_deploymentSelection = require("./lib/deploymentSelection.js");
|
|
|
36
46
|
var import_deployment = require("./lib/deployment.js");
|
|
37
47
|
var import_globalConfig = require("./lib/utils/globalConfig.js");
|
|
38
48
|
var import_api = require("./lib/api.js");
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
function deployKeyEnvFile(ctx, envVarName, value) {
|
|
50
|
+
for (const file of [import_utils.ENV_VAR_FILE_PATH, ".env"]) {
|
|
51
|
+
if (!ctx.fs.exists(file)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (dotenv.parse(ctx.fs.readUtf8File(file))[envVarName] === value) {
|
|
55
|
+
return file;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
43
60
|
async function reportDeployKeyInWorkingDirectory(ctx, auth) {
|
|
44
61
|
if (auth === null || auth.kind === "accessToken" || auth.kind === "previewDeployKey") {
|
|
45
62
|
return;
|
|
46
63
|
}
|
|
47
64
|
const key = auth.kind === "projectKey" ? auth.projectKey : auth.deploymentKey;
|
|
48
|
-
const
|
|
65
|
+
const envVarName = 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;
|
|
66
|
+
const envFile = deployKeyEnvFile(ctx, envVarName, key);
|
|
67
|
+
const source = envFile ?? "shell environment";
|
|
49
68
|
const secret = key.slice(key.indexOf("|") + 1);
|
|
50
69
|
if (await (0, import_login.isAuthorizedHeader)(ctx, `Bearer ${secret}`)) {
|
|
51
70
|
(0, import_log.logMessage)(`Working Directory: Valid ${envVarName} in ${source}`);
|
|
@@ -53,221 +72,103 @@ async function reportDeployKeyInWorkingDirectory(ctx, auth) {
|
|
|
53
72
|
}
|
|
54
73
|
(0, import_log.logWarning)(`Working Directory: Invalid ${envVarName} in ${source}`);
|
|
55
74
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
75
|
+
const loginStatus = new import_extra_typings.Command("status").description("Check login status and list accessible teams").allowExcessArguments(false).action(async () => {
|
|
76
|
+
const ctx = await (0, import_context.oneoffContext)({
|
|
77
|
+
url: void 0,
|
|
78
|
+
adminKey: void 0,
|
|
79
|
+
envFile: void 0
|
|
80
|
+
});
|
|
81
|
+
const auth = ctx.bigBrainAuth();
|
|
82
|
+
const globalConfig = (0, import_globalConfig.readGlobalConfig)(ctx);
|
|
83
|
+
if (globalConfig === null) {
|
|
84
|
+
(0, import_log.logMessage)(`No Convex account token found in: ${(0, import_globalConfig.globalConfigPath)()}`);
|
|
85
|
+
(0, import_log.logMessage)("Status: Not logged in");
|
|
86
|
+
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
(0, import_log.logMessage)(`Convex account token found in: ${(0, import_globalConfig.globalConfigPath)()}`);
|
|
90
|
+
const accessToken = globalConfig.accessToken;
|
|
91
|
+
if (!await (0, import_login.isAuthorizedHeader)(ctx, `Bearer ${accessToken}`)) {
|
|
92
|
+
(0, import_log.logMessage)("Status: Not logged in");
|
|
93
|
+
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
(0, import_log.logMessage)("Status: Logged in");
|
|
97
|
+
ctx._updateBigBrainAuth({
|
|
98
|
+
kind: "accessToken",
|
|
99
|
+
header: `Bearer ${accessToken}`,
|
|
100
|
+
accessToken
|
|
101
|
+
});
|
|
102
|
+
const teams = await (0, import_api.getTeamsForUser)(ctx);
|
|
103
|
+
(0, import_log.logMessage)(
|
|
104
|
+
`Teams: ${teams.length} team${teams.length === 1 ? "" : "s"} accessible`
|
|
105
|
+
);
|
|
106
|
+
for (const team of teams) {
|
|
107
|
+
(0, import_log.logMessage)(` - ${team.name} (${team.slug})`);
|
|
108
|
+
}
|
|
109
|
+
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
110
|
+
});
|
|
111
|
+
const login = new import_extra_typings.Command("login").description("Login to Convex").allowExcessArguments(false).option(
|
|
112
|
+
"--device-name <name>",
|
|
113
|
+
"Provide a name for the device being authorized"
|
|
114
|
+
).option(
|
|
115
|
+
"-f, --force",
|
|
116
|
+
"Proceed with login even if a valid access token already exists for this device"
|
|
117
|
+
).option(
|
|
118
|
+
"--no-open",
|
|
119
|
+
"Don't automatically open the login link in the default browser"
|
|
120
|
+
).addOption(
|
|
121
|
+
new import_extra_typings.Option(
|
|
122
|
+
"--login-flow <mode>",
|
|
123
|
+
`How to log in; defaults to guessing based on the environment.`
|
|
124
|
+
).choices(["paste", "auto", "poll"]).default("auto")
|
|
125
|
+
).addOption(new import_extra_typings.Option("--link-deployments").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-url <url>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-client <id>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-username <username>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-password <password>").hideHelp()).addOption(new import_extra_typings.Option("--override-access-token <token>").hideHelp()).addOption(new import_extra_typings.Option("--accept-opt-ins").hideHelp()).addOption(new import_extra_typings.Option("--dump-access-token").hideHelp()).addOption(new import_extra_typings.Option("--check-login").hideHelp()).addOption(
|
|
126
|
+
new import_extra_typings.Option(
|
|
127
|
+
"--vercel",
|
|
128
|
+
"Redirect to Vercel SSO integration for login"
|
|
129
|
+
).hideHelp()
|
|
130
|
+
).addOption(new import_extra_typings.Option("--vercel-override <slug>").hideHelp()).addCommand(loginStatus).addHelpCommand(false).action(async (options, cmd) => {
|
|
131
|
+
const ctx = await (0, import_context.oneoffContext)({
|
|
132
|
+
url: void 0,
|
|
133
|
+
adminKey: void 0,
|
|
134
|
+
envFile: void 0
|
|
135
|
+
});
|
|
136
|
+
if (!options.force && await (0, import_login.checkAuthorization)(ctx, !!options.acceptOptIns)) {
|
|
137
|
+
(0, import_log.logFinishedStep)(
|
|
138
|
+
"This device has previously been authorized and is ready for use with Convex."
|
|
139
|
+
);
|
|
140
|
+
await handleLinkingDeployments(ctx, {
|
|
141
|
+
interactive: !!options.linkDeployments
|
|
64
142
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
} else {
|
|
72
|
-
const globalConfig = (0, import_globalConfig.readGlobalConfig)(ctx);
|
|
73
|
-
if (globalConfig !== null) {
|
|
74
|
-
accountAuth = {
|
|
75
|
-
kind: "accessToken",
|
|
76
|
-
accessToken: globalConfig.accessToken,
|
|
77
|
-
header: `Bearer ${globalConfig.accessToken}`,
|
|
78
|
-
profile: null
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (accountAuth === null) {
|
|
84
|
-
(0, import_log.logMessage)(`No Convex account token found in: ${(0, import_globalConfig.globalConfigPath)()}`);
|
|
85
|
-
(0, import_log.logMessage)("Status: Not logged in");
|
|
86
|
-
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
87
|
-
return await ctx.crash({
|
|
88
|
-
exitCode: 1,
|
|
89
|
-
errorType: "fatal",
|
|
90
|
-
printedMessage: null
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
(0, import_deployKeyWarning.warnIfDeployKeyOverridesLogin)(ctx, true);
|
|
94
|
-
if (accountAuth.profile) {
|
|
95
|
-
(0, import_log.logMessage)(`Account: ${accountAuth.profile.name}`);
|
|
96
|
-
(0, import_log.logMessage)(`Selected by: ${accountAuth.profile.source}`);
|
|
97
|
-
(0, import_log.logMessage)(
|
|
98
|
-
`Convex account token found in: ${(0, import_profiles.profileConfigPath)(accountAuth.profile.name)}`
|
|
99
|
-
);
|
|
100
|
-
} else if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
|
|
101
|
-
(0, import_log.logMessage)("Using CONVEX_OVERRIDE_ACCESS_TOKEN from the environment");
|
|
102
|
-
} else {
|
|
103
|
-
(0, import_log.logMessage)(`Convex account token found in: ${(0, import_globalConfig.globalConfigPath)()}`);
|
|
104
|
-
}
|
|
105
|
-
if (!await (0, import_login.isAuthorizedHeader)(ctx, accountAuth.header)) {
|
|
106
|
-
(0, import_log.logMessage)("Status: Not logged in");
|
|
107
|
-
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
108
|
-
return await ctx.crash({
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!options.force && options.checkLogin) {
|
|
146
|
+
const isLoggedIn = await (0, import_login.checkAuthorization)(ctx, !!options.acceptOptIns);
|
|
147
|
+
if (!isLoggedIn) {
|
|
148
|
+
return ctx.crash({
|
|
109
149
|
exitCode: 1,
|
|
110
150
|
errorType: "fatal",
|
|
111
|
-
|
|
151
|
+
errForSentry: "You are not logged in.",
|
|
152
|
+
printedMessage: "You are not logged in."
|
|
112
153
|
});
|
|
113
154
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`Teams: ${teams.length} team${teams.length === 1 ? "" : "s"} accessible`
|
|
155
|
+
}
|
|
156
|
+
if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {
|
|
157
|
+
cmd.error(
|
|
158
|
+
"If overriding credentials, both username and password must be provided"
|
|
119
159
|
);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
160
|
+
}
|
|
161
|
+
const uuid = (0, import_filePaths.loadUuidForAnonymousUser)(ctx);
|
|
162
|
+
await (0, import_login.performLogin)(ctx, {
|
|
163
|
+
...options,
|
|
164
|
+
anonymousId: uuid,
|
|
165
|
+
vercel: options.vercel,
|
|
166
|
+
vercelOverride: options.vercelOverride
|
|
124
167
|
});
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return new import_extra_typings.Command("login").description("Login to Convex").allowExcessArguments(false).option("--account <name>", "Log in to a named account").option(
|
|
128
|
-
"--select",
|
|
129
|
-
"Select this account for this directory and its subdirectories"
|
|
130
|
-
).option(
|
|
131
|
-
"--device-name <name>",
|
|
132
|
-
"Provide a name for the device being authorized"
|
|
133
|
-
).option(
|
|
134
|
-
"-f, --force",
|
|
135
|
-
"Proceed with login even if a valid access token already exists for this device"
|
|
136
|
-
).option(
|
|
137
|
-
"--no-open",
|
|
138
|
-
"Don't automatically open the login link in the default browser"
|
|
139
|
-
).addOption(
|
|
140
|
-
new import_extra_typings.Option(
|
|
141
|
-
"--login-flow <mode>",
|
|
142
|
-
`How to log in; defaults to guessing based on the environment.`
|
|
143
|
-
).choices(["paste", "auto", "poll"]).default("auto")
|
|
144
|
-
).addOption(new import_extra_typings.Option("--link-deployments").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-url <url>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-client <id>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-username <username>").hideHelp()).addOption(new import_extra_typings.Option("--override-auth-password <password>").hideHelp()).addOption(new import_extra_typings.Option("--override-access-token <token>").hideHelp()).addOption(new import_extra_typings.Option("--accept-opt-ins").hideHelp()).addOption(new import_extra_typings.Option("--dump-access-token").hideHelp()).addOption(new import_extra_typings.Option("--check-login").hideHelp()).addOption(
|
|
145
|
-
new import_extra_typings.Option(
|
|
146
|
-
"--vercel",
|
|
147
|
-
"Redirect to Vercel SSO integration for login"
|
|
148
|
-
).hideHelp()
|
|
149
|
-
).addOption(new import_extra_typings.Option("--vercel-override <slug>").hideHelp()).addCommand(createLoginStatusCommand()).addHelpCommand(false).action(async (options, cmd) => {
|
|
150
|
-
const ctx = await (0, import_context.oneoffContext)({
|
|
151
|
-
url: void 0,
|
|
152
|
-
adminKey: void 0,
|
|
153
|
-
envFile: void 0,
|
|
154
|
-
skipAuth: true
|
|
155
|
-
});
|
|
156
|
-
const profile = await (0, import_profiles.getProfileSelection)(ctx, {
|
|
157
|
-
name: options.account
|
|
158
|
-
});
|
|
159
|
-
if (options.select && profile === null) {
|
|
160
|
-
cmd.error("Pass --account <name> with --select to name this login.");
|
|
161
|
-
}
|
|
162
|
-
(0, import_envvars.loadProjectEnvironmentVariables)();
|
|
163
|
-
let namingLegacyAccount = false;
|
|
164
|
-
if (profile !== null) {
|
|
165
|
-
let auth2 = options.force ? null : await (0, import_profiles.readProfileAuth)(ctx, profile, true);
|
|
166
|
-
if (auth2 === null && !options.force && !options.overrideAccessToken && !options.overrideAuthUsername && !process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
|
|
167
|
-
auth2 = await (0, import_profiles.legacyAuthForFirstProfile)(ctx, profile);
|
|
168
|
-
namingLegacyAccount = auth2 !== null;
|
|
169
|
-
}
|
|
170
|
-
ctx._updateBigBrainAuth(auth2);
|
|
171
|
-
} else {
|
|
172
|
-
const accessToken = process.env.CONVEX_OVERRIDE_ACCESS_TOKEN || (0, import_globalConfig.readGlobalConfig)(ctx)?.accessToken;
|
|
173
|
-
ctx._updateBigBrainAuth(
|
|
174
|
-
accessToken ? {
|
|
175
|
-
kind: "accessToken",
|
|
176
|
-
accessToken,
|
|
177
|
-
header: `Bearer ${accessToken}`,
|
|
178
|
-
profile: null
|
|
179
|
-
} : null
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
(0, import_deployKeyWarning.warnIfDeployKeyOverridesLogin)(ctx, ctx.bigBrainAuth() !== null);
|
|
183
|
-
if (!options.force && await (0, import_login.checkAuthorization)(ctx, !!options.acceptOptIns)) {
|
|
184
|
-
const auth2 = ctx.bigBrainAuth();
|
|
185
|
-
if (namingLegacyAccount && profile !== null && auth2?.kind === "accessToken") {
|
|
186
|
-
await (0, import_profiles.writeProfileCredentials)(
|
|
187
|
-
ctx,
|
|
188
|
-
profile.name,
|
|
189
|
-
auth2.accessToken,
|
|
190
|
-
{},
|
|
191
|
-
null
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
(0, import_log.logFinishedStep)(
|
|
195
|
-
profile !== null ? namingLegacyAccount ? `Saved account "${profile.name}" using your existing login.` : `Account "${profile.name}" is already logged in.` : "This device has previously been authorized and is ready for use with Convex."
|
|
196
|
-
);
|
|
197
|
-
if (profile !== null && auth2?.kind === "accessToken") {
|
|
198
|
-
await (0, import_profiles.initializeDefaultProfile)(
|
|
199
|
-
ctx,
|
|
200
|
-
profile,
|
|
201
|
-
namingLegacyAccount,
|
|
202
|
-
!!options.select
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
if (options.select && profile !== null) {
|
|
206
|
-
if (!await (0, import_profileManagement.bindProfileToDirectory)(ctx, profile.name)) {
|
|
207
|
-
return await ctx.crash({
|
|
208
|
-
exitCode: 1,
|
|
209
|
-
errorType: "fatal",
|
|
210
|
-
printedMessage: `Logged in as "${profile.name}", but the directory selection could not be changed.`
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
await handleLinkingDeployments(ctx, {
|
|
215
|
-
interactive: !!options.linkDeployments
|
|
216
|
-
});
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
if (!options.force && options.checkLogin) {
|
|
220
|
-
const isLoggedIn = await (0, import_login.checkAuthorization)(
|
|
221
|
-
ctx,
|
|
222
|
-
!!options.acceptOptIns
|
|
223
|
-
);
|
|
224
|
-
if (!isLoggedIn) {
|
|
225
|
-
return ctx.crash({
|
|
226
|
-
exitCode: 1,
|
|
227
|
-
errorType: "fatal",
|
|
228
|
-
errForSentry: "You are not logged in.",
|
|
229
|
-
printedMessage: "You are not logged in."
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {
|
|
234
|
-
cmd.error(
|
|
235
|
-
"If overriding credentials, both username and password must be provided"
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
const uuid = (0, import_filePaths.loadUuidForAnonymousUser)(ctx);
|
|
239
|
-
await (0, import_login.performLogin)(ctx, {
|
|
240
|
-
...options,
|
|
241
|
-
profile,
|
|
242
|
-
anonymousId: uuid,
|
|
243
|
-
vercel: options.vercel,
|
|
244
|
-
vercelOverride: options.vercelOverride
|
|
245
|
-
});
|
|
246
|
-
const auth = ctx.bigBrainAuth();
|
|
247
|
-
if (profile !== null && auth?.kind === "accessToken") {
|
|
248
|
-
await (0, import_profiles.initializeDefaultProfile)(
|
|
249
|
-
ctx,
|
|
250
|
-
profile,
|
|
251
|
-
namingLegacyAccount,
|
|
252
|
-
!!options.select
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
if (options.select && profile !== null) {
|
|
256
|
-
if (!await (0, import_profileManagement.bindProfileToDirectory)(ctx, profile.name)) {
|
|
257
|
-
return await ctx.crash({
|
|
258
|
-
exitCode: 1,
|
|
259
|
-
errorType: "fatal",
|
|
260
|
-
printedMessage: `Logged in as "${profile.name}", but the directory selection could not be changed.`
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
(0, import_deployKeyWarning.warnIfDeployKeyOverridesLogin)(ctx, true);
|
|
265
|
-
await handleLinkingDeployments(ctx, {
|
|
266
|
-
interactive: !!options.linkDeployments
|
|
267
|
-
});
|
|
168
|
+
await handleLinkingDeployments(ctx, {
|
|
169
|
+
interactive: !!options.linkDeployments
|
|
268
170
|
});
|
|
269
|
-
}
|
|
270
|
-
const login = createLoginCommand();
|
|
171
|
+
});
|
|
271
172
|
async function handleLinkingDeployments(ctx, args) {
|
|
272
173
|
if (!(0, import_deploymentSelection.shouldAllowAnonymousDevelopment)()) {
|
|
273
174
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/login.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { BigBrainAuth, Context, oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, logWarning } from \"../bundler/log.js\";\nimport {\n checkAuthorization,\n isAuthorizedHeader,\n performLogin,\n} from \"./lib/login.js\";\nimport {\n loadProjectLocalConfig,\n loadUuidForAnonymousUser,\n} from \"./lib/localDeployment/filePaths.js\";\nimport {\n handleLinkToProject,\n listLegacyAnonymousDeployments,\n} from \"./lib/localDeployment/anonymous.js\";\nimport {\n DASHBOARD_HOST,\n deploymentDashboardUrlPage,\n teamDashboardUrl,\n} from \"./lib/dashboard.js\";\nimport { promptSearch, promptYesNo } from \"./lib/utils/prompts.js\";\nimport { validateOrSelectTeam } from \"./lib/utils/utils.js\";\nimport {\n selectProject,\n updateEnvAndConfigForDeploymentSelection,\n} from \"./configure.js\";\nimport {\n getDeploymentSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport {\n isAnonymousDeployment,\n removeAnonymousPrefix,\n} from \"./lib/deployment.js\";\nimport {\n globalConfigPath,\n readGlobalConfig,\n} from \"./lib/utils/globalConfig.js\";\nimport { getTeamsForUser } from \"./lib/api.js\";\nimport {\n getProfileSelection,\n initializeDefaultProfile,\n legacyAuthForFirstProfile,\n profileConfigPath,\n readProfileAuth,\n writeProfileCredentials,\n} from \"./lib/profiles.js\";\nimport {\n getDeployKeySource,\n loadProjectEnvironmentVariables,\n} from \"./lib/envvars.js\";\nimport { bindProfileToDirectory } from \"./lib/profileManagement.js\";\nimport { warnIfDeployKeyOverridesLogin } from \"./lib/deployKeyWarning.js\";\n\n/**\n * A project or deployment key in the environment outranks the account token for\n * commands run from this directory, and an expired one makes the CLI look\n * logged out, so report it separately from the account.\n */\nasync function reportDeployKeyInWorkingDirectory(\n ctx: Context,\n auth: BigBrainAuth | null,\n) {\n // A preview deploy key is only used when there's no account token at all.\n if (\n auth === null ||\n auth.kind === \"accessToken\" ||\n auth.kind === \"previewDeployKey\"\n ) {\n return;\n }\n const key = auth.kind === \"projectKey\" ? auth.projectKey : auth.deploymentKey;\n const { envVarName, source } = getDeployKeySource(key);\n // Big Brain only strips a `project:`/`team:` prefix itself, so a deployment\n // key authorizes only without its `dev:`/`prod:` prefix. Split on the first\n // `|` like the server does, so a secret containing one survives.\n const secret = key.slice(key.indexOf(\"|\") + 1);\n if (await isAuthorizedHeader(ctx, `Bearer ${secret}`)) {\n logMessage(`Working Directory: Valid ${envVarName} in ${source}`);\n return;\n }\n logWarning(`Working Directory: Invalid ${envVarName} in ${source}`);\n}\n\nfunction createLoginStatusCommand() {\n return new Command(\"status\")\n .description(\n \"Check login status and list accessible teams. Exits with code 1 when not logged in.\",\n )\n .allowExcessArguments(false)\n .action(async () => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Keep the directory's deploy key for separate reporting after selecting\n // the account whose teams will be listed.\n const auth = ctx.bigBrainAuth();\n let accountAuth = auth?.kind === \"accessToken\" ? auth : null;\n if (accountAuth === null) {\n const profile = await getProfileSelection(ctx);\n if (profile !== null) {\n accountAuth = await readProfileAuth(ctx, profile);\n } else {\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig !== null) {\n accountAuth = {\n kind: \"accessToken\",\n accessToken: globalConfig.accessToken,\n header: `Bearer ${globalConfig.accessToken}`,\n profile: null,\n };\n }\n }\n }\n if (accountAuth === null) {\n logMessage(`No Convex account token found in: ${globalConfigPath()}`);\n logMessage(\"Status: Not logged in\");\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n });\n }\n warnIfDeployKeyOverridesLogin(ctx, true);\n if (accountAuth.profile) {\n logMessage(`Account: ${accountAuth.profile.name}`);\n logMessage(`Selected by: ${accountAuth.profile.source}`);\n logMessage(\n `Convex account token found in: ${profileConfigPath(accountAuth.profile.name)}`,\n );\n } else if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n logMessage(\"Using CONVEX_OVERRIDE_ACCESS_TOKEN from the environment\");\n } else {\n logMessage(`Convex account token found in: ${globalConfigPath()}`);\n }\n\n if (!(await isAuthorizedHeader(ctx, accountAuth.header))) {\n logMessage(\"Status: Not logged in\");\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n });\n }\n\n logMessage(\"Status: Logged in\");\n ctx._updateBigBrainAuth(accountAuth);\n const teams = await getTeamsForUser(ctx);\n logMessage(\n `Teams: ${teams.length} team${teams.length === 1 ? \"\" : \"s\"} accessible`,\n );\n for (const team of teams) {\n logMessage(` - ${team.name} (${team.slug})`);\n }\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n });\n}\n\nexport function createLoginCommand() {\n return (\n new Command(\"login\")\n .description(\"Login to Convex\")\n .allowExcessArguments(false)\n .option(\"--account <name>\", \"Log in to a named account\")\n .option(\n \"--select\",\n \"Select this account for this directory and its subdirectories\",\n )\n .option(\n \"--device-name <name>\",\n \"Provide a name for the device being authorized\",\n )\n .option(\n \"-f, --force\",\n \"Proceed with login even if a valid access token already exists for this device\",\n )\n .option(\n \"--no-open\",\n \"Don't automatically open the login link in the default browser\",\n )\n .addOption(\n new Option(\n \"--login-flow <mode>\",\n `How to log in; defaults to guessing based on the environment.`,\n )\n .choices([\"paste\", \"auto\", \"poll\"] as const)\n .default(\"auto\" as const),\n )\n .addOption(new Option(\"--link-deployments\").hideHelp())\n // These options are hidden from the help/usage message, but allow overriding settings for testing.\n // Change the auth credentials with the auth provider\n .addOption(new Option(\"--override-auth-url <url>\").hideHelp())\n .addOption(new Option(\"--override-auth-client <id>\").hideHelp())\n .addOption(new Option(\"--override-auth-username <username>\").hideHelp())\n .addOption(new Option(\"--override-auth-password <password>\").hideHelp())\n // Skip the auth provider login and directly use this access token\n .addOption(new Option(\"--override-access-token <token>\").hideHelp())\n // Automatically accept opt ins without prompting\n .addOption(new Option(\"--accept-opt-ins\").hideHelp())\n // Dump the access token from the auth provider and skip authorization with Convex\n .addOption(new Option(\"--dump-access-token\").hideHelp())\n // Hidden option for tests to check if the user is logged in.\n .addOption(new Option(\"--check-login\").hideHelp())\n // Redirect to Vercel SSO integration URL\n .addOption(\n new Option(\n \"--vercel\",\n \"Redirect to Vercel SSO integration for login\",\n ).hideHelp(),\n )\n // Override the Vercel URL slug (defaults to 'convex')\n .addOption(new Option(\"--vercel-override <slug>\").hideHelp())\n .addCommand(createLoginStatusCommand())\n .addHelpCommand(false)\n .action(async (options, cmd: Command) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n skipAuth: true,\n });\n const profile = await getProfileSelection(ctx, {\n name: options.account,\n });\n if (options.select && profile === null) {\n cmd.error(\"Pass --account <name> with --select to name this login.\");\n }\n loadProjectEnvironmentVariables();\n let namingLegacyAccount = false;\n if (profile !== null) {\n let auth = options.force\n ? null\n : await readProfileAuth(ctx, profile, true);\n if (\n auth === null &&\n !options.force &&\n !options.overrideAccessToken &&\n !options.overrideAuthUsername &&\n !process.env.CONVEX_OVERRIDE_ACCESS_TOKEN\n ) {\n auth = await legacyAuthForFirstProfile(ctx, profile);\n namingLegacyAccount = auth !== null;\n }\n ctx._updateBigBrainAuth(auth);\n } else {\n const accessToken =\n process.env.CONVEX_OVERRIDE_ACCESS_TOKEN ||\n readGlobalConfig(ctx)?.accessToken;\n ctx._updateBigBrainAuth(\n accessToken\n ? {\n kind: \"accessToken\",\n accessToken,\n header: `Bearer ${accessToken}`,\n profile: null,\n }\n : null,\n );\n }\n warnIfDeployKeyOverridesLogin(ctx, ctx.bigBrainAuth() !== null);\n if (\n !options.force &&\n (await checkAuthorization(ctx, !!options.acceptOptIns))\n ) {\n const auth = ctx.bigBrainAuth();\n if (\n namingLegacyAccount &&\n profile !== null &&\n auth?.kind === \"accessToken\"\n ) {\n await writeProfileCredentials(\n ctx,\n profile.name,\n auth.accessToken,\n {},\n null,\n );\n }\n logFinishedStep(\n profile !== null\n ? namingLegacyAccount\n ? `Saved account \"${profile.name}\" using your existing login.`\n : `Account \"${profile.name}\" is already logged in.`\n : \"This device has previously been authorized and is ready for use with Convex.\",\n );\n if (profile !== null && auth?.kind === \"accessToken\") {\n await initializeDefaultProfile(\n ctx,\n profile,\n namingLegacyAccount,\n !!options.select,\n );\n }\n if (options.select && profile !== null) {\n if (!(await bindProfileToDirectory(ctx, profile.name))) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Logged in as \"${profile.name}\", but the directory selection could not be changed.`,\n });\n }\n }\n await handleLinkingDeployments(ctx, {\n interactive: !!options.linkDeployments,\n });\n return;\n }\n if (!options.force && options.checkLogin) {\n const isLoggedIn = await checkAuthorization(\n ctx,\n !!options.acceptOptIns,\n );\n if (!isLoggedIn) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"You are not logged in.\",\n printedMessage: \"You are not logged in.\",\n });\n }\n }\n if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {\n cmd.error(\n \"If overriding credentials, both username and password must be provided\",\n );\n }\n\n const uuid = loadUuidForAnonymousUser(ctx);\n await performLogin(ctx, {\n ...options,\n profile,\n anonymousId: uuid,\n vercel: options.vercel,\n vercelOverride: options.vercelOverride,\n });\n\n const auth = ctx.bigBrainAuth();\n if (profile !== null && auth?.kind === \"accessToken\") {\n await initializeDefaultProfile(\n ctx,\n profile,\n namingLegacyAccount,\n !!options.select,\n );\n }\n if (options.select && profile !== null) {\n if (!(await bindProfileToDirectory(ctx, profile.name))) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Logged in as \"${profile.name}\", but the directory selection could not be changed.`,\n });\n }\n }\n warnIfDeployKeyOverridesLogin(ctx, true);\n\n await handleLinkingDeployments(ctx, {\n interactive: !!options.linkDeployments,\n });\n })\n );\n}\n\nexport const login = createLoginCommand();\n\nasync function handleLinkingDeployments(\n ctx: Context,\n args: {\n interactive: boolean;\n },\n) {\n if (!shouldAllowAnonymousDevelopment()) {\n return;\n }\n\n // Check for project-local anonymous deployment first - this takes priority\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n const shouldLink = await promptYesNo(ctx, {\n message: `Would you like to link your existing deployment to your account? (\"${projectLocal.deploymentName}\")`,\n default: true,\n });\n if (!shouldLink) {\n logMessage(\n \"Not linking your existing deployment. If you want to link it later, run `npx convex login --link-deployments`.\",\n );\n logMessage(\n `Visit ${DASHBOARD_HOST} or run \\`npx convex dev\\` to get started with your new account.`,\n );\n return;\n }\n\n const { dashboardUrl } = await linkSingleDeployment(\n ctx,\n projectLocal.deploymentName,\n projectLocal.deploymentName,\n );\n logFinishedStep(`Visit ${dashboardUrl} to get started.`);\n return;\n }\n\n // No project-local deployment - check for legacy deployments\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n if (legacyDeployments.length === 0) {\n if (args.interactive) {\n logMessage(\n \"It doesn't look like you have any deployments to link. You can run `npx convex dev` to set up a new project or select an existing one.\",\n );\n }\n return;\n }\n\n // Get the currently configured deployment (if any) for env var updates\n const deploymentSelection = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n const configuredDeployment =\n deploymentSelection.kind === \"anonymous\"\n ? deploymentSelection.deploymentName\n : null;\n\n if (!args.interactive) {\n // Non-interactive: link all legacy deployments automatically\n const message = getMessage(legacyDeployments.map((d) => d.deploymentName));\n const createProjects = await promptYesNo(ctx, {\n message,\n default: true,\n });\n if (!createProjects) {\n logMessage(\n \"Not linking your existing deployments. If you want to link them later, run `npx convex login --link-deployments`.\",\n );\n logMessage(\n `Visit ${DASHBOARD_HOST} or run \\`npx convex dev\\` to get started with your new account.`,\n );\n return;\n }\n\n const {\n team: { slug: teamSlug },\n } = await validateOrSelectTeam(\n ctx,\n undefined,\n \"Choose a team for your deployments:\",\n );\n let dashboardUrl = teamDashboardUrl(teamSlug);\n for (const deployment of legacyDeployments) {\n const result = await linkSingleDeployment(\n ctx,\n deployment.deploymentName,\n configuredDeployment,\n { teamSlug, projectSlug: null },\n );\n if (deployment.deploymentName === configuredDeployment) {\n dashboardUrl = result.dashboardUrl;\n }\n }\n logFinishedStep(\n `Successfully linked your deployments! Visit ${dashboardUrl} to get started.`,\n );\n return;\n }\n\n // Interactive mode: let user choose which legacy deployments to link\n while (true) {\n const currentLegacyDeployments = listLegacyAnonymousDeployments(ctx);\n if (currentLegacyDeployments.length === 0) {\n logMessage(\"All deployments have been linked.\");\n break;\n }\n logMessage(\n getDeploymentListMessage(\n currentLegacyDeployments.map((d) => d.deploymentName),\n ),\n );\n const deploymentToLink = await promptSearch(ctx, {\n message: \"Which deployment would you like to link to your account?\",\n choices: currentLegacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n });\n\n await linkSingleDeployment(ctx, deploymentToLink, configuredDeployment);\n\n const shouldContinue = await promptYesNo(ctx, {\n message: \"Would you like to link another deployment?\",\n default: true,\n });\n if (!shouldContinue) {\n break;\n }\n }\n}\n\n/**\n * Link a single deployment to a project, prompting for team and project selection.\n * Updates env vars if this is the currently configured deployment.\n */\nasync function linkSingleDeployment(\n ctx: Context,\n deploymentName: string,\n configuredDeployment: string | null,\n options?: {\n teamSlug?: string;\n projectSlug?: string | null;\n },\n): Promise<{ dashboardUrl: string }> {\n const { team } = await validateOrSelectTeam(\n ctx,\n options?.teamSlug,\n \"Choose a team for your deployment:\",\n );\n\n const projectSlug =\n options?.projectSlug ??\n (\n await selectProject(ctx, \"ask\", {\n team: team.slug,\n devDeployment: \"local\",\n defaultProjectName: removeAnonymousPrefix(deploymentName),\n })\n ).projectSlug;\n\n const linkedDeployment = await handleLinkToProject(ctx, {\n deploymentName,\n teamSlug: team.slug,\n teamId: team.id,\n projectSlug,\n });\n\n if (deploymentName === configuredDeployment) {\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: linkedDeployment.deploymentUrl,\n deploymentName: linkedDeployment.deploymentName,\n teamSlug: team.slug,\n projectSlug: linkedDeployment.projectSlug,\n deploymentType: \"local\",\n },\n configuredDeployment,\n );\n }\n\n return {\n dashboardUrl: deploymentDashboardUrlPage(\n linkedDeployment.deploymentName,\n \"\",\n ),\n };\n}\n\nfunction getDeploymentListMessage(anonymousDeploymentNames: string[]) {\n let message = `You have ${anonymousDeploymentNames.length} existing deployments.`;\n message += `\\n\\nDeployments:`;\n for (const deploymentName of anonymousDeploymentNames) {\n message += `\\n- ${deploymentName}`;\n }\n return message;\n}\n\nfunction getMessage(anonymousDeploymentNames: string[]) {\n if (anonymousDeploymentNames.length === 1) {\n return `Would you like to link your existing deployment to your account? (\"${anonymousDeploymentNames[0]}\")`;\n }\n let message = `You have ${anonymousDeploymentNames.length} existing deployments. Would you like to link them to your account?`;\n message += `\\n\\nDeployments:`;\n for (const deploymentName of anonymousDeploymentNames) {\n message += `\\n- ${deploymentName}`;\n }\n message += `\\n\\nYou can alternatively run \\`npx convex login --link-deployments\\` to interactively choose which deployments to add.`;\n return message;\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport * as dotenv from \"dotenv\";\nimport { BigBrainAuth, Context, oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, logWarning } from \"../bundler/log.js\";\nimport {\n checkAuthorization,\n isAuthorizedHeader,\n performLogin,\n} from \"./lib/login.js\";\nimport {\n loadProjectLocalConfig,\n loadUuidForAnonymousUser,\n} from \"./lib/localDeployment/filePaths.js\";\nimport {\n handleLinkToProject,\n listLegacyAnonymousDeployments,\n} from \"./lib/localDeployment/anonymous.js\";\nimport {\n DASHBOARD_HOST,\n deploymentDashboardUrlPage,\n teamDashboardUrl,\n} from \"./lib/dashboard.js\";\nimport { promptSearch, promptYesNo } from \"./lib/utils/prompts.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n validateOrSelectTeam,\n} from \"./lib/utils/utils.js\";\nimport {\n selectProject,\n updateEnvAndConfigForDeploymentSelection,\n} from \"./configure.js\";\nimport {\n getDeploymentSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport {\n isAnonymousDeployment,\n removeAnonymousPrefix,\n} from \"./lib/deployment.js\";\nimport {\n readGlobalConfig,\n globalConfigPath,\n} from \"./lib/utils/globalConfig.js\";\nimport { getTeamsForUser } from \"./lib/api.js\";\n\n/**\n * The env file a deploy key came from, or null if it came from the shell.\n * `dotenv` doesn't overwrite variables that are already set, so a value from\n * the shell outranks these files -- match on the value to tell them apart.\n */\nfunction deployKeyEnvFile(\n ctx: Context,\n envVarName: string,\n value: string,\n): string | null {\n for (const file of [ENV_VAR_FILE_PATH, \".env\"]) {\n if (!ctx.fs.exists(file)) {\n continue;\n }\n if (dotenv.parse(ctx.fs.readUtf8File(file))[envVarName] === value) {\n return file;\n }\n }\n return null;\n}\n\n/**\n * A project or deployment key in the environment outranks the account token for\n * commands run from this directory, and an expired one makes the CLI look\n * logged out, so report it separately from the account.\n */\nasync function reportDeployKeyInWorkingDirectory(\n ctx: Context,\n auth: BigBrainAuth | null,\n) {\n // A preview deploy key is only used when there's no account token at all.\n if (\n auth === null ||\n auth.kind === \"accessToken\" ||\n auth.kind === \"previewDeployKey\"\n ) {\n return;\n }\n const key = auth.kind === \"projectKey\" ? auth.projectKey : auth.deploymentKey;\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;\n const envFile = deployKeyEnvFile(ctx, envVarName, key);\n const source = envFile ?? \"shell environment\";\n // Big Brain only strips a `project:`/`team:` prefix itself, so a deployment\n // key authorizes only without its `dev:`/`prod:` prefix. Split on the first\n // `|` like the server does, so a secret containing one survives.\n const secret = key.slice(key.indexOf(\"|\") + 1);\n if (await isAuthorizedHeader(ctx, `Bearer ${secret}`)) {\n logMessage(`Working Directory: Valid ${envVarName} in ${source}`);\n return;\n }\n logWarning(`Working Directory: Invalid ${envVarName} in ${source}`);\n}\n\nconst loginStatus = new Command(\"status\")\n .description(\"Check login status and list accessible teams\")\n .allowExcessArguments(false)\n .action(async () => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // `_updateBigBrainAuth` below replaces any deploy key in `ctx` with the\n // account token, so read the deploy key first.\n const auth = ctx.bigBrainAuth();\n\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig === null) {\n logMessage(`No Convex account token found in: ${globalConfigPath()}`);\n logMessage(\"Status: Not logged in\");\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n return;\n }\n logMessage(`Convex account token found in: ${globalConfigPath()}`);\n\n const accessToken = globalConfig.accessToken;\n if (!(await isAuthorizedHeader(ctx, `Bearer ${accessToken}`))) {\n logMessage(\"Status: Not logged in\");\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n return;\n }\n\n logMessage(\"Status: Logged in\");\n // Describe the account, even if a deploy key outranks it for other commands.\n ctx._updateBigBrainAuth({\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n accessToken,\n });\n const teams = await getTeamsForUser(ctx);\n logMessage(\n `Teams: ${teams.length} team${teams.length === 1 ? \"\" : \"s\"} accessible`,\n );\n for (const team of teams) {\n logMessage(` - ${team.name} (${team.slug})`);\n }\n await reportDeployKeyInWorkingDirectory(ctx, auth);\n });\n\nexport const login = new Command(\"login\")\n .description(\"Login to Convex\")\n .allowExcessArguments(false)\n .option(\n \"--device-name <name>\",\n \"Provide a name for the device being authorized\",\n )\n .option(\n \"-f, --force\",\n \"Proceed with login even if a valid access token already exists for this device\",\n )\n .option(\n \"--no-open\",\n \"Don't automatically open the login link in the default browser\",\n )\n .addOption(\n new Option(\n \"--login-flow <mode>\",\n `How to log in; defaults to guessing based on the environment.`,\n )\n .choices([\"paste\", \"auto\", \"poll\"] as const)\n .default(\"auto\" as const),\n )\n .addOption(new Option(\"--link-deployments\").hideHelp())\n // These options are hidden from the help/usage message, but allow overriding settings for testing.\n // Change the auth credentials with the auth provider\n .addOption(new Option(\"--override-auth-url <url>\").hideHelp())\n .addOption(new Option(\"--override-auth-client <id>\").hideHelp())\n .addOption(new Option(\"--override-auth-username <username>\").hideHelp())\n .addOption(new Option(\"--override-auth-password <password>\").hideHelp())\n // Skip the auth provider login and directly use this access token\n .addOption(new Option(\"--override-access-token <token>\").hideHelp())\n // Automatically accept opt ins without prompting\n .addOption(new Option(\"--accept-opt-ins\").hideHelp())\n // Dump the access token from the auth provider and skip authorization with Convex\n .addOption(new Option(\"--dump-access-token\").hideHelp())\n // Hidden option for tests to check if the user is logged in.\n .addOption(new Option(\"--check-login\").hideHelp())\n // Redirect to Vercel SSO integration URL\n .addOption(\n new Option(\n \"--vercel\",\n \"Redirect to Vercel SSO integration for login\",\n ).hideHelp(),\n )\n // Override the Vercel URL slug (defaults to 'convex')\n .addOption(new Option(\"--vercel-override <slug>\").hideHelp())\n .addCommand(loginStatus)\n .addHelpCommand(false)\n .action(async (options, cmd: Command) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n if (\n !options.force &&\n (await checkAuthorization(ctx, !!options.acceptOptIns))\n ) {\n logFinishedStep(\n \"This device has previously been authorized and is ready for use with Convex.\",\n );\n await handleLinkingDeployments(ctx, {\n interactive: !!options.linkDeployments,\n });\n return;\n }\n if (!options.force && options.checkLogin) {\n const isLoggedIn = await checkAuthorization(ctx, !!options.acceptOptIns);\n if (!isLoggedIn) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"You are not logged in.\",\n printedMessage: \"You are not logged in.\",\n });\n }\n }\n if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {\n cmd.error(\n \"If overriding credentials, both username and password must be provided\",\n );\n }\n\n const uuid = loadUuidForAnonymousUser(ctx);\n await performLogin(ctx, {\n ...options,\n anonymousId: uuid,\n vercel: options.vercel,\n vercelOverride: options.vercelOverride,\n });\n\n await handleLinkingDeployments(ctx, {\n interactive: !!options.linkDeployments,\n });\n });\n\nasync function handleLinkingDeployments(\n ctx: Context,\n args: {\n interactive: boolean;\n },\n) {\n if (!shouldAllowAnonymousDevelopment()) {\n return;\n }\n\n // Check for project-local anonymous deployment first - this takes priority\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n const shouldLink = await promptYesNo(ctx, {\n message: `Would you like to link your existing deployment to your account? (\"${projectLocal.deploymentName}\")`,\n default: true,\n });\n if (!shouldLink) {\n logMessage(\n \"Not linking your existing deployment. If you want to link it later, run `npx convex login --link-deployments`.\",\n );\n logMessage(\n `Visit ${DASHBOARD_HOST} or run \\`npx convex dev\\` to get started with your new account.`,\n );\n return;\n }\n\n const { dashboardUrl } = await linkSingleDeployment(\n ctx,\n projectLocal.deploymentName,\n projectLocal.deploymentName,\n );\n logFinishedStep(`Visit ${dashboardUrl} to get started.`);\n return;\n }\n\n // No project-local deployment - check for legacy deployments\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n if (legacyDeployments.length === 0) {\n if (args.interactive) {\n logMessage(\n \"It doesn't look like you have any deployments to link. You can run `npx convex dev` to set up a new project or select an existing one.\",\n );\n }\n return;\n }\n\n // Get the currently configured deployment (if any) for env var updates\n const deploymentSelection = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n const configuredDeployment =\n deploymentSelection.kind === \"anonymous\"\n ? deploymentSelection.deploymentName\n : null;\n\n if (!args.interactive) {\n // Non-interactive: link all legacy deployments automatically\n const message = getMessage(legacyDeployments.map((d) => d.deploymentName));\n const createProjects = await promptYesNo(ctx, {\n message,\n default: true,\n });\n if (!createProjects) {\n logMessage(\n \"Not linking your existing deployments. If you want to link them later, run `npx convex login --link-deployments`.\",\n );\n logMessage(\n `Visit ${DASHBOARD_HOST} or run \\`npx convex dev\\` to get started with your new account.`,\n );\n return;\n }\n\n const {\n team: { slug: teamSlug },\n } = await validateOrSelectTeam(\n ctx,\n undefined,\n \"Choose a team for your deployments:\",\n );\n let dashboardUrl = teamDashboardUrl(teamSlug);\n for (const deployment of legacyDeployments) {\n const result = await linkSingleDeployment(\n ctx,\n deployment.deploymentName,\n configuredDeployment,\n { teamSlug, projectSlug: null },\n );\n if (deployment.deploymentName === configuredDeployment) {\n dashboardUrl = result.dashboardUrl;\n }\n }\n logFinishedStep(\n `Successfully linked your deployments! Visit ${dashboardUrl} to get started.`,\n );\n return;\n }\n\n // Interactive mode: let user choose which legacy deployments to link\n while (true) {\n const currentLegacyDeployments = listLegacyAnonymousDeployments(ctx);\n if (currentLegacyDeployments.length === 0) {\n logMessage(\"All deployments have been linked.\");\n break;\n }\n logMessage(\n getDeploymentListMessage(\n currentLegacyDeployments.map((d) => d.deploymentName),\n ),\n );\n const deploymentToLink = await promptSearch(ctx, {\n message: \"Which deployment would you like to link to your account?\",\n choices: currentLegacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n });\n\n await linkSingleDeployment(ctx, deploymentToLink, configuredDeployment);\n\n const shouldContinue = await promptYesNo(ctx, {\n message: \"Would you like to link another deployment?\",\n default: true,\n });\n if (!shouldContinue) {\n break;\n }\n }\n}\n\n/**\n * Link a single deployment to a project, prompting for team and project selection.\n * Updates env vars if this is the currently configured deployment.\n */\nasync function linkSingleDeployment(\n ctx: Context,\n deploymentName: string,\n configuredDeployment: string | null,\n options?: {\n teamSlug?: string;\n projectSlug?: string | null;\n },\n): Promise<{ dashboardUrl: string }> {\n const { team } = await validateOrSelectTeam(\n ctx,\n options?.teamSlug,\n \"Choose a team for your deployment:\",\n );\n\n const projectSlug =\n options?.projectSlug ??\n (\n await selectProject(ctx, \"ask\", {\n team: team.slug,\n devDeployment: \"local\",\n defaultProjectName: removeAnonymousPrefix(deploymentName),\n })\n ).projectSlug;\n\n const linkedDeployment = await handleLinkToProject(ctx, {\n deploymentName,\n teamSlug: team.slug,\n teamId: team.id,\n projectSlug,\n });\n\n if (deploymentName === configuredDeployment) {\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: linkedDeployment.deploymentUrl,\n deploymentName: linkedDeployment.deploymentName,\n teamSlug: team.slug,\n projectSlug: linkedDeployment.projectSlug,\n deploymentType: \"local\",\n },\n configuredDeployment,\n );\n }\n\n return {\n dashboardUrl: deploymentDashboardUrlPage(\n linkedDeployment.deploymentName,\n \"\",\n ),\n };\n}\n\nfunction getDeploymentListMessage(anonymousDeploymentNames: string[]) {\n let message = `You have ${anonymousDeploymentNames.length} existing deployments.`;\n message += `\\n\\nDeployments:`;\n for (const deploymentName of anonymousDeploymentNames) {\n message += `\\n- ${deploymentName}`;\n }\n return message;\n}\n\nfunction getMessage(anonymousDeploymentNames: string[]) {\n if (anonymousDeploymentNames.length === 1) {\n return `Would you like to link your existing deployment to your account? (\"${anonymousDeploymentNames[0]}\")`;\n }\n let message = `You have ${anonymousDeploymentNames.length} existing deployments. Would you like to link them to your account?`;\n message += `\\n\\nDeployments:`;\n for (const deploymentName of anonymousDeploymentNames) {\n message += `\\n- ${deploymentName}`;\n }\n message += `\\n\\nYou can alternatively run \\`npx convex login --link-deployments\\` to interactively choose which deployments to add.`;\n return message;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|