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,398 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { isDeepStrictEqual } from "util";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
import { TempPath } from "../../bundler/fs.js";
|
|
5
|
+
import * as dotenv from "dotenv";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { BigBrainAuth, Context } from "../../bundler/context.js";
|
|
8
|
+
import { logFinishedStep, logWarning } from "../../bundler/log.js";
|
|
9
|
+
import { globalConfigPath, readGlobalConfig } from "./utils/globalConfig.js";
|
|
10
|
+
import { ENV_VAR_FILE_PATH, rootDirectory } from "./utils/utils.js";
|
|
11
|
+
|
|
12
|
+
import { CONVEX_ACCOUNT_ENV_VAR } from "./envvars.js";
|
|
13
|
+
|
|
14
|
+
export type ProfileSelection = {
|
|
15
|
+
name: string;
|
|
16
|
+
source: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const settingsSchema = z
|
|
20
|
+
.object({
|
|
21
|
+
defaultProfile: z.string().optional(),
|
|
22
|
+
directories: z.record(z.string()).optional(),
|
|
23
|
+
revokeReplacedTokens: z.boolean().optional(),
|
|
24
|
+
})
|
|
25
|
+
.passthrough();
|
|
26
|
+
|
|
27
|
+
const credentialsSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
accessToken: z.string().min(1),
|
|
30
|
+
memberId: z.string().optional(),
|
|
31
|
+
email: z.string().optional(),
|
|
32
|
+
})
|
|
33
|
+
.passthrough();
|
|
34
|
+
|
|
35
|
+
export type ProfileCredentials = z.infer<typeof credentialsSchema>;
|
|
36
|
+
|
|
37
|
+
export async function readProfileSettings(
|
|
38
|
+
ctx: Context,
|
|
39
|
+
): Promise<z.infer<typeof settingsSchema>> {
|
|
40
|
+
if (!ctx.fs.exists(globalConfigPath())) return {};
|
|
41
|
+
try {
|
|
42
|
+
return settingsSchema.parse(
|
|
43
|
+
JSON.parse(ctx.fs.readUtf8File(globalConfigPath())),
|
|
44
|
+
);
|
|
45
|
+
} catch {
|
|
46
|
+
return await ctx.crash({
|
|
47
|
+
exitCode: 1,
|
|
48
|
+
errorType: "invalid filesystem data",
|
|
49
|
+
printedMessage: `Unable to read account settings from ${globalConfigPath()}. Check defaultProfile, directories, and revokeReplacedTokens.`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function writeProfileSettings(ctx: Context, settings: Record<string, unknown>) {
|
|
55
|
+
if (Object.keys(settings).length === 0) {
|
|
56
|
+
if (ctx.fs.exists(globalConfigPath())) ctx.fs.unlink(globalConfigPath());
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const temporary = `${globalConfigPath()}.${randomUUID()}.tmp` as TempPath;
|
|
60
|
+
try {
|
|
61
|
+
ctx.fs.writeUtf8File(temporary, JSON.stringify(settings, null, 2), 0o600);
|
|
62
|
+
ctx.fs.swapTmpFile(temporary, globalConfigPath());
|
|
63
|
+
} finally {
|
|
64
|
+
if (ctx.fs.exists(temporary)) ctx.fs.unlink(temporary);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function updateProfileSettings<T>(
|
|
69
|
+
ctx: Context,
|
|
70
|
+
update: (settings: z.infer<typeof settingsSchema>) => T | Promise<T>,
|
|
71
|
+
afterWrite?: () => void,
|
|
72
|
+
): Promise<T> {
|
|
73
|
+
const lockPath = `${globalConfigPath()}.lock`;
|
|
74
|
+
ctx.fs.mkdir(rootDirectory(), { allowExisting: true });
|
|
75
|
+
const deadline = Date.now() + 5000;
|
|
76
|
+
for (;;) {
|
|
77
|
+
try {
|
|
78
|
+
ctx.fs.mkdir(lockPath);
|
|
79
|
+
break;
|
|
80
|
+
} catch (err: any) {
|
|
81
|
+
// Only the process that creates the directory owns the update lock.
|
|
82
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
83
|
+
if (err.code !== "EEXIST") throw err;
|
|
84
|
+
if (Date.now() >= deadline) {
|
|
85
|
+
return await ctx.crash({
|
|
86
|
+
exitCode: 1,
|
|
87
|
+
errorType: "fatal",
|
|
88
|
+
printedMessage: `Another command is updating Convex accounts. Retry after it finishes. If it was interrupted, remove ${lockPath}.`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
let released = false;
|
|
95
|
+
const release = () => {
|
|
96
|
+
if (released) return;
|
|
97
|
+
ctx.fs.rmdir(lockPath);
|
|
98
|
+
released = true;
|
|
99
|
+
};
|
|
100
|
+
const cleanup = ctx.registerCleanup(async () => release());
|
|
101
|
+
try {
|
|
102
|
+
const settings = await readProfileSettings(ctx);
|
|
103
|
+
const result = await update(settings);
|
|
104
|
+
writeProfileSettings(ctx, settings);
|
|
105
|
+
// Credential deletion follows persistence while sharing the lock with renewals.
|
|
106
|
+
afterWrite?.();
|
|
107
|
+
return result;
|
|
108
|
+
} finally {
|
|
109
|
+
ctx.removeCleanup(cleanup);
|
|
110
|
+
release();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function profileConfigPath(name: string): string {
|
|
115
|
+
return path.join(
|
|
116
|
+
rootDirectory(),
|
|
117
|
+
"profiles",
|
|
118
|
+
`${encodeURIComponent(name)}.json`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export async function validateProfileName(
|
|
123
|
+
ctx: Context,
|
|
124
|
+
name: string,
|
|
125
|
+
): Promise<void> {
|
|
126
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/.test(name)) {
|
|
127
|
+
await ctx.crash({
|
|
128
|
+
exitCode: 1,
|
|
129
|
+
errorType: "invalid filesystem or env vars",
|
|
130
|
+
printedMessage:
|
|
131
|
+
"Account names must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, and underscores.",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export async function getProfileSelection(
|
|
137
|
+
ctx: Context,
|
|
138
|
+
options: { name?: string | undefined; envFile?: string | undefined } = {},
|
|
139
|
+
): Promise<ProfileSelection | null> {
|
|
140
|
+
let name = options.name;
|
|
141
|
+
let source = "--account";
|
|
142
|
+
if (name === undefined && process.env[CONVEX_ACCOUNT_ENV_VAR] !== undefined) {
|
|
143
|
+
name = process.env[CONVEX_ACCOUNT_ENV_VAR];
|
|
144
|
+
source = `${CONVEX_ACCOUNT_ENV_VAR} environment variable`;
|
|
145
|
+
}
|
|
146
|
+
if (name === undefined) {
|
|
147
|
+
const files = options.envFile
|
|
148
|
+
? [options.envFile]
|
|
149
|
+
: [ENV_VAR_FILE_PATH, ".env"];
|
|
150
|
+
for (const file of files) {
|
|
151
|
+
if (!ctx.fs.exists(file)) continue;
|
|
152
|
+
name = dotenv.parse(ctx.fs.readUtf8File(file))[CONVEX_ACCOUNT_ENV_VAR];
|
|
153
|
+
if (name !== undefined) {
|
|
154
|
+
source = `${CONVEX_ACCOUNT_ENV_VAR} in ${file}`;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (name === undefined) {
|
|
160
|
+
const config = await readProfileSettings(ctx);
|
|
161
|
+
const binding = findProfileDirectory(
|
|
162
|
+
config.directories ?? {},
|
|
163
|
+
process.cwd(),
|
|
164
|
+
);
|
|
165
|
+
name = binding?.name ?? config.defaultProfile;
|
|
166
|
+
source = binding
|
|
167
|
+
? `directory selection for ${binding.directory}`
|
|
168
|
+
: `default account in ${globalConfigPath()}`;
|
|
169
|
+
}
|
|
170
|
+
if (name === undefined) return null;
|
|
171
|
+
await validateProfileName(ctx, name);
|
|
172
|
+
return { name, source };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export async function readProfileAuth(
|
|
176
|
+
ctx: Context,
|
|
177
|
+
profile: ProfileSelection,
|
|
178
|
+
allowMissing = false,
|
|
179
|
+
): Promise<Extract<BigBrainAuth, { kind: "accessToken" }> | null> {
|
|
180
|
+
const credentials = await readProfileCredentials(ctx, profile, allowMissing);
|
|
181
|
+
return credentials === null
|
|
182
|
+
? null
|
|
183
|
+
: {
|
|
184
|
+
kind: "accessToken",
|
|
185
|
+
accessToken: credentials.accessToken,
|
|
186
|
+
header: `Bearer ${credentials.accessToken}`,
|
|
187
|
+
profile,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export async function readProfileCredentials(
|
|
192
|
+
ctx: Context,
|
|
193
|
+
profile: ProfileSelection,
|
|
194
|
+
allowMissing = false,
|
|
195
|
+
): Promise<ProfileCredentials | null> {
|
|
196
|
+
await validateProfileName(ctx, profile.name);
|
|
197
|
+
const configPath = profileConfigPath(profile.name);
|
|
198
|
+
if (!ctx.fs.exists(configPath)) {
|
|
199
|
+
if (allowMissing) return null;
|
|
200
|
+
return await ctx.crash({
|
|
201
|
+
exitCode: 1,
|
|
202
|
+
errorType: "invalid filesystem data",
|
|
203
|
+
printedMessage: `Account "${profile.name}" selected by ${profile.source} is not logged in. Run \`npx convex login --account ${profile.name}\`.`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
return credentialsSchema.parse(JSON.parse(ctx.fs.readUtf8File(configPath)));
|
|
208
|
+
} catch {
|
|
209
|
+
return await ctx.crash({
|
|
210
|
+
exitCode: 1,
|
|
211
|
+
errorType: "invalid filesystem data",
|
|
212
|
+
printedMessage: `Unable to read credentials for account "${profile.name}" from ${configPath}.`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function readProfileToken(ctx: Context, name: string): string | null {
|
|
218
|
+
try {
|
|
219
|
+
const token = JSON.parse(
|
|
220
|
+
ctx.fs.readUtf8File(profileConfigPath(name)),
|
|
221
|
+
).accessToken;
|
|
222
|
+
return typeof token === "string" && token.length > 0 ? token : null;
|
|
223
|
+
} catch {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async function writeCredentialsFile(
|
|
229
|
+
ctx: Context,
|
|
230
|
+
name: string,
|
|
231
|
+
credentials: ProfileCredentials,
|
|
232
|
+
) {
|
|
233
|
+
const configPath = profileConfigPath(name);
|
|
234
|
+
const directory = path.dirname(configPath);
|
|
235
|
+
ctx.fs.mkdir(directory, { allowExisting: true });
|
|
236
|
+
for (const dir of [rootDirectory(), directory]) {
|
|
237
|
+
if (!ctx.fs.lstat(dir).isDirectory()) {
|
|
238
|
+
return await ctx.crash({
|
|
239
|
+
exitCode: 1,
|
|
240
|
+
errorType: "invalid filesystem data",
|
|
241
|
+
printedMessage: `Cannot save account credentials through a symlink or non-directory: ${dir}.`,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const temporary = `${configPath}.${randomUUID()}.tmp` as TempPath;
|
|
246
|
+
try {
|
|
247
|
+
ctx.fs.writeUtf8File(
|
|
248
|
+
temporary,
|
|
249
|
+
JSON.stringify(credentials, null, 2),
|
|
250
|
+
0o600,
|
|
251
|
+
);
|
|
252
|
+
ctx.fs.swapTmpFile(temporary, configPath);
|
|
253
|
+
} finally {
|
|
254
|
+
if (ctx.fs.exists(temporary)) ctx.fs.unlink(temporary);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export async function writeProfileCredentials(
|
|
259
|
+
ctx: Context,
|
|
260
|
+
name: string,
|
|
261
|
+
accessToken: string,
|
|
262
|
+
metadata: Omit<ProfileCredentials, "accessToken"> = {},
|
|
263
|
+
expected?: ProfileCredentials | null,
|
|
264
|
+
): Promise<void> {
|
|
265
|
+
await validateProfileName(ctx, name);
|
|
266
|
+
await updateProfileSettings(ctx, async (settings) => {
|
|
267
|
+
if (expected !== undefined) {
|
|
268
|
+
const current = await readProfileCredentials(
|
|
269
|
+
ctx,
|
|
270
|
+
{ name, source: "login" },
|
|
271
|
+
true,
|
|
272
|
+
);
|
|
273
|
+
if (!isDeepStrictEqual(current, expected)) {
|
|
274
|
+
return await ctx.crash({
|
|
275
|
+
exitCode: 1,
|
|
276
|
+
errorType: "fatal",
|
|
277
|
+
printedMessage: `Account "${name}" changed during login. Retry the login.`,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
await writeCredentialsFile(ctx, name, { ...metadata, accessToken });
|
|
282
|
+
if (settings.defaultProfile === name) settings.accessToken = accessToken;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export async function legacyAuthForFirstProfile(
|
|
287
|
+
ctx: Context,
|
|
288
|
+
profile: ProfileSelection,
|
|
289
|
+
): Promise<Extract<BigBrainAuth, { kind: "accessToken" }> | null> {
|
|
290
|
+
const settings = await readProfileSettings(ctx);
|
|
291
|
+
const profilesDir = path.dirname(profileConfigPath(profile.name));
|
|
292
|
+
if (
|
|
293
|
+
settings.defaultProfile !== undefined ||
|
|
294
|
+
(ctx.fs.exists(profilesDir) &&
|
|
295
|
+
ctx.fs.listDir(profilesDir).some((entry) => entry.name.endsWith(".json")))
|
|
296
|
+
) {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
const config = readGlobalConfig(ctx);
|
|
300
|
+
return config === null
|
|
301
|
+
? null
|
|
302
|
+
: {
|
|
303
|
+
kind: "accessToken",
|
|
304
|
+
accessToken: config.accessToken,
|
|
305
|
+
header: `Bearer ${config.accessToken}`,
|
|
306
|
+
profile,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export async function initializeDefaultProfile(
|
|
311
|
+
ctx: Context,
|
|
312
|
+
profile: ProfileSelection,
|
|
313
|
+
namingLegacyAccount: boolean,
|
|
314
|
+
select = true,
|
|
315
|
+
) {
|
|
316
|
+
const defaultProfile = await updateProfileSettings(ctx, async (settings) => {
|
|
317
|
+
if (settings.defaultProfile !== undefined) return undefined;
|
|
318
|
+
const credentials = await readProfileCredentials(ctx, profile);
|
|
319
|
+
const accessToken = credentials!.accessToken;
|
|
320
|
+
const legacyToken = settings.accessToken;
|
|
321
|
+
if (
|
|
322
|
+
!select &&
|
|
323
|
+
(savedProfileNames(ctx).some((name) => name !== profile.name) ||
|
|
324
|
+
(!namingLegacyAccount &&
|
|
325
|
+
typeof legacyToken === "string" &&
|
|
326
|
+
legacyToken.length > 0 &&
|
|
327
|
+
legacyToken !== accessToken))
|
|
328
|
+
)
|
|
329
|
+
return undefined;
|
|
330
|
+
if (
|
|
331
|
+
!namingLegacyAccount &&
|
|
332
|
+
typeof legacyToken === "string" &&
|
|
333
|
+
legacyToken.length > 0 &&
|
|
334
|
+
legacyToken !== accessToken
|
|
335
|
+
) {
|
|
336
|
+
// An explicitly new login keeps the previous account as the default for
|
|
337
|
+
// directories that haven't selected an account.
|
|
338
|
+
let legacyName = "default";
|
|
339
|
+
for (
|
|
340
|
+
let suffix = 2;
|
|
341
|
+
ctx.fs.exists(profileConfigPath(legacyName));
|
|
342
|
+
suffix++
|
|
343
|
+
) {
|
|
344
|
+
legacyName = `default-${suffix}`;
|
|
345
|
+
}
|
|
346
|
+
await writeCredentialsFile(ctx, legacyName, { accessToken: legacyToken });
|
|
347
|
+
settings.defaultProfile = legacyName;
|
|
348
|
+
} else {
|
|
349
|
+
settings.defaultProfile = profile.name;
|
|
350
|
+
settings.accessToken = accessToken;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return settings.defaultProfile;
|
|
354
|
+
});
|
|
355
|
+
if (defaultProfile !== undefined)
|
|
356
|
+
logFinishedStep(`Default account: ${defaultProfile}`);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export function findProfileDirectory(
|
|
360
|
+
directories: Record<string, string>,
|
|
361
|
+
cwd: string,
|
|
362
|
+
): { directory: string; name: string } | null {
|
|
363
|
+
let directory = path.resolve(cwd);
|
|
364
|
+
for (;;) {
|
|
365
|
+
if (Object.hasOwn(directories, directory)) {
|
|
366
|
+
return { directory, name: directories[directory] };
|
|
367
|
+
}
|
|
368
|
+
const parent = path.dirname(directory);
|
|
369
|
+
if (parent === directory) return null;
|
|
370
|
+
directory = parent;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export function savedProfileNames(ctx: Context): string[] {
|
|
375
|
+
const directory = path.join(rootDirectory(), "profiles");
|
|
376
|
+
if (!ctx.fs.exists(directory)) return [];
|
|
377
|
+
return ctx.fs
|
|
378
|
+
.listDir(directory)
|
|
379
|
+
.filter((entry) => entry.name.endsWith(".json"))
|
|
380
|
+
.map((entry) => entry.name.slice(0, -5))
|
|
381
|
+
.sort();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export async function writeProfileDirectory(ctx: Context, name: string) {
|
|
385
|
+
await validateProfileName(ctx, name);
|
|
386
|
+
await updateProfileSettings(ctx, (settings) => {
|
|
387
|
+
settings.directories = { ...settings.directories, [process.cwd()]: name };
|
|
388
|
+
});
|
|
389
|
+
logFinishedStep(
|
|
390
|
+
`Saved directory selection: ${name} (applies to this directory and its subdirectories).`,
|
|
391
|
+
);
|
|
392
|
+
const selected = await getProfileSelection(ctx);
|
|
393
|
+
if (selected !== null && selected.name !== name) {
|
|
394
|
+
logWarning(
|
|
395
|
+
`Account "${selected.name}" selected by ${selected.source} overrides this directory selection. Remove that override to use account "${name}".`,
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
}
|
package/src/cli/lib/run.ts
CHANGED
|
@@ -535,6 +535,8 @@ export async function pushToDeployment(
|
|
|
535
535
|
liveComponentSources: args.liveComponentSources,
|
|
536
536
|
pushAllModules: false,
|
|
537
537
|
largeIndexDeletionCheck: "no verification", // `convex run` can’t push to prod
|
|
538
|
+
largeIndexBackfillCheck: "no verification", // ditto
|
|
539
|
+
stagedValidatorDeletionCheck: "no verification", // ditto
|
|
538
540
|
warnOnSlowSchemaValidation: true,
|
|
539
541
|
message: null,
|
|
540
542
|
},
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Context } from "../../bundler/context.js";
|
|
2
|
+
import { logVerbose } from "../../bundler/log.js";
|
|
3
|
+
import { EvaluateSchemaResponse } from "./deployApi/evaluateSchema.js";
|
|
4
|
+
import { StartPushRequest } from "./deployApi/startPush.js";
|
|
5
|
+
import { evaluateSchema } from "./deploy2.js";
|
|
6
|
+
import { Span } from "./tracing.js";
|
|
7
|
+
|
|
8
|
+
type EvaluateOptions = {
|
|
9
|
+
url: string;
|
|
10
|
+
deploymentName: string | null;
|
|
11
|
+
adminKey: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A schema evaluation shared by the pre-push checks. Resolves to `null` when
|
|
16
|
+
* the deployment doesn't support `evaluate_schema` or the request failed, in
|
|
17
|
+
* which case each check skips itself.
|
|
18
|
+
*/
|
|
19
|
+
export type SchemaEvaluation = (
|
|
20
|
+
span: Span,
|
|
21
|
+
) => Promise<EvaluateSchemaResponse | null>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Evaluate the schema at most once per push however many checks consume it:
|
|
25
|
+
* the first check to call sends the request under its own span, and the rest
|
|
26
|
+
* await the same promise. Each request makes the backend evaluate the schema
|
|
27
|
+
* module in an isolate and predict against a fresh snapshot, so repeating it
|
|
28
|
+
* per check would add that work and a round trip to the deploy's critical
|
|
29
|
+
* path for every check.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Whether a schema module in the push calls `.staged(`. Bundles aren't
|
|
33
|
+
* minified, so the call survives bundling. A false positive from a comment or
|
|
34
|
+
* string costs one evaluation, while a push without staged validators skips
|
|
35
|
+
* the evaluation round trip on its critical path.
|
|
36
|
+
*/
|
|
37
|
+
export function pushStagesValidators(request: StartPushRequest): boolean {
|
|
38
|
+
return [
|
|
39
|
+
request.appDefinition.schema,
|
|
40
|
+
...request.componentDefinitions.map((definition) => definition.schema),
|
|
41
|
+
].some((schema) => schema?.source.includes(".staged(") ?? false);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function sharedSchemaEvaluation(
|
|
45
|
+
ctx: Context,
|
|
46
|
+
request: StartPushRequest,
|
|
47
|
+
options: EvaluateOptions,
|
|
48
|
+
): SchemaEvaluation {
|
|
49
|
+
let evaluation: Promise<EvaluateSchemaResponse | null> | undefined;
|
|
50
|
+
return (span) => {
|
|
51
|
+
evaluation ??= evaluateSchemaBestEffort({ ctx, span, request, options });
|
|
52
|
+
return evaluation;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The checks are advisory: if evaluation fails, fall back to skipping them
|
|
57
|
+
// rather than aborting the push over a check that isn't required for
|
|
58
|
+
// correctness. Plausibly transient failures — network errors and 5xx
|
|
59
|
+
// responses (e.g. table summaries still bootstrapping) — are retried with
|
|
60
|
+
// backoff by the shared fetch wrapper (see `pushCode`); anything else is
|
|
61
|
+
// deterministic, including a 2xx whose shape the CLI doesn't recognize, so
|
|
62
|
+
// it skips the checks immediately.
|
|
63
|
+
async function evaluateSchemaBestEffort({
|
|
64
|
+
ctx,
|
|
65
|
+
span,
|
|
66
|
+
request,
|
|
67
|
+
options,
|
|
68
|
+
}: {
|
|
69
|
+
ctx: Context;
|
|
70
|
+
span: Span;
|
|
71
|
+
request: StartPushRequest;
|
|
72
|
+
options: EvaluateOptions;
|
|
73
|
+
}): Promise<EvaluateSchemaResponse | null> {
|
|
74
|
+
try {
|
|
75
|
+
return await evaluateSchema(
|
|
76
|
+
ctx,
|
|
77
|
+
span,
|
|
78
|
+
request,
|
|
79
|
+
options,
|
|
80
|
+
/* bestEffort */ true,
|
|
81
|
+
);
|
|
82
|
+
} catch (error: unknown) {
|
|
83
|
+
logVerbose(
|
|
84
|
+
`Skipping schema evaluation checks: ${error instanceof Error ? error.message : String(error)}`,
|
|
85
|
+
);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -21,6 +21,7 @@ export const USAGE_LIMIT_METRICS = [
|
|
|
21
21
|
"databaseIoGb",
|
|
22
22
|
"searchQueryGb",
|
|
23
23
|
"dataEgressGb",
|
|
24
|
+
"aiGatewayCostDollars",
|
|
24
25
|
] as const satisfies readonly UsageLimitMetric[];
|
|
25
26
|
|
|
26
27
|
// Fails to compile if the backend's `UsageLimitMetric` gains a metric not listed
|
|
@@ -47,6 +48,7 @@ export const METRIC_LABELS: Record<UsageLimitMetric, string> = {
|
|
|
47
48
|
databaseIoGb: "Database I/O",
|
|
48
49
|
searchQueryGb: "Search queries",
|
|
49
50
|
dataEgressGb: "Data egress",
|
|
51
|
+
aiGatewayCostDollars: "AI Gateway",
|
|
50
52
|
};
|
|
51
53
|
|
|
52
54
|
export function metricLabel(metric: string): string {
|
|
@@ -1,32 +1,14 @@
|
|
|
1
1
|
export class Mutex {
|
|
2
|
-
|
|
3
|
-
waiting: Array<() => Promise<void>> = [];
|
|
2
|
+
private tail: Promise<void> = Promise.resolve();
|
|
4
3
|
|
|
5
4
|
async runExclusive<T>(fn: () => Promise<T>): Promise<T> {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return outerPromise;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
private enqueueCallbackForMutex(callback: () => Promise<void>) {
|
|
18
|
-
if (this.currentlyRunning === null) {
|
|
19
|
-
this.currentlyRunning = callback().finally(() => {
|
|
20
|
-
const nextCb = this.waiting.shift();
|
|
21
|
-
if (nextCb === undefined) {
|
|
22
|
-
this.currentlyRunning = null;
|
|
23
|
-
} else {
|
|
24
|
-
this.enqueueCallbackForMutex(nextCb);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
this.waiting.length = 0;
|
|
28
|
-
} else {
|
|
29
|
-
this.waiting.push(callback);
|
|
30
|
-
}
|
|
5
|
+
const result = this.tail.then(fn);
|
|
6
|
+
// Reserve the next position before running fn, and allow the queue to
|
|
7
|
+
// continue even if fn rejects or throws synchronously.
|
|
8
|
+
this.tail = result.then(
|
|
9
|
+
() => {},
|
|
10
|
+
() => {},
|
|
11
|
+
);
|
|
12
|
+
return result;
|
|
31
13
|
}
|
|
32
14
|
}
|