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,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var checkForLargeIndexBackfill_exports = {};
|
|
20
|
+
__export(checkForLargeIndexBackfill_exports, {
|
|
21
|
+
blockingIndexesFromSchemaEvaluation: () => blockingIndexesFromSchemaEvaluation,
|
|
22
|
+
checkForLargeIndexBackfill: () => checkForLargeIndexBackfill
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(checkForLargeIndexBackfill_exports);
|
|
25
|
+
var import_chalk = require("chalk");
|
|
26
|
+
var import_log = require("../../bundler/log.js");
|
|
27
|
+
var import_indexes = require("./indexes.js");
|
|
28
|
+
var import_prompts = require("./utils/prompts.js");
|
|
29
|
+
var import_utils = require("./utils/utils.js");
|
|
30
|
+
const MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING = 1e5;
|
|
31
|
+
async function checkForLargeIndexBackfill({
|
|
32
|
+
ctx,
|
|
33
|
+
span,
|
|
34
|
+
schemaEvaluation,
|
|
35
|
+
options,
|
|
36
|
+
mode
|
|
37
|
+
}) {
|
|
38
|
+
(0, import_log.changeSpinner)("Verifying that the push isn\u2019t creating large indexes...");
|
|
39
|
+
const response = await schemaEvaluation(span);
|
|
40
|
+
if (response === null) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const blockingIndexes = blockingIndexesFromSchemaEvaluation(
|
|
44
|
+
response,
|
|
45
|
+
minDocumentsForIndexBackfillWarning()
|
|
46
|
+
);
|
|
47
|
+
if (blockingIndexes.length === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const plural = blockingIndexes.length !== 1;
|
|
51
|
+
(0, import_log.logMessage)(`\u26A0\uFE0F This push will ${import_chalk.chalkStderr.bold("create")} the following ${plural ? "indexes on large tables" : "index on a large table"}
|
|
52
|
+
in your deployment (${options.url}). The deploy will block until ${plural ? "they finish" : "it finishes"} backfilling:
|
|
53
|
+
|
|
54
|
+
${blockingIndexes.map(formatBlockingIndex).join("\n")}
|
|
55
|
+
|
|
56
|
+
Tip: stage the index (e.g. \`.index("by_field", { fields: ["field"], staged: true })\`) to backfill
|
|
57
|
+
it in the background without blocking the deploy, then remove \`staged\` in a later push once it\u2019s ready.
|
|
58
|
+
Learn more at https://docs.convex.dev/database/reading-data/indexes#staged-indexes
|
|
59
|
+
`);
|
|
60
|
+
if (mode === "warn") {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (mode === "has confirmation") {
|
|
64
|
+
(0, import_log.logFinishedStep)(
|
|
65
|
+
"Proceeding with push since --skip-large-indexes-check is set"
|
|
66
|
+
);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!process.stdin.isTTY) {
|
|
70
|
+
return ctx.crash({
|
|
71
|
+
exitCode: 1,
|
|
72
|
+
errorType: "fatal",
|
|
73
|
+
printedMessage: `To confirm the push:
|
|
74
|
+
\u2022 run the deploy command in an ${import_chalk.chalkStderr.bold("interactive terminal")}
|
|
75
|
+
\u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--skip-large-indexes-check")} flag`
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
(0, import_log.stopSpinner)();
|
|
79
|
+
if (!await (0, import_prompts.promptYesNo)(ctx, {
|
|
80
|
+
message: `Create ${plural ? "these indexes" : "this index"} now?`,
|
|
81
|
+
default: false
|
|
82
|
+
})) {
|
|
83
|
+
return ctx.crash({
|
|
84
|
+
exitCode: 1,
|
|
85
|
+
errorType: "fatal",
|
|
86
|
+
printedMessage: `Canceling push`
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
(0, import_log.logFinishedStep)("Proceeding with push.");
|
|
90
|
+
}
|
|
91
|
+
function blockingIndexesFromSchemaEvaluation(response, minDocuments) {
|
|
92
|
+
return Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
93
|
+
([componentPath, prediction]) => prediction.indexes.filter(
|
|
94
|
+
(index) => index.needsBackfill && !index.staged && (index.change === "added" || index.change === "enabled") && index.numDocs >= minDocuments
|
|
95
|
+
).map((index) => ({ componentPath, index }))
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function formatBlockingIndex({ componentPath, index }) {
|
|
99
|
+
const componentNameFormatted = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}:` : "";
|
|
100
|
+
const documentsCountFormatted = import_chalk.chalkStderr.yellowBright(
|
|
101
|
+
`\u26A0\uFE0F ${index.numDocs.toLocaleString()} documents`
|
|
102
|
+
);
|
|
103
|
+
const enabledNote = index.change === "enabled" ? `
|
|
104
|
+
${import_chalk.chalkStderr.gray("enabled before its staged backfill finished")}` : "";
|
|
105
|
+
return "\u26D4 " + componentNameFormatted + (0, import_indexes.formatIndex)(index) + " " + documentsCountFormatted + enabledNote;
|
|
106
|
+
}
|
|
107
|
+
function minDocumentsForIndexBackfillWarning() {
|
|
108
|
+
return (0, import_utils.integerFromEnv)(
|
|
109
|
+
"CONVEX_MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING",
|
|
110
|
+
MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=checkForLargeIndexBackfill.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cli/lib/checkForLargeIndexBackfill.ts"],
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { formatIndex } from \"./indexes.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport { Span } from \"./tracing.js\";\nimport {\n EvaluateSchemaResponse,\n IndexPrediction,\n} from \"./deployApi/evaluateSchema.js\";\nimport { SchemaEvaluation } from \"./schemaEvaluation.js\";\nimport { integerFromEnv } from \"./utils/utils.js\";\n\n// Same size as the large index deletion check, so both index guards fire at\n// the same table size. Separate env override so tests can trigger one\n// without the other.\nconst MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING = 100_000;\n\nexport type LargeIndexBackfillCheck =\n // Don\u2019t check whether the push creates indexes on large tables\n | \"no verification\"\n // If it does, ask for confirmation (and fail in non-interactive envs)\n | \"ask for confirmation\"\n // If it does, proceed (the user has used --skip-large-indexes-check)\n | \"has confirmation\";\n\ntype BlockingIndex = {\n // The component instance path (\"\" for the root component), matching the\n // keys of `componentSchemaEvaluations`.\n componentPath: string;\n index: IndexPrediction;\n};\n\n/**\n * Warn \u2014 and on a real deploy require confirmation \u2014 when a push creates or\n * enables a non-staged index on a large table. `wait_for_schema` blocks the\n * deploy until every such index is backfilled, which can take a long time on\n * large tables; staging the index instead backfills it in the background.\n *\n * Skipped silently when the deployment doesn't support `evaluate_schema`:\n * the check protects the developer's time, not correctness.\n */\nexport async function checkForLargeIndexBackfill({\n ctx,\n span,\n schemaEvaluation,\n options,\n mode,\n}: {\n ctx: Context;\n span: Span;\n schemaEvaluation: SchemaEvaluation;\n options: { url: string };\n // \"warn\" prints the warning without prompting, for dry runs.\n mode: \"warn\" | \"ask for confirmation\" | \"has confirmation\";\n}): Promise<void> {\n changeSpinner(\"Verifying that the push isn\u2019t creating large indexes...\");\n const response = await schemaEvaluation(span);\n if (response === null) {\n return;\n }\n\n const blockingIndexes = blockingIndexesFromSchemaEvaluation(\n response,\n minDocumentsForIndexBackfillWarning(),\n );\n if (blockingIndexes.length === 0) {\n return;\n }\n\n const plural = blockingIndexes.length !== 1;\n logMessage(`\u26A0\uFE0F This push will ${chalkStderr.bold(\"create\")} the following ${plural ? \"indexes on large tables\" : \"index on a large table\"}\nin your deployment (${options.url}). The deploy will block until ${plural ? \"they finish\" : \"it finishes\"} backfilling:\n\n${blockingIndexes.map(formatBlockingIndex).join(\"\\n\")}\n\nTip: stage the index (e.g. \\`.index(\"by_field\", { fields: [\"field\"], staged: true })\\`) to backfill\nit in the background without blocking the deploy, then remove \\`staged\\` in a later push once it\u2019s ready.\nLearn more at https://docs.convex.dev/database/reading-data/indexes#staged-indexes\n`);\n\n if (mode === \"warn\") {\n return;\n }\n\n if (mode === \"has confirmation\") {\n logFinishedStep(\n \"Proceeding with push since --skip-large-indexes-check is set\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\u2022 or run the deploy command with the ${chalkStderr.bold(\"--skip-large-indexes-check\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Create ${plural ? \"these indexes\" : \"this index\"} now?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\n// An index blocks the deploy when this push starts (`added`) or waits on\n// (`enabled` before its staged backfill finished) a backfill that isn't\n// staged. Added staged indexes report `needsBackfill` too but never block,\n// and an in-progress backfill an earlier push started (`identical`) isn't\n// this push's doing.\nexport function blockingIndexesFromSchemaEvaluation(\n response: EvaluateSchemaResponse,\n minDocuments: number,\n): BlockingIndex[] {\n return Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n prediction.indexes\n .filter(\n (index) =>\n index.needsBackfill &&\n !index.staged &&\n (index.change === \"added\" || index.change === \"enabled\") &&\n index.numDocs >= minDocuments,\n )\n .map((index) => ({ componentPath, index })),\n );\n}\n\nfunction formatBlockingIndex({ componentPath, index }: BlockingIndex) {\n const componentNameFormatted =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n const documentsCountFormatted = chalkStderr.yellowBright(\n `\u26A0\uFE0F ${index.numDocs.toLocaleString()} documents`,\n );\n const enabledNote =\n index.change === \"enabled\"\n ? `\\n ${chalkStderr.gray(\"enabled before its staged backfill finished\")}`\n : \"\";\n return (\n \"\u26D4 \" +\n componentNameFormatted +\n formatIndex(index) +\n \" \" +\n documentsCountFormatted +\n enabledNote\n );\n}\n\nfunction minDocumentsForIndexBackfillWarning(): number {\n return integerFromEnv(\n \"CONVEX_MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING\",\n MIN_DOCUMENTS_FOR_INDEX_BACKFILL_WARNING,\n );\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAKO;AACP,qBAA4B;AAC5B,qBAA4B;AAO5B,mBAA+B;AAK/B,MAAM,2CAA2C;AA0BjD,eAAsB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOkB;AAChB,gCAAc,8DAAyD;AACvE,QAAM,WAAW,MAAM,iBAAiB,IAAI;AAC5C,MAAI,aAAa,MAAM;AACrB;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,oCAAoC;AAAA,EACtC;AACA,MAAI,gBAAgB,WAAW,GAAG;AAChC;AAAA,EACF;AAEA,QAAM,SAAS,gBAAgB,WAAW;AAC1C,6BAAW,gCAAsB,yBAAY,KAAK,QAAQ,CAAC,kBAAkB,SAAS,4BAA4B,wBAAwB;AAAA,sBACtH,QAAQ,GAAG,kCAAkC,SAAS,gBAAgB,aAAa;AAAA;AAAA,EAEvG,gBAAgB,IAAI,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,CAKpD;AAEC,MAAI,SAAS,QAAQ;AACnB;AAAA,EACF;AAEA,MAAI,SAAS,oBAAoB;AAC/B;AAAA,MACE;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,sCACW,yBAAY,KAAK,sBAAsB,CAAC;AAAA,4CAClC,yBAAY,KAAK,4BAA4B,CAAC;AAAA,IACjF,CAAC;AAAA,EACH;AAEA,8BAAY;AACZ,MACE,CAAE,UAAM,4BAAY,KAAK;AAAA,IACvB,SAAS,UAAU,SAAS,kBAAkB,YAAY;AAAA,IAC1D,SAAS;AAAA,EACX,CAAC,GACD;AACA,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,kCAAgB,uBAAuB;AACzC;AAOO,SAAS,oCACd,UACA,cACiB;AACjB,SAAO,OAAO,QAAQ,SAAS,0BAA0B,EAAE;AAAA,IACzD,CAAC,CAAC,eAAe,UAAU,MACzB,WAAW,QACR;AAAA,MACC,CAAC,UACC,MAAM,iBACN,CAAC,MAAM,WACN,MAAM,WAAW,WAAW,MAAM,WAAW,cAC9C,MAAM,WAAW;AAAA,IACrB,EACC,IAAI,CAAC,WAAW,EAAE,eAAe,MAAM,EAAE;AAAA,EAChD;AACF;AAEA,SAAS,oBAAoB,EAAE,eAAe,MAAM,GAAkB;AACpE,QAAM,yBACJ,kBAAkB,KAAK,GAAG,yBAAY,KAAK,aAAa,CAAC,MAAM;AACjE,QAAM,0BAA0B,yBAAY;AAAA,IAC1C,iBAAO,MAAM,QAAQ,eAAe,CAAC;AAAA,EACvC;AACA,QAAM,cACJ,MAAM,WAAW,YACb;AAAA,KAAQ,yBAAY,KAAK,6CAA6C,CAAC,KACvE;AACN,SACE,YACA,6BACA,4BAAY,KAAK,IACjB,OACA,0BACA;AAEJ;AAEA,SAAS,sCAA8C;AACrD,aAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -29,21 +29,34 @@ var import_indexes = require("./indexes.js");
|
|
|
29
29
|
var import_prompts = require("./utils/prompts.js");
|
|
30
30
|
var import_deploy2 = require("./deploy2.js");
|
|
31
31
|
var import_run = require("./run.js");
|
|
32
|
+
var import_utils = require("./utils/utils.js");
|
|
32
33
|
const MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 1e5;
|
|
33
34
|
async function checkForLargeIndexDeletion({
|
|
34
35
|
ctx,
|
|
35
36
|
span,
|
|
36
37
|
request,
|
|
37
38
|
options,
|
|
39
|
+
schemaEvaluation,
|
|
38
40
|
askForConfirmation
|
|
39
41
|
}) {
|
|
40
42
|
(0, import_log.changeSpinner)("Verifying that the push isn\u2019t deleting large indexes...");
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
const schemaEvaluationResponse = await schemaEvaluation(span);
|
|
44
|
+
let deletedIndexes;
|
|
45
|
+
if (schemaEvaluationResponse !== null) {
|
|
46
|
+
deletedIndexes = deletedIndexesFromSchemaEvaluation(
|
|
47
|
+
schemaEvaluationResponse
|
|
48
|
+
);
|
|
49
|
+
} else {
|
|
50
|
+
(0, import_log.logVerbose)(
|
|
51
|
+
"Schema evaluation unavailable, sizing deleted indexes per table"
|
|
52
|
+
);
|
|
53
|
+
deletedIndexes = await deletedIndexesFromTableSizes({
|
|
54
|
+
ctx,
|
|
55
|
+
span,
|
|
56
|
+
request,
|
|
57
|
+
options
|
|
58
|
+
});
|
|
59
|
+
}
|
|
47
60
|
if (deletedIndexes.length === 0) {
|
|
48
61
|
(0, import_log.logFinishedStep)("No indexes are deleted by this push");
|
|
49
62
|
return;
|
|
@@ -67,7 +80,7 @@ to be backfilled again if you want to restore it later.
|
|
|
67
80
|
`);
|
|
68
81
|
if (!askForConfirmation) {
|
|
69
82
|
(0, import_log.logFinishedStep)(
|
|
70
|
-
"Proceeding with push since
|
|
83
|
+
"Proceeding with push since deleting large indexes was allowed by flag"
|
|
71
84
|
);
|
|
72
85
|
return;
|
|
73
86
|
}
|
|
@@ -77,7 +90,7 @@ to be backfilled again if you want to restore it later.
|
|
|
77
90
|
errorType: "fatal",
|
|
78
91
|
printedMessage: `To confirm the push:
|
|
79
92
|
\u2022 run the deploy command in an ${import_chalk.chalkStderr.bold("interactive terminal")}
|
|
80
|
-
\u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--
|
|
93
|
+
\u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--skip-large-indexes-check")} flag`
|
|
81
94
|
});
|
|
82
95
|
}
|
|
83
96
|
(0, import_log.stopSpinner)();
|
|
@@ -93,37 +106,17 @@ to be backfilled again if you want to restore it later.
|
|
|
93
106
|
}
|
|
94
107
|
(0, import_log.logFinishedStep)("Proceeding with push.");
|
|
95
108
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
options,
|
|
108
|
-
/* bestEffort */
|
|
109
|
-
true
|
|
110
|
-
);
|
|
111
|
-
return Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
112
|
-
([componentPath, prediction]) => prediction.indexes.filter((index) => index.change === "dropped").map((index) => ({
|
|
113
|
-
componentPath,
|
|
114
|
-
index,
|
|
115
|
-
documentsCount: index.numDocs,
|
|
116
|
-
replacedBy: prediction.indexes.find(
|
|
117
|
-
(other) => other.change === "added" && other.name === index.name
|
|
118
|
-
) ?? null
|
|
119
|
-
}))
|
|
120
|
-
);
|
|
121
|
-
} catch (error) {
|
|
122
|
-
(0, import_log.logVerbose)(
|
|
123
|
-
`Schema evaluation unavailable, sizing deleted indexes per table: ${error instanceof Error ? error.message : String(error)}`
|
|
124
|
-
);
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
109
|
+
function deletedIndexesFromSchemaEvaluation(response) {
|
|
110
|
+
return Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
111
|
+
([componentPath, prediction]) => prediction.indexes.filter((index) => index.change === "dropped").map((index) => ({
|
|
112
|
+
componentPath,
|
|
113
|
+
index,
|
|
114
|
+
documentsCount: index.numDocs,
|
|
115
|
+
replacedBy: prediction.indexes.find(
|
|
116
|
+
(other) => other.change === "added" && other.name === index.name
|
|
117
|
+
) ?? null
|
|
118
|
+
}))
|
|
119
|
+
);
|
|
127
120
|
}
|
|
128
121
|
async function deletedIndexesFromTableSizes({
|
|
129
122
|
ctx,
|
|
@@ -194,13 +187,9 @@ function getTableName(index) {
|
|
|
194
187
|
return tableName;
|
|
195
188
|
}
|
|
196
189
|
function minDocumentsForIndexDeleteWarning() {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
return parsed;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
|
|
190
|
+
return (0, import_utils.integerFromEnv)(
|
|
191
|
+
"CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING",
|
|
192
|
+
MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING
|
|
193
|
+
);
|
|
205
194
|
}
|
|
206
195
|
//# sourceMappingURL=checkForLargeIndexDeletion.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/checkForLargeIndexDeletion.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n logVerbose,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { formatIndex } from \"./indexes.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport { Span } from \"./tracing.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport { evaluatePush
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAMO;AACP,qBAA4B;AAC5B,qBAA4B;AAG5B,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logFinishedStep,\n logMessage,\n logVerbose,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { formatIndex } from \"./indexes.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport { Span } from \"./tracing.js\";\nimport { StartPushRequest } from \"./deployApi/startPush.js\";\nimport { evaluatePush } from \"./deploy2.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\nimport { EvaluateSchemaResponse } from \"./deployApi/evaluateSchema.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { SchemaEvaluation } from \"./schemaEvaluation.js\";\nimport { integerFromEnv } from \"./utils/utils.js\";\n\nconst MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 100_000;\n\ntype CheckOptions = {\n url: string;\n deploymentName: string | null;\n adminKey: string;\n};\n\ntype DeletedIndex = {\n // The component instance path (\"\" for the root component), matching the\n // keys of both `componentSchemaEvaluations` and `indexDiffs`.\n componentPath: string;\n index: DeveloperIndexConfig;\n documentsCount: number;\n replacedBy: DeveloperIndexConfig | null;\n};\n\nexport async function checkForLargeIndexDeletion({\n ctx,\n span,\n request,\n options,\n schemaEvaluation,\n askForConfirmation,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n schemaEvaluation: SchemaEvaluation;\n askForConfirmation: boolean;\n}): Promise<void> {\n changeSpinner(\"Verifying that the push isn\u2019t deleting large indexes...\");\n\n const schemaEvaluationResponse = await schemaEvaluation(span);\n let deletedIndexes: DeletedIndex[];\n if (schemaEvaluationResponse !== null) {\n deletedIndexes = deletedIndexesFromSchemaEvaluation(\n schemaEvaluationResponse,\n );\n } else {\n logVerbose(\n \"Schema evaluation unavailable, sizing deleted indexes per table\",\n );\n deletedIndexes = await deletedIndexesFromTableSizes({\n ctx,\n span,\n request,\n options,\n });\n }\n\n if (deletedIndexes.length === 0) {\n logFinishedStep(\"No indexes are deleted by this push\");\n return;\n }\n\n const minDocumentsForWarning = minDocumentsForIndexDeleteWarning();\n if (\n !deletedIndexes.some(\n ({ documentsCount }) => documentsCount >= minDocumentsForWarning,\n )\n ) {\n logFinishedStep(\"No large indexes are deleted by this push\");\n return;\n }\n\n logMessage(`\u26A0\uFE0F This code push will ${chalkStderr.bold(\"delete\")} the following ${deletedIndexes.length === 1 ? \"index\" : \"indexes\"}\nfrom your production deployment (${options.url}):\n\n${deletedIndexes\n .map((deletedIndex) =>\n formatDeletedIndex({ ...deletedIndex, minDocumentsForWarning }),\n )\n .join(\"\\n\")}\n\nThe documents that are in the index won\u2019t be deleted, but the index will need\nto be backfilled again if you want to restore it later.\n`);\n\n // Either --skip-large-indexes-check or its deletion-only predecessor\n // --allow-deleting-large-indexes gets here, so name neither.\n if (!askForConfirmation) {\n logFinishedStep(\n \"Proceeding with push since deleting large indexes was allowed by flag\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\u2022 or run the deploy command with the ${chalkStderr.bold(\"--skip-large-indexes-check\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Delete ${deletedIndexes.length === 1 ? \"this index\" : \"these indexes\"}?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\n// Preferred source: one schema evaluation reports every dropped index\n// together with its table's document count, requiring only the\n// `deployment:deploy` permission the push itself needs.\nexport function deletedIndexesFromSchemaEvaluation(\n response: EvaluateSchemaResponse,\n): DeletedIndex[] {\n return Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n prediction.indexes\n .filter((index) => index.change === \"dropped\")\n .map((index) => ({\n componentPath,\n index,\n documentsCount: index.numDocs,\n replacedBy:\n prediction.indexes.find(\n (other) => other.change === \"added\" && other.name === index.name,\n ) ?? null,\n })),\n );\n}\n\n// Fallback for deployments without `evaluate_schema`: diff indexes with\n// `evaluate_push`, then size each affected table with a system query. The\n// system query needs the `deployment:data:view` permission, which a\n// deploy-scoped key may lack.\nexport async function deletedIndexesFromTableSizes({\n ctx,\n span,\n request,\n options,\n}: {\n ctx: Context;\n span: Span;\n request: StartPushRequest;\n options: CheckOptions;\n}): Promise<DeletedIndex[]> {\n const { schemaChange } = await evaluatePush(ctx, span, request, options);\n\n const indexDiffs = schemaChange.indexDiffs ?? {};\n const deletedIndexes = Object.entries(indexDiffs).flatMap(\n ([componentPath, indexDiff]) =>\n indexDiff.removed_indexes.map((index) => ({\n componentPath,\n index,\n replacedBy:\n indexDiff.added_indexes.find((other) => other.name === index.name) ??\n null,\n })),\n );\n\n if (deletedIndexes.length === 0) {\n return [];\n }\n\n const tablesWithDeletedIndexes = [\n ...new Set(\n deletedIndexes.map(\n ({ componentPath, index }) => `${componentPath}:${getTableName(index)}`,\n ),\n ),\n ].map((str) => {\n const [componentPath, table] = str.split(\":\");\n return { componentPath, table };\n });\n changeSpinner(\"Checking whether the deleted indexes are on large tables...\");\n const documentCounts = await Promise.all(\n tablesWithDeletedIndexes.map(async ({ componentPath, table }) => ({\n componentPath,\n table,\n count: (await runSystemQuery(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n functionName: \"_system/cli/tableSize:default\",\n componentPath,\n args: { tableName: table },\n })) as number,\n })),\n );\n return deletedIndexes.map(({ componentPath, index, replacedBy }) => ({\n componentPath,\n index,\n replacedBy,\n documentsCount: documentCounts.find(\n (count) =>\n count.table === getTableName(index) &&\n count.componentPath === componentPath,\n )!.count,\n }));\n}\n\nfunction formatDeletedIndex({\n componentPath,\n index,\n documentsCount,\n replacedBy,\n minDocumentsForWarning,\n}: DeletedIndex & { minDocumentsForWarning: number }) {\n const componentNameFormatted =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n\n const documentsCountFormatted =\n documentsCount >= minDocumentsForWarning\n ? ` ${chalkStderr.yellowBright(`\u26A0\uFE0F ${documentsCount.toLocaleString()} documents`)}`\n : ` ${documentsCount.toLocaleString()} ${documentsCount === 1 ? \"document\" : \"documents\"}`;\n\n const replacedByFormatted = replacedBy\n ? `\\n ${chalkStderr.green(\"\u2192 replaced by:\")} ${formatIndex(replacedBy)}`\n : \"\";\n\n return (\n \"\u26D4 \" +\n componentNameFormatted +\n formatIndex(index) +\n documentsCountFormatted +\n replacedByFormatted\n );\n}\n\nfunction getTableName(index: DeveloperIndexConfig) {\n const [tableName, _indexName] = index.name.split(\".\");\n return tableName;\n}\n\nfunction minDocumentsForIndexDeleteWarning(): number {\n return integerFromEnv(\n \"CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING\",\n MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING,\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,24 +23,22 @@ __export(checkForSlowSchemaValidation_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(checkForSlowSchemaValidation_exports);
|
|
24
24
|
var import_chalk = require("chalk");
|
|
25
25
|
var import_log = require("../../bundler/log.js");
|
|
26
|
-
var import_deploy2 = require("./deploy2.js");
|
|
27
26
|
var import_utils = require("./utils/utils.js");
|
|
27
|
+
var import_formatValidationProgress = require("./formatValidationProgress.js");
|
|
28
28
|
const MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27;
|
|
29
29
|
async function checkForSlowSchemaValidation({
|
|
30
|
-
ctx,
|
|
31
30
|
span,
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
schemaEvaluation,
|
|
32
|
+
dryRun
|
|
34
33
|
}) {
|
|
35
|
-
const response = await
|
|
36
|
-
ctx,
|
|
37
|
-
span,
|
|
38
|
-
request,
|
|
39
|
-
options
|
|
40
|
-
});
|
|
34
|
+
const response = await schemaEvaluation(span);
|
|
41
35
|
if (response === null) {
|
|
42
36
|
return;
|
|
43
37
|
}
|
|
38
|
+
reportStagedValidators(response);
|
|
39
|
+
if (!dryRun) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
44
42
|
const walkedTables = Object.entries(
|
|
45
43
|
response.componentSchemaEvaluations
|
|
46
44
|
).flatMap(
|
|
@@ -56,34 +54,55 @@ async function checkForSlowSchemaValidation({
|
|
|
56
54
|
if (totalBytes < minBytesForSchemaWalkWarning()) {
|
|
57
55
|
return;
|
|
58
56
|
}
|
|
57
|
+
const shouldSuggestStaging = walkedTables.some(
|
|
58
|
+
({ table }) => !table.canSkipAfterStagedValidation
|
|
59
|
+
);
|
|
59
60
|
(0, import_log.logMessage)(`\u26A0\uFE0F This schema change requires checking every document in the following ${walkedTables.length === 1 ? "table" : "tables"} against your new schema, totaling ${import_chalk.chalkStderr.yellowBright((0, import_utils.formatSize)(totalBytes))}. This deploy may take a while:
|
|
60
61
|
|
|
61
62
|
${walkedTables.map(
|
|
62
63
|
({ componentPath, table }) => formatWalkedTable({ componentPath, table })
|
|
63
64
|
).join("\n")}
|
|
64
|
-
`
|
|
65
|
+
${shouldSuggestStaging ? `
|
|
66
|
+
Tip: stage the new validator (\`defineTable({...}).staged({...})\`) to validate it in the background without blocking deploys.` : ""}`);
|
|
65
67
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
span,
|
|
76
|
-
request,
|
|
77
|
-
options,
|
|
78
|
-
/* bestEffort */
|
|
79
|
-
true
|
|
80
|
-
);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
(0, import_log.logVerbose)(
|
|
83
|
-
`Skipping slow schema validation check: ${error instanceof Error ? error.message : String(error)}`
|
|
68
|
+
function reportStagedValidators(response) {
|
|
69
|
+
const stagedTables = Object.entries(
|
|
70
|
+
response.componentSchemaEvaluations
|
|
71
|
+
).flatMap(([componentPath, prediction]) => {
|
|
72
|
+
const discarded = new Map(
|
|
73
|
+
(prediction.discardedStagedValidators ?? []).map((validator) => [
|
|
74
|
+
validator.tableName,
|
|
75
|
+
validator
|
|
76
|
+
])
|
|
84
77
|
);
|
|
85
|
-
return
|
|
78
|
+
return prediction.tables.filter((table) => table.staged !== void 0).map((table) => ({
|
|
79
|
+
componentPath,
|
|
80
|
+
table,
|
|
81
|
+
discarded: discarded.get(table.name)
|
|
82
|
+
}));
|
|
83
|
+
});
|
|
84
|
+
if (stagedTables.length === 0) {
|
|
85
|
+
return;
|
|
86
86
|
}
|
|
87
|
+
const lines = stagedTables.map(({ componentPath, table, discarded }) => {
|
|
88
|
+
const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}: ` : "";
|
|
89
|
+
if (discarded !== void 0) {
|
|
90
|
+
return ` ${componentPrefix}${table.name}: ${(0, import_formatValidationProgress.formatDiscardedStagedValidator)(discarded)}`;
|
|
91
|
+
}
|
|
92
|
+
const staged = table.staged;
|
|
93
|
+
switch (staged.state) {
|
|
94
|
+
case "pending": {
|
|
95
|
+
return ` ${componentPrefix}${table.name}: validating in the background (${(0, import_formatValidationProgress.formatValidationProgress)(staged)})`;
|
|
96
|
+
}
|
|
97
|
+
case "valid":
|
|
98
|
+
return table.outcome === "supersetOfStagedValidated" ? ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.green("validated")}. This deploy applies the staged schema without scanning the table.` : ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.green("validated")}. Safe to apply the staged schema changes and deploy.`;
|
|
99
|
+
case "failed":
|
|
100
|
+
return ` ${componentPrefix}${table.name}: ${import_chalk.chalkStderr.red("failed")}: ${staged.error}${import_chalk.chalkStderr.gray(" (fix the offending documents and redeploy to revalidate)")}`;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
(0, import_log.logMessage)(`Staged schema validation status:
|
|
104
|
+
${lines.join("\n")}
|
|
105
|
+
`);
|
|
87
106
|
}
|
|
88
107
|
function formatWalkedTable({
|
|
89
108
|
componentPath,
|
|
@@ -92,16 +111,16 @@ function formatWalkedTable({
|
|
|
92
111
|
const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}: ` : "";
|
|
93
112
|
const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;
|
|
94
113
|
const sizeFormatted = (0, import_utils.formatSize)(table.sizeBytes);
|
|
95
|
-
|
|
114
|
+
let stagedNote = "";
|
|
115
|
+
if (table.staged?.state === "pending" && table.canSkipAfterStagedValidation) {
|
|
116
|
+
stagedNote = `. Staged schema validation in progress. Wait for validation to complete before deploying with the staged changes. Deploying now will block on a full table revalidation scan.`;
|
|
117
|
+
}
|
|
118
|
+
return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;
|
|
96
119
|
}
|
|
97
120
|
function minBytesForSchemaWalkWarning() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return parsed;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return MIN_BYTES_FOR_SCHEMA_WALK_WARNING;
|
|
121
|
+
return (0, import_utils.integerFromEnv)(
|
|
122
|
+
"CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING",
|
|
123
|
+
MIN_BYTES_FOR_SCHEMA_WALK_WARNING
|
|
124
|
+
);
|
|
106
125
|
}
|
|
107
126
|
//# sourceMappingURL=checkForSlowSchemaValidation.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/checkForSlowSchemaValidation.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport { Span } from \"./tracing.js\";\nimport {\n EvaluateSchemaResponse,\n TablePrediction,\n} from \"./deployApi/evaluateSchema.js\";\nimport { SchemaEvaluation } from \"./schemaEvaluation.js\";\nimport { formatSize, integerFromEnv } from \"./utils/utils.js\";\nimport {\n formatDiscardedStagedValidator,\n formatValidationProgress,\n} from \"./formatValidationProgress.js\";\n\nconst MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27; // 128 MiB\n\nexport async function checkForSlowSchemaValidation({\n span,\n schemaEvaluation,\n dryRun,\n}: {\n span: Span;\n schemaEvaluation: SchemaEvaluation;\n dryRun: boolean;\n}): Promise<void> {\n const response = await schemaEvaluation(span);\n if (response === null) {\n return;\n }\n reportStagedValidators(response);\n if (!dryRun) {\n return;\n }\n\n const walkedTables = Object.entries(\n response.componentSchemaEvaluations,\n ).flatMap(([componentPath, prediction]) =>\n prediction.tables\n .filter((table) => table.outcome === \"mustWalk\")\n .map((table) => ({ componentPath, table })),\n );\n if (walkedTables.length === 0) {\n return;\n }\n\n const totalBytes = walkedTables.reduce(\n (sum, { table }) => sum + table.sizeBytes,\n 0,\n );\n if (totalBytes < minBytesForSchemaWalkWarning()) {\n return;\n }\n\n const shouldSuggestStaging = walkedTables.some(\n ({ table }) => !table.canSkipAfterStagedValidation,\n );\n logMessage(`\u26A0\uFE0F This schema change requires checking every document in the following ${walkedTables.length === 1 ? \"table\" : \"tables\"} against your new schema, totaling ${chalkStderr.yellowBright(formatSize(totalBytes))}. This deploy may take a while:\n\n${walkedTables\n .map(({ componentPath, table }) =>\n formatWalkedTable({ componentPath, table }),\n )\n .join(\"\\n\")}\n${\n shouldSuggestStaging\n ? `\\nTip: stage the new validator (\\`defineTable({...}).staged({...})\\`) to validate it in the background without blocking deploys.`\n : \"\"\n}`);\n}\n\n// The prediction includes staged validators from active and in-flight schemas.\nfunction reportStagedValidators(response: EvaluateSchemaResponse) {\n const stagedTables = Object.entries(\n response.componentSchemaEvaluations,\n ).flatMap(([componentPath, prediction]) => {\n const discarded = new Map(\n (prediction.discardedStagedValidators ?? []).map((validator) => [\n validator.tableName,\n validator,\n ]),\n );\n return prediction.tables\n .filter((table) => table.staged !== undefined)\n .map((table) => ({\n componentPath,\n table,\n discarded: discarded.get(table.name),\n }));\n });\n if (stagedTables.length === 0) {\n return;\n }\n const lines = stagedTables.map(({ componentPath, table, discarded }) => {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}: ` : \"\";\n // The state describes the validator this push discards, so advertising\n // it as ready to promote would contradict the unstaging warning.\n if (discarded !== undefined) {\n return ` ${componentPrefix}${table.name}: ${formatDiscardedStagedValidator(discarded)}`;\n }\n const staged = table.staged!;\n switch (staged.state) {\n case \"pending\": {\n return ` ${componentPrefix}${table.name}: validating in the background (${formatValidationProgress(staged)})`;\n }\n case \"valid\":\n // `supersetOfStagedValidated` means this push already promotes it.\n return table.outcome === \"supersetOfStagedValidated\"\n ? ` ${componentPrefix}${table.name}: ${chalkStderr.green(\"validated\")}. This deploy applies the staged schema without scanning the table.`\n : ` ${componentPrefix}${table.name}: ${chalkStderr.green(\"validated\")}. Safe to apply the staged schema changes and deploy.`;\n case \"failed\":\n return ` ${componentPrefix}${table.name}: ${chalkStderr.red(\"failed\")}: ${staged.error}${chalkStderr.gray(\" (fix the offending documents and redeploy to revalidate)\")}`;\n }\n });\n logMessage(`Staged schema validation status:\\n${lines.join(\"\\n\")}\\n`);\n}\n\nfunction formatWalkedTable({\n componentPath,\n table,\n}: {\n componentPath: string;\n table: TablePrediction;\n}) {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}: ` : \"\";\n const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;\n const sizeFormatted = formatSize(table.sizeBytes);\n let stagedNote = \"\";\n if (table.staged?.state === \"pending\" && table.canSkipAfterStagedValidation) {\n stagedNote = `. Staged schema validation in progress. Wait for validation to complete before deploying with the staged changes. Deploying now will block on a full table revalidation scan.`;\n }\n return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;\n}\n\nfunction minBytesForSchemaWalkWarning(): number {\n return integerFromEnv(\n \"CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING\",\n MIN_BYTES_FOR_SCHEMA_WALK_WARNING,\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var checkForStagedValidatorDeletion_exports = {};
|
|
20
|
+
__export(checkForStagedValidatorDeletion_exports, {
|
|
21
|
+
checkForStagedValidatorDeletion: () => checkForStagedValidatorDeletion
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(checkForStagedValidatorDeletion_exports);
|
|
24
|
+
var import_chalk = require("chalk");
|
|
25
|
+
var import_log = require("../../bundler/log.js");
|
|
26
|
+
var import_prompts = require("./utils/prompts.js");
|
|
27
|
+
var import_formatValidationProgress = require("./formatValidationProgress.js");
|
|
28
|
+
async function checkForStagedValidatorDeletion({
|
|
29
|
+
ctx,
|
|
30
|
+
response,
|
|
31
|
+
askForConfirmation,
|
|
32
|
+
dryRun = false
|
|
33
|
+
}) {
|
|
34
|
+
if (response === null) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
38
|
+
([componentPath, prediction]) => (prediction.discardedStagedValidators ?? []).map((validator) => ({
|
|
39
|
+
componentPath,
|
|
40
|
+
validator
|
|
41
|
+
}))
|
|
42
|
+
);
|
|
43
|
+
if (discarded.length === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
(0, import_log.logMessage)(`\u26A0\uFE0F This push ${import_chalk.chalkStderr.bold(dryRun ? "would discard" : "discards")} staged schema validation for the following ${discarded.length === 1 ? "table" : "tables"}:
|
|
47
|
+
|
|
48
|
+
${discarded.map(formatDiscarded).join("\n")}
|
|
49
|
+
|
|
50
|
+
A discarded staged validator restarts validation from zero if staged again.
|
|
51
|
+
`);
|
|
52
|
+
if (dryRun) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!askForConfirmation) {
|
|
56
|
+
(0, import_log.logFinishedStep)(
|
|
57
|
+
"Proceeding with push since --allow-unstaging-schema is set"
|
|
58
|
+
);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!process.stdin.isTTY) {
|
|
62
|
+
return ctx.crash({
|
|
63
|
+
exitCode: 1,
|
|
64
|
+
errorType: "fatal",
|
|
65
|
+
printedMessage: `To confirm the push:
|
|
66
|
+
\u2022 run the deploy command in an ${import_chalk.chalkStderr.bold("interactive terminal")}
|
|
67
|
+
\u2022 or run the deploy command with the ${import_chalk.chalkStderr.bold("--allow-unstaging-schema")} flag`
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
(0, import_log.stopSpinner)();
|
|
71
|
+
if (!await (0, import_prompts.promptYesNo)(ctx, {
|
|
72
|
+
message: `Discard staged validation for ${discarded.length === 1 ? "this table" : "these tables"}?`,
|
|
73
|
+
default: false
|
|
74
|
+
})) {
|
|
75
|
+
return ctx.crash({
|
|
76
|
+
exitCode: 1,
|
|
77
|
+
errorType: "fatal",
|
|
78
|
+
printedMessage: `Canceling push`
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
(0, import_log.logFinishedStep)("Proceeding with push.");
|
|
82
|
+
}
|
|
83
|
+
function formatDiscarded({
|
|
84
|
+
componentPath,
|
|
85
|
+
validator
|
|
86
|
+
}) {
|
|
87
|
+
const componentPrefix = componentPath !== "" ? `${import_chalk.chalkStderr.gray(componentPath)}:` : "";
|
|
88
|
+
return `\u26D4 ${componentPrefix}${validator.tableName}: ${(0, import_formatValidationProgress.formatDiscardedStagedValidator)(validator)}`;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=checkForStagedValidatorDeletion.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cli/lib/checkForStagedValidatorDeletion.ts"],
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, stopSpinner } from \"../../bundler/log.js\";\nimport { promptYesNo } from \"./utils/prompts.js\";\nimport {\n DiscardedStagedValidator,\n EvaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport { formatDiscardedStagedValidator } from \"./formatValidationProgress.js\";\n\nexport type StagedValidatorDeletionCheck =\n | \"ask for confirmation\"\n | \"has confirmation\"\n | \"no verification\";\n\n/**\n * Confirm before discarding pending or successful staged validation. Unstaging\n * stops write-time checks, so restaging requires a fresh scan.\n *\n * A dry run only reports what the push would discard, so `--dry-run` previews\n * the confirmation the real push will ask for.\n */\nexport async function checkForStagedValidatorDeletion({\n ctx,\n response,\n askForConfirmation,\n dryRun = false,\n}: {\n ctx: Context;\n response: EvaluateSchemaResponse | null;\n askForConfirmation: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n // `sharedSchemaEvaluation` has already logged why evaluation failed.\n if (response === null) {\n return;\n }\n const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(\n ([componentPath, prediction]) =>\n (prediction.discardedStagedValidators ?? []).map((validator) => ({\n componentPath,\n validator,\n })),\n );\n if (discarded.length === 0) {\n return;\n }\n\n logMessage(`\\u26a0\\ufe0f This push ${chalkStderr.bold(dryRun ? \"would discard\" : \"discards\")} staged schema validation for the following ${discarded.length === 1 ? \"table\" : \"tables\"}:\n\n${discarded.map(formatDiscarded).join(\"\\n\")}\n\nA discarded staged validator restarts validation from zero if staged again.\n`);\n\n if (dryRun) {\n return;\n }\n\n if (!askForConfirmation) {\n logFinishedStep(\n \"Proceeding with push since --allow-unstaging-schema is set\",\n );\n return;\n }\n\n if (!process.stdin.isTTY) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `To confirm the push:\n\\u2022 run the deploy command in an ${chalkStderr.bold(\"interactive terminal\")}\n\\u2022 or run the deploy command with the ${chalkStderr.bold(\"--allow-unstaging-schema\")} flag`,\n });\n }\n\n stopSpinner();\n if (\n !(await promptYesNo(ctx, {\n message: `Discard staged validation for ${discarded.length === 1 ? \"this table\" : \"these tables\"}?`,\n default: false,\n }))\n ) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Canceling push`,\n });\n }\n\n logFinishedStep(\"Proceeding with push.\");\n}\n\nfunction formatDiscarded({\n componentPath,\n validator,\n}: {\n componentPath: string;\n validator: DiscardedStagedValidator;\n}): string {\n const componentPrefix =\n componentPath !== \"\" ? `${chalkStderr.gray(componentPath)}:` : \"\";\n return `\\u26d4 ${componentPrefix}${validator.tableName}: ${formatDiscardedStagedValidator(validator)}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAAyD;AACzD,qBAA4B;AAK5B,sCAA+C;AAc/C,eAAsB,gCAAgC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAKkB;AAEhB,MAAI,aAAa,MAAM;AACrB;AAAA,EACF;AACA,QAAM,YAAY,OAAO,QAAQ,SAAS,0BAA0B,EAAE;AAAA,IACpE,CAAC,CAAC,eAAe,UAAU,OACxB,WAAW,6BAA6B,CAAC,GAAG,IAAI,CAAC,eAAe;AAAA,MAC/D;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACN;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,EACF;AAEA,6BAAW,2BAA2B,yBAAY,KAAK,SAAS,kBAAkB,UAAU,CAAC,+CAA+C,UAAU,WAAW,IAAI,UAAU,QAAQ;AAAA;AAAA,EAEvL,UAAU,IAAI,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,CAG1C;AAEC,MAAI,QAAQ;AACV;AAAA,EACF;AAEA,MAAI,CAAC,oBAAoB;AACvB;AAAA,MACE;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,sCACgB,yBAAY,KAAK,sBAAsB,CAAC;AAAA,4CAClC,yBAAY,KAAK,0BAA0B,CAAC;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,8BAAY;AACZ,MACE,CAAE,UAAM,4BAAY,KAAK;AAAA,IACvB,SAAS,iCAAiC,UAAU,WAAW,IAAI,eAAe,cAAc;AAAA,IAChG,SAAS;AAAA,EACX,CAAC,GACD;AACA,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,kCAAgB,uBAAuB;AACzC;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGW;AACT,QAAM,kBACJ,kBAAkB,KAAK,GAAG,yBAAY,KAAK,aAAa,CAAC,MAAM;AACjE,SAAO,UAAU,eAAe,GAAG,UAAU,SAAS,SAAK,gEAA+B,SAAS,CAAC;AACtG;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|