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/src/cli/login.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command, Option } from "@commander-js/extra-typings";
|
|
2
|
+
import * as dotenv from "dotenv";
|
|
2
3
|
import { BigBrainAuth, Context, oneoffContext } from "../bundler/context.js";
|
|
3
4
|
import { logFinishedStep, logMessage, logWarning } from "../bundler/log.js";
|
|
4
5
|
import {
|
|
@@ -20,7 +21,12 @@ import {
|
|
|
20
21
|
teamDashboardUrl,
|
|
21
22
|
} from "./lib/dashboard.js";
|
|
22
23
|
import { promptSearch, promptYesNo } from "./lib/utils/prompts.js";
|
|
23
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
|
|
26
|
+
CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
|
|
27
|
+
ENV_VAR_FILE_PATH,
|
|
28
|
+
validateOrSelectTeam,
|
|
29
|
+
} from "./lib/utils/utils.js";
|
|
24
30
|
import {
|
|
25
31
|
selectProject,
|
|
26
32
|
updateEnvAndConfigForDeploymentSelection,
|
|
@@ -34,24 +40,31 @@ import {
|
|
|
34
40
|
removeAnonymousPrefix,
|
|
35
41
|
} from "./lib/deployment.js";
|
|
36
42
|
import {
|
|
37
|
-
globalConfigPath,
|
|
38
43
|
readGlobalConfig,
|
|
44
|
+
globalConfigPath,
|
|
39
45
|
} from "./lib/utils/globalConfig.js";
|
|
40
46
|
import { getTeamsForUser } from "./lib/api.js";
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The env file a deploy key came from, or null if it came from the shell.
|
|
50
|
+
* `dotenv` doesn't overwrite variables that are already set, so a value from
|
|
51
|
+
* the shell outranks these files -- match on the value to tell them apart.
|
|
52
|
+
*/
|
|
53
|
+
function deployKeyEnvFile(
|
|
54
|
+
ctx: Context,
|
|
55
|
+
envVarName: string,
|
|
56
|
+
value: string,
|
|
57
|
+
): string | null {
|
|
58
|
+
for (const file of [ENV_VAR_FILE_PATH, ".env"]) {
|
|
59
|
+
if (!ctx.fs.exists(file)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (dotenv.parse(ctx.fs.readUtf8File(file))[envVarName] === value) {
|
|
63
|
+
return file;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
55
68
|
|
|
56
69
|
/**
|
|
57
70
|
* A project or deployment key in the environment outranks the account token for
|
|
@@ -71,7 +84,11 @@ async function reportDeployKeyInWorkingDirectory(
|
|
|
71
84
|
return;
|
|
72
85
|
}
|
|
73
86
|
const key = auth.kind === "projectKey" ? auth.projectKey : auth.deploymentKey;
|
|
74
|
-
const
|
|
87
|
+
const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]
|
|
88
|
+
? CONVEX_DEPLOY_KEY_ENV_VAR_NAME
|
|
89
|
+
: CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
|
|
90
|
+
const envFile = deployKeyEnvFile(ctx, envVarName, key);
|
|
91
|
+
const source = envFile ?? "shell environment";
|
|
75
92
|
// Big Brain only strips a `project:`/`team:` prefix itself, so a deployment
|
|
76
93
|
// key authorizes only without its `dev:`/`prod:` prefix. Split on the first
|
|
77
94
|
// `|` like the server does, so a secret containing one survives.
|
|
@@ -83,291 +100,149 @@ async function reportDeployKeyInWorkingDirectory(
|
|
|
83
100
|
logWarning(`Working Directory: Invalid ${envVarName} in ${source}`);
|
|
84
101
|
}
|
|
85
102
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
adminKey: undefined,
|
|
96
|
-
envFile: undefined,
|
|
97
|
-
});
|
|
103
|
+
const loginStatus = new Command("status")
|
|
104
|
+
.description("Check login status and list accessible teams")
|
|
105
|
+
.allowExcessArguments(false)
|
|
106
|
+
.action(async () => {
|
|
107
|
+
const ctx = await oneoffContext({
|
|
108
|
+
url: undefined,
|
|
109
|
+
adminKey: undefined,
|
|
110
|
+
envFile: undefined,
|
|
111
|
+
});
|
|
98
112
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
let accountAuth = auth?.kind === "accessToken" ? auth : null;
|
|
103
|
-
if (accountAuth === null) {
|
|
104
|
-
const profile = await getProfileSelection(ctx);
|
|
105
|
-
if (profile !== null) {
|
|
106
|
-
accountAuth = await readProfileAuth(ctx, profile);
|
|
107
|
-
} else {
|
|
108
|
-
const globalConfig = readGlobalConfig(ctx);
|
|
109
|
-
if (globalConfig !== null) {
|
|
110
|
-
accountAuth = {
|
|
111
|
-
kind: "accessToken",
|
|
112
|
-
accessToken: globalConfig.accessToken,
|
|
113
|
-
header: `Bearer ${globalConfig.accessToken}`,
|
|
114
|
-
profile: null,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (accountAuth === null) {
|
|
120
|
-
logMessage(`No Convex account token found in: ${globalConfigPath()}`);
|
|
121
|
-
logMessage("Status: Not logged in");
|
|
122
|
-
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
123
|
-
return await ctx.crash({
|
|
124
|
-
exitCode: 1,
|
|
125
|
-
errorType: "fatal",
|
|
126
|
-
printedMessage: null,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
warnIfDeployKeyOverridesLogin(ctx, true);
|
|
130
|
-
if (accountAuth.profile) {
|
|
131
|
-
logMessage(`Account: ${accountAuth.profile.name}`);
|
|
132
|
-
logMessage(`Selected by: ${accountAuth.profile.source}`);
|
|
133
|
-
logMessage(
|
|
134
|
-
`Convex account token found in: ${profileConfigPath(accountAuth.profile.name)}`,
|
|
135
|
-
);
|
|
136
|
-
} else if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
|
|
137
|
-
logMessage("Using CONVEX_OVERRIDE_ACCESS_TOKEN from the environment");
|
|
138
|
-
} else {
|
|
139
|
-
logMessage(`Convex account token found in: ${globalConfigPath()}`);
|
|
140
|
-
}
|
|
113
|
+
// `_updateBigBrainAuth` below replaces any deploy key in `ctx` with the
|
|
114
|
+
// account token, so read the deploy key first.
|
|
115
|
+
const auth = ctx.bigBrainAuth();
|
|
141
116
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
117
|
+
const globalConfig = readGlobalConfig(ctx);
|
|
118
|
+
if (globalConfig === null) {
|
|
119
|
+
logMessage(`No Convex account token found in: ${globalConfigPath()}`);
|
|
120
|
+
logMessage("Status: Not logged in");
|
|
121
|
+
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
logMessage(`Convex account token found in: ${globalConfigPath()}`);
|
|
151
125
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
logMessage(
|
|
156
|
-
`Teams: ${teams.length} team${teams.length === 1 ? "" : "s"} accessible`,
|
|
157
|
-
);
|
|
158
|
-
for (const team of teams) {
|
|
159
|
-
logMessage(` - ${team.name} (${team.slug})`);
|
|
160
|
-
}
|
|
126
|
+
const accessToken = globalConfig.accessToken;
|
|
127
|
+
if (!(await isAuthorizedHeader(ctx, `Bearer ${accessToken}`))) {
|
|
128
|
+
logMessage("Status: Not logged in");
|
|
161
129
|
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
162
|
-
|
|
163
|
-
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
164
132
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
"Proceed with login even if a valid access token already exists for this device",
|
|
182
|
-
)
|
|
183
|
-
.option(
|
|
184
|
-
"--no-open",
|
|
185
|
-
"Don't automatically open the login link in the default browser",
|
|
186
|
-
)
|
|
187
|
-
.addOption(
|
|
188
|
-
new Option(
|
|
189
|
-
"--login-flow <mode>",
|
|
190
|
-
`How to log in; defaults to guessing based on the environment.`,
|
|
191
|
-
)
|
|
192
|
-
.choices(["paste", "auto", "poll"] as const)
|
|
193
|
-
.default("auto" as const),
|
|
194
|
-
)
|
|
195
|
-
.addOption(new Option("--link-deployments").hideHelp())
|
|
196
|
-
// These options are hidden from the help/usage message, but allow overriding settings for testing.
|
|
197
|
-
// Change the auth credentials with the auth provider
|
|
198
|
-
.addOption(new Option("--override-auth-url <url>").hideHelp())
|
|
199
|
-
.addOption(new Option("--override-auth-client <id>").hideHelp())
|
|
200
|
-
.addOption(new Option("--override-auth-username <username>").hideHelp())
|
|
201
|
-
.addOption(new Option("--override-auth-password <password>").hideHelp())
|
|
202
|
-
// Skip the auth provider login and directly use this access token
|
|
203
|
-
.addOption(new Option("--override-access-token <token>").hideHelp())
|
|
204
|
-
// Automatically accept opt ins without prompting
|
|
205
|
-
.addOption(new Option("--accept-opt-ins").hideHelp())
|
|
206
|
-
// Dump the access token from the auth provider and skip authorization with Convex
|
|
207
|
-
.addOption(new Option("--dump-access-token").hideHelp())
|
|
208
|
-
// Hidden option for tests to check if the user is logged in.
|
|
209
|
-
.addOption(new Option("--check-login").hideHelp())
|
|
210
|
-
// Redirect to Vercel SSO integration URL
|
|
211
|
-
.addOption(
|
|
212
|
-
new Option(
|
|
213
|
-
"--vercel",
|
|
214
|
-
"Redirect to Vercel SSO integration for login",
|
|
215
|
-
).hideHelp(),
|
|
216
|
-
)
|
|
217
|
-
// Override the Vercel URL slug (defaults to 'convex')
|
|
218
|
-
.addOption(new Option("--vercel-override <slug>").hideHelp())
|
|
219
|
-
.addCommand(createLoginStatusCommand())
|
|
220
|
-
.addHelpCommand(false)
|
|
221
|
-
.action(async (options, cmd: Command) => {
|
|
222
|
-
const ctx = await oneoffContext({
|
|
223
|
-
url: undefined,
|
|
224
|
-
adminKey: undefined,
|
|
225
|
-
envFile: undefined,
|
|
226
|
-
skipAuth: true,
|
|
227
|
-
});
|
|
228
|
-
const profile = await getProfileSelection(ctx, {
|
|
229
|
-
name: options.account,
|
|
230
|
-
});
|
|
231
|
-
if (options.select && profile === null) {
|
|
232
|
-
cmd.error("Pass --account <name> with --select to name this login.");
|
|
233
|
-
}
|
|
234
|
-
loadProjectEnvironmentVariables();
|
|
235
|
-
let namingLegacyAccount = false;
|
|
236
|
-
if (profile !== null) {
|
|
237
|
-
let auth = options.force
|
|
238
|
-
? null
|
|
239
|
-
: await readProfileAuth(ctx, profile, true);
|
|
240
|
-
if (
|
|
241
|
-
auth === null &&
|
|
242
|
-
!options.force &&
|
|
243
|
-
!options.overrideAccessToken &&
|
|
244
|
-
!options.overrideAuthUsername &&
|
|
245
|
-
!process.env.CONVEX_OVERRIDE_ACCESS_TOKEN
|
|
246
|
-
) {
|
|
247
|
-
auth = await legacyAuthForFirstProfile(ctx, profile);
|
|
248
|
-
namingLegacyAccount = auth !== null;
|
|
249
|
-
}
|
|
250
|
-
ctx._updateBigBrainAuth(auth);
|
|
251
|
-
} else {
|
|
252
|
-
const accessToken =
|
|
253
|
-
process.env.CONVEX_OVERRIDE_ACCESS_TOKEN ||
|
|
254
|
-
readGlobalConfig(ctx)?.accessToken;
|
|
255
|
-
ctx._updateBigBrainAuth(
|
|
256
|
-
accessToken
|
|
257
|
-
? {
|
|
258
|
-
kind: "accessToken",
|
|
259
|
-
accessToken,
|
|
260
|
-
header: `Bearer ${accessToken}`,
|
|
261
|
-
profile: null,
|
|
262
|
-
}
|
|
263
|
-
: null,
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
warnIfDeployKeyOverridesLogin(ctx, ctx.bigBrainAuth() !== null);
|
|
267
|
-
if (
|
|
268
|
-
!options.force &&
|
|
269
|
-
(await checkAuthorization(ctx, !!options.acceptOptIns))
|
|
270
|
-
) {
|
|
271
|
-
const auth = ctx.bigBrainAuth();
|
|
272
|
-
if (
|
|
273
|
-
namingLegacyAccount &&
|
|
274
|
-
profile !== null &&
|
|
275
|
-
auth?.kind === "accessToken"
|
|
276
|
-
) {
|
|
277
|
-
await writeProfileCredentials(
|
|
278
|
-
ctx,
|
|
279
|
-
profile.name,
|
|
280
|
-
auth.accessToken,
|
|
281
|
-
{},
|
|
282
|
-
null,
|
|
283
|
-
);
|
|
284
|
-
}
|
|
285
|
-
logFinishedStep(
|
|
286
|
-
profile !== null
|
|
287
|
-
? namingLegacyAccount
|
|
288
|
-
? `Saved account "${profile.name}" using your existing login.`
|
|
289
|
-
: `Account "${profile.name}" is already logged in.`
|
|
290
|
-
: "This device has previously been authorized and is ready for use with Convex.",
|
|
291
|
-
);
|
|
292
|
-
if (profile !== null && auth?.kind === "accessToken") {
|
|
293
|
-
await initializeDefaultProfile(
|
|
294
|
-
ctx,
|
|
295
|
-
profile,
|
|
296
|
-
namingLegacyAccount,
|
|
297
|
-
!!options.select,
|
|
298
|
-
);
|
|
299
|
-
}
|
|
300
|
-
if (options.select && profile !== null) {
|
|
301
|
-
if (!(await bindProfileToDirectory(ctx, profile.name))) {
|
|
302
|
-
return await ctx.crash({
|
|
303
|
-
exitCode: 1,
|
|
304
|
-
errorType: "fatal",
|
|
305
|
-
printedMessage: `Logged in as "${profile.name}", but the directory selection could not be changed.`,
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
await handleLinkingDeployments(ctx, {
|
|
310
|
-
interactive: !!options.linkDeployments,
|
|
311
|
-
});
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
if (!options.force && options.checkLogin) {
|
|
315
|
-
const isLoggedIn = await checkAuthorization(
|
|
316
|
-
ctx,
|
|
317
|
-
!!options.acceptOptIns,
|
|
318
|
-
);
|
|
319
|
-
if (!isLoggedIn) {
|
|
320
|
-
return ctx.crash({
|
|
321
|
-
exitCode: 1,
|
|
322
|
-
errorType: "fatal",
|
|
323
|
-
errForSentry: "You are not logged in.",
|
|
324
|
-
printedMessage: "You are not logged in.",
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {
|
|
329
|
-
cmd.error(
|
|
330
|
-
"If overriding credentials, both username and password must be provided",
|
|
331
|
-
);
|
|
332
|
-
}
|
|
133
|
+
logMessage("Status: Logged in");
|
|
134
|
+
// Describe the account, even if a deploy key outranks it for other commands.
|
|
135
|
+
ctx._updateBigBrainAuth({
|
|
136
|
+
kind: "accessToken",
|
|
137
|
+
header: `Bearer ${accessToken}`,
|
|
138
|
+
accessToken,
|
|
139
|
+
});
|
|
140
|
+
const teams = await getTeamsForUser(ctx);
|
|
141
|
+
logMessage(
|
|
142
|
+
`Teams: ${teams.length} team${teams.length === 1 ? "" : "s"} accessible`,
|
|
143
|
+
);
|
|
144
|
+
for (const team of teams) {
|
|
145
|
+
logMessage(` - ${team.name} (${team.slug})`);
|
|
146
|
+
}
|
|
147
|
+
await reportDeployKeyInWorkingDirectory(ctx, auth);
|
|
148
|
+
});
|
|
333
149
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
150
|
+
export const login = new Command("login")
|
|
151
|
+
.description("Login to Convex")
|
|
152
|
+
.allowExcessArguments(false)
|
|
153
|
+
.option(
|
|
154
|
+
"--device-name <name>",
|
|
155
|
+
"Provide a name for the device being authorized",
|
|
156
|
+
)
|
|
157
|
+
.option(
|
|
158
|
+
"-f, --force",
|
|
159
|
+
"Proceed with login even if a valid access token already exists for this device",
|
|
160
|
+
)
|
|
161
|
+
.option(
|
|
162
|
+
"--no-open",
|
|
163
|
+
"Don't automatically open the login link in the default browser",
|
|
164
|
+
)
|
|
165
|
+
.addOption(
|
|
166
|
+
new Option(
|
|
167
|
+
"--login-flow <mode>",
|
|
168
|
+
`How to log in; defaults to guessing based on the environment.`,
|
|
169
|
+
)
|
|
170
|
+
.choices(["paste", "auto", "poll"] as const)
|
|
171
|
+
.default("auto" as const),
|
|
172
|
+
)
|
|
173
|
+
.addOption(new Option("--link-deployments").hideHelp())
|
|
174
|
+
// These options are hidden from the help/usage message, but allow overriding settings for testing.
|
|
175
|
+
// Change the auth credentials with the auth provider
|
|
176
|
+
.addOption(new Option("--override-auth-url <url>").hideHelp())
|
|
177
|
+
.addOption(new Option("--override-auth-client <id>").hideHelp())
|
|
178
|
+
.addOption(new Option("--override-auth-username <username>").hideHelp())
|
|
179
|
+
.addOption(new Option("--override-auth-password <password>").hideHelp())
|
|
180
|
+
// Skip the auth provider login and directly use this access token
|
|
181
|
+
.addOption(new Option("--override-access-token <token>").hideHelp())
|
|
182
|
+
// Automatically accept opt ins without prompting
|
|
183
|
+
.addOption(new Option("--accept-opt-ins").hideHelp())
|
|
184
|
+
// Dump the access token from the auth provider and skip authorization with Convex
|
|
185
|
+
.addOption(new Option("--dump-access-token").hideHelp())
|
|
186
|
+
// Hidden option for tests to check if the user is logged in.
|
|
187
|
+
.addOption(new Option("--check-login").hideHelp())
|
|
188
|
+
// Redirect to Vercel SSO integration URL
|
|
189
|
+
.addOption(
|
|
190
|
+
new Option(
|
|
191
|
+
"--vercel",
|
|
192
|
+
"Redirect to Vercel SSO integration for login",
|
|
193
|
+
).hideHelp(),
|
|
194
|
+
)
|
|
195
|
+
// Override the Vercel URL slug (defaults to 'convex')
|
|
196
|
+
.addOption(new Option("--vercel-override <slug>").hideHelp())
|
|
197
|
+
.addCommand(loginStatus)
|
|
198
|
+
.addHelpCommand(false)
|
|
199
|
+
.action(async (options, cmd: Command) => {
|
|
200
|
+
const ctx = await oneoffContext({
|
|
201
|
+
url: undefined,
|
|
202
|
+
adminKey: undefined,
|
|
203
|
+
envFile: undefined,
|
|
204
|
+
});
|
|
205
|
+
if (
|
|
206
|
+
!options.force &&
|
|
207
|
+
(await checkAuthorization(ctx, !!options.acceptOptIns))
|
|
208
|
+
) {
|
|
209
|
+
logFinishedStep(
|
|
210
|
+
"This device has previously been authorized and is ready for use with Convex.",
|
|
211
|
+
);
|
|
212
|
+
await handleLinkingDeployments(ctx, {
|
|
213
|
+
interactive: !!options.linkDeployments,
|
|
214
|
+
});
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (!options.force && options.checkLogin) {
|
|
218
|
+
const isLoggedIn = await checkAuthorization(ctx, !!options.acceptOptIns);
|
|
219
|
+
if (!isLoggedIn) {
|
|
220
|
+
return ctx.crash({
|
|
221
|
+
exitCode: 1,
|
|
222
|
+
errorType: "fatal",
|
|
223
|
+
errForSentry: "You are not logged in.",
|
|
224
|
+
printedMessage: "You are not logged in.",
|
|
341
225
|
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!!options.overrideAuthUsername !== !!options.overrideAuthPassword) {
|
|
229
|
+
cmd.error(
|
|
230
|
+
"If overriding credentials, both username and password must be provided",
|
|
231
|
+
);
|
|
232
|
+
}
|
|
342
233
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
);
|
|
351
|
-
}
|
|
352
|
-
if (options.select && profile !== null) {
|
|
353
|
-
if (!(await bindProfileToDirectory(ctx, profile.name))) {
|
|
354
|
-
return await ctx.crash({
|
|
355
|
-
exitCode: 1,
|
|
356
|
-
errorType: "fatal",
|
|
357
|
-
printedMessage: `Logged in as "${profile.name}", but the directory selection could not be changed.`,
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
warnIfDeployKeyOverridesLogin(ctx, true);
|
|
362
|
-
|
|
363
|
-
await handleLinkingDeployments(ctx, {
|
|
364
|
-
interactive: !!options.linkDeployments,
|
|
365
|
-
});
|
|
366
|
-
})
|
|
367
|
-
);
|
|
368
|
-
}
|
|
234
|
+
const uuid = loadUuidForAnonymousUser(ctx);
|
|
235
|
+
await performLogin(ctx, {
|
|
236
|
+
...options,
|
|
237
|
+
anonymousId: uuid,
|
|
238
|
+
vercel: options.vercel,
|
|
239
|
+
vercelOverride: options.vercelOverride,
|
|
240
|
+
});
|
|
369
241
|
|
|
370
|
-
|
|
242
|
+
await handleLinkingDeployments(ctx, {
|
|
243
|
+
interactive: !!options.linkDeployments,
|
|
244
|
+
});
|
|
245
|
+
});
|
|
371
246
|
|
|
372
247
|
async function handleLinkingDeployments(
|
|
373
248
|
ctx: Context,
|
package/src/cli/logout.ts
CHANGED
|
@@ -1,149 +1,24 @@
|
|
|
1
1
|
import { Command } from "@commander-js/extra-typings";
|
|
2
2
|
import { oneoffContext } from "../bundler/context.js";
|
|
3
|
-
import { logFinishedStep
|
|
3
|
+
import { logFinishedStep } from "../bundler/log.js";
|
|
4
4
|
import { recursivelyDelete } from "./lib/fsUtils.js";
|
|
5
5
|
import { globalConfigPath } from "./lib/utils/globalConfig.js";
|
|
6
|
-
import {
|
|
7
|
-
getProfileSelection,
|
|
8
|
-
profileConfigPath,
|
|
9
|
-
readProfileToken,
|
|
10
|
-
readProfileSettings,
|
|
11
|
-
updateProfileSettings,
|
|
12
|
-
savedProfileNames,
|
|
13
|
-
} from "./lib/profiles.js";
|
|
14
|
-
import path from "path";
|
|
15
|
-
import { rootDirectory } from "./lib/utils/utils.js";
|
|
16
|
-
import { promptOptions } from "./lib/utils/prompts.js";
|
|
17
6
|
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"Remove all saved account credentials, preserving account selections",
|
|
27
|
-
)
|
|
28
|
-
.allowExcessArguments(false)
|
|
29
|
-
.action(async (options, cmd) => {
|
|
30
|
-
if (options.all && options.account !== undefined)
|
|
31
|
-
cmd.error("Pass either --account or --all, not both.");
|
|
32
|
-
const ctx = await oneoffContext({
|
|
33
|
-
url: undefined,
|
|
34
|
-
adminKey: undefined,
|
|
35
|
-
envFile: undefined,
|
|
36
|
-
skipAuth: true,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
let all = !!options.all;
|
|
40
|
-
let profile = all
|
|
41
|
-
? null
|
|
42
|
-
: await getProfileSelection(ctx, { name: options.account });
|
|
43
|
-
if (
|
|
44
|
-
!all &&
|
|
45
|
-
options.account === undefined &&
|
|
46
|
-
process.stdin.isTTY &&
|
|
47
|
-
profile !== null
|
|
48
|
-
) {
|
|
49
|
-
const token = readProfileToken(ctx, profile.name);
|
|
50
|
-
const settings = await readProfileSettings(ctx);
|
|
51
|
-
const selectedName = profile.name;
|
|
52
|
-
// A matching compatibility token is another copy of this account's login.
|
|
53
|
-
const hasOtherLogins =
|
|
54
|
-
savedProfileNames(ctx).some((name) => name !== selectedName) ||
|
|
55
|
-
(typeof settings.accessToken === "string" &&
|
|
56
|
-
settings.accessToken.length > 0 &&
|
|
57
|
-
settings.accessToken !== token);
|
|
58
|
-
if (hasOtherLogins) {
|
|
59
|
-
const scope = await promptOptions(ctx, {
|
|
60
|
-
message: "Which saved logins would you like to log out of?",
|
|
61
|
-
choices: [
|
|
62
|
-
{ name: `Only account "${profile.name}"`, value: "profile" },
|
|
63
|
-
{ name: "All saved logins on this device", value: "all" },
|
|
64
|
-
],
|
|
65
|
-
default: "profile",
|
|
66
|
-
});
|
|
67
|
-
if (scope === "all") {
|
|
68
|
-
profile = null;
|
|
69
|
-
all = true;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
let warnAboutLegacyCredentials = false;
|
|
75
|
-
if (profile !== null) {
|
|
76
|
-
const selectedName = profile.name;
|
|
77
|
-
await updateProfileSettings(
|
|
78
|
-
ctx,
|
|
79
|
-
(settings) => {
|
|
80
|
-
const token = readProfileToken(ctx, selectedName);
|
|
81
|
-
// A migrated account can share its token with old CLI versions.
|
|
82
|
-
if (token !== null && settings.accessToken === token) {
|
|
83
|
-
delete settings.accessToken;
|
|
84
|
-
} else if (
|
|
85
|
-
settings.defaultProfile === selectedName &&
|
|
86
|
-
typeof settings.accessToken === "string" &&
|
|
87
|
-
settings.accessToken.length > 0
|
|
88
|
-
) {
|
|
89
|
-
// Editing the default or logging in with an older CLI can leave this
|
|
90
|
-
// token belonging to a different account.
|
|
91
|
-
warnAboutLegacyCredentials = true;
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
() => {
|
|
95
|
-
const configPath = profileConfigPath(selectedName);
|
|
96
|
-
recursivelyDelete(ctx, configPath, {
|
|
97
|
-
force: true,
|
|
98
|
-
followSymlinks: false,
|
|
99
|
-
});
|
|
100
|
-
},
|
|
101
|
-
);
|
|
102
|
-
} else {
|
|
103
|
-
await updateProfileSettings(
|
|
104
|
-
ctx,
|
|
105
|
-
async (settings) => {
|
|
106
|
-
if (
|
|
107
|
-
!all &&
|
|
108
|
-
savedProfileNames(ctx).length > 0 &&
|
|
109
|
-
settings.accessToken === undefined
|
|
110
|
-
) {
|
|
111
|
-
return await ctx.crash({
|
|
112
|
-
exitCode: 1,
|
|
113
|
-
errorType: "fatal",
|
|
114
|
-
printedMessage:
|
|
115
|
-
"No account is selected. Use `npx convex logout --account <name>` or `npx convex logout --all`.",
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
delete settings.accessToken;
|
|
119
|
-
},
|
|
120
|
-
() => {
|
|
121
|
-
const profilesDir = path.join(rootDirectory(), "profiles");
|
|
122
|
-
if (all)
|
|
123
|
-
recursivelyDelete(ctx, profilesDir, {
|
|
124
|
-
force: true,
|
|
125
|
-
followSymlinks: false,
|
|
126
|
-
});
|
|
127
|
-
},
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
logFinishedStep(
|
|
132
|
-
profile !== null
|
|
133
|
-
? `Removed credentials for account "${profile.name}".\n Run \`npx convex login --account ${profile.name}\` to log in.`
|
|
134
|
-
: `${all ? "Removed all saved Convex account credentials." : "Removed your saved Convex login credentials."}\n Run \`npx convex login\` to log in.`,
|
|
135
|
-
);
|
|
136
|
-
if (warnAboutLegacyCredentials) {
|
|
137
|
-
logWarning(
|
|
138
|
-
`Saved credentials remain in ${globalConfigPath()} for older CLI versions. To remove all saved account credentials, run \`npx convex logout --all\`.`,
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
|
|
142
|
-
logMessage(
|
|
143
|
-
"CONVEX_OVERRIDE_ACCESS_TOKEN still supplies credentials. Unset it to stop using that token.",
|
|
144
|
-
);
|
|
145
|
-
}
|
|
7
|
+
export const logout = new Command("logout")
|
|
8
|
+
.description("Log out of Convex on this machine")
|
|
9
|
+
.allowExcessArguments(false)
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const ctx = await oneoffContext({
|
|
12
|
+
url: undefined,
|
|
13
|
+
adminKey: undefined,
|
|
14
|
+
envFile: undefined,
|
|
146
15
|
});
|
|
147
|
-
}
|
|
148
16
|
|
|
149
|
-
|
|
17
|
+
if (ctx.fs.exists(globalConfigPath())) {
|
|
18
|
+
recursivelyDelete(ctx, globalConfigPath());
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
logFinishedStep(
|
|
22
|
+
"You have been logged out of Convex.\n Run `npx convex dev` to log in.",
|
|
23
|
+
);
|
|
24
|
+
});
|