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
|
@@ -49,17 +49,15 @@ var import_projectMismatch = require("./localDeployment/projectMismatch.js");
|
|
|
49
49
|
var import_chalk = require("chalk");
|
|
50
50
|
var import_envvars = require("./envvars.js");
|
|
51
51
|
var import_globalConfig = require("./utils/globalConfig.js");
|
|
52
|
-
var import_profiles = require("./profiles.js");
|
|
53
52
|
var import_utils = require("./utils/utils.js");
|
|
54
53
|
var dotenv = __toESM(require("dotenv"), 1);
|
|
55
54
|
async function initializeBigBrainAuth(ctx, initialArgs) {
|
|
56
55
|
if (initialArgs.url !== void 0 && initialArgs.adminKey !== void 0) {
|
|
57
56
|
ctx._updateBigBrainAuth(
|
|
58
|
-
|
|
57
|
+
getBigBrainAuth(ctx, {
|
|
59
58
|
previewDeployKey: null,
|
|
60
59
|
projectKey: null,
|
|
61
|
-
deploymentKey: null
|
|
62
|
-
skipProfile: true
|
|
60
|
+
deploymentKey: null
|
|
63
61
|
})
|
|
64
62
|
);
|
|
65
63
|
return;
|
|
@@ -77,30 +75,29 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
|
|
|
77
75
|
const rawDeployKey2 = (0, import_utils.readDeployKeyFromEnv)((name) => config[name]);
|
|
78
76
|
const deployKey2 = await (0, import_utils.processDeployKeyValue)(ctx, rawDeployKey2);
|
|
79
77
|
if (deployKey2 !== void 0) {
|
|
80
|
-
const bigBrainAuth =
|
|
78
|
+
const bigBrainAuth = getBigBrainAuth(ctx, {
|
|
81
79
|
previewDeployKey: (0, import_deployment.isPreviewDeployKey)(deployKey2) ? deployKey2 : null,
|
|
82
80
|
projectKey: (0, import_deployment.isProjectKey)(deployKey2) ? deployKey2 : null,
|
|
83
|
-
deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey2) ? deployKey2 : null
|
|
84
|
-
envFile: initialArgs.envFile
|
|
81
|
+
deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey2) ? deployKey2 : null
|
|
85
82
|
});
|
|
86
83
|
ctx._updateBigBrainAuth(bigBrainAuth);
|
|
87
84
|
return;
|
|
88
85
|
}
|
|
89
86
|
ctx._updateBigBrainAuth(
|
|
90
|
-
|
|
87
|
+
getBigBrainAuth(ctx, {
|
|
91
88
|
previewDeployKey: null,
|
|
92
89
|
projectKey: null,
|
|
93
|
-
deploymentKey: null
|
|
94
|
-
envFile: initialArgs.envFile
|
|
90
|
+
deploymentKey: null
|
|
95
91
|
})
|
|
96
92
|
);
|
|
97
93
|
return;
|
|
98
94
|
}
|
|
99
|
-
(
|
|
95
|
+
dotenv.config({ path: import_utils.ENV_VAR_FILE_PATH });
|
|
96
|
+
dotenv.config();
|
|
100
97
|
const rawDeployKey = (0, import_utils.readDeployKeyFromEnv)((name) => process.env[name]);
|
|
101
98
|
const deployKey = await (0, import_utils.processDeployKeyValue)(ctx, rawDeployKey);
|
|
102
99
|
if (deployKey !== void 0) {
|
|
103
|
-
const bigBrainAuth =
|
|
100
|
+
const bigBrainAuth = getBigBrainAuth(ctx, {
|
|
104
101
|
previewDeployKey: (0, import_deployment.isPreviewDeployKey)(deployKey) ? deployKey : null,
|
|
105
102
|
projectKey: (0, import_deployment.isProjectKey)(deployKey) ? deployKey : null,
|
|
106
103
|
deploymentKey: (0, import_deployment.isDeploymentKey)(deployKey) ? deployKey : null
|
|
@@ -109,7 +106,7 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
|
|
|
109
106
|
return;
|
|
110
107
|
}
|
|
111
108
|
ctx._updateBigBrainAuth(
|
|
112
|
-
|
|
109
|
+
getBigBrainAuth(ctx, {
|
|
113
110
|
previewDeployKey: null,
|
|
114
111
|
projectKey: null,
|
|
115
112
|
deploymentKey: null
|
|
@@ -117,7 +114,7 @@ async function initializeBigBrainAuth(ctx, initialArgs) {
|
|
|
117
114
|
);
|
|
118
115
|
return;
|
|
119
116
|
}
|
|
120
|
-
async function updateBigBrainAuthAfterLogin(ctx, accessToken
|
|
117
|
+
async function updateBigBrainAuthAfterLogin(ctx, accessToken) {
|
|
121
118
|
const existingAuth = ctx.bigBrainAuth();
|
|
122
119
|
if (existingAuth !== null && existingAuth.kind === "projectKey") {
|
|
123
120
|
(0, import_log.logVerbose)(
|
|
@@ -128,20 +125,18 @@ async function updateBigBrainAuthAfterLogin(ctx, accessToken, profile) {
|
|
|
128
125
|
ctx._updateBigBrainAuth({
|
|
129
126
|
accessToken,
|
|
130
127
|
kind: "accessToken",
|
|
131
|
-
header: `Bearer ${accessToken}
|
|
132
|
-
...profile ? { profile } : {}
|
|
128
|
+
header: `Bearer ${accessToken}`
|
|
133
129
|
});
|
|
134
130
|
}
|
|
135
131
|
async function clearBigBrainAuth(ctx) {
|
|
136
132
|
ctx._updateBigBrainAuth(null);
|
|
137
133
|
}
|
|
138
|
-
|
|
134
|
+
function getBigBrainAuth(ctx, opts) {
|
|
139
135
|
if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {
|
|
140
136
|
return {
|
|
141
137
|
accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,
|
|
142
138
|
kind: "accessToken",
|
|
143
|
-
header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}
|
|
144
|
-
profile: null
|
|
139
|
+
header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`
|
|
145
140
|
};
|
|
146
141
|
}
|
|
147
142
|
if (opts.projectKey !== null) {
|
|
@@ -158,17 +153,12 @@ async function getBigBrainAuth(ctx, opts) {
|
|
|
158
153
|
deploymentKey: opts.deploymentKey
|
|
159
154
|
};
|
|
160
155
|
}
|
|
161
|
-
const profile = opts.skipProfile ? null : await (0, import_profiles.getProfileSelection)(ctx, { envFile: opts.envFile });
|
|
162
|
-
if (profile !== null) {
|
|
163
|
-
return await (0, import_profiles.readProfileAuth)(ctx, profile);
|
|
164
|
-
}
|
|
165
156
|
const globalConfig = (0, import_globalConfig.readGlobalConfig)(ctx);
|
|
166
157
|
if (globalConfig) {
|
|
167
158
|
return {
|
|
168
159
|
kind: "accessToken",
|
|
169
160
|
header: `Bearer ${globalConfig.accessToken}`,
|
|
170
|
-
accessToken: globalConfig.accessToken
|
|
171
|
-
profile: null
|
|
161
|
+
accessToken: globalConfig.accessToken
|
|
172
162
|
};
|
|
173
163
|
}
|
|
174
164
|
if (opts.previewDeployKey !== null) {
|
|
@@ -208,7 +198,7 @@ async function ensureAuthCanCreateDeployment(ctx) {
|
|
|
208
198
|
)} and try again.`
|
|
209
199
|
});
|
|
210
200
|
}
|
|
211
|
-
const envVar =
|
|
201
|
+
const envVar = process.env[import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME : import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;
|
|
212
202
|
return await ctx.crash({
|
|
213
203
|
exitCode: 1,
|
|
214
204
|
errorType: "fatal",
|
|
@@ -378,7 +368,8 @@ async function resolveBaseDeploymentSelection(ctx, cliArgs, selectionWithinProje
|
|
|
378
368
|
}
|
|
379
369
|
return result2.metadata;
|
|
380
370
|
}
|
|
381
|
-
(
|
|
371
|
+
dotenv.config({ path: import_utils.ENV_VAR_FILE_PATH });
|
|
372
|
+
dotenv.config();
|
|
382
373
|
const result = await getDeploymentSelectionFromEnv(
|
|
383
374
|
ctx,
|
|
384
375
|
selectionWithinProject,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/deploymentSelection.ts"],
|
|
4
|
-
"sourcesContent": ["import { ProjectResponse } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n getTeamAndProjectSlugForDeployment,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n targetProjectForLocalSelector,\n} from \"./localDeployment/projectMismatch.js\";\nimport { chalkStderr } from \"chalk\";\nimport {\n getBuildEnvironment,\n loadProjectEnvironmentVariables,\n} from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n getProfileSelection,\n ProfileSelection,\n readProfileAuth,\n} from \"./profiles.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n bigBrainAPI,\n processDeployKeyValue,\n readDeployKeyFromEnv,\n readDeployKeyEnvVar,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n await getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n skipProfile: true,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = await getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n envFile: initialArgs.envFile,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n await getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n envFile: initialArgs.envFile,\n }),\n );\n return;\n }\n loadProjectEnvironmentVariables();\n const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = await getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n await getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n profile?: ProfileSelection,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n ...(profile ? { profile } : {}),\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nasync function getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n envFile?: string;\n skipProfile?: boolean;\n },\n): Promise<BigBrainAuth | null> {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n profile: null,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const profile = opts.skipProfile\n ? null\n : await getProfileSelection(ctx, { envFile: opts.envFile });\n if (profile !== null) {\n return await readProfileAuth(ctx, profile);\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n profile: null,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// These guards mirror the management API's auth rules client-side so we can\n// fail with a clear message instead of an opaque 401; the server stays\n// authoritative. Creating a deployment also allows project keys, while the\n// deploy-key commands stay personal-access-token only.\n\n/** Crashes unless logged in with a personal access token (not a deploy key). */\nexport async function ensureLoggedInWithAccessToken(\n ctx: Context,\n action: string,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (auth !== null && auth.kind === \"accessToken\") {\n return;\n }\n // Name whichever deploy-key env var is in effect (CONVEX_DEPLOY_KEY wins).\n const prefix =\n auth === null\n ? \"Run \"\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&\n !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `\n : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `${action} requires being logged in with a personal access token. ${prefix}${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n}\n\n/**\n * Crashes unless the auth can create a deployment: personal access tokens and\n * project keys are accepted, deploy keys are not.\n */\nexport async function ensureAuthCanCreateDeployment(\n ctx: Context,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (\n auth !== null &&\n (auth.kind === \"accessToken\" || auth.kind === \"projectKey\")\n ) {\n return;\n }\n if (auth === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment requires logging in. Run ${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n }\n const envVar =\n readDeployKeyEnvVar((name) => process.env[name])?.name ??\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment isn't supported with a deploy key (${envVar}). Run ${chalkStderr.bold(\n \"npx convex login\",\n )} (or use a project key) and try again.`,\n });\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref or\n // deployment name), we don't need a current project context \u2192 handle it\n // before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind !== \"local\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n // team:project:local \u2014 we have the cloud project context up front and\n // don't need to consult env vars at all.\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n null,\n );\n }\n }\n\n const baseSelection = await resolveBaseDeploymentSelection(\n ctx,\n cliArgs,\n selectionWithinProject,\n );\n\n // If --deployment is a project-scoped local selector (`local` or\n // `project:local`), override the env-var-derived selection with the local\n // deployment after performing a cloud-project-mismatch check.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (\n (parsed.kind === \"inCurrentProject\" || parsed.kind === \"inProject\") &&\n parsed.selector.kind === \"local\"\n ) {\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n baseSelection,\n );\n }\n }\n\n return baseSelection;\n}\n\nasync function resolveBaseDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n selectionWithinProject: DeploymentSelectionWithinProject,\n): Promise<DeploymentSelection> {\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n loadProjectEnvironmentVariables();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n !process.stdin.isTTY) &&\n !cliArgs.implicitProd &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\n/**\n * Handles the `[team:project:]local` selector. Loads the on-disk local config\n * and (if the config has a `cloudProjectId`) verifies it matches the cloud\n * project the user is asking about. Crashes on mismatch.\n */\nasync function resolveLocalDeploymentSelection(\n ctx: Context,\n parsed: ParsedDeploymentSelector,\n selectionWithinProject: DeploymentSelectionWithinProject,\n currentSelection: DeploymentSelection | null,\n): Promise<DeploymentSelection> {\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n // Only resolve the target cloud project if the on-disk config has a\n // `cloudProjectId` to compare against \u2014 this avoids unnecessary platform\n // calls for older configs and anonymous mode.\n if (localConfig.config.cloudProjectId !== undefined) {\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection ?? { kind: \"chooseProject\", selectionWithinProject },\n );\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(\n ctx,\n localConfig.config,\n target,\n );\n if (match === \"mismatch\") {\n const newSelector = `${target.teamSlug}:${target.slug}:local`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `The local deployment in this directory is in a different project than \\`${target.teamSlug}:${target.slug}\\`. ` +\n `\\n${chalkStderr.dim(`${chalkStderr.bold(\"Hint\")}: If you want to move the local deployment to this project, run ${chalkStderr.bold(`npx convex deployment select ${newSelector}`)}`)}`,\n });\n }\n }\n }\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: localConfig.deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = readDeployKeyFromEnv(getEnv);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n reference: slugs.reference,\n isDefault: slugs.isDefault,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n // Overwrite the selection within project\n const newSelectionWithinProject =\n selectionWithinProject.kind === \"unspecified\" &&\n // Fetching local deployment credentials uses the \"unspecified\" code path\n targetDeploymentType !== \"local\"\n ? {\n kind: \"deploymentName\" as const,\n deploymentName: targetDeploymentName,\n }\n : selectionWithinProject;\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject: newSelectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<ProjectResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n });\n }\n\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { ProjectResponse } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n getTeamAndProjectSlugForDeployment,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n targetProjectForLocalSelector,\n} from \"./localDeployment/projectMismatch.js\";\nimport { chalkStderr } from \"chalk\";\nimport { getBuildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n processDeployKeyValue,\n readDeployKeyFromEnv,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// These guards mirror the management API's auth rules client-side so we can\n// fail with a clear message instead of an opaque 401; the server stays\n// authoritative. Creating a deployment also allows project keys, while the\n// deploy-key commands stay personal-access-token only.\n\n/** Crashes unless logged in with a personal access token (not a deploy key). */\nexport async function ensureLoggedInWithAccessToken(\n ctx: Context,\n action: string,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (auth !== null && auth.kind === \"accessToken\") {\n return;\n }\n // Name whichever deploy-key env var is in effect (CONVEX_DEPLOY_KEY wins).\n const prefix =\n auth === null\n ? \"Run \"\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&\n !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `\n : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `${action} requires being logged in with a personal access token. ${prefix}${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n}\n\n/**\n * Crashes unless the auth can create a deployment: personal access tokens and\n * project keys are accepted, deploy keys are not.\n */\nexport async function ensureAuthCanCreateDeployment(\n ctx: Context,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (\n auth !== null &&\n (auth.kind === \"accessToken\" || auth.kind === \"projectKey\")\n ) {\n return;\n }\n if (auth === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment requires logging in. Run ${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n }\n const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment isn't supported with a deploy key (${envVar}). Run ${chalkStderr.bold(\n \"npx convex login\",\n )} (or use a project key) and try again.`,\n });\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref or\n // deployment name), we don't need a current project context \u2192 handle it\n // before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind !== \"local\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n // team:project:local \u2014 we have the cloud project context up front and\n // don't need to consult env vars at all.\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n null,\n );\n }\n }\n\n const baseSelection = await resolveBaseDeploymentSelection(\n ctx,\n cliArgs,\n selectionWithinProject,\n );\n\n // If --deployment is a project-scoped local selector (`local` or\n // `project:local`), override the env-var-derived selection with the local\n // deployment after performing a cloud-project-mismatch check.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (\n (parsed.kind === \"inCurrentProject\" || parsed.kind === \"inProject\") &&\n parsed.selector.kind === \"local\"\n ) {\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n baseSelection,\n );\n }\n }\n\n return baseSelection;\n}\n\nasync function resolveBaseDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n selectionWithinProject: DeploymentSelectionWithinProject,\n): Promise<DeploymentSelection> {\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n !process.stdin.isTTY) &&\n !cliArgs.implicitProd &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\n/**\n * Handles the `[team:project:]local` selector. Loads the on-disk local config\n * and (if the config has a `cloudProjectId`) verifies it matches the cloud\n * project the user is asking about. Crashes on mismatch.\n */\nasync function resolveLocalDeploymentSelection(\n ctx: Context,\n parsed: ParsedDeploymentSelector,\n selectionWithinProject: DeploymentSelectionWithinProject,\n currentSelection: DeploymentSelection | null,\n): Promise<DeploymentSelection> {\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n // Only resolve the target cloud project if the on-disk config has a\n // `cloudProjectId` to compare against \u2014 this avoids unnecessary platform\n // calls for older configs and anonymous mode.\n if (localConfig.config.cloudProjectId !== undefined) {\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection ?? { kind: \"chooseProject\", selectionWithinProject },\n );\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(\n ctx,\n localConfig.config,\n target,\n );\n if (match === \"mismatch\") {\n const newSelector = `${target.teamSlug}:${target.slug}:local`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `The local deployment in this directory is in a different project than \\`${target.teamSlug}:${target.slug}\\`. ` +\n `\\n${chalkStderr.dim(`${chalkStderr.bold(\"Hint\")}: If you want to move the local deployment to this project, run ${chalkStderr.bold(`npx convex deployment select ${newSelector}`)}`)}`,\n });\n }\n }\n }\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: localConfig.deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = readDeployKeyFromEnv(getEnv);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n reference: slugs.reference,\n isDefault: slugs.isDefault,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n // Overwrite the selection within project\n const newSelectionWithinProject =\n selectionWithinProject.kind === \"unspecified\" &&\n // Fetching local deployment credentials uses the \"unspecified\" code path\n targetDeploymentType !== \"local\"\n ? {\n kind: \"deploymentName\" as const,\n deploymentName: targetDeploymentName,\n }\n : selectionWithinProject;\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject: newSelectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<ProjectResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n });\n }\n\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["rawDeployKey", "deployKey", "result"]
|
|
7
7
|
}
|
package/dist/cjs/cli/lib/env.js
CHANGED
|
@@ -42,6 +42,7 @@ var import_run = require("./run.js");
|
|
|
42
42
|
var import_utils = require("./utils/utils.js");
|
|
43
43
|
var import_stdin = require("./utils/stdin.js");
|
|
44
44
|
var import_prompts = require("./utils/prompts.js");
|
|
45
|
+
var import_aiAgent = require("./utils/aiAgent.js");
|
|
45
46
|
var import_envvars = require("./envvars.js");
|
|
46
47
|
var import_formatEnvValueForDotfile = require("./formatEnvValueForDotfile.js");
|
|
47
48
|
var import_utils2 = require("./utils/utils.js");
|
|
@@ -150,8 +151,10 @@ async function envList(ctx, backend, options) {
|
|
|
150
151
|
(0, import_log.logMessage)(`No environment variables set${backend.notice}`);
|
|
151
152
|
return;
|
|
152
153
|
}
|
|
154
|
+
const agent = options?.namesOnly || options?.includeValues ? null : await (0, import_aiAgent.detectAiAgent)();
|
|
155
|
+
const namesOnly = options?.namesOnly || agent !== null;
|
|
153
156
|
for (const { name, value } of envs) {
|
|
154
|
-
if (
|
|
157
|
+
if (namesOnly) {
|
|
155
158
|
(0, import_log.logOutput)(name);
|
|
156
159
|
continue;
|
|
157
160
|
}
|
|
@@ -161,6 +164,11 @@ async function envList(ctx, backend, options) {
|
|
|
161
164
|
}
|
|
162
165
|
(0, import_log.logOutput)(`${name}=${formatted}`);
|
|
163
166
|
}
|
|
167
|
+
if (agent !== null) {
|
|
168
|
+
(0, import_log.logMessage)(
|
|
169
|
+
`Listed names only because an AI agent (${agent}) appears to be running this command. Pass --include-values to print the values too.`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
164
172
|
}
|
|
165
173
|
async function getFileContents(ctx, filePath) {
|
|
166
174
|
if (!ctx.fs.exists(filePath)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/env.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logOutput,\n} from \"../../bundler/log.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\nimport { readFromStdin } from \"./utils/stdin.js\";\nimport { promptSecret } from \"./utils/prompts.js\";\nimport {\n EXPECTED_CONVEX_URL_NAMES,\n EXPECTED_SITE_URL_NAMES,\n} from \"./envvars.js\";\nimport { formatEnvValueForDotfile } from \"./formatEnvValueForDotfile.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n} from \"./utils/utils.js\";\n\nfunction formatList(items: string[]): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]} and ${items[1]}`;\n return `${items.slice(0, -1).join(\", \")}, and ${items[items.length - 1]}`;\n}\n\nexport type EnvVarChange = {\n name: string;\n value: string | null; // null = delete\n};\n\nexport type EnvVar = {\n name: string;\n value: string;\n};\n\nexport interface EnvVarBackend {\n get(name: string): Promise<EnvVar | null>;\n list(): Promise<EnvVar[]>;\n update(changes: EnvVarChange[]): Promise<void>;\n notice: string;\n}\n\nexport function deploymentEnvBackend(\n ctx: Context,\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice?: string;\n },\n): EnvVarBackend {\n return {\n async get(name) {\n const envVar = (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables:get\",\n componentPath: undefined,\n args: { name },\n })) as EnvVar | null;\n return envVar;\n },\n async list() {\n return (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as EnvVar[];\n },\n async update(changes) {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes }),\n method: \"POST\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n },\n notice: deployment.deploymentNotice ?? \"\",\n };\n}\n\nexport async function envSet(\n ctx: Context,\n backend: EnvVarBackend,\n originalName: string | undefined,\n originalValue: string | undefined,\n options?: {\n fromFile?: string;\n force?: boolean;\n secret?: boolean;\n },\n) {\n const { fromFile, force = false } = options ?? {};\n if (originalName) {\n let name = originalName,\n value: string;\n const parsed = await allowEqualsSyntax(ctx, originalName, originalValue);\n if (parsed) {\n [name, value] = parsed;\n } else if (fromFile) {\n value = await getFileContents(ctx, fromFile);\n } else if (!process.stdin.isTTY) {\n value = await getStdIn(ctx);\n } else {\n value = await promptSecret(ctx, {\n message: `Enter value for ${name}:`,\n });\n }\n await backend.update([{ name, value }]);\n if (options?.secret) {\n const formatted = /\\s/.test(value) ? `\"${value}\"` : value;\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)} to ${chalkStderr.bold(formatted)}${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)}${backend.notice}`,\n );\n }\n return true;\n }\n let content: string, source: string;\n if (fromFile) {\n content = await getFileContents(ctx, fromFile);\n source = fromFile;\n } else if (!process.stdin.isTTY) {\n content = await getStdIn(ctx);\n source = \"stdin\";\n } else {\n return false;\n }\n await envSetFromContent(ctx, backend, {\n content,\n source,\n force,\n });\n return true;\n}\n\nexport async function envGet(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n const envVar = await backend.get(name);\n if (envVar === null) {\n logFailure(`Environment variable \"${name}\" not found${backend.notice}`);\n return;\n }\n logOutput(`${envVar.value}`);\n}\n\nexport async function envRemove(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n await backend.update([{ name, value: null }]);\n logFinishedStep(\n `Successfully unset ${chalkStderr.bold(name)}${backend.notice}`,\n );\n}\n\nexport async function envList(\n ctx: Context,\n backend: EnvVarBackend,\n options?: { namesOnly?: boolean },\n) {\n const envs = await backend.list();\n if (envs.length === 0) {\n logMessage(`No environment variables set${backend.notice}`);\n return;\n }\n for (const { name, value } of envs) {\n if (options?.namesOnly) {\n logOutput(name);\n continue;\n }\n const { formatted, warning } = formatEnvValueForDotfile(value);\n if (warning) {\n logMessage(`Warning (${name}): ${warning}`);\n }\n logOutput(`${name}=${formatted}`);\n }\n}\n\nasync function getFileContents(\n ctx: Context,\n filePath: string,\n): Promise<string> {\n if (!ctx.fs.exists(filePath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: file not found: ${filePath}`,\n });\n }\n return ctx.fs.readUtf8File(filePath);\n}\n\nasync function getStdIn(ctx: Context): Promise<string> {\n try {\n return await readFromStdin();\n } catch (error) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: failed to read from stdin: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n}\n\nasync function envSetFromContent(\n ctx: Context,\n backend: EnvVarBackend,\n options: {\n content: string;\n source: string;\n force: boolean;\n },\n) {\n const { content, source, force } = options;\n const parsedEnv = dotenv.parse(content);\n\n // Filter out CLI-managed environment variables\n const envVars = Object.entries(parsedEnv);\n const filteredVars: string[] = [];\n\n const envVarsToSet: [string, string][] = [];\n const managedVars = new Set<string>([\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n ...EXPECTED_CONVEX_URL_NAMES,\n ...EXPECTED_SITE_URL_NAMES,\n ]);\n for (const [name, value] of envVars) {\n if (managedVars.has(name)) {\n filteredVars.push(name);\n } else {\n envVarsToSet.push([name, value]);\n }\n }\n\n if (filteredVars.length > 0) {\n const varNames = filteredVars.map((n) => chalkStderr.bold(n));\n const formattedNames = formatList(varNames);\n logMessage(\n `Skipping ${filteredVars.length} CLI-managed environment variable${filteredVars.length === 1 ? \"\" : \"s\"}: ${formattedNames}`,\n );\n }\n\n if (envVarsToSet.length === 0) {\n if (envVars.length === 0) {\n logMessage(`No environment variables found in ${source}.`);\n }\n return;\n }\n\n // Fetch existing environment variables\n const existingEnvVars = await backend.list();\n\n const existingEnvMap = new Map(\n existingEnvVars.map((env) => [env.name, env.value]),\n );\n\n // Categorize the environment variables\n const newVars: [string, string][] = [];\n const updatedVars: [string, string][] = [];\n const unchangedVars: [string, string][] = [];\n const conflicts: { name: string; existing: string; new: string }[] = [];\n\n for (const [name, value] of envVarsToSet) {\n const existingValue = existingEnvMap.get(name);\n if (existingValue === undefined) {\n newVars.push([name, value]);\n } else if (existingValue === value) {\n unchangedVars.push([name, value]);\n } else if (force) {\n updatedVars.push([name, value]);\n } else {\n conflicts.push({ name, existing: existingValue, new: value });\n }\n }\n\n // Check for conflicts if not replacing\n if (conflicts.length > 0) {\n const varNames = conflicts.map((c) => chalkStderr.bold(c.name));\n const formattedNames = formatList(varNames);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `error: environment variable${conflicts.length === 1 ? \"\" : \"s\"} ${formattedNames} already exist${conflicts.length === 1 ? \"s\" : \"\"} with different value${conflicts.length === 1 ? \"\" : \"s\"}.\\n\\n` +\n `Use ${chalkStderr.bold(\"--force\")} to overwrite existing values.`,\n });\n }\n\n // Build the changes: only new vars when not replacing, new + updated when replacing\n const varsToUpdate = force ? [...newVars, ...updatedVars] : newVars;\n const changes: EnvVarChange[] = varsToUpdate.map(([name, value]) => ({\n name,\n value,\n }));\n\n if (changes.length > 0) {\n await backend.update(changes);\n }\n\n const newCount = newVars.length;\n const updatedCount = updatedVars.length;\n const unchangedCount = unchangedVars.length;\n\n const parts = [];\n if (newCount > 0) parts.push(`${newCount} new`);\n if (updatedCount > 0) parts.push(`${updatedCount} updated`);\n if (unchangedCount > 0) parts.push(`${unchangedCount} unchanged`);\n\n const totalProcessed = newCount + updatedCount + unchangedCount;\n if (changes.length === 0) {\n logMessage(\n `All ${totalProcessed} environment variable${totalProcessed === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} already set${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${changes.length} environment variable${changes.length === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} (${parts.join(\", \")})${backend.notice}`,\n );\n }\n}\n\nasync function allowEqualsSyntax(\n ctx: Context,\n name: string,\n value: string | undefined,\n): Promise<[string, string] | null> {\n if (/^[a-zA-Z][a-zA-Z0-9_]*=/.test(name)) {\n const [n, ...values] = name.split(\"=\");\n if (value === undefined) {\n return [n, values.join(\"=\")];\n } else {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `When setting an environment variable, you can either set a value with 'NAME=value', or with NAME value, but not both. Are you missing quotes around the CLI argument? Try: \\n npx convex env set '${name} ${value}'`,\n });\n }\n }\n if (value === undefined) return null;\n return [name, value];\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logOutput,\n} from \"../../bundler/log.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\nimport { readFromStdin } from \"./utils/stdin.js\";\nimport { promptSecret } from \"./utils/prompts.js\";\nimport { detectAiAgent } from \"./utils/aiAgent.js\";\nimport {\n EXPECTED_CONVEX_URL_NAMES,\n EXPECTED_SITE_URL_NAMES,\n} from \"./envvars.js\";\nimport { formatEnvValueForDotfile } from \"./formatEnvValueForDotfile.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n} from \"./utils/utils.js\";\n\nfunction formatList(items: string[]): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]} and ${items[1]}`;\n return `${items.slice(0, -1).join(\", \")}, and ${items[items.length - 1]}`;\n}\n\nexport type EnvVarChange = {\n name: string;\n value: string | null; // null = delete\n};\n\nexport type EnvVar = {\n name: string;\n value: string;\n};\n\nexport interface EnvVarBackend {\n get(name: string): Promise<EnvVar | null>;\n list(): Promise<EnvVar[]>;\n update(changes: EnvVarChange[]): Promise<void>;\n notice: string;\n}\n\nexport function deploymentEnvBackend(\n ctx: Context,\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice?: string;\n },\n): EnvVarBackend {\n return {\n async get(name) {\n const envVar = (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables:get\",\n componentPath: undefined,\n args: { name },\n })) as EnvVar | null;\n return envVar;\n },\n async list() {\n return (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as EnvVar[];\n },\n async update(changes) {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes }),\n method: \"POST\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n },\n notice: deployment.deploymentNotice ?? \"\",\n };\n}\n\nexport async function envSet(\n ctx: Context,\n backend: EnvVarBackend,\n originalName: string | undefined,\n originalValue: string | undefined,\n options?: {\n fromFile?: string;\n force?: boolean;\n secret?: boolean;\n },\n) {\n const { fromFile, force = false } = options ?? {};\n if (originalName) {\n let name = originalName,\n value: string;\n const parsed = await allowEqualsSyntax(ctx, originalName, originalValue);\n if (parsed) {\n [name, value] = parsed;\n } else if (fromFile) {\n value = await getFileContents(ctx, fromFile);\n } else if (!process.stdin.isTTY) {\n value = await getStdIn(ctx);\n } else {\n value = await promptSecret(ctx, {\n message: `Enter value for ${name}:`,\n });\n }\n await backend.update([{ name, value }]);\n if (options?.secret) {\n const formatted = /\\s/.test(value) ? `\"${value}\"` : value;\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)} to ${chalkStderr.bold(formatted)}${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)}${backend.notice}`,\n );\n }\n return true;\n }\n let content: string, source: string;\n if (fromFile) {\n content = await getFileContents(ctx, fromFile);\n source = fromFile;\n } else if (!process.stdin.isTTY) {\n content = await getStdIn(ctx);\n source = \"stdin\";\n } else {\n return false;\n }\n await envSetFromContent(ctx, backend, {\n content,\n source,\n force,\n });\n return true;\n}\n\nexport async function envGet(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n const envVar = await backend.get(name);\n if (envVar === null) {\n logFailure(`Environment variable \"${name}\" not found${backend.notice}`);\n return;\n }\n logOutput(`${envVar.value}`);\n}\n\nexport async function envRemove(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n await backend.update([{ name, value: null }]);\n logFinishedStep(\n `Successfully unset ${chalkStderr.bold(name)}${backend.notice}`,\n );\n}\n\nexport async function envList(\n ctx: Context,\n backend: EnvVarBackend,\n options?: { namesOnly?: boolean; includeValues?: boolean },\n) {\n const envs = await backend.list();\n if (envs.length === 0) {\n logMessage(`No environment variables set${backend.notice}`);\n return;\n }\n // Agents tend to run `env list` to check what is set, which copies every\n // secret into their context. They get names unless they ask for values.\n const agent =\n options?.namesOnly || options?.includeValues ? null : await detectAiAgent();\n const namesOnly = options?.namesOnly || agent !== null;\n for (const { name, value } of envs) {\n if (namesOnly) {\n logOutput(name);\n continue;\n }\n const { formatted, warning } = formatEnvValueForDotfile(value);\n if (warning) {\n logMessage(`Warning (${name}): ${warning}`);\n }\n logOutput(`${name}=${formatted}`);\n }\n if (agent !== null) {\n logMessage(\n `Listed names only because an AI agent (${agent}) appears to be running this command. Pass --include-values to print the values too.`,\n );\n }\n}\n\nasync function getFileContents(\n ctx: Context,\n filePath: string,\n): Promise<string> {\n if (!ctx.fs.exists(filePath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: file not found: ${filePath}`,\n });\n }\n return ctx.fs.readUtf8File(filePath);\n}\n\nasync function getStdIn(ctx: Context): Promise<string> {\n try {\n return await readFromStdin();\n } catch (error) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: failed to read from stdin: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n}\n\nasync function envSetFromContent(\n ctx: Context,\n backend: EnvVarBackend,\n options: {\n content: string;\n source: string;\n force: boolean;\n },\n) {\n const { content, source, force } = options;\n const parsedEnv = dotenv.parse(content);\n\n // Filter out CLI-managed environment variables\n const envVars = Object.entries(parsedEnv);\n const filteredVars: string[] = [];\n\n const envVarsToSet: [string, string][] = [];\n const managedVars = new Set<string>([\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n ...EXPECTED_CONVEX_URL_NAMES,\n ...EXPECTED_SITE_URL_NAMES,\n ]);\n for (const [name, value] of envVars) {\n if (managedVars.has(name)) {\n filteredVars.push(name);\n } else {\n envVarsToSet.push([name, value]);\n }\n }\n\n if (filteredVars.length > 0) {\n const varNames = filteredVars.map((n) => chalkStderr.bold(n));\n const formattedNames = formatList(varNames);\n logMessage(\n `Skipping ${filteredVars.length} CLI-managed environment variable${filteredVars.length === 1 ? \"\" : \"s\"}: ${formattedNames}`,\n );\n }\n\n if (envVarsToSet.length === 0) {\n if (envVars.length === 0) {\n logMessage(`No environment variables found in ${source}.`);\n }\n return;\n }\n\n // Fetch existing environment variables\n const existingEnvVars = await backend.list();\n\n const existingEnvMap = new Map(\n existingEnvVars.map((env) => [env.name, env.value]),\n );\n\n // Categorize the environment variables\n const newVars: [string, string][] = [];\n const updatedVars: [string, string][] = [];\n const unchangedVars: [string, string][] = [];\n const conflicts: { name: string; existing: string; new: string }[] = [];\n\n for (const [name, value] of envVarsToSet) {\n const existingValue = existingEnvMap.get(name);\n if (existingValue === undefined) {\n newVars.push([name, value]);\n } else if (existingValue === value) {\n unchangedVars.push([name, value]);\n } else if (force) {\n updatedVars.push([name, value]);\n } else {\n conflicts.push({ name, existing: existingValue, new: value });\n }\n }\n\n // Check for conflicts if not replacing\n if (conflicts.length > 0) {\n const varNames = conflicts.map((c) => chalkStderr.bold(c.name));\n const formattedNames = formatList(varNames);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `error: environment variable${conflicts.length === 1 ? \"\" : \"s\"} ${formattedNames} already exist${conflicts.length === 1 ? \"s\" : \"\"} with different value${conflicts.length === 1 ? \"\" : \"s\"}.\\n\\n` +\n `Use ${chalkStderr.bold(\"--force\")} to overwrite existing values.`,\n });\n }\n\n // Build the changes: only new vars when not replacing, new + updated when replacing\n const varsToUpdate = force ? [...newVars, ...updatedVars] : newVars;\n const changes: EnvVarChange[] = varsToUpdate.map(([name, value]) => ({\n name,\n value,\n }));\n\n if (changes.length > 0) {\n await backend.update(changes);\n }\n\n const newCount = newVars.length;\n const updatedCount = updatedVars.length;\n const unchangedCount = unchangedVars.length;\n\n const parts = [];\n if (newCount > 0) parts.push(`${newCount} new`);\n if (updatedCount > 0) parts.push(`${updatedCount} updated`);\n if (unchangedCount > 0) parts.push(`${unchangedCount} unchanged`);\n\n const totalProcessed = newCount + updatedCount + unchangedCount;\n if (changes.length === 0) {\n logMessage(\n `All ${totalProcessed} environment variable${totalProcessed === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} already set${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${changes.length} environment variable${changes.length === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} (${parts.join(\", \")})${backend.notice}`,\n );\n }\n}\n\nasync function allowEqualsSyntax(\n ctx: Context,\n name: string,\n value: string | undefined,\n): Promise<[string, string] | null> {\n if (/^[a-zA-Z][a-zA-Z0-9_]*=/.test(name)) {\n const [n, ...values] = name.split(\"=\");\n if (value === undefined) {\n return [n, values.join(\"=\")];\n } else {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `When setting an environment variable, you can either set a value with 'NAME=value', or with NAME value, but not both. Are you missing quotes around the CLI argument? Try: \\n npx convex env set '${name} ${value}'`,\n });\n }\n }\n if (value === undefined) return null;\n return [name, value];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_utils"]
|
|
7
7
|
}
|
|
@@ -28,18 +28,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var envvars_exports = {};
|
|
30
30
|
__export(envvars_exports, {
|
|
31
|
-
CONVEX_ACCOUNT_ENV_VAR: () => CONVEX_ACCOUNT_ENV_VAR,
|
|
32
31
|
EXPECTED_CONVEX_URL_NAMES: () => EXPECTED_CONVEX_URL_NAMES,
|
|
33
32
|
EXPECTED_SITE_URL_NAMES: () => EXPECTED_SITE_URL_NAMES,
|
|
34
33
|
changedEnvVarFile: () => changedEnvVarFile,
|
|
35
34
|
detectSuspiciousEnvironmentVariables: () => detectSuspiciousEnvironmentVariables,
|
|
36
35
|
getBuildEnvironment: () => getBuildEnvironment,
|
|
37
36
|
getDefaultDeployMessage: () => getDefaultDeployMessage,
|
|
38
|
-
getDeployKeySource: () => getDeployKeySource,
|
|
39
37
|
getEnvVarRegex: () => getEnvVarRegex,
|
|
40
38
|
gitBranchFromEnvironment: () => gitBranchFromEnvironment,
|
|
41
39
|
isNonProdBuildEnvironment: () => isNonProdBuildEnvironment,
|
|
42
|
-
loadProjectEnvironmentVariables: () => loadProjectEnvironmentVariables,
|
|
43
40
|
suggestedEnvVarNames: () => suggestedEnvVarNames,
|
|
44
41
|
writeUrlsToEnvFile: () => writeUrlsToEnvFile
|
|
45
42
|
});
|
|
@@ -48,35 +45,6 @@ var import_chalk = require("chalk");
|
|
|
48
45
|
var dotenv = __toESM(require("dotenv"), 1);
|
|
49
46
|
var import_log = require("../../bundler/log.js");
|
|
50
47
|
var import_utils = require("./utils/utils.js");
|
|
51
|
-
const CONVEX_ACCOUNT_ENV_VAR = "CONVEX_ACCOUNT";
|
|
52
|
-
const loadedEnvironment = /* @__PURE__ */ new Map();
|
|
53
|
-
function loadProjectEnvironmentVariables() {
|
|
54
|
-
for (const [name, { value }] of loadedEnvironment) {
|
|
55
|
-
if (process.env[name] === value) delete process.env[name];
|
|
56
|
-
}
|
|
57
|
-
loadedEnvironment.clear();
|
|
58
|
-
const environment = {};
|
|
59
|
-
for (const [name, value] of Object.entries(process.env)) {
|
|
60
|
-
if (value !== void 0) environment[name] = value;
|
|
61
|
-
}
|
|
62
|
-
for (const file of [import_utils.ENV_VAR_FILE_PATH, ".env"]) {
|
|
63
|
-
dotenv.config({ path: file, processEnv: environment });
|
|
64
|
-
for (const [name, value] of Object.entries(environment)) {
|
|
65
|
-
if (name !== CONVEX_ACCOUNT_ENV_VAR && process.env[name] === void 0) {
|
|
66
|
-
process.env[name] = value;
|
|
67
|
-
loadedEnvironment.set(name, { value, source: file });
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function getDeployKeySource(key) {
|
|
73
|
-
const envVarName = (0, import_utils.readDeployKeyEnvVar)((name) => process.env[name])?.name ?? import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME;
|
|
74
|
-
const loaded = loadedEnvironment.get(envVarName);
|
|
75
|
-
return {
|
|
76
|
-
envVarName,
|
|
77
|
-
source: loaded?.value === key ? loaded.source : "shell environment"
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
48
|
const _FRAMEWORKS = [
|
|
81
49
|
"create-react-app",
|
|
82
50
|
"Next.js",
|