convex 1.46.0 → 1.48.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -1
- package/dist/browser.bundle.js +7 -1
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/bundler/context.js +7 -5
- package/dist/cjs/bundler/context.js.map +2 -2
- package/dist/cjs/bundler/fs.js +47 -6
- package/dist/cjs/bundler/fs.js.map +2 -2
- package/dist/cjs/bundler/index.js +5 -4
- package/dist/cjs/bundler/index.js.map +2 -2
- package/dist/cjs/cli/account.js +237 -0
- package/dist/cjs/cli/account.js.map +7 -0
- package/dist/cjs/cli/codegen.js +0 -4
- package/dist/cjs/cli/codegen.js.map +2 -2
- package/dist/cjs/cli/configure.js +28 -6
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +27 -2
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentSelect.js +2 -2
- package/dist/cjs/cli/deploymentSelect.js.map +2 -2
- package/dist/cjs/cli/dev.js +6 -0
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/env.js +10 -5
- package/dist/cjs/cli/env.js.map +2 -2
- package/dist/cjs/cli/envDefault.js +7 -2
- package/dist/cjs/cli/envDefault.js.map +2 -2
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/api.js +2 -0
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
- package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
- package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +36 -47
- package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +58 -39
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
- package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
- package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
- package/dist/cjs/cli/lib/codegen.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +2 -1
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
- package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
- package/dist/cjs/cli/lib/components.js +48 -5
- package/dist/cjs/cli/lib/components.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +56 -17
- package/dist/cjs/cli/lib/config.js.map +2 -2
- package/dist/cjs/cli/lib/deploy2.js +3 -1
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +30 -2
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +2 -2
- package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
- package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
- package/dist/cjs/cli/lib/deployment.js +2 -0
- package/dist/cjs/cli/lib/deployment.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +5 -0
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/envvars.js +32 -0
- package/dist/cjs/cli/lib/envvars.js.map +2 -2
- package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
- package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
- 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/indexes.js.map +1 -1
- package/dist/cjs/cli/lib/login.js +28 -4
- package/dist/cjs/cli/lib/login.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
- package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
- package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
- package/dist/cjs/cli/lib/profileManagement.js +196 -0
- package/dist/cjs/cli/lib/profileManagement.js.map +7 -0
- package/dist/cjs/cli/lib/profiles.js +333 -0
- package/dist/cjs/cli/lib/profiles.js.map +7 -0
- package/dist/cjs/cli/lib/run.js +4 -0
- package/dist/cjs/cli/lib/run.js.map +2 -2
- package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
- package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
- package/dist/cjs/cli/lib/usageLimits.js +4 -2
- package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
- package/dist/cjs/cli/lib/utils/mutex.js +9 -24
- package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +66 -27
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/cli/login.js +213 -114
- package/dist/cjs/cli/login.js.map +3 -3
- package/dist/cjs/cli/logout.js +113 -12
- package/dist/cjs/cli/logout.js.map +3 -3
- package/dist/cjs/cli/mcp.js +43 -10
- package/dist/cjs/cli/mcp.js.map +3 -3
- package/dist/cjs/cli/program.js +2 -1
- package/dist/cjs/cli/program.js.map +2 -2
- package/dist/cjs/cli/projectCreate.js +1 -1
- package/dist/cjs/cli/projectCreate.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/impl/actions_impl.js +8 -3
- package/dist/cjs/server/impl/actions_impl.js.map +2 -2
- package/dist/cjs/server/impl/storage_impl.js +29 -0
- package/dist/cjs/server/impl/storage_impl.js.map +2 -2
- package/dist/cjs/server/index.js +1 -0
- 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 +34 -12
- package/dist/cjs/server/schema.js.map +2 -2
- package/dist/cjs/server/storage.js.map +1 -1
- package/dist/cjs/values/validators.js +1 -1
- package/dist/cjs/values/validators.js.map +2 -2
- package/dist/cjs/values/value.js +6 -0
- package/dist/cjs/values/value.js.map +2 -2
- package/dist/cjs-types/bundler/context.d.ts +5 -0
- package/dist/cjs-types/bundler/context.d.ts.map +1 -1
- package/dist/cjs-types/bundler/fs.d.ts +7 -2
- package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
- package/dist/cjs-types/bundler/index.d.ts +9 -2
- package/dist/cjs-types/bundler/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/account.d.ts +6 -0
- package/dist/cjs-types/cli/account.d.ts.map +1 -0
- package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts +6 -0
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploy.d.ts +2 -0
- package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
- package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts +1 -0
- package/dist/cjs-types/cli/dev.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/generatedApi.d.ts +1 -1
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
- package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
- package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
- package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/codegen.d.ts +0 -3
- package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/command.d.ts +2 -0
- package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
- package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components.d.ts +4 -0
- package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/config.d.ts +2 -1
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +2 -0
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
- package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
- package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
- package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
- package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
- package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/login.d.ts +3 -1
- 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/env.d.ts +8 -5
- package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/cjs-types/cli/lib/profileManagement.d.ts +10 -0
- package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/profiles.d.ts +59 -0
- package/dist/cjs-types/cli/lib/profiles.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
- package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
- package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
- package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -2
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/login.d.ts +21 -0
- package/dist/cjs-types/cli/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/logout.d.ts +8 -1
- 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/impl/actions_impl.d.ts +18 -3
- package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -1
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +63 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts +10 -0
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts +33 -0
- package/dist/cjs-types/server/schema.d.ts.map +1 -1
- package/dist/cjs-types/server/storage.d.ts.map +1 -1
- package/dist/cjs-types/values/value.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +4889 -2980
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/bundler/context.js +7 -5
- package/dist/esm/bundler/context.js.map +2 -2
- package/dist/esm/bundler/fs.js +47 -6
- package/dist/esm/bundler/fs.js.map +2 -2
- package/dist/esm/bundler/index.js +5 -4
- package/dist/esm/bundler/index.js.map +2 -2
- package/dist/esm/cli/account.js +221 -0
- package/dist/esm/cli/account.js.map +7 -0
- package/dist/esm/cli/codegen.js +0 -4
- package/dist/esm/cli/codegen.js.map +2 -2
- package/dist/esm/cli/configure.js +27 -6
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +27 -2
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +6 -3
- package/dist/esm/cli/deploymentSelect.js.map +2 -2
- package/dist/esm/cli/dev.js +6 -0
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/env.js +11 -6
- package/dist/esm/cli/env.js.map +2 -2
- package/dist/esm/cli/envDefault.js +7 -2
- package/dist/esm/cli/envDefault.js.map +2 -2
- package/dist/esm/cli/lib/api.js +2 -0
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
- package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
- package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +37 -48
- package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +63 -41
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
- package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
- package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
- package/dist/esm/cli/lib/codegen.js.map +2 -2
- package/dist/esm/cli/lib/command.js +2 -1
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
- package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
- package/dist/esm/cli/lib/components.js +55 -5
- package/dist/esm/cli/lib/components.js.map +2 -2
- package/dist/esm/cli/lib/config.js +55 -17
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +3 -1
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js +28 -2
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +2 -2
- package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
- package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
- 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 +35 -20
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +5 -0
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/envvars.js +35 -1
- package/dist/esm/cli/lib/envvars.js.map +2 -2
- package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
- package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
- 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/indexes.js.map +1 -1
- package/dist/esm/cli/lib/login.js +36 -4
- package/dist/esm/cli/lib/login.js.map +2 -2
- package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
- package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
- package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
- package/dist/esm/cli/lib/profileManagement.js +179 -0
- package/dist/esm/cli/lib/profileManagement.js.map +7 -0
- package/dist/esm/cli/lib/profiles.js +288 -0
- package/dist/esm/cli/lib/profiles.js.map +7 -0
- package/dist/esm/cli/lib/run.js +4 -0
- package/dist/esm/cli/lib/run.js.map +2 -2
- package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
- package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
- package/dist/esm/cli/lib/usageLimits.js +4 -2
- package/dist/esm/cli/lib/usageLimits.js.map +2 -2
- package/dist/esm/cli/lib/utils/mutex.js +9 -24
- package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +63 -27
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/cli/login.js +225 -112
- package/dist/esm/cli/login.js.map +3 -3
- package/dist/esm/cli/logout.js +110 -13
- package/dist/esm/cli/logout.js.map +2 -2
- package/dist/esm/cli/mcp.js +34 -10
- package/dist/esm/cli/mcp.js.map +2 -2
- package/dist/esm/cli/program.js +2 -1
- package/dist/esm/cli/program.js.map +2 -2
- package/dist/esm/cli/projectCreate.js +1 -1
- package/dist/esm/cli/projectCreate.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/impl/actions_impl.js +7 -3
- package/dist/esm/server/impl/actions_impl.js.map +2 -2
- package/dist/esm/server/impl/storage_impl.js +29 -0
- package/dist/esm/server/impl/storage_impl.js.map +2 -2
- package/dist/esm/server/index.js +4 -1
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/schema.js +34 -12
- package/dist/esm/server/schema.js.map +2 -2
- package/dist/esm/values/validators.js +1 -1
- package/dist/esm/values/validators.js.map +2 -2
- package/dist/esm/values/value.js +6 -0
- package/dist/esm/values/value.js.map +2 -2
- package/dist/esm-types/bundler/context.d.ts +5 -0
- package/dist/esm-types/bundler/context.d.ts.map +1 -1
- package/dist/esm-types/bundler/fs.d.ts +7 -2
- package/dist/esm-types/bundler/fs.d.ts.map +1 -1
- package/dist/esm-types/bundler/index.d.ts +9 -2
- package/dist/esm-types/bundler/index.d.ts.map +1 -1
- package/dist/esm-types/cli/account.d.ts +6 -0
- package/dist/esm-types/cli/account.d.ts.map +1 -0
- package/dist/esm-types/cli/codegen.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts +6 -0
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/deploy.d.ts +2 -0
- package/dist/esm-types/cli/deploy.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
- package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts +1 -0
- package/dist/esm-types/cli/dev.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/generatedApi.d.ts +1 -1
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
- package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
- package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
- package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/codegen.d.ts +0 -3
- package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/command.d.ts +2 -0
- package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
- package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components.d.ts +4 -0
- package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/config.d.ts +2 -1
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +2 -0
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
- package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
- package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts +1 -0
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
- package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
- package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
- package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/login.d.ts +3 -1
- 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/env.d.ts +8 -5
- package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/esm-types/cli/lib/profileManagement.d.ts +10 -0
- package/dist/esm-types/cli/lib/profileManagement.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/profiles.d.ts +59 -0
- package/dist/esm-types/cli/lib/profiles.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
- package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
- package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
- package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -2
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/login.d.ts +21 -0
- package/dist/esm-types/cli/login.d.ts.map +1 -1
- package/dist/esm-types/cli/logout.d.ts +8 -1
- 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/impl/actions_impl.d.ts +18 -3
- package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -1
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +63 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts +10 -0
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts +33 -0
- package/dist/esm-types/server/schema.d.ts.map +1 -1
- package/dist/esm-types/server/storage.d.ts.map +1 -1
- package/dist/esm-types/values/value.d.ts.map +1 -1
- package/dist/react.bundle.js +7 -1
- package/dist/react.bundle.js.map +2 -2
- package/package.json +5 -5
- package/schemas/convex.schema.json +5 -5
- package/src/bundler/context.ts +9 -5
- package/src/bundler/fs.ts +54 -5
- package/src/bundler/index.ts +9 -4
- package/src/cli/account.ts +320 -0
- package/src/cli/codegen.ts +0 -2
- package/src/cli/configure.ts +45 -9
- package/src/cli/deploy.ts +36 -5
- package/src/cli/deploymentSelect.ts +7 -4
- package/src/cli/dev.ts +9 -0
- package/src/cli/env.ts +12 -6
- package/src/cli/envDefault.ts +8 -2
- package/src/cli/generatedApi.ts +1 -1
- package/src/cli/lib/api.ts +5 -1
- package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
- package/src/cli/lib/checkForLargeIndexDeletion.ts +45 -58
- package/src/cli/lib/checkForSlowSchemaValidation.ts +76 -65
- package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
- package/src/cli/lib/codegen.ts +0 -3
- package/src/cli/lib/command.ts +3 -0
- package/src/cli/lib/components/definition/bundle.ts +68 -14
- package/src/cli/lib/components.ts +71 -4
- package/src/cli/lib/config.ts +85 -18
- package/src/cli/lib/deploy2.ts +10 -1
- package/src/cli/lib/deployApi/evaluateSchema.ts +35 -0
- package/src/cli/lib/deployKeyWarning.ts +43 -0
- package/src/cli/lib/deployment.ts +2 -2
- package/src/cli/lib/deploymentSelection.ts +37 -18
- package/src/cli/lib/dev.ts +14 -0
- package/src/cli/lib/envvars.ts +43 -1
- package/src/cli/lib/formatValidationProgress.ts +35 -0
- package/src/cli/lib/fsUtils.ts +5 -2
- package/src/cli/lib/generateDocs.ts +1 -1
- package/src/cli/lib/indexes.ts +1 -1
- package/src/cli/lib/login.ts +47 -3
- package/src/cli/lib/mcp/requestContext.ts +7 -1
- package/src/cli/lib/mcp/tools/env.ts +17 -3
- package/src/cli/lib/profileManagement.ts +262 -0
- package/src/cli/lib/profiles.ts +398 -0
- package/src/cli/lib/run.ts +2 -0
- package/src/cli/lib/schemaEvaluation.ts +88 -0
- package/src/cli/lib/usageLimits.ts +2 -0
- package/src/cli/lib/utils/mutex.ts +9 -27
- package/src/cli/lib/utils/utils.ts +83 -36
- package/src/cli/login.ts +293 -168
- package/src/cli/logout.ts +142 -17
- package/src/cli/mcp.ts +48 -11
- package/src/cli/program.ts +2 -0
- package/src/cli/projectCreate.ts +1 -1
- package/src/index.ts +1 -1
- package/src/server/impl/actions_impl.ts +26 -6
- package/src/server/impl/storage_impl.ts +30 -0
- package/src/server/index.ts +5 -1
- package/src/server/meta.ts +56 -2
- package/src/server/registration.ts +10 -0
- package/src/server/schema.ts +37 -15
- package/src/server/storage.ts +17 -0
- package/src/values/validators.ts +1 -1
- package/src/values/value.ts +9 -5
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { chalkStderr } from "chalk";
|
|
2
|
+
import { DiscardedStagedValidator } from "./deployApi/evaluateSchema.js";
|
|
3
|
+
|
|
4
|
+
export function formatValidationProgress({
|
|
5
|
+
numDocsValidated,
|
|
6
|
+
totalDocs,
|
|
7
|
+
}: {
|
|
8
|
+
numDocsValidated: number;
|
|
9
|
+
totalDocs?: number | null | undefined;
|
|
10
|
+
}): string {
|
|
11
|
+
const checked = numDocsValidated.toLocaleString();
|
|
12
|
+
return totalDocs === null || totalDocs === undefined
|
|
13
|
+
? `${checked} documents checked`
|
|
14
|
+
: `${checked} of approximately ${totalDocs.toLocaleString()} documents checked`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** "validated; the push removes the staged validator" */
|
|
18
|
+
export function formatDiscardedStagedValidator(
|
|
19
|
+
validator: DiscardedStagedValidator,
|
|
20
|
+
): string {
|
|
21
|
+
let status;
|
|
22
|
+
switch (validator.state.state) {
|
|
23
|
+
case "pending": {
|
|
24
|
+
status = `validating in the background (${formatValidationProgress(validator.state)})`;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case "valid":
|
|
28
|
+
status = chalkStderr.green("validated");
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
const action = validator.replaced
|
|
32
|
+
? "the push stages a different validator"
|
|
33
|
+
: "the push removes the staged validator";
|
|
34
|
+
return `${status}; ${action}`;
|
|
35
|
+
}
|
package/src/cli/lib/fsUtils.ts
CHANGED
|
@@ -6,12 +6,15 @@ import { NodeFs } from "../../bundler/fs.js";
|
|
|
6
6
|
export function recursivelyDelete(
|
|
7
7
|
ctx: Context,
|
|
8
8
|
deletePath: string,
|
|
9
|
-
opts?: { force?: boolean; dryRun?: boolean },
|
|
9
|
+
opts?: { force?: boolean; dryRun?: boolean; followSymlinks?: boolean },
|
|
10
10
|
) {
|
|
11
11
|
const dryRun = !!opts?.dryRun;
|
|
12
12
|
let st;
|
|
13
13
|
try {
|
|
14
|
-
st =
|
|
14
|
+
st =
|
|
15
|
+
opts?.followSymlinks === false
|
|
16
|
+
? ctx.fs.lstat(deletePath)
|
|
17
|
+
: ctx.fs.stat(deletePath);
|
|
15
18
|
} catch (err: any) {
|
|
16
19
|
if (err.code === "ENOENT" && opts?.force) {
|
|
17
20
|
return;
|
|
@@ -299,7 +299,7 @@ function renderCopyableCommands(text: string): string {
|
|
|
299
299
|
.map((line) =>
|
|
300
300
|
/^- /.test(line)
|
|
301
301
|
? line.replace(
|
|
302
|
-
/`(npx convex [^`]*)`/g,
|
|
302
|
+
/`(npx convex(?:@[^\s`]+)? [^`]*)`/g,
|
|
303
303
|
(_, command) =>
|
|
304
304
|
`<CodeWithCopyButton text={${JSON.stringify(command)}} />`,
|
|
305
305
|
)
|
package/src/cli/lib/indexes.ts
CHANGED
|
@@ -27,7 +27,7 @@ export type LargeIndexDeletionCheck =
|
|
|
27
27
|
| "no verification"
|
|
28
28
|
// If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)
|
|
29
29
|
| "ask for confirmation"
|
|
30
|
-
// If large indexes are being deleted, confirm (the user has used --
|
|
30
|
+
// If large indexes are being deleted, confirm (the user has used --skip-large-indexes-check)
|
|
31
31
|
| "has confirmation";
|
|
32
32
|
|
|
33
33
|
export function addProgressLinkIfSlow(
|
package/src/cli/lib/login.ts
CHANGED
|
@@ -32,6 +32,17 @@ import {
|
|
|
32
32
|
modifyGlobalConfig,
|
|
33
33
|
} from "./utils/globalConfig.js";
|
|
34
34
|
import { updateBigBrainAuthAfterLogin } from "./deploymentSelection.js";
|
|
35
|
+
import {
|
|
36
|
+
getProfileSelection,
|
|
37
|
+
ProfileSelection,
|
|
38
|
+
profileConfigPath,
|
|
39
|
+
writeProfileCredentials,
|
|
40
|
+
readProfileCredentials,
|
|
41
|
+
} from "./profiles.js";
|
|
42
|
+
import {
|
|
43
|
+
profileLoginMetadata,
|
|
44
|
+
revokeReplacedProfileToken,
|
|
45
|
+
} from "./profileManagement.js";
|
|
35
46
|
|
|
36
47
|
// Per https://github.com/panva/node-openid-client/tree/main/docs#customizing
|
|
37
48
|
custom.setHttpOptionsDefaults({
|
|
@@ -291,6 +302,7 @@ export async function performLogin(
|
|
|
291
302
|
anonymousId,
|
|
292
303
|
vercel,
|
|
293
304
|
vercelOverride,
|
|
305
|
+
profile: selectedProfile,
|
|
294
306
|
}: {
|
|
295
307
|
overrideAuthUrl?: string | undefined;
|
|
296
308
|
overrideAuthClient?: string | undefined;
|
|
@@ -307,8 +319,16 @@ export async function performLogin(
|
|
|
307
319
|
anonymousId?: string | undefined;
|
|
308
320
|
vercel?: boolean | undefined;
|
|
309
321
|
vercelOverride?: string | undefined;
|
|
322
|
+
profile?: ProfileSelection | null;
|
|
310
323
|
} = {},
|
|
311
324
|
) {
|
|
325
|
+
const auth = ctx.bigBrainAuth();
|
|
326
|
+
const profile =
|
|
327
|
+
selectedProfile !== undefined
|
|
328
|
+
? selectedProfile
|
|
329
|
+
: auth?.kind === "accessToken" && auth.profile !== undefined
|
|
330
|
+
? auth.profile
|
|
331
|
+
: await getProfileSelection(ctx);
|
|
312
332
|
loginFlow = loginFlow || "auto";
|
|
313
333
|
// Get access token from big-brain
|
|
314
334
|
// Default the device name to the hostname, but allow the user to change this if the terminal is interactive.
|
|
@@ -400,6 +420,12 @@ export async function performLogin(
|
|
|
400
420
|
}
|
|
401
421
|
|
|
402
422
|
// Exchange the WorkOS access token for a Convex personal access token.
|
|
423
|
+
const previous =
|
|
424
|
+
profile === null ? null : await readProfileCredentials(ctx, profile, true);
|
|
425
|
+
const metadata =
|
|
426
|
+
profile === null
|
|
427
|
+
? {}
|
|
428
|
+
: await profileLoginMetadata(ctx, profile, accessToken, previous);
|
|
403
429
|
ctx._updateBigBrainAuth({
|
|
404
430
|
accessToken: accessToken,
|
|
405
431
|
kind: "accessToken",
|
|
@@ -417,8 +443,19 @@ export async function performLogin(
|
|
|
417
443
|
const newAccessToken = response.data!.accessToken;
|
|
418
444
|
const globalConfig = { accessToken: newAccessToken };
|
|
419
445
|
try {
|
|
420
|
-
|
|
421
|
-
|
|
446
|
+
if (profile !== null) {
|
|
447
|
+
await writeProfileCredentials(
|
|
448
|
+
ctx,
|
|
449
|
+
profile.name,
|
|
450
|
+
newAccessToken,
|
|
451
|
+
metadata,
|
|
452
|
+
previous,
|
|
453
|
+
);
|
|
454
|
+
} else {
|
|
455
|
+
await modifyGlobalConfig(ctx, globalConfig);
|
|
456
|
+
}
|
|
457
|
+
const path =
|
|
458
|
+
profile !== null ? profileConfigPath(profile.name) : globalConfigPath();
|
|
422
459
|
logFinishedStep(`Saved credentials to ${formatPathForPrinting(path)}`);
|
|
423
460
|
} catch (err: unknown) {
|
|
424
461
|
return await ctx.crash({
|
|
@@ -429,8 +466,15 @@ export async function performLogin(
|
|
|
429
466
|
});
|
|
430
467
|
}
|
|
431
468
|
|
|
469
|
+
if (profile !== null) {
|
|
470
|
+
await revokeReplacedProfileToken(
|
|
471
|
+
ctx,
|
|
472
|
+
previous?.accessToken,
|
|
473
|
+
newAccessToken,
|
|
474
|
+
);
|
|
475
|
+
}
|
|
432
476
|
logVerbose(`performLogin: updating big brain auth after login`);
|
|
433
|
-
await updateBigBrainAuthAfterLogin(ctx, newAccessToken);
|
|
477
|
+
await updateBigBrainAuthAfterLogin(ctx, newAccessToken, profile ?? undefined);
|
|
434
478
|
|
|
435
479
|
logVerbose(`performLogin: checking opt ins, acceptOptIns: ${acceptOptIns}`);
|
|
436
480
|
// Do opt in to TOS and Privacy Policy stuff
|
|
@@ -149,7 +149,13 @@ export function encodeDeploymentSelector(
|
|
|
149
149
|
projectDir,
|
|
150
150
|
deployment,
|
|
151
151
|
};
|
|
152
|
-
|
|
152
|
+
// ASCII JSON escapes support Unicode paths with the existing Latin-1 decoder.
|
|
153
|
+
const serialized = JSON.stringify(payload).replace(
|
|
154
|
+
/[\u0080-\uffff]/g,
|
|
155
|
+
(character) =>
|
|
156
|
+
`\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`,
|
|
157
|
+
);
|
|
158
|
+
return `${deployment.kind}:${btoa(serialized)}`;
|
|
153
159
|
}
|
|
154
160
|
|
|
155
161
|
const payloadSchema = z.object({
|
|
@@ -12,13 +12,22 @@ const envListInputSchema = z.object({
|
|
|
12
12
|
.describe(
|
|
13
13
|
"Deployment selector (from the status tool) to list environment variables from.",
|
|
14
14
|
),
|
|
15
|
+
includeValues: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe(
|
|
19
|
+
"Also return each variable's value. Values are often secrets like API keys, so leave this off unless you need every value, and use envGet to read a single variable instead.",
|
|
20
|
+
),
|
|
15
21
|
});
|
|
16
22
|
|
|
17
23
|
const envListOutputSchema = z.object({
|
|
18
24
|
variables: z.array(
|
|
19
25
|
z.object({
|
|
20
26
|
name: z.string(),
|
|
21
|
-
value: z
|
|
27
|
+
value: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Only present when includeValues is true."),
|
|
22
31
|
}),
|
|
23
32
|
),
|
|
24
33
|
});
|
|
@@ -28,7 +37,8 @@ export const EnvListTool: ConvexTool<
|
|
|
28
37
|
typeof envListOutputSchema
|
|
29
38
|
> = {
|
|
30
39
|
name: "envList",
|
|
31
|
-
description:
|
|
40
|
+
description:
|
|
41
|
+
"List the names of all environment variables in your Convex deployment. Values are left out unless includeValues is true.",
|
|
32
42
|
inputSchema: envListInputSchema,
|
|
33
43
|
outputSchema: envListOutputSchema,
|
|
34
44
|
handler: async (ctx, args) => {
|
|
@@ -51,7 +61,11 @@ export const EnvListTool: ConvexTool<
|
|
|
51
61
|
componentPath: undefined,
|
|
52
62
|
args: {},
|
|
53
63
|
})) as EnvVar[];
|
|
54
|
-
return {
|
|
64
|
+
return {
|
|
65
|
+
variables: variables.map(({ name, value }) =>
|
|
66
|
+
args.includeValues ? { name, value } : { name },
|
|
67
|
+
),
|
|
68
|
+
};
|
|
55
69
|
},
|
|
56
70
|
};
|
|
57
71
|
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { ProjectSelection } from "./deploymentSelection.js";
|
|
2
|
+
import { Context } from "../../bundler/context.js";
|
|
3
|
+
import { logMessage, logWarning } from "../../bundler/log.js";
|
|
4
|
+
import { provisionHost } from "./config.js";
|
|
5
|
+
import { version } from "../version.js";
|
|
6
|
+
import {
|
|
7
|
+
isAnonymousDeployment,
|
|
8
|
+
getDeploymentTypeFromConfiguredDeployment,
|
|
9
|
+
stripDeploymentTypePrefix,
|
|
10
|
+
} from "./deployment.js";
|
|
11
|
+
import { CONVEX_DEPLOYMENT_ENV_VAR_NAME } from "./utils/utils.js";
|
|
12
|
+
import { promptYesNo } from "./utils/prompts.js";
|
|
13
|
+
import { loadProjectEnvironmentVariables } from "./envvars.js";
|
|
14
|
+
import {
|
|
15
|
+
ProfileCredentials,
|
|
16
|
+
ProfileSelection,
|
|
17
|
+
readProfileCredentials,
|
|
18
|
+
readProfileSettings,
|
|
19
|
+
readProfileToken,
|
|
20
|
+
savedProfileNames,
|
|
21
|
+
writeProfileDirectory,
|
|
22
|
+
} from "./profiles.js";
|
|
23
|
+
|
|
24
|
+
export async function profileApi(
|
|
25
|
+
token: string,
|
|
26
|
+
pathname: string,
|
|
27
|
+
body?: unknown,
|
|
28
|
+
) {
|
|
29
|
+
return await fetch(`${provisionHost}${pathname}`, {
|
|
30
|
+
method: body === undefined ? "GET" : "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${token}`,
|
|
33
|
+
"Convex-Client": `npm-cli-${version}`,
|
|
34
|
+
...(body === undefined ? {} : { "Content-Type": "application/json" }),
|
|
35
|
+
},
|
|
36
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
37
|
+
signal: AbortSignal.timeout(10_000),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function deploymentAccess(
|
|
42
|
+
token: string,
|
|
43
|
+
deploymentName: string,
|
|
44
|
+
): Promise<"yes" | "no" | "unknown"> {
|
|
45
|
+
try {
|
|
46
|
+
const response = await profileApi(
|
|
47
|
+
token,
|
|
48
|
+
`/v1/deployments/${encodeURIComponent(deploymentName)}`,
|
|
49
|
+
);
|
|
50
|
+
if (response.ok) return "yes";
|
|
51
|
+
return [401, 403, 404].includes(response.status) ? "no" : "unknown";
|
|
52
|
+
} catch {
|
|
53
|
+
return "unknown";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function projectAccess(
|
|
58
|
+
token: string,
|
|
59
|
+
target: ProjectSelection,
|
|
60
|
+
): Promise<"yes" | "no" | "unknown"> {
|
|
61
|
+
if (target.kind === "deploymentName")
|
|
62
|
+
return deploymentAccess(token, target.deploymentName);
|
|
63
|
+
if (target.kind !== "teamAndProjectSlugs") return "unknown";
|
|
64
|
+
try {
|
|
65
|
+
const response = await profileApi(
|
|
66
|
+
token,
|
|
67
|
+
`/v1/teams/${encodeURIComponent(target.teamSlug)}/projects/${encodeURIComponent(target.projectSlug)}`,
|
|
68
|
+
);
|
|
69
|
+
if (response.ok) return "yes";
|
|
70
|
+
return [401, 403, 404].includes(response.status) ? "no" : "unknown";
|
|
71
|
+
} catch {
|
|
72
|
+
return "unknown";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function configuredCloudDeployment(): string | null {
|
|
77
|
+
const configured = process.env[CONVEX_DEPLOYMENT_ENV_VAR_NAME]?.trim();
|
|
78
|
+
if (
|
|
79
|
+
!configured ||
|
|
80
|
+
getDeploymentTypeFromConfiguredDeployment(configured) === "local"
|
|
81
|
+
)
|
|
82
|
+
return null;
|
|
83
|
+
const name = stripDeploymentTypePrefix(configured);
|
|
84
|
+
return isAnonymousDeployment(name) ? null : name;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function bindProfileToDirectory(
|
|
88
|
+
ctx: Context,
|
|
89
|
+
name: string,
|
|
90
|
+
force = false,
|
|
91
|
+
target?: ProjectSelection,
|
|
92
|
+
): Promise<boolean> {
|
|
93
|
+
const credentials = await readProfileCredentials(ctx, {
|
|
94
|
+
name,
|
|
95
|
+
source: "account selection",
|
|
96
|
+
});
|
|
97
|
+
loadProjectEnvironmentVariables();
|
|
98
|
+
const deployment = configuredCloudDeployment();
|
|
99
|
+
const selectedTarget =
|
|
100
|
+
target ??
|
|
101
|
+
(deployment === null
|
|
102
|
+
? null
|
|
103
|
+
: {
|
|
104
|
+
kind: "deploymentName" as const,
|
|
105
|
+
deploymentName: deployment,
|
|
106
|
+
deploymentType: null,
|
|
107
|
+
});
|
|
108
|
+
if (!force && selectedTarget !== null) {
|
|
109
|
+
const label =
|
|
110
|
+
selectedTarget.kind === "teamAndProjectSlugs"
|
|
111
|
+
? `project "${selectedTarget.teamSlug}/${selectedTarget.projectSlug}"`
|
|
112
|
+
: `deployment "${selectedTarget.kind === "deploymentName" ? selectedTarget.deploymentName : "configured"}"`;
|
|
113
|
+
const access = await projectAccess(
|
|
114
|
+
credentials!.accessToken,
|
|
115
|
+
selectedTarget,
|
|
116
|
+
);
|
|
117
|
+
if (access !== "yes") {
|
|
118
|
+
logWarning(
|
|
119
|
+
access === "no"
|
|
120
|
+
? `Account "${name}" cannot access ${label}.`
|
|
121
|
+
: `Could not verify whether account "${name}" can access ${label}.`,
|
|
122
|
+
);
|
|
123
|
+
if (
|
|
124
|
+
!process.stdin.isTTY ||
|
|
125
|
+
!(await promptYesNo(ctx, {
|
|
126
|
+
message: `Use account "${name}" here anyway?`,
|
|
127
|
+
default: false,
|
|
128
|
+
}))
|
|
129
|
+
) {
|
|
130
|
+
logMessage(
|
|
131
|
+
`Directory selection unchanged. To select this account anyway, run \`npx convex account select ${name} --force\`.`,
|
|
132
|
+
);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
await writeProfileDirectory(ctx, name);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export async function profileLoginMetadata(
|
|
142
|
+
ctx: Context,
|
|
143
|
+
profile: ProfileSelection,
|
|
144
|
+
loginToken: string,
|
|
145
|
+
previous: ProfileCredentials | null,
|
|
146
|
+
): Promise<Omit<ProfileCredentials, "accessToken">> {
|
|
147
|
+
let identity: { memberId: string; email: string } | null = null;
|
|
148
|
+
try {
|
|
149
|
+
const response = await profileApi(loginToken, "/api/dashboard/profile");
|
|
150
|
+
if (response.ok) {
|
|
151
|
+
const data = await response.json();
|
|
152
|
+
if (
|
|
153
|
+
(typeof data.id === "number" || typeof data.id === "string") &&
|
|
154
|
+
typeof data.email === "string"
|
|
155
|
+
) {
|
|
156
|
+
identity = { memberId: String(data.id), email: data.email };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
// Older authentication tokens can be valid without access to the dashboard profile API.
|
|
161
|
+
}
|
|
162
|
+
const sameAccount =
|
|
163
|
+
previous !== null && (previous.memberId === undefined || identity === null)
|
|
164
|
+
? await tokensBelongToSameAccount(previous.accessToken, loginToken)
|
|
165
|
+
: null;
|
|
166
|
+
if (
|
|
167
|
+
previous !== null &&
|
|
168
|
+
(previous.memberId === undefined || identity === null
|
|
169
|
+
? sameAccount !== true
|
|
170
|
+
: identity.memberId !== previous.memberId)
|
|
171
|
+
) {
|
|
172
|
+
return await ctx.crash({
|
|
173
|
+
exitCode: 1,
|
|
174
|
+
errorType: "fatal",
|
|
175
|
+
printedMessage:
|
|
176
|
+
sameAccount === null &&
|
|
177
|
+
(previous.memberId === undefined || identity === null)
|
|
178
|
+
? `Could not verify the identity of saved account "${profile.name}". To replace this saved login, run \`npx convex logout --account ${profile.name}\` followed by \`npx convex login --account ${profile.name}\`. Choose the intended account when logging in.`
|
|
179
|
+
: `The login does not match saved account "${profile.name}". Log in with the matching account, or choose another name with \`npx convex login --account <name>\`.`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
...(identity ??
|
|
184
|
+
(previous?.memberId === undefined
|
|
185
|
+
? {}
|
|
186
|
+
: { memberId: previous.memberId, email: previous.email })),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function tokensBelongToSameAccount(
|
|
191
|
+
older: string,
|
|
192
|
+
newer: string,
|
|
193
|
+
): Promise<boolean | null> {
|
|
194
|
+
try {
|
|
195
|
+
const responses = await Promise.all(
|
|
196
|
+
[older, newer].map((token) =>
|
|
197
|
+
profileApi(token, "/v1/list_personal_access_tokens?limit=100"),
|
|
198
|
+
),
|
|
199
|
+
);
|
|
200
|
+
if (responses.some((response) => !response.ok)) return null;
|
|
201
|
+
const lists = await Promise.all(
|
|
202
|
+
responses.map((response) => response.json()),
|
|
203
|
+
);
|
|
204
|
+
if (
|
|
205
|
+
lists.some(
|
|
206
|
+
(list) => !Array.isArray(list.items) || list.items.length === 0,
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
return null;
|
|
210
|
+
const ids = new Set(
|
|
211
|
+
lists[0].items.map((token: { id: unknown }) => String(token.id)),
|
|
212
|
+
);
|
|
213
|
+
if (
|
|
214
|
+
lists[1].items.some((token: { id: unknown }) => ids.has(String(token.id)))
|
|
215
|
+
)
|
|
216
|
+
return true;
|
|
217
|
+
// Disjoint partial pages cannot establish that the accounts differ.
|
|
218
|
+
return lists.some((list) => list.pagination?.hasMore !== false)
|
|
219
|
+
? null
|
|
220
|
+
: false;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export async function revokeReplacedProfileToken(
|
|
227
|
+
ctx: Context,
|
|
228
|
+
previous: string | undefined,
|
|
229
|
+
accessToken: string,
|
|
230
|
+
) {
|
|
231
|
+
if (previous === undefined || previous === accessToken) return;
|
|
232
|
+
const settings = await readProfileSettings(ctx);
|
|
233
|
+
if (
|
|
234
|
+
settings.revokeReplacedTokens === false ||
|
|
235
|
+
settings.accessToken === previous
|
|
236
|
+
)
|
|
237
|
+
return;
|
|
238
|
+
for (const name of savedProfileNames(ctx)) {
|
|
239
|
+
const token = readProfileToken(ctx, name);
|
|
240
|
+
if (token === null) {
|
|
241
|
+
logWarning(
|
|
242
|
+
`The new login was saved, but account "${name}" could not be read. Skipping revocation of the replaced token.`,
|
|
243
|
+
);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (token === previous) return;
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
// The API verifies token ownership using the newly authenticated account.
|
|
250
|
+
const response = await profileApi(
|
|
251
|
+
accessToken,
|
|
252
|
+
"/v1/delete_personal_access_token",
|
|
253
|
+
{ id: previous },
|
|
254
|
+
);
|
|
255
|
+
if (response.ok) return;
|
|
256
|
+
} catch {
|
|
257
|
+
// The new credentials are already saved, so a failed revocation can be retried in the dashboard.
|
|
258
|
+
}
|
|
259
|
+
logWarning(
|
|
260
|
+
"The new login was saved, but the replaced token could not be revoked. You can remove it in the dashboard's account settings.",
|
|
261
|
+
);
|
|
262
|
+
}
|