convex 1.45.0 → 1.47.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 +105 -6
- package/dist/browser.bundle.js +7 -1
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/http_client.js.map +2 -2
- package/dist/cjs/browser/query_options.js.map +2 -2
- package/dist/cjs/browser/simple_client.js.map +2 -2
- package/dist/cjs/browser/sync/optimistic_updates.js.map +1 -1
- package/dist/cjs/browser/sync/optimistic_updates_impl.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/codegen.js +0 -2
- package/dist/cjs/cli/codegen.js.map +2 -2
- package/dist/cjs/cli/configure.js +13 -4
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +28 -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/docs.js +3 -36
- package/dist/cjs/cli/docs.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 +100 -70
- package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +126 -0
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
- 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 +56 -1
- 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 +32 -3
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +101 -0
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
- package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
- package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
- package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +6 -0
- package/dist/cjs/cli/lib/dev.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/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/indexes.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
- package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
- package/dist/cjs/cli/lib/localDeployment/utils.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/run.js +5 -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 +84 -47
- package/dist/cjs/cli/lib/utils/utils.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/nextjs/index.js.map +2 -2
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react/hydration.js.map +2 -2
- package/dist/cjs/react/queries_observer.js.map +2 -2
- package/dist/cjs/react/use_paginated_query2.js.map +2 -2
- package/dist/cjs/react/use_queries.js.map +2 -2
- package/dist/cjs/server/api.js.map +2 -2
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/cron.js +10 -10
- package/dist/cjs/server/cron.js.map +2 -2
- 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/meta_impl.js +8 -2
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/scheduler_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/scheduler.js.map +1 -1
- package/dist/cjs/server/schema.js +72 -3
- package/dist/cjs/server/schema.js.map +2 -2
- package/dist/cjs/server/storage.js.map +1 -1
- package/dist/cjs/values/validator.js +1 -1
- package/dist/cjs/values/validator.js.map +2 -2
- package/dist/cjs/values/validators.js +82 -26
- 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/browser/http_client.d.ts +5 -5
- package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
- package/dist/cjs-types/browser/query_options.d.ts +2 -2
- package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
- package/dist/cjs-types/browser/simple_client.d.ts +6 -6
- package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
- package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/optimistic_updates_impl.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/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/docs.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 +25 -6
- package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
- 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 -2
- 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 +5 -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 +8 -0
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
- package/dist/cjs-types/cli/lib/deployApi/finishPush.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/formatValidationProgress.d.ts +8 -0
- package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/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/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 -7
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/nextjs/index.d.ts +6 -6
- package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
- package/dist/cjs-types/react/client.d.ts +15 -15
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/hydration.d.ts +3 -3
- package/dist/cjs-types/react/hydration.d.ts.map +1 -1
- package/dist/cjs-types/react/queries_observer.d.ts +9 -9
- package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
- package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/cjs-types/react/use_queries.d.ts +14 -6
- package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
- package/dist/cjs-types/server/api.d.ts +157 -7
- package/dist/cjs-types/server/api.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +2 -2
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.d.ts +21 -20
- package/dist/cjs-types/server/cron.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/actions_impl.d.ts +22 -7
- package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/scheduler_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 +2 -2
- 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 +17 -7
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/scheduler.d.ts +9 -7
- package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts +34 -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/validator.d.ts.map +1 -1
- package/dist/cjs-types/values/validators.d.ts +30 -0
- package/dist/cjs-types/values/validators.d.ts.map +1 -1
- package/dist/cjs-types/values/value.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +2728 -1627
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/http_client.js.map +2 -2
- package/dist/esm/browser/query_options.js.map +2 -2
- package/dist/esm/browser/simple_client.js.map +2 -2
- package/dist/esm/browser/sync/optimistic_updates_impl.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/codegen.js +0 -2
- package/dist/esm/cli/codegen.js.map +2 -2
- package/dist/esm/cli/configure.js +12 -4
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +28 -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/docs.js +3 -43
- package/dist/esm/cli/docs.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 +98 -69
- package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +107 -0
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
- 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 +63 -1
- 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 +33 -3
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js +72 -0
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
- package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
- package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
- package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +6 -0
- package/dist/esm/cli/lib/dev.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/indexes.js.map +1 -1
- package/dist/esm/cli/lib/localDeployment/run.js +30 -2
- package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
- package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
- package/dist/esm/cli/lib/run.js +5 -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 +84 -49
- package/dist/esm/cli/lib/utils/utils.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/nextjs/index.js.map +2 -2
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react/hydration.js +3 -1
- package/dist/esm/react/hydration.js.map +2 -2
- package/dist/esm/react/queries_observer.js +3 -1
- package/dist/esm/react/queries_observer.js.map +2 -2
- package/dist/esm/react/use_paginated_query2.js +3 -1
- package/dist/esm/react/use_paginated_query2.js.map +2 -2
- package/dist/esm/react/use_queries.js.map +2 -2
- package/dist/esm/server/api.js.map +2 -2
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/cron.js +13 -11
- package/dist/esm/server/cron.js.map +2 -2
- 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/meta_impl.js +9 -3
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/scheduler_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 +72 -3
- package/dist/esm/server/schema.js.map +2 -2
- package/dist/esm/values/validator.js +1 -1
- package/dist/esm/values/validator.js.map +2 -2
- package/dist/esm/values/validators.js +82 -26
- 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/browser/http_client.d.ts +5 -5
- package/dist/esm-types/browser/http_client.d.ts.map +1 -1
- package/dist/esm-types/browser/query_options.d.ts +2 -2
- package/dist/esm-types/browser/query_options.d.ts.map +1 -1
- package/dist/esm-types/browser/simple_client.d.ts +6 -6
- package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
- package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/optimistic_updates_impl.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/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/docs.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 +25 -6
- package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +8 -0
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
- 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 -2
- 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 +5 -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 +8 -0
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +897 -0
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
- package/dist/esm-types/cli/lib/deployApi/finishPush.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/formatValidationProgress.d.ts +8 -0
- package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/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/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 -7
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/nextjs/index.d.ts +6 -6
- package/dist/esm-types/nextjs/index.d.ts.map +1 -1
- package/dist/esm-types/react/client.d.ts +15 -15
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/hydration.d.ts +3 -3
- package/dist/esm-types/react/hydration.d.ts.map +1 -1
- package/dist/esm-types/react/queries_observer.d.ts +9 -9
- package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
- package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/esm-types/react/use_queries.d.ts +14 -6
- package/dist/esm-types/react/use_queries.d.ts.map +1 -1
- package/dist/esm-types/server/api.d.ts +157 -7
- package/dist/esm-types/server/api.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +2 -2
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/cron.d.ts +21 -20
- package/dist/esm-types/server/cron.d.ts.map +1 -1
- package/dist/esm-types/server/impl/actions_impl.d.ts +22 -7
- package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/scheduler_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 +2 -2
- 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 +17 -7
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/scheduler.d.ts +9 -7
- package/dist/esm-types/server/scheduler.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts +34 -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/validator.d.ts.map +1 -1
- package/dist/esm-types/values/validators.d.ts +30 -0
- package/dist/esm-types/values/validators.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 +9 -9
- package/schemas/convex.schema.json +5 -5
- package/src/browser/http_client.ts +43 -10
- package/src/browser/query_options.ts +11 -5
- package/src/browser/simple_client.ts +35 -14
- package/src/browser/sync/optimistic_updates.ts +17 -4
- package/src/browser/sync/optimistic_updates_impl.ts +17 -4
- package/src/bundler/index.ts +9 -4
- package/src/cli/codegen.ts +0 -1
- package/src/cli/configure.ts +27 -7
- package/src/cli/deploy.ts +37 -5
- package/src/cli/deploymentSelect.ts +7 -4
- package/src/cli/dev.ts +9 -0
- package/src/cli/docs.ts +3 -44
- 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 +150 -91
- package/src/cli/lib/checkForSlowSchemaValidation.ts +141 -0
- package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
- package/src/cli/lib/codegen.ts +0 -2
- package/src/cli/lib/command.ts +3 -0
- package/src/cli/lib/components/definition/bundle.ts +68 -14
- package/src/cli/lib/components.ts +84 -0
- package/src/cli/lib/config.ts +85 -18
- package/src/cli/lib/deploy2.ts +66 -2
- package/src/cli/lib/deployApi/evaluateSchema.ts +97 -0
- package/src/cli/lib/deployApi/finishPush.ts +1 -1
- package/src/cli/lib/deployApi/startPush.ts +1 -1
- package/src/cli/lib/dev.ts +15 -0
- package/src/cli/lib/formatValidationProgress.ts +35 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
- package/src/cli/lib/indexes.ts +1 -1
- package/src/cli/lib/localDeployment/run.ts +44 -2
- package/src/cli/lib/localDeployment/upgrade.ts +4 -6
- package/src/cli/lib/localDeployment/utils.ts +6 -0
- package/src/cli/lib/mcp/tools/env.ts +17 -3
- package/src/cli/lib/run.ts +3 -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 +127 -56
- package/src/cli/projectCreate.ts +1 -1
- package/src/index.ts +1 -1
- package/src/nextjs/index.ts +19 -8
- package/src/react/client.ts +73 -30
- package/src/react/hydration.tsx +14 -6
- package/src/react/queries_observer.ts +19 -16
- package/src/react/use_paginated_query2.ts +10 -6
- package/src/react/use_queries.ts +23 -7
- package/src/server/api.ts +220 -14
- package/src/server/components/index.ts +4 -6
- package/src/server/cron.ts +34 -24
- package/src/server/impl/actions_impl.ts +39 -10
- package/src/server/impl/meta_impl.ts +8 -1
- package/src/server/impl/scheduler_impl.ts +13 -6
- package/src/server/impl/storage_impl.ts +30 -0
- package/src/server/index.ts +6 -1
- package/src/server/meta.ts +79 -0
- package/src/server/registration.ts +38 -7
- package/src/server/scheduler.ts +22 -7
- package/src/server/schema.ts +77 -0
- package/src/server/storage.ts +17 -0
- package/src/values/validator.ts +3 -1
- package/src/values/validators.ts +85 -27
- package/src/values/value.ts +9 -5
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
changeSpinner,
|
|
5
5
|
logFinishedStep,
|
|
6
6
|
logMessage,
|
|
7
|
+
logVerbose,
|
|
7
8
|
stopSpinner,
|
|
8
9
|
} from "../../bundler/log.js";
|
|
9
10
|
import { formatIndex } from "./indexes.js";
|
|
@@ -11,107 +12,85 @@ import { promptYesNo } from "./utils/prompts.js";
|
|
|
11
12
|
import { Span } from "./tracing.js";
|
|
12
13
|
import { StartPushRequest } from "./deployApi/startPush.js";
|
|
13
14
|
import { evaluatePush } from "./deploy2.js";
|
|
14
|
-
import { DeveloperIndexConfig
|
|
15
|
+
import { DeveloperIndexConfig } from "./deployApi/finishPush.js";
|
|
16
|
+
import { EvaluateSchemaResponse } from "./deployApi/evaluateSchema.js";
|
|
15
17
|
import { runSystemQuery } from "./run.js";
|
|
18
|
+
import { SchemaEvaluation } from "./schemaEvaluation.js";
|
|
19
|
+
import { integerFromEnv } from "./utils/utils.js";
|
|
16
20
|
|
|
17
21
|
const MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING = 100_000;
|
|
18
22
|
|
|
23
|
+
type CheckOptions = {
|
|
24
|
+
url: string;
|
|
25
|
+
deploymentName: string | null;
|
|
26
|
+
adminKey: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type DeletedIndex = {
|
|
30
|
+
// The component instance path ("" for the root component), matching the
|
|
31
|
+
// keys of both `componentSchemaEvaluations` and `indexDiffs`.
|
|
32
|
+
componentPath: string;
|
|
33
|
+
index: DeveloperIndexConfig;
|
|
34
|
+
documentsCount: number;
|
|
35
|
+
replacedBy: DeveloperIndexConfig | null;
|
|
36
|
+
};
|
|
37
|
+
|
|
19
38
|
export async function checkForLargeIndexDeletion({
|
|
20
39
|
ctx,
|
|
21
40
|
span,
|
|
22
41
|
request,
|
|
23
42
|
options,
|
|
43
|
+
schemaEvaluation,
|
|
24
44
|
askForConfirmation,
|
|
25
45
|
}: {
|
|
26
46
|
ctx: Context;
|
|
27
47
|
span: Span;
|
|
28
48
|
request: StartPushRequest;
|
|
29
|
-
options:
|
|
30
|
-
|
|
31
|
-
deploymentName: string | null;
|
|
32
|
-
adminKey: string;
|
|
33
|
-
};
|
|
49
|
+
options: CheckOptions;
|
|
50
|
+
schemaEvaluation: SchemaEvaluation;
|
|
34
51
|
askForConfirmation: boolean;
|
|
35
52
|
}): Promise<void> {
|
|
36
53
|
changeSpinner("Verifying that the push isn’t deleting large indexes...");
|
|
37
54
|
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
const schemaEvaluationResponse = await schemaEvaluation(span);
|
|
56
|
+
let deletedIndexes: DeletedIndex[];
|
|
57
|
+
if (schemaEvaluationResponse !== null) {
|
|
58
|
+
deletedIndexes = deletedIndexesFromSchemaEvaluation(
|
|
59
|
+
schemaEvaluationResponse,
|
|
60
|
+
);
|
|
61
|
+
} else {
|
|
62
|
+
logVerbose(
|
|
63
|
+
"Schema evaluation unavailable, sizing deleted indexes per table",
|
|
64
|
+
);
|
|
65
|
+
deletedIndexes = await deletedIndexesFromTableSizes({
|
|
66
|
+
ctx,
|
|
67
|
+
span,
|
|
68
|
+
request,
|
|
69
|
+
options,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
48
72
|
|
|
49
73
|
if (deletedIndexes.length === 0) {
|
|
50
74
|
logFinishedStep("No indexes are deleted by this push");
|
|
51
75
|
return;
|
|
52
76
|
}
|
|
53
77
|
|
|
54
|
-
const tablesWithDeletedIndexes = [
|
|
55
|
-
...new Set(
|
|
56
|
-
deletedIndexes.map(
|
|
57
|
-
({ componentDefinitionPath, index }) =>
|
|
58
|
-
`${componentDefinitionPath}:${getTableName(index)}`,
|
|
59
|
-
),
|
|
60
|
-
),
|
|
61
|
-
].map((str) => {
|
|
62
|
-
const [componentDefinitionPath, table] = str.split(":");
|
|
63
|
-
return { componentDefinitionPath, table };
|
|
64
|
-
});
|
|
65
|
-
changeSpinner("Checking whether the deleted indexes are on large tables...");
|
|
66
|
-
const documentCounts = await Promise.all(
|
|
67
|
-
tablesWithDeletedIndexes.map(
|
|
68
|
-
async ({ componentDefinitionPath, table }) => ({
|
|
69
|
-
componentDefinitionPath,
|
|
70
|
-
table,
|
|
71
|
-
count: (await runSystemQuery(ctx, {
|
|
72
|
-
deploymentUrl: options.url,
|
|
73
|
-
adminKey: options.adminKey,
|
|
74
|
-
functionName: "_system/cli/tableSize:default",
|
|
75
|
-
componentPath: componentDefinitionPath,
|
|
76
|
-
args: { tableName: table },
|
|
77
|
-
})) as number,
|
|
78
|
-
}),
|
|
79
|
-
),
|
|
80
|
-
);
|
|
81
|
-
const deletedIndexesWithDocumentsCount = deletedIndexes.map(
|
|
82
|
-
({ componentDefinitionPath, index }) => ({
|
|
83
|
-
componentDefinitionPath,
|
|
84
|
-
index,
|
|
85
|
-
count: documentCounts.find(
|
|
86
|
-
(count) =>
|
|
87
|
-
count.table === getTableName(index) &&
|
|
88
|
-
count.componentDefinitionPath === componentDefinitionPath,
|
|
89
|
-
)!.count,
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
|
|
93
78
|
const minDocumentsForWarning = minDocumentsForIndexDeleteWarning();
|
|
94
79
|
if (
|
|
95
|
-
!
|
|
96
|
-
({
|
|
80
|
+
!deletedIndexes.some(
|
|
81
|
+
({ documentsCount }) => documentsCount >= minDocumentsForWarning,
|
|
97
82
|
)
|
|
98
83
|
) {
|
|
99
84
|
logFinishedStep("No large indexes are deleted by this push");
|
|
100
85
|
return;
|
|
101
86
|
}
|
|
102
87
|
|
|
103
|
-
logMessage(`⚠️ This code push will ${chalkStderr.bold("delete")} the following ${
|
|
88
|
+
logMessage(`⚠️ This code push will ${chalkStderr.bold("delete")} the following ${deletedIndexes.length === 1 ? "index" : "indexes"}
|
|
104
89
|
from your production deployment (${options.url}):
|
|
105
90
|
|
|
106
|
-
${
|
|
107
|
-
.map((
|
|
108
|
-
formatDeletedIndex({
|
|
109
|
-
componentDefinitionPath,
|
|
110
|
-
index,
|
|
111
|
-
indexDiff: indexDiffs[componentDefinitionPath],
|
|
112
|
-
documentsCount: count,
|
|
113
|
-
minDocumentsForWarning,
|
|
114
|
-
}),
|
|
91
|
+
${deletedIndexes
|
|
92
|
+
.map((deletedIndex) =>
|
|
93
|
+
formatDeletedIndex({ ...deletedIndex, minDocumentsForWarning }),
|
|
115
94
|
)
|
|
116
95
|
.join("\n")}
|
|
117
96
|
|
|
@@ -119,9 +98,11 @@ The documents that are in the index won’t be deleted, but the index will need
|
|
|
119
98
|
to be backfilled again if you want to restore it later.
|
|
120
99
|
`);
|
|
121
100
|
|
|
101
|
+
// Either --skip-large-indexes-check or its deletion-only predecessor
|
|
102
|
+
// --allow-deleting-large-indexes gets here, so name neither.
|
|
122
103
|
if (!askForConfirmation) {
|
|
123
104
|
logFinishedStep(
|
|
124
|
-
"Proceeding with push since
|
|
105
|
+
"Proceeding with push since deleting large indexes was allowed by flag",
|
|
125
106
|
);
|
|
126
107
|
return;
|
|
127
108
|
}
|
|
@@ -132,14 +113,14 @@ to be backfilled again if you want to restore it later.
|
|
|
132
113
|
errorType: "fatal",
|
|
133
114
|
printedMessage: `To confirm the push:
|
|
134
115
|
• run the deploy command in an ${chalkStderr.bold("interactive terminal")}
|
|
135
|
-
• or run the deploy command with the ${chalkStderr.bold("--
|
|
116
|
+
• or run the deploy command with the ${chalkStderr.bold("--skip-large-indexes-check")} flag`,
|
|
136
117
|
});
|
|
137
118
|
}
|
|
138
119
|
|
|
139
120
|
stopSpinner();
|
|
140
121
|
if (
|
|
141
122
|
!(await promptYesNo(ctx, {
|
|
142
|
-
message: `Delete ${
|
|
123
|
+
message: `Delete ${deletedIndexes.length === 1 ? "this index" : "these indexes"}?`,
|
|
143
124
|
default: false,
|
|
144
125
|
}))
|
|
145
126
|
) {
|
|
@@ -153,30 +134,112 @@ to be backfilled again if you want to restore it later.
|
|
|
153
134
|
logFinishedStep("Proceeding with push.");
|
|
154
135
|
}
|
|
155
136
|
|
|
137
|
+
// Preferred source: one schema evaluation reports every dropped index
|
|
138
|
+
// together with its table's document count, requiring only the
|
|
139
|
+
// `deployment:deploy` permission the push itself needs.
|
|
140
|
+
export function deletedIndexesFromSchemaEvaluation(
|
|
141
|
+
response: EvaluateSchemaResponse,
|
|
142
|
+
): DeletedIndex[] {
|
|
143
|
+
return Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
144
|
+
([componentPath, prediction]) =>
|
|
145
|
+
prediction.indexes
|
|
146
|
+
.filter((index) => index.change === "dropped")
|
|
147
|
+
.map((index) => ({
|
|
148
|
+
componentPath,
|
|
149
|
+
index,
|
|
150
|
+
documentsCount: index.numDocs,
|
|
151
|
+
replacedBy:
|
|
152
|
+
prediction.indexes.find(
|
|
153
|
+
(other) => other.change === "added" && other.name === index.name,
|
|
154
|
+
) ?? null,
|
|
155
|
+
})),
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Fallback for deployments without `evaluate_schema`: diff indexes with
|
|
160
|
+
// `evaluate_push`, then size each affected table with a system query. The
|
|
161
|
+
// system query needs the `deployment:data:view` permission, which a
|
|
162
|
+
// deploy-scoped key may lack.
|
|
163
|
+
export async function deletedIndexesFromTableSizes({
|
|
164
|
+
ctx,
|
|
165
|
+
span,
|
|
166
|
+
request,
|
|
167
|
+
options,
|
|
168
|
+
}: {
|
|
169
|
+
ctx: Context;
|
|
170
|
+
span: Span;
|
|
171
|
+
request: StartPushRequest;
|
|
172
|
+
options: CheckOptions;
|
|
173
|
+
}): Promise<DeletedIndex[]> {
|
|
174
|
+
const { schemaChange } = await evaluatePush(ctx, span, request, options);
|
|
175
|
+
|
|
176
|
+
const indexDiffs = schemaChange.indexDiffs ?? {};
|
|
177
|
+
const deletedIndexes = Object.entries(indexDiffs).flatMap(
|
|
178
|
+
([componentPath, indexDiff]) =>
|
|
179
|
+
indexDiff.removed_indexes.map((index) => ({
|
|
180
|
+
componentPath,
|
|
181
|
+
index,
|
|
182
|
+
replacedBy:
|
|
183
|
+
indexDiff.added_indexes.find((other) => other.name === index.name) ??
|
|
184
|
+
null,
|
|
185
|
+
})),
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
if (deletedIndexes.length === 0) {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const tablesWithDeletedIndexes = [
|
|
193
|
+
...new Set(
|
|
194
|
+
deletedIndexes.map(
|
|
195
|
+
({ componentPath, index }) => `${componentPath}:${getTableName(index)}`,
|
|
196
|
+
),
|
|
197
|
+
),
|
|
198
|
+
].map((str) => {
|
|
199
|
+
const [componentPath, table] = str.split(":");
|
|
200
|
+
return { componentPath, table };
|
|
201
|
+
});
|
|
202
|
+
changeSpinner("Checking whether the deleted indexes are on large tables...");
|
|
203
|
+
const documentCounts = await Promise.all(
|
|
204
|
+
tablesWithDeletedIndexes.map(async ({ componentPath, table }) => ({
|
|
205
|
+
componentPath,
|
|
206
|
+
table,
|
|
207
|
+
count: (await runSystemQuery(ctx, {
|
|
208
|
+
deploymentUrl: options.url,
|
|
209
|
+
adminKey: options.adminKey,
|
|
210
|
+
functionName: "_system/cli/tableSize:default",
|
|
211
|
+
componentPath,
|
|
212
|
+
args: { tableName: table },
|
|
213
|
+
})) as number,
|
|
214
|
+
})),
|
|
215
|
+
);
|
|
216
|
+
return deletedIndexes.map(({ componentPath, index, replacedBy }) => ({
|
|
217
|
+
componentPath,
|
|
218
|
+
index,
|
|
219
|
+
replacedBy,
|
|
220
|
+
documentsCount: documentCounts.find(
|
|
221
|
+
(count) =>
|
|
222
|
+
count.table === getTableName(index) &&
|
|
223
|
+
count.componentPath === componentPath,
|
|
224
|
+
)!.count,
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
|
|
156
228
|
function formatDeletedIndex({
|
|
157
|
-
|
|
229
|
+
componentPath,
|
|
158
230
|
index,
|
|
159
|
-
indexDiff,
|
|
160
231
|
documentsCount,
|
|
232
|
+
replacedBy,
|
|
161
233
|
minDocumentsForWarning,
|
|
162
|
-
}: {
|
|
163
|
-
componentDefinitionPath: string;
|
|
164
|
-
index: DeveloperIndexConfig;
|
|
165
|
-
indexDiff: IndexDiff;
|
|
166
|
-
documentsCount: number;
|
|
167
|
-
minDocumentsForWarning: number;
|
|
168
|
-
}) {
|
|
234
|
+
}: DeletedIndex & { minDocumentsForWarning: number }) {
|
|
169
235
|
const componentNameFormatted =
|
|
170
|
-
|
|
171
|
-
? `${chalkStderr.gray(componentDefinitionPath)}:`
|
|
172
|
-
: "";
|
|
236
|
+
componentPath !== "" ? `${chalkStderr.gray(componentPath)}:` : "";
|
|
173
237
|
|
|
174
238
|
const documentsCountFormatted =
|
|
175
239
|
documentsCount >= minDocumentsForWarning
|
|
176
240
|
? ` ${chalkStderr.yellowBright(`⚠️ ${documentsCount.toLocaleString()} documents`)}`
|
|
177
241
|
: ` ${documentsCount.toLocaleString()} ${documentsCount === 1 ? "document" : "documents"}`;
|
|
178
242
|
|
|
179
|
-
const replacedBy = indexDiff.added_indexes.find((i) => i.name === index.name);
|
|
180
243
|
const replacedByFormatted = replacedBy
|
|
181
244
|
? `\n ${chalkStderr.green("→ replaced by:")} ${formatIndex(replacedBy)}`
|
|
182
245
|
: "";
|
|
@@ -196,12 +259,8 @@ function getTableName(index: DeveloperIndexConfig) {
|
|
|
196
259
|
}
|
|
197
260
|
|
|
198
261
|
function minDocumentsForIndexDeleteWarning(): number {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
return parsed;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING;
|
|
262
|
+
return integerFromEnv(
|
|
263
|
+
"CONVEX_MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING",
|
|
264
|
+
MIN_DOCUMENTS_FOR_INDEX_DELETE_WARNING,
|
|
265
|
+
);
|
|
207
266
|
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { chalkStderr } from "chalk";
|
|
2
|
+
import { logMessage } from "../../bundler/log.js";
|
|
3
|
+
import { Span } from "./tracing.js";
|
|
4
|
+
import {
|
|
5
|
+
EvaluateSchemaResponse,
|
|
6
|
+
TablePrediction,
|
|
7
|
+
} from "./deployApi/evaluateSchema.js";
|
|
8
|
+
import { SchemaEvaluation } from "./schemaEvaluation.js";
|
|
9
|
+
import { formatSize, integerFromEnv } from "./utils/utils.js";
|
|
10
|
+
import {
|
|
11
|
+
formatDiscardedStagedValidator,
|
|
12
|
+
formatValidationProgress,
|
|
13
|
+
} from "./formatValidationProgress.js";
|
|
14
|
+
|
|
15
|
+
const MIN_BYTES_FOR_SCHEMA_WALK_WARNING = 1 << 27; // 128 MiB
|
|
16
|
+
|
|
17
|
+
export async function checkForSlowSchemaValidation({
|
|
18
|
+
span,
|
|
19
|
+
schemaEvaluation,
|
|
20
|
+
dryRun,
|
|
21
|
+
}: {
|
|
22
|
+
span: Span;
|
|
23
|
+
schemaEvaluation: SchemaEvaluation;
|
|
24
|
+
dryRun: boolean;
|
|
25
|
+
}): Promise<void> {
|
|
26
|
+
const response = await schemaEvaluation(span);
|
|
27
|
+
if (response === null) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
reportStagedValidators(response);
|
|
31
|
+
if (!dryRun) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const walkedTables = Object.entries(
|
|
36
|
+
response.componentSchemaEvaluations,
|
|
37
|
+
).flatMap(([componentPath, prediction]) =>
|
|
38
|
+
prediction.tables
|
|
39
|
+
.filter((table) => table.outcome === "mustWalk")
|
|
40
|
+
.map((table) => ({ componentPath, table })),
|
|
41
|
+
);
|
|
42
|
+
if (walkedTables.length === 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const totalBytes = walkedTables.reduce(
|
|
47
|
+
(sum, { table }) => sum + table.sizeBytes,
|
|
48
|
+
0,
|
|
49
|
+
);
|
|
50
|
+
if (totalBytes < minBytesForSchemaWalkWarning()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const shouldSuggestStaging = walkedTables.some(
|
|
55
|
+
({ table }) => !table.canSkipAfterStagedValidation,
|
|
56
|
+
);
|
|
57
|
+
logMessage(`⚠️ 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:
|
|
58
|
+
|
|
59
|
+
${walkedTables
|
|
60
|
+
.map(({ componentPath, table }) =>
|
|
61
|
+
formatWalkedTable({ componentPath, table }),
|
|
62
|
+
)
|
|
63
|
+
.join("\n")}
|
|
64
|
+
${
|
|
65
|
+
shouldSuggestStaging
|
|
66
|
+
? `\nTip: stage the new validator (\`defineTable({...}).staged({...})\`) to validate it in the background without blocking deploys.`
|
|
67
|
+
: ""
|
|
68
|
+
}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The prediction includes staged validators from active and in-flight schemas.
|
|
72
|
+
function reportStagedValidators(response: EvaluateSchemaResponse) {
|
|
73
|
+
const stagedTables = Object.entries(
|
|
74
|
+
response.componentSchemaEvaluations,
|
|
75
|
+
).flatMap(([componentPath, prediction]) => {
|
|
76
|
+
const discarded = new Map(
|
|
77
|
+
(prediction.discardedStagedValidators ?? []).map((validator) => [
|
|
78
|
+
validator.tableName,
|
|
79
|
+
validator,
|
|
80
|
+
]),
|
|
81
|
+
);
|
|
82
|
+
return prediction.tables
|
|
83
|
+
.filter((table) => table.staged !== undefined)
|
|
84
|
+
.map((table) => ({
|
|
85
|
+
componentPath,
|
|
86
|
+
table,
|
|
87
|
+
discarded: discarded.get(table.name),
|
|
88
|
+
}));
|
|
89
|
+
});
|
|
90
|
+
if (stagedTables.length === 0) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const lines = stagedTables.map(({ componentPath, table, discarded }) => {
|
|
94
|
+
const componentPrefix =
|
|
95
|
+
componentPath !== "" ? `${chalkStderr.gray(componentPath)}: ` : "";
|
|
96
|
+
// The state describes the validator this push discards, so advertising
|
|
97
|
+
// it as ready to promote would contradict the unstaging warning.
|
|
98
|
+
if (discarded !== undefined) {
|
|
99
|
+
return ` ${componentPrefix}${table.name}: ${formatDiscardedStagedValidator(discarded)}`;
|
|
100
|
+
}
|
|
101
|
+
const staged = table.staged!;
|
|
102
|
+
switch (staged.state) {
|
|
103
|
+
case "pending": {
|
|
104
|
+
return ` ${componentPrefix}${table.name}: validating in the background (${formatValidationProgress(staged)})`;
|
|
105
|
+
}
|
|
106
|
+
case "valid":
|
|
107
|
+
// `supersetOfStagedValidated` means this push already promotes it.
|
|
108
|
+
return table.outcome === "supersetOfStagedValidated"
|
|
109
|
+
? ` ${componentPrefix}${table.name}: ${chalkStderr.green("validated")}. This deploy applies the staged schema without scanning the table.`
|
|
110
|
+
: ` ${componentPrefix}${table.name}: ${chalkStderr.green("validated")}. Safe to apply the staged schema changes and deploy.`;
|
|
111
|
+
case "failed":
|
|
112
|
+
return ` ${componentPrefix}${table.name}: ${chalkStderr.red("failed")}: ${staged.error}${chalkStderr.gray(" (fix the offending documents and redeploy to revalidate)")}`;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
logMessage(`Staged schema validation status:\n${lines.join("\n")}\n`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function formatWalkedTable({
|
|
119
|
+
componentPath,
|
|
120
|
+
table,
|
|
121
|
+
}: {
|
|
122
|
+
componentPath: string;
|
|
123
|
+
table: TablePrediction;
|
|
124
|
+
}) {
|
|
125
|
+
const componentPrefix =
|
|
126
|
+
componentPath !== "" ? `${chalkStderr.gray(componentPath)}: ` : "";
|
|
127
|
+
const docsFormatted = `${table.numDocs.toLocaleString()} documents, `;
|
|
128
|
+
const sizeFormatted = formatSize(table.sizeBytes);
|
|
129
|
+
let stagedNote = "";
|
|
130
|
+
if (table.staged?.state === "pending" && table.canSkipAfterStagedValidation) {
|
|
131
|
+
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.`;
|
|
132
|
+
}
|
|
133
|
+
return ` ${componentPrefix}${table.name} (${docsFormatted}${sizeFormatted})${stagedNote}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function minBytesForSchemaWalkWarning(): number {
|
|
137
|
+
return integerFromEnv(
|
|
138
|
+
"CONVEX_MIN_BYTES_FOR_SCHEMA_WALK_WARNING",
|
|
139
|
+
MIN_BYTES_FOR_SCHEMA_WALK_WARNING,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { chalkStderr } from "chalk";
|
|
2
|
+
import { Context } from "../../bundler/context.js";
|
|
3
|
+
import { logFinishedStep, logMessage, stopSpinner } from "../../bundler/log.js";
|
|
4
|
+
import { promptYesNo } from "./utils/prompts.js";
|
|
5
|
+
import {
|
|
6
|
+
DiscardedStagedValidator,
|
|
7
|
+
EvaluateSchemaResponse,
|
|
8
|
+
} from "./deployApi/evaluateSchema.js";
|
|
9
|
+
import { formatDiscardedStagedValidator } from "./formatValidationProgress.js";
|
|
10
|
+
|
|
11
|
+
export type StagedValidatorDeletionCheck =
|
|
12
|
+
| "ask for confirmation"
|
|
13
|
+
| "has confirmation"
|
|
14
|
+
| "no verification";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Confirm before discarding pending or successful staged validation. Unstaging
|
|
18
|
+
* stops write-time checks, so restaging requires a fresh scan.
|
|
19
|
+
*
|
|
20
|
+
* A dry run only reports what the push would discard, so `--dry-run` previews
|
|
21
|
+
* the confirmation the real push will ask for.
|
|
22
|
+
*/
|
|
23
|
+
export async function checkForStagedValidatorDeletion({
|
|
24
|
+
ctx,
|
|
25
|
+
response,
|
|
26
|
+
askForConfirmation,
|
|
27
|
+
dryRun = false,
|
|
28
|
+
}: {
|
|
29
|
+
ctx: Context;
|
|
30
|
+
response: EvaluateSchemaResponse | null;
|
|
31
|
+
askForConfirmation: boolean;
|
|
32
|
+
dryRun?: boolean;
|
|
33
|
+
}): Promise<void> {
|
|
34
|
+
// `sharedSchemaEvaluation` has already logged why evaluation failed.
|
|
35
|
+
if (response === null) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const discarded = Object.entries(response.componentSchemaEvaluations).flatMap(
|
|
39
|
+
([componentPath, prediction]) =>
|
|
40
|
+
(prediction.discardedStagedValidators ?? []).map((validator) => ({
|
|
41
|
+
componentPath,
|
|
42
|
+
validator,
|
|
43
|
+
})),
|
|
44
|
+
);
|
|
45
|
+
if (discarded.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
logMessage(`\u26a0\ufe0f This push ${chalkStderr.bold(dryRun ? "would discard" : "discards")} staged schema validation for the following ${discarded.length === 1 ? "table" : "tables"}:
|
|
50
|
+
|
|
51
|
+
${discarded.map(formatDiscarded).join("\n")}
|
|
52
|
+
|
|
53
|
+
A discarded staged validator restarts validation from zero if staged again.
|
|
54
|
+
`);
|
|
55
|
+
|
|
56
|
+
if (dryRun) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!askForConfirmation) {
|
|
61
|
+
logFinishedStep(
|
|
62
|
+
"Proceeding with push since --allow-unstaging-schema is set",
|
|
63
|
+
);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!process.stdin.isTTY) {
|
|
68
|
+
return ctx.crash({
|
|
69
|
+
exitCode: 1,
|
|
70
|
+
errorType: "fatal",
|
|
71
|
+
printedMessage: `To confirm the push:
|
|
72
|
+
\u2022 run the deploy command in an ${chalkStderr.bold("interactive terminal")}
|
|
73
|
+
\u2022 or run the deploy command with the ${chalkStderr.bold("--allow-unstaging-schema")} flag`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
stopSpinner();
|
|
78
|
+
if (
|
|
79
|
+
!(await promptYesNo(ctx, {
|
|
80
|
+
message: `Discard staged validation for ${discarded.length === 1 ? "this table" : "these tables"}?`,
|
|
81
|
+
default: false,
|
|
82
|
+
}))
|
|
83
|
+
) {
|
|
84
|
+
return ctx.crash({
|
|
85
|
+
exitCode: 1,
|
|
86
|
+
errorType: "fatal",
|
|
87
|
+
printedMessage: `Canceling push`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
logFinishedStep("Proceeding with push.");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function formatDiscarded({
|
|
95
|
+
componentPath,
|
|
96
|
+
validator,
|
|
97
|
+
}: {
|
|
98
|
+
componentPath: string;
|
|
99
|
+
validator: DiscardedStagedValidator;
|
|
100
|
+
}): string {
|
|
101
|
+
const componentPrefix =
|
|
102
|
+
componentPath !== "" ? `${chalkStderr.gray(componentPath)}:` : "";
|
|
103
|
+
return `\u26d4 ${componentPrefix}${validator.tableName}: ${formatDiscardedStagedValidator(validator)}`;
|
|
104
|
+
}
|
package/src/cli/lib/codegen.ts
CHANGED
|
@@ -46,7 +46,6 @@ import {
|
|
|
46
46
|
rootComponentApiCJS,
|
|
47
47
|
} from "../codegen_templates/component_api.js";
|
|
48
48
|
import { functionsDir } from "./utils/utils.js";
|
|
49
|
-
import { LargeIndexDeletionCheck } from "./indexes.js";
|
|
50
49
|
|
|
51
50
|
const PRESERVED_GENERATED_ENTRIES = new Set(["ai"]);
|
|
52
51
|
|
|
@@ -81,7 +80,6 @@ export type CodegenOptions = {
|
|
|
81
80
|
liveComponentSources: boolean;
|
|
82
81
|
debugNodeApis: boolean;
|
|
83
82
|
systemUdfs: boolean;
|
|
84
|
-
largeIndexDeletionCheck: LargeIndexDeletionCheck;
|
|
85
83
|
codegenOnlyThisComponent?: string | undefined;
|
|
86
84
|
};
|
|
87
85
|
|
package/src/cli/lib/command.ts
CHANGED
|
@@ -260,6 +260,7 @@ export async function normalizeDevOptions(
|
|
|
260
260
|
debugNodeApis?: boolean;
|
|
261
261
|
liveComponentSources?: boolean;
|
|
262
262
|
pushAllModules?: boolean;
|
|
263
|
+
allowUnstagingSchema?: boolean;
|
|
263
264
|
while?: string;
|
|
264
265
|
},
|
|
265
266
|
): Promise<{
|
|
@@ -279,6 +280,7 @@ export async function normalizeDevOptions(
|
|
|
279
280
|
debugNodeApis: boolean;
|
|
280
281
|
liveComponentSources: boolean;
|
|
281
282
|
pushAllModules: boolean;
|
|
283
|
+
allowUnstagingSchema: boolean;
|
|
282
284
|
}> {
|
|
283
285
|
if (cmdOptions.runComponent && !cmdOptions.run) {
|
|
284
286
|
return await ctx.crash({
|
|
@@ -332,6 +334,7 @@ export async function normalizeDevOptions(
|
|
|
332
334
|
debugNodeApis: !!cmdOptions.debugNodeApis,
|
|
333
335
|
liveComponentSources: !!cmdOptions.liveComponentSources,
|
|
334
336
|
pushAllModules: !!cmdOptions.pushAllModules,
|
|
337
|
+
allowUnstagingSchema: !!cmdOptions.allowUnstagingSchema,
|
|
335
338
|
};
|
|
336
339
|
}
|
|
337
340
|
|