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
|
@@ -0,0 +1,47 @@
|
|
|
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 formatValidationProgress_exports = {};
|
|
20
|
+
__export(formatValidationProgress_exports, {
|
|
21
|
+
formatDiscardedStagedValidator: () => formatDiscardedStagedValidator,
|
|
22
|
+
formatValidationProgress: () => formatValidationProgress
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(formatValidationProgress_exports);
|
|
25
|
+
var import_chalk = require("chalk");
|
|
26
|
+
function formatValidationProgress({
|
|
27
|
+
numDocsValidated,
|
|
28
|
+
totalDocs
|
|
29
|
+
}) {
|
|
30
|
+
const checked = numDocsValidated.toLocaleString();
|
|
31
|
+
return totalDocs === null || totalDocs === void 0 ? `${checked} documents checked` : `${checked} of approximately ${totalDocs.toLocaleString()} documents checked`;
|
|
32
|
+
}
|
|
33
|
+
function formatDiscardedStagedValidator(validator) {
|
|
34
|
+
let status;
|
|
35
|
+
switch (validator.state.state) {
|
|
36
|
+
case "pending": {
|
|
37
|
+
status = `validating in the background (${formatValidationProgress(validator.state)})`;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case "valid":
|
|
41
|
+
status = import_chalk.chalkStderr.green("validated");
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
const action = validator.replaced ? "the push stages a different validator" : "the push removes the staged validator";
|
|
45
|
+
return `${status}; ${action}`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=formatValidationProgress.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cli/lib/formatValidationProgress.ts"],
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { DiscardedStagedValidator } from \"./deployApi/evaluateSchema.js\";\n\nexport function formatValidationProgress({\n numDocsValidated,\n totalDocs,\n}: {\n numDocsValidated: number;\n totalDocs?: number | null | undefined;\n}): string {\n const checked = numDocsValidated.toLocaleString();\n return totalDocs === null || totalDocs === undefined\n ? `${checked} documents checked`\n : `${checked} of approximately ${totalDocs.toLocaleString()} documents checked`;\n}\n\n/** \"validated; the push removes the staged validator\" */\nexport function formatDiscardedStagedValidator(\n validator: DiscardedStagedValidator,\n): string {\n let status;\n switch (validator.state.state) {\n case \"pending\": {\n status = `validating in the background (${formatValidationProgress(validator.state)})`;\n break;\n }\n case \"valid\":\n status = chalkStderr.green(\"validated\");\n break;\n }\n const action = validator.replaced\n ? \"the push stages a different validator\"\n : \"the push removes the staged validator\";\n return `${status}; ${action}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAGrB,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGW;AACT,QAAM,UAAU,iBAAiB,eAAe;AAChD,SAAO,cAAc,QAAQ,cAAc,SACvC,GAAG,OAAO,uBACV,GAAG,OAAO,qBAAqB,UAAU,eAAe,CAAC;AAC/D;AAGO,SAAS,+BACd,WACQ;AACR,MAAI;AACJ,UAAQ,UAAU,MAAM,OAAO;AAAA,IAC7B,KAAK,WAAW;AACd,eAAS,iCAAiC,yBAAyB,UAAU,KAAK,CAAC;AACnF;AAAA,IACF;AAAA,IACA,KAAK;AACH,eAAS,yBAAY,MAAM,WAAW;AACtC;AAAA,EACJ;AACA,QAAM,SAAS,UAAU,WACrB,0CACA;AACJ,SAAO,GAAG,MAAM,KAAK,MAAM;AAC7B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/generatedFunctionLogsApi.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport type paths = Record<string, never>;\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n FunctionExecutionJson: {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n logLines: components[\"schemas\"][\"Value\"][];\n /** Format: double */\n timestamp: number;\n cachedResult: boolean;\n caller: string;\n parentExecutionId?: string | null;\n /** Format: double */\n executionTime: number;\n /** Format: double */\n userExecutionTime?: number | null;\n success?: null | components[\"schemas\"][\"Value\"];\n error?: string | null;\n requestId: string;\n executionId: string;\n usageStats: components[\"schemas\"][\"UsageStatsJson\"];\n /** Format: double */\n returnBytes?: number | null;\n occInfo?: null | components[\"schemas\"][\"OccInfoJson\"];\n willRetry: boolean;\n /** Format: double */\n executionTimestamp: number;\n identityType: string;\n environment: string;\n /** @enum {string} */\n kind: \"Completion\";\n } | {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n /** Format: double */\n timestamp: number;\n logLines: components[\"schemas\"][\"Value\"][];\n requestId: string;\n executionId: string;\n /** @enum {string} */\n kind: \"Progress\";\n };\n /** @enum {string} */\n LogLevelJson: \"DEBUG\" | \"ERROR\" | \"WARN\" | \"INFO\" | \"LOG\";\n LogLineJson: {\n messages: string[];\n isTruncated: boolean;\n /** Format: int64 */\n timestamp: number;\n level: components[\"schemas\"][\"LogLevelJson\"];\n systemMetadata?: null | components[\"schemas\"][\"SystemLogMetadataJson\"];\n componentPath?: string | null;\n udfPath?: string | null;\n };\n OccInfoJson: {\n tableName?: string | null;\n documentId?: string | null;\n writeSource?: string | null;\n componentPath?: string | null;\n /** Format: int64 */\n retryCount?: number | null;\n };\n StreamFunctionLogs: {\n /** Format: double */\n cursor: number;\n sessionId?: string | null;\n /** Format: int32 */\n clientRequestCounter?: number | null;\n };\n StreamUdfExecutionQueryArgs: {\n /** Format: double */\n cursor: number;\n };\n StreamUdfExecutionResponse: {\n entries: components[\"schemas\"][\"FunctionExecutionJson\"][];\n /** Format: double */\n newCursor: number;\n };\n SystemLogMetadataJson: {\n code: string;\n };\n /** @enum {string} */\n UdfTypeJson: \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n UsageStatsJson: {\n /** Format: int64 */\n databaseReadBytes: number;\n /** Format: int64 */\n databaseWriteBytes: number;\n /** Format: int64 */\n databaseIoReadBytes: number;\n /** Format: int64 */\n databaseIoWriteBytes: number;\n /** Format: int64 */\n databaseReadDocuments: number;\n /** Format: int64 */\n databaseWriteDocuments: number;\n /** Format: int64 */\n storageReadBytes: number;\n /** Format: int64 */\n storageWriteBytes: number;\n /** Format: int64 */\n vectorIndexReadBytes: number;\n /** Format: int64 */\n vectorIndexWriteBytes: number;\n /** Format: int64 */\n textIndexQueryBytes: number;\n /** Format: int64 */\n textIndexWriteQueryBytes: number;\n /** Format: int64 */\n vectorIndexReadQueryBytes: number;\n /** Format: int64 */\n vectorIndexWriteQueryBytes: number;\n /** Format: int64 */\n networkEgressBytes: number;\n /** Format: int64 */\n memoryUsedMb: number;\n };\n Value: unknown;\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type FunctionExecutionJson = components['schemas']['FunctionExecutionJson'];\nexport type LogLevelJson = components['schemas']['LogLevelJson'];\nexport type LogLineJson = components['schemas']['LogLineJson'];\nexport type OccInfoJson = components['schemas']['OccInfoJson'];\nexport type StreamFunctionLogs = components['schemas']['StreamFunctionLogs'];\nexport type StreamUdfExecutionQueryArgs = components['schemas']['StreamUdfExecutionQueryArgs'];\nexport type StreamUdfExecutionResponse = components['schemas']['StreamUdfExecutionResponse'];\nexport type SystemLogMetadataJson = components['schemas']['SystemLogMetadataJson'];\nexport type UdfTypeJson = components['schemas']['UdfTypeJson'];\nexport type UsageStatsJson = components['schemas']['UsageStatsJson'];\nexport type Value = components['schemas']['Value'];\nexport type $defs = Record<string, never>;\nexport type operations = Record<string, never>;\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport type paths = Record<string, never>;\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n FunctionExecutionJson: {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n logLines: components[\"schemas\"][\"Value\"][];\n /** Format: double */\n timestamp: number;\n cachedResult: boolean;\n caller: string;\n parentExecutionId?: string | null;\n /** Format: double */\n executionTime: number;\n /** Format: double */\n userExecutionTime?: number | null;\n success?: null | components[\"schemas\"][\"Value\"];\n error?: string | null;\n requestId: string;\n executionId: string;\n usageStats: components[\"schemas\"][\"UsageStatsJson\"];\n /** Format: double */\n returnBytes?: number | null;\n occInfo?: null | components[\"schemas\"][\"OccInfoJson\"];\n willRetry: boolean;\n /** Format: double */\n executionTimestamp: number;\n identityType: string;\n environment: string;\n /** @enum {string} */\n kind: \"Completion\";\n } | {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n /** Format: double */\n timestamp: number;\n logLines: components[\"schemas\"][\"Value\"][];\n requestId: string;\n executionId: string;\n /** @enum {string} */\n kind: \"Progress\";\n };\n /** @enum {string} */\n LogLevelJson: \"DEBUG\" | \"ERROR\" | \"WARN\" | \"INFO\" | \"LOG\";\n LogLineJson: {\n messages: string[];\n isTruncated: boolean;\n /** Format: int64 */\n timestamp: number;\n level: components[\"schemas\"][\"LogLevelJson\"];\n systemMetadata?: null | components[\"schemas\"][\"SystemLogMetadataJson\"];\n componentPath?: string | null;\n udfPath?: string | null;\n };\n OccInfoJson: {\n tableName?: string | null;\n documentId?: string | null;\n writeSource?: string | null;\n componentPath?: string | null;\n /** Format: int64 */\n retryCount?: number | null;\n };\n StreamFunctionLogs: {\n /** Format: double */\n cursor: number;\n sessionId?: string | null;\n /** Format: int32 */\n clientRequestCounter?: number | null;\n };\n StreamUdfExecutionQueryArgs: {\n /** Format: double */\n cursor: number;\n };\n StreamUdfExecutionResponse: {\n entries: components[\"schemas\"][\"FunctionExecutionJson\"][];\n /** Format: double */\n newCursor: number;\n };\n SystemLogMetadataJson: {\n code: string;\n };\n /** @enum {string} */\n UdfTypeJson: \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n UsageStatsJson: {\n /** Format: int64 */\n databaseReadBytes: number;\n /** Format: int64 */\n databaseWriteBytes: number;\n /** Format: int64 */\n databaseIoReadBytes: number;\n /** Format: int64 */\n databaseIoWriteBytes: number;\n /** Format: int64 */\n databaseReadDocuments: number;\n /** Format: int64 */\n databaseWriteDocuments: number;\n /** Format: int64 */\n databaseWriteIndexRows: number;\n /** Format: int64 */\n storageReadBytes: number;\n /** Format: int64 */\n storageWriteBytes: number;\n /** Format: int64 */\n vectorIndexReadBytes: number;\n /** Format: int64 */\n vectorIndexWriteBytes: number;\n /** Format: int64 */\n textIndexQueryBytes: number;\n /** Format: int64 */\n textIndexWriteQueryBytes: number;\n /** Format: int64 */\n vectorIndexReadQueryBytes: number;\n /** Format: int64 */\n vectorIndexWriteQueryBytes: number;\n /** Format: int64 */\n networkEgressBytes: number;\n /** Format: int64 */\n memoryUsedMb: number;\n };\n Value: unknown;\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type FunctionExecutionJson = components['schemas']['FunctionExecutionJson'];\nexport type LogLevelJson = components['schemas']['LogLevelJson'];\nexport type LogLineJson = components['schemas']['LogLineJson'];\nexport type OccInfoJson = components['schemas']['OccInfoJson'];\nexport type StreamFunctionLogs = components['schemas']['StreamFunctionLogs'];\nexport type StreamUdfExecutionQueryArgs = components['schemas']['StreamUdfExecutionQueryArgs'];\nexport type StreamUdfExecutionResponse = components['schemas']['StreamUdfExecutionResponse'];\nexport type SystemLogMetadataJson = components['schemas']['SystemLogMetadataJson'];\nexport type UdfTypeJson = components['schemas']['UdfTypeJson'];\nexport type UsageStatsJson = components['schemas']['UsageStatsJson'];\nexport type Value = components['schemas']['Value'];\nexport type $defs = Record<string, never>;\nexport type operations = Record<string, never>;\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/indexes.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\n\nexport type IndexMetadata = {\n table: string;\n name: string;\n fields:\n | string[]\n | {\n searchField: string;\n filterFields: string[];\n }\n | {\n dimensions: number;\n vectorField: string;\n filterFields: string[];\n };\n backfill: {\n state: \"in_progress\" | \"done\";\n };\n staged: boolean;\n};\n\nexport type LargeIndexDeletionCheck =\n // Don\u2019t verify whether large indexes have been deleted\n | \"no verification\"\n // If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)\n | \"ask for confirmation\"\n // If large indexes are being deleted, confirm (the user has used --
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\n\nexport type IndexMetadata = {\n table: string;\n name: string;\n fields:\n | string[]\n | {\n searchField: string;\n filterFields: string[];\n }\n | {\n dimensions: number;\n vectorField: string;\n filterFields: string[];\n };\n backfill: {\n state: \"in_progress\" | \"done\";\n };\n staged: boolean;\n};\n\nexport type LargeIndexDeletionCheck =\n // Don\u2019t verify whether large indexes have been deleted\n | \"no verification\"\n // If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)\n | \"ask for confirmation\"\n // If large indexes are being deleted, confirm (the user has used --skip-large-indexes-check)\n | \"has confirmation\";\n\nexport function addProgressLinkIfSlow(\n msg: string,\n deploymentName: string | null,\n start: number,\n): string {\n if (Date.now() - start > 10_000) {\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/schema?showSchema=true`,\n );\n msg = msg.concat(`\\nSee progress here: ${dashboardUrl}`);\n }\n return msg;\n}\n\nexport function formatIndex(index: DeveloperIndexConfig) {\n const [tableName, indexName] = index.name.split(\".\");\n return `${tableName}.${chalkStderr.bold(indexName)} ${chalkStderr.gray(formatIndexFields(index))}${index.staged ? chalkStderr.blue(\" (staged)\") : \"\"}`;\n}\n\nfunction formatIndexFields(index: DeveloperIndexConfig) {\n switch (index.type) {\n case \"database\":\n return (\n \" \" + index.fields.map((f) => chalkStderr.underline(f)).join(\", \")\n );\n case \"search\":\n return `${chalkStderr.cyan(\"(text)\")} ${chalkStderr.underline(index.searchField)}${formatFilterFields(index.filterFields)}`;\n case \"vector\":\n return `${chalkStderr.cyan(\"(vector)\")} ${chalkStderr.underline(index.vectorField)} (${index.dimensions} dimensions)${formatFilterFields(index.filterFields)}`;\n default:\n index satisfies never;\n return \"\";\n }\n}\n\nfunction formatFilterFields(filterFields: string[]) {\n if (filterFields.length === 0) {\n return \"\";\n }\n return `, filter${filterFields.length === 1 ? \"\" : \"s\"} on ${filterFields.map((f) => chalkStderr.underline(f)).join(\", \")}`;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,uBAA2C;AA+BpC,SAAS,sBACd,KACA,gBACA,OACQ;AACR,MAAI,KAAK,IAAI,IAAI,QAAQ,KAAQ;AAC/B,UAAM,mBAAe;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,OAAO;AAAA,qBAAwB,YAAY,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA6B;AACvD,QAAM,CAAC,WAAW,SAAS,IAAI,MAAM,KAAK,MAAM,GAAG;AACnD,SAAO,GAAG,SAAS,IAAI,yBAAY,KAAK,SAAS,CAAC,IAAI,yBAAY,KAAK,kBAAkB,KAAK,CAAC,CAAC,GAAG,MAAM,SAAS,yBAAY,KAAK,YAAY,IAAI,EAAE;AACvJ;AAEA,SAAS,kBAAkB,OAA6B;AACtD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,yBAAY,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IAEtE,KAAK;AACH,aAAO,GAAG,yBAAY,KAAK,QAAQ,CAAC,MAAM,yBAAY,UAAU,MAAM,WAAW,CAAC,GAAG,mBAAmB,MAAM,YAAY,CAAC;AAAA,IAC7H,KAAK;AACH,aAAO,GAAG,yBAAY,KAAK,UAAU,CAAC,MAAM,yBAAY,UAAU,MAAM,WAAW,CAAC,KAAK,MAAM,UAAU,eAAe,mBAAmB,MAAM,YAAY,CAAC;AAAA,IAChK;AACE;AACA,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,cAAwB;AAClD,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,WAAW,aAAa,WAAW,IAAI,KAAK,GAAG,OAAO,aAAa,IAAI,CAAC,MAAM,yBAAY,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC3H;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var run_exports = {};
|
|
30
30
|
__export(run_exports, {
|
|
31
|
+
_backendSupportsControlPlaneAuth: () => _backendSupportsControlPlaneAuth,
|
|
31
32
|
assertLocalBackendRunning: () => assertLocalBackendRunning,
|
|
32
33
|
ensureBackendRunning: () => ensureBackendRunning,
|
|
33
34
|
ensureBackendStopped: () => ensureBackendStopped,
|
|
@@ -50,7 +51,19 @@ var import_sentry = require("../utils/sentry.js");
|
|
|
50
51
|
var import_crypto = require("crypto");
|
|
51
52
|
var import_errors = require("./errors.js");
|
|
52
53
|
var import_utils = require("./utils.js");
|
|
54
|
+
var import_config = require("../config.js");
|
|
53
55
|
const DEFAULT_STARTUP_TIMEOUT_SECS = 30;
|
|
56
|
+
const FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION = "precompiled-2026-09-15-4e9b83a";
|
|
57
|
+
function _backendSupportsControlPlaneAuth(version) {
|
|
58
|
+
if (version === FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
const backendDate = (0, import_utils.releaseDate)(version);
|
|
62
|
+
const firstSupportedDate = (0, import_utils.releaseDate)(
|
|
63
|
+
FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION
|
|
64
|
+
);
|
|
65
|
+
return backendDate !== null && firstSupportedDate !== null && backendDate > firstSupportedDate;
|
|
66
|
+
}
|
|
54
67
|
async function parseStartupTimeoutSecs(ctx) {
|
|
55
68
|
const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;
|
|
56
69
|
if (raw === void 0) {
|
|
@@ -138,7 +151,22 @@ async function runLocalBackend(ctx, args) {
|
|
|
138
151
|
errForSentry: new import_errors.LocalDeploymentError(message)
|
|
139
152
|
});
|
|
140
153
|
}
|
|
141
|
-
const
|
|
154
|
+
const supportsControlPlane = _backendSupportsControlPlaneAuth(
|
|
155
|
+
args.backendVersion
|
|
156
|
+
);
|
|
157
|
+
if (supportsControlPlane && import_config.provisionHost !== import_config.productionProvisionHost) {
|
|
158
|
+
commandArgs.push("--control-plane-url", import_config.provisionHost);
|
|
159
|
+
}
|
|
160
|
+
const auth = ctx.bigBrainAuth();
|
|
161
|
+
if (supportsControlPlane && args.deploymentKind === "local" && auth?.kind === "accessToken") {
|
|
162
|
+
commandArgs.push("--control-plane-access-token", auth.accessToken);
|
|
163
|
+
}
|
|
164
|
+
const displayArgs = commandArgs.map(
|
|
165
|
+
(arg, index) => index > 0 && ["--instance-secret", "--control-plane-access-token"].includes(
|
|
166
|
+
commandArgs[index - 1]
|
|
167
|
+
) ? "[REDACTED]" : arg
|
|
168
|
+
);
|
|
169
|
+
const commandStr = `${args.binaryPath} ${displayArgs.join(" ")}`;
|
|
142
170
|
(0, import_log.logVerbose)(`Starting local backend: \`${commandStr}\``);
|
|
143
171
|
const p = import_child_process.default.spawn(args.binaryPath, commandArgs, {
|
|
144
172
|
stdio: "ignore",
|
|
@@ -342,6 +370,7 @@ Run \`npx convex dev\` first.`
|
|
|
342
370
|
const instanceSecret = config.instanceSecret ?? import_utils.LOCAL_BACKEND_INSTANCE_SECRET;
|
|
343
371
|
const { cleanupHandle } = await runLocalBackend(ctx, {
|
|
344
372
|
binaryPath,
|
|
373
|
+
backendVersion: config.backendVersion,
|
|
345
374
|
ports: config.ports,
|
|
346
375
|
deploymentKind,
|
|
347
376
|
deploymentName: args.deploymentName,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/run.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logVerbose, logMessage } from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n loadUuidForAnonymousUser,\n} from \"./filePaths.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport path from \"path\";\nimport child_process from \"child_process\";\nimport detect from \"detect-port\";\nimport { LOCAL_BACKEND_SENTRY_DSN } from \"../utils/sentry.js\";\nimport { createHash } from \"crypto\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { LOCAL_BACKEND_INSTANCE_SECRET } from \"./utils.js\";\nimport { DeploymentType, DetailedDeploymentCredentials } from \"../api.js\";\n\nconst DEFAULT_STARTUP_TIMEOUT_SECS = 30;\n\nasync function parseStartupTimeoutSecs(ctx: Context): Promise<number> {\n const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;\n if (raw === undefined) {\n return DEFAULT_STARTUP_TIMEOUT_SECS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=${JSON.stringify(raw)}: expected a positive number.`,\n });\n }\n return parsed;\n}\n\nexport async function runLocalBackend(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site: number;\n };\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n binaryPath: string;\n instanceSecret: string;\n isLatestVersion: boolean;\n },\n): Promise<{\n cleanupHandle: string;\n}> {\n const { ports } = args;\n const deploymentDir = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n ctx.fs.mkdir(deploymentDir, { recursive: true });\n const deploymentNameSha = createHash(\"sha256\")\n .update(args.deploymentName)\n .digest(\"hex\");\n const commandArgs = [\n \"--port\",\n ports.cloud.toString(),\n \"--site-proxy-port\",\n ports.site.toString(),\n \"--sentry-identifier\",\n deploymentNameSha,\n \"--instance-name\",\n args.deploymentName,\n \"--instance-secret\",\n args.instanceSecret,\n \"--local-storage\",\n path.join(deploymentDir, \"convex_local_storage\"),\n \"--beacon-tag\",\n selfHostedEventTag(args.deploymentKind),\n path.join(deploymentDir, \"convex_local_backend.sqlite3\"),\n ];\n if (args.isLatestVersion) {\n // CLI args that were added in later versions of backend go here instead of above\n // since the CLI may run older versions of backend (e.g. when upgrading).\n if (args.deploymentKind === \"anonymous\") {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid !== null) {\n commandArgs.push(\n \"--beacon-fields\",\n JSON.stringify({\n override_uuid: uuid,\n }),\n );\n }\n }\n }\n\n // Check that binary works by running with --help\n try {\n const result = child_process.spawnSync(args.binaryPath, [\n ...commandArgs,\n \"--help\",\n ]);\n if (result.status === 3221225781) {\n const message =\n \"Local backend exited because shared libraries are missing. These may include libraries installed via 'Microsoft Visual C++ Redistributable for Visual Studio.'\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(\n \"Local backend exited with code 3221225781\",\n ),\n });\n } else if (result.status !== 0) {\n const message = `Failed to run backend binary, exit code ${result.status}, error: ${result.stderr === null ? \"null\" : result.stderr.toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n } catch (e) {\n const message = `Failed to run backend binary: ${(e as any).toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n const commandStr = `${args.binaryPath} ${commandArgs.join(\" \")}`;\n logVerbose(`Starting local backend: \\`${commandStr}\\``);\n const p = child_process\n .spawn(args.binaryPath, commandArgs, {\n stdio: \"ignore\",\n env: {\n ...process.env,\n SENTRY_DSN: LOCAL_BACKEND_SENTRY_DSN,\n },\n })\n .on(\"exit\", (code) => {\n const why = code === null ? \"from signal\" : `with code ${code}`;\n logVerbose(`Local backend exited ${why}, full command \\`${commandStr}\\``);\n });\n const cleanupHandle = ctx.registerCleanup(async () => {\n logVerbose(`Stopping local backend on port ${ports.cloud}`);\n p.kill(\"SIGTERM\");\n });\n\n await ensureBackendRunning(ctx, {\n cloudPort: ports.cloud,\n deploymentName: args.deploymentName,\n maxTimeSecs: await parseStartupTimeoutSecs(ctx),\n });\n\n return {\n cleanupHandle,\n };\n}\n\n/** Crash if correct local backend is not currently listening on the expected port. */\nexport async function assertLocalBackendRunning(\n ctx: Context,\n args: {\n url: string;\n deploymentName: string;\n },\n): Promise<void> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n const result = await fetchLocalBackendStatus(args);\n switch (result.kind) {\n case \"running\":\n return;\n case \"different\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${result.name} is running at ${args.url}`,\n });\n case \"error\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error response code received from local backend ${result.resp.status} ${result.resp.statusText}`,\n });\n case \"not-running\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running. (it's not listening at ${args.url})\\nRun \\`npx convex dev\\` in another terminal first.`,\n });\n }\n}\n\n/** Wait for up to maxTimeSecs for the correct local backend to be running on the expected port. */\nexport async function ensureBackendRunning(\n ctx: Context,\n args: {\n cloudPort: number;\n deploymentName: string;\n maxTimeSecs: number;\n },\n): Promise<void> {\n logVerbose(`Ensuring backend running on port ${args.cloudPort} is running`);\n const deploymentUrl = localDeploymentUrl(args.cloudPort);\n let timeElapsedSecs = 0;\n let hasShownWaiting = false;\n while (timeElapsedSecs <= args.maxTimeSecs) {\n if (!hasShownWaiting && timeElapsedSecs > 2) {\n logMessage(\"waiting for local backend to start...\");\n hasShownWaiting = true;\n }\n try {\n const resp = await fetch(`${deploymentUrl}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${text} is running on selected port ${args.cloudPort}`,\n });\n } else {\n // The backend is running!\n return;\n }\n } else {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n }\n const base = `Local backend did not start on port ${args.cloudPort} within ${args.maxTimeSecs} seconds.`;\n const message =\n args.maxTimeSecs >= DEFAULT_STARTUP_TIMEOUT_SECS\n ? `${base} If your local database is large, increase the timeout by setting CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS (e.g. CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=120).`\n : base;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n}\n\nexport async function ensureBackendStopped(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site?: number;\n };\n maxTimeSecs: number;\n deploymentName: string;\n // Whether to allow a deployment with a different name to run on this port\n allowOtherDeployments: boolean;\n },\n) {\n logVerbose(`Ensuring backend running on port ${args.ports.cloud} is stopped`);\n let timeElapsedSecs = 0;\n while (timeElapsedSecs < args.maxTimeSecs) {\n const cloudPort = await detect(args.ports.cloud);\n const sitePort =\n args.ports.site === undefined ? undefined : await detect(args.ports.site);\n // Both ports are free\n if (cloudPort === args.ports.cloud && sitePort === args.ports.site) {\n return;\n }\n try {\n const instanceNameResp = await fetch(\n `${localDeploymentUrl(args.ports.cloud)}/instance_name`,\n );\n if (instanceNameResp.ok) {\n const instanceName = await instanceNameResp.text();\n if (instanceName !== args.deploymentName) {\n if (args.allowOtherDeployments) {\n return;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${instanceName} is running on selected port ${args.ports.cloud}`,\n });\n }\n }\n } catch (error: any) {\n logVerbose(`Error checking if backend is running: ${error.message}`);\n // Backend is probably not running\n continue;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A local backend is still running on port ${args.ports.cloud}. Please stop it and run this command again.`,\n });\n}\n\nexport function localDeploymentUrl(cloudPort: number): string {\n return `http://127.0.0.1:${cloudPort}`;\n}\n\nexport function selfHostedEventTag(\n deploymentKind: LocalDeploymentKind,\n): string {\n return deploymentKind === \"local\" ? \"cli-local-dev\" : \"cli-anonymous-dev\";\n}\n\ntype LocalBackendStatus =\n | { kind: \"running\" }\n | { kind: \"error\"; resp: Response }\n | { kind: \"different\"; name: string }\n | { kind: \"not-running\" };\n\nexport async function fetchLocalBackendStatus(args: {\n url: string;\n deploymentName: string;\n}): Promise<LocalBackendStatus> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n try {\n const resp = await fetch(`${args.url}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return { kind: \"different\", name: text };\n } else {\n return { kind: \"running\" };\n }\n } else {\n return { kind: \"error\", resp };\n }\n } catch {\n return { kind: \"not-running\" };\n }\n}\n\n/** Returns true if the correct local backend is listening. */\nexport async function isLocalBackendRunning(\n url: string,\n deploymentName: string,\n): Promise<boolean> {\n return (\n \"running\" === (await fetchLocalBackendStatus({ url, deploymentName })).kind\n );\n}\n\nexport function shouldUseLocalDeployment(deploymentType: DeploymentType) {\n return deploymentType === \"local\" || deploymentType === \"anonymous\";\n}\n\ninterface WithRunningBackendArgs {\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n action: () => Promise<void>;\n}\n\n/**\n * If the deployment is a local deployment and not already running, start it\n * for the duration of the action, then stop it.\n */\nexport async function withRunningBackend({\n ctx,\n deployment,\n action,\n}: WithRunningBackendArgs) {\n let cleanup: (() => Promise<void>) | null = null;\n\n if (\n deployment.deploymentFields &&\n shouldUseLocalDeployment(deployment.deploymentFields.deploymentType)\n ) {\n const isRunning = await isLocalBackendRunning(\n deployment.deploymentUrl,\n deployment.deploymentFields.deploymentName,\n );\n if (!isRunning) {\n ({ cleanup } = await startEphemeralLocalBackend(ctx, {\n deploymentType: deployment.deploymentFields.deploymentType,\n deploymentName: deployment.deploymentFields.deploymentName,\n }));\n }\n }\n\n try {\n await action();\n } finally {\n await cleanup?.();\n }\n}\n\n/**\n * Start a local backend for a one-off command using saved deployment config.\n * Returns a cleanup function that stops the backend.\n */\nasync function startEphemeralLocalBackend(\n ctx: Context,\n args: {\n deploymentType: string;\n deploymentName: string;\n },\n): Promise<{ cleanup: () => Promise<void> }> {\n const deploymentKind: LocalDeploymentKind =\n args.deploymentType === \"anonymous\" ? \"anonymous\" : \"local\";\n\n const config = loadDeploymentConfig(ctx, deploymentKind, args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running and no saved configuration found.\\nRun \\`npx convex dev\\` first.`,\n });\n }\n\n const { binaryPath } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"version\",\n version: config.backendVersion,\n });\n\n const instanceSecret = config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath,\n ports: config.ports,\n deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: true,\n });\n\n return {\n cleanup: async () => {\n const fn = ctx.removeCleanup(cleanupHandle);\n if (fn) {\n await fn(0);\n }\n },\n };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAuC;AACvC,uBAKO;AACP,sBAA8C;AAC9C,kBAAiB;AACjB,2BAA0B;AAC1B,yBAAmB;AACnB,oBAAyC;AACzC,oBAA2B;AAC3B,oBAAqC;AACrC,
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logVerbose, logMessage } from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n loadUuidForAnonymousUser,\n} from \"./filePaths.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport path from \"path\";\nimport child_process from \"child_process\";\nimport detect from \"detect-port\";\nimport { LOCAL_BACKEND_SENTRY_DSN } from \"../utils/sentry.js\";\nimport { createHash } from \"crypto\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { LOCAL_BACKEND_INSTANCE_SECRET, releaseDate } from \"./utils.js\";\nimport { DeploymentType, DetailedDeploymentCredentials } from \"../api.js\";\nimport { productionProvisionHost, provisionHost } from \"../config.js\";\n\nconst DEFAULT_STARTUP_TIMEOUT_SECS = 30;\nconst FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION =\n \"precompiled-2026-09-15-4e9b83a\";\n\nexport function _backendSupportsControlPlaneAuth(version: string): boolean {\n if (version === FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION) {\n return true;\n }\n const backendDate = releaseDate(version);\n const firstSupportedDate = releaseDate(\n FIRST_CONTROL_PLANE_AUTH_BACKEND_VERSION,\n );\n return (\n backendDate !== null &&\n firstSupportedDate !== null &&\n backendDate > firstSupportedDate\n );\n}\n\nasync function parseStartupTimeoutSecs(ctx: Context): Promise<number> {\n const raw = process.env.CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS;\n if (raw === undefined) {\n return DEFAULT_STARTUP_TIMEOUT_SECS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=${JSON.stringify(raw)}: expected a positive number.`,\n });\n }\n return parsed;\n}\n\nexport async function runLocalBackend(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site: number;\n };\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n binaryPath: string;\n backendVersion: string;\n instanceSecret: string;\n isLatestVersion: boolean;\n },\n): Promise<{\n cleanupHandle: string;\n}> {\n const { ports } = args;\n const deploymentDir = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n ctx.fs.mkdir(deploymentDir, { recursive: true });\n const deploymentNameSha = createHash(\"sha256\")\n .update(args.deploymentName)\n .digest(\"hex\");\n const commandArgs = [\n \"--port\",\n ports.cloud.toString(),\n \"--site-proxy-port\",\n ports.site.toString(),\n \"--sentry-identifier\",\n deploymentNameSha,\n \"--instance-name\",\n args.deploymentName,\n \"--instance-secret\",\n args.instanceSecret,\n \"--local-storage\",\n path.join(deploymentDir, \"convex_local_storage\"),\n \"--beacon-tag\",\n selfHostedEventTag(args.deploymentKind),\n path.join(deploymentDir, \"convex_local_backend.sqlite3\"),\n ];\n if (args.isLatestVersion) {\n // CLI args that were added in later versions of backend go here instead of above\n // since the CLI may run older versions of backend (e.g. when upgrading).\n if (args.deploymentKind === \"anonymous\") {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid !== null) {\n commandArgs.push(\n \"--beacon-fields\",\n JSON.stringify({\n override_uuid: uuid,\n }),\n );\n }\n }\n }\n\n // Check that binary works by running with --help\n try {\n const result = child_process.spawnSync(args.binaryPath, [\n ...commandArgs,\n \"--help\",\n ]);\n if (result.status === 3221225781) {\n const message =\n \"Local backend exited because shared libraries are missing. These may include libraries installed via 'Microsoft Visual C++ Redistributable for Visual Studio.'\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(\n \"Local backend exited with code 3221225781\",\n ),\n });\n } else if (result.status !== 0) {\n const message = `Failed to run backend binary, exit code ${result.status}, error: ${result.stderr === null ? \"null\" : result.stderr.toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n } catch (e) {\n const message = `Failed to run backend binary: ${(e as any).toString()}`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n const supportsControlPlane = _backendSupportsControlPlaneAuth(\n args.backendVersion,\n );\n if (supportsControlPlane && provisionHost !== productionProvisionHost) {\n commandArgs.push(\"--control-plane-url\", provisionHost);\n }\n const auth = ctx.bigBrainAuth();\n if (\n supportsControlPlane &&\n args.deploymentKind === \"local\" &&\n auth?.kind === \"accessToken\"\n ) {\n commandArgs.push(\"--control-plane-access-token\", auth.accessToken);\n }\n const displayArgs = commandArgs.map((arg, index) =>\n index > 0 &&\n [\"--instance-secret\", \"--control-plane-access-token\"].includes(\n commandArgs[index - 1],\n )\n ? \"[REDACTED]\"\n : arg,\n );\n const commandStr = `${args.binaryPath} ${displayArgs.join(\" \")}`;\n logVerbose(`Starting local backend: \\`${commandStr}\\``);\n const p = child_process\n .spawn(args.binaryPath, commandArgs, {\n stdio: \"ignore\",\n env: {\n ...process.env,\n SENTRY_DSN: LOCAL_BACKEND_SENTRY_DSN,\n },\n })\n .on(\"exit\", (code) => {\n const why = code === null ? \"from signal\" : `with code ${code}`;\n logVerbose(`Local backend exited ${why}, full command \\`${commandStr}\\``);\n });\n const cleanupHandle = ctx.registerCleanup(async () => {\n logVerbose(`Stopping local backend on port ${ports.cloud}`);\n p.kill(\"SIGTERM\");\n });\n\n await ensureBackendRunning(ctx, {\n cloudPort: ports.cloud,\n deploymentName: args.deploymentName,\n maxTimeSecs: await parseStartupTimeoutSecs(ctx),\n });\n\n return {\n cleanupHandle,\n };\n}\n\n/** Crash if correct local backend is not currently listening on the expected port. */\nexport async function assertLocalBackendRunning(\n ctx: Context,\n args: {\n url: string;\n deploymentName: string;\n },\n): Promise<void> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n const result = await fetchLocalBackendStatus(args);\n switch (result.kind) {\n case \"running\":\n return;\n case \"different\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${result.name} is running at ${args.url}`,\n });\n case \"error\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error response code received from local backend ${result.resp.status} ${result.resp.statusText}`,\n });\n case \"not-running\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running. (it's not listening at ${args.url})\\nRun \\`npx convex dev\\` in another terminal first.`,\n });\n }\n}\n\n/** Wait for up to maxTimeSecs for the correct local backend to be running on the expected port. */\nexport async function ensureBackendRunning(\n ctx: Context,\n args: {\n cloudPort: number;\n deploymentName: string;\n maxTimeSecs: number;\n },\n): Promise<void> {\n logVerbose(`Ensuring backend running on port ${args.cloudPort} is running`);\n const deploymentUrl = localDeploymentUrl(args.cloudPort);\n let timeElapsedSecs = 0;\n let hasShownWaiting = false;\n while (timeElapsedSecs <= args.maxTimeSecs) {\n if (!hasShownWaiting && timeElapsedSecs > 2) {\n logMessage(\"waiting for local backend to start...\");\n hasShownWaiting = true;\n }\n try {\n const resp = await fetch(`${deploymentUrl}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${text} is running on selected port ${args.cloudPort}`,\n });\n } else {\n // The backend is running!\n return;\n }\n } else {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n }\n const base = `Local backend did not start on port ${args.cloudPort} within ${args.maxTimeSecs} seconds.`;\n const message =\n args.maxTimeSecs >= DEFAULT_STARTUP_TIMEOUT_SECS\n ? `${base} If your local database is large, increase the timeout by setting CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS (e.g. CONVEX_LOCAL_BACKEND_STARTUP_TIMEOUT_SECS=120).`\n : base;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n}\n\nexport async function ensureBackendStopped(\n ctx: Context,\n args: {\n ports: {\n cloud: number;\n site?: number;\n };\n maxTimeSecs: number;\n deploymentName: string;\n // Whether to allow a deployment with a different name to run on this port\n allowOtherDeployments: boolean;\n },\n) {\n logVerbose(`Ensuring backend running on port ${args.ports.cloud} is stopped`);\n let timeElapsedSecs = 0;\n while (timeElapsedSecs < args.maxTimeSecs) {\n const cloudPort = await detect(args.ports.cloud);\n const sitePort =\n args.ports.site === undefined ? undefined : await detect(args.ports.site);\n // Both ports are free\n if (cloudPort === args.ports.cloud && sitePort === args.ports.site) {\n return;\n }\n try {\n const instanceNameResp = await fetch(\n `${localDeploymentUrl(args.ports.cloud)}/instance_name`,\n );\n if (instanceNameResp.ok) {\n const instanceName = await instanceNameResp.text();\n if (instanceName !== args.deploymentName) {\n if (args.allowOtherDeployments) {\n return;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A different local backend ${instanceName} is running on selected port ${args.ports.cloud}`,\n });\n }\n }\n } catch (error: any) {\n logVerbose(`Error checking if backend is running: ${error.message}`);\n // Backend is probably not running\n continue;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n timeElapsedSecs += 0.5;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `A local backend is still running on port ${args.ports.cloud}. Please stop it and run this command again.`,\n });\n}\n\nexport function localDeploymentUrl(cloudPort: number): string {\n return `http://127.0.0.1:${cloudPort}`;\n}\n\nexport function selfHostedEventTag(\n deploymentKind: LocalDeploymentKind,\n): string {\n return deploymentKind === \"local\" ? \"cli-local-dev\" : \"cli-anonymous-dev\";\n}\n\ntype LocalBackendStatus =\n | { kind: \"running\" }\n | { kind: \"error\"; resp: Response }\n | { kind: \"different\"; name: string }\n | { kind: \"not-running\" };\n\nexport async function fetchLocalBackendStatus(args: {\n url: string;\n deploymentName: string;\n}): Promise<LocalBackendStatus> {\n logVerbose(`Checking local backend at ${args.url} is running`);\n try {\n const resp = await fetch(`${args.url}/instance_name`);\n if (resp.status === 200) {\n const text = await resp.text();\n if (text !== args.deploymentName) {\n return { kind: \"different\", name: text };\n } else {\n return { kind: \"running\" };\n }\n } else {\n return { kind: \"error\", resp };\n }\n } catch {\n return { kind: \"not-running\" };\n }\n}\n\n/** Returns true if the correct local backend is listening. */\nexport async function isLocalBackendRunning(\n url: string,\n deploymentName: string,\n): Promise<boolean> {\n return (\n \"running\" === (await fetchLocalBackendStatus({ url, deploymentName })).kind\n );\n}\n\nexport function shouldUseLocalDeployment(deploymentType: DeploymentType) {\n return deploymentType === \"local\" || deploymentType === \"anonymous\";\n}\n\ninterface WithRunningBackendArgs {\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n action: () => Promise<void>;\n}\n\n/**\n * If the deployment is a local deployment and not already running, start it\n * for the duration of the action, then stop it.\n */\nexport async function withRunningBackend({\n ctx,\n deployment,\n action,\n}: WithRunningBackendArgs) {\n let cleanup: (() => Promise<void>) | null = null;\n\n if (\n deployment.deploymentFields &&\n shouldUseLocalDeployment(deployment.deploymentFields.deploymentType)\n ) {\n const isRunning = await isLocalBackendRunning(\n deployment.deploymentUrl,\n deployment.deploymentFields.deploymentName,\n );\n if (!isRunning) {\n ({ cleanup } = await startEphemeralLocalBackend(ctx, {\n deploymentType: deployment.deploymentFields.deploymentType,\n deploymentName: deployment.deploymentFields.deploymentName,\n }));\n }\n }\n\n try {\n await action();\n } finally {\n await cleanup?.();\n }\n}\n\n/**\n * Start a local backend for a one-off command using saved deployment config.\n * Returns a cleanup function that stops the backend.\n */\nasync function startEphemeralLocalBackend(\n ctx: Context,\n args: {\n deploymentType: string;\n deploymentName: string;\n },\n): Promise<{ cleanup: () => Promise<void> }> {\n const deploymentKind: LocalDeploymentKind =\n args.deploymentType === \"anonymous\" ? \"anonymous\" : \"local\";\n\n const config = loadDeploymentConfig(ctx, deploymentKind, args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Local backend isn't running and no saved configuration found.\\nRun \\`npx convex dev\\` first.`,\n });\n }\n\n const { binaryPath } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"version\",\n version: config.backendVersion,\n });\n\n const instanceSecret = config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath,\n backendVersion: config.backendVersion,\n ports: config.ports,\n deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: true,\n });\n\n return {\n cleanup: async () => {\n const fn = ctx.removeCleanup(cleanupHandle);\n if (fn) {\n await fn(0);\n }\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "child_process", "detect"]
|
|
7
7
|
}
|
|
@@ -25,6 +25,7 @@ module.exports = __toCommonJS(upgrade_exports);
|
|
|
25
25
|
var import_log = require("../../../bundler/log.js");
|
|
26
26
|
var import_filePaths = require("./filePaths.js");
|
|
27
27
|
var import_run = require("./run.js");
|
|
28
|
+
var import_utils = require("./utils.js");
|
|
28
29
|
var import_prompts = require("../utils/prompts.js");
|
|
29
30
|
var import_download = require("./download.js");
|
|
30
31
|
var import_secrets = require("./secrets.js");
|
|
@@ -57,6 +58,7 @@ async function handlePotentialUpgradeAndStart(ctx, args) {
|
|
|
57
58
|
);
|
|
58
59
|
const { cleanupHandle: cleanupHandle2 } = await (0, import_run.runLocalBackend)(ctx, {
|
|
59
60
|
binaryPath: args.newBinaryPath,
|
|
61
|
+
backendVersion: args.newVersion,
|
|
60
62
|
deploymentKind: args.deploymentKind,
|
|
61
63
|
deploymentName: args.deploymentName,
|
|
62
64
|
ports: args.ports,
|
|
@@ -86,6 +88,7 @@ async function handlePotentialUpgradeAndStart(ctx, args) {
|
|
|
86
88
|
});
|
|
87
89
|
const { cleanupHandle: cleanupHandle2 } = await (0, import_run.runLocalBackend)(ctx, {
|
|
88
90
|
binaryPath: oldBinaryPath,
|
|
91
|
+
backendVersion: args.oldVersion,
|
|
89
92
|
ports: args.ports,
|
|
90
93
|
deploymentKind: args.deploymentKind,
|
|
91
94
|
deploymentName: args.deploymentName,
|
|
@@ -117,6 +120,7 @@ async function handleUpgrade(ctx, args) {
|
|
|
117
120
|
(0, import_log.logVerbose)(`Running backend on new version ${args.newVersion}`);
|
|
118
121
|
const { cleanupHandle } = await (0, import_run.runLocalBackend)(ctx, {
|
|
119
122
|
binaryPath: args.newBinaryPath,
|
|
123
|
+
backendVersion: args.newVersion,
|
|
120
124
|
ports: args.ports,
|
|
121
125
|
deploymentKind: args.deploymentKind,
|
|
122
126
|
deploymentName: args.deploymentName,
|
|
@@ -136,11 +140,8 @@ async function handleUpgrade(ctx, args) {
|
|
|
136
140
|
return { cleanupHandle };
|
|
137
141
|
}
|
|
138
142
|
function _isDowngrade(oldVersion, newVersion) {
|
|
139
|
-
const oldDate = releaseDate(oldVersion);
|
|
140
|
-
const newDate = releaseDate(newVersion);
|
|
143
|
+
const oldDate = (0, import_utils.releaseDate)(oldVersion);
|
|
144
|
+
const newDate = (0, import_utils.releaseDate)(newVersion);
|
|
141
145
|
return oldDate !== null && newDate !== null && newDate < oldDate;
|
|
142
146
|
}
|
|
143
|
-
function releaseDate(version) {
|
|
144
|
-
return /^precompiled-(\d{4}-\d{2}-\d{2})-/.exec(version)?.[1] ?? null;
|
|
145
|
-
}
|
|
146
147
|
//# sourceMappingURL=upgrade.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/upgrade.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { runLocalBackend } from \"./run.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handlePotentialUpgradeAndStart(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n existingCredentials: { adminKey: string; instanceSecret: string } | null;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string; adminKey: string }> {\n const { adminKey, instanceSecret } =\n args.existingCredentials === null ||\n args.existingCredentials.instanceSecret ===\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET\n ? // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`\n // here, because `newBinaryPath` can be a binary that doesn\u2019t support\n // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)\n //\n // In most cases (the user is not using the flag), we have already downloaded the latest binary\n // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn\u2019t cause an\n // extra download (even if the user chooses later not to upgrade their deployment)\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: args.deploymentName,\n })\n : args.existingCredentials;\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: false,\n });\n return { cleanupHandle, adminKey };\n }\n const { cleanupHandle } = await handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n return { cleanupHandle, adminKey };\n}\n\n/**\n * Upgrade in place: hand the existing data directory to the new binary, which\n * migrates its own on-disk state on startup (the same path self-hosted\n * deployments take).\n */\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n instanceSecret: string;\n adminKey: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const isDowngrade = _isDowngrade(args.oldVersion, args.newVersion);\n if (isDowngrade) {\n logWarning(\n `Moving a local deployment back to an older backend version (${args.oldVersion} \u2192 ${args.newVersion}) isn't supported: ` +\n `the older backend may not be able to read data written by the newer one. ` +\n `If it fails to start, delete the deployment's state directory to start fresh on this version.`,\n );\n }\n\n logVerbose(`Running backend on new version ${args.newVersion}`);\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logFinishedStep(\n `Successfully ${isDowngrade ? \"moved\" : \"upgraded\"} to backend version ${args.newVersion}`,\n );\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n\n/** Whether `newVersion` predates `oldVersion`, as far as we can tell. */\nexport function _isDowngrade(oldVersion: string, newVersion: string): boolean {\n const oldDate = releaseDate(oldVersion);\n const newDate = releaseDate(newVersion);\n return oldDate !== null && newDate !== null && newDate < oldDate;\n}\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n LocalDeploymentConfig,\n LocalDeploymentKind,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { runLocalBackend } from \"./run.js\";\nimport { releaseDate } from \"./utils.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handlePotentialUpgradeAndStart(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n existingCredentials: { adminKey: string; instanceSecret: string } | null;\n forceUpgrade: boolean;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string; adminKey: string }> {\n const { adminKey, instanceSecret } =\n args.existingCredentials === null ||\n args.existingCredentials.instanceSecret ===\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET\n ? // Using `generateLocalDevSecretsFromLatestBinary` instead of `generateLocalDevSecrets`\n // here, because `newBinaryPath` can be a binary that doesn\u2019t support\n // the `keygen admin-key` subcommand (when the --local-backend-version flag is provided to the CLI)\n //\n // In most cases (the user is not using the flag), we have already downloaded the latest binary\n // shortly before in handleLocalDeployment/handleAnonymousDeployment, so this doesn\u2019t cause an\n // extra download (even if the user chooses later not to upgrade their deployment)\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: args.deploymentName,\n })\n : args.existingCredentials;\n const newConfig: LocalDeploymentConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n backendVersion: args.newVersion,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret,\n isLatestVersion: true,\n });\n return { cleanupHandle, adminKey };\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n backendVersion: args.oldVersion,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret,\n isLatestVersion: false,\n });\n return { cleanupHandle, adminKey };\n }\n const { cleanupHandle } = await handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n adminKey,\n instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n return { cleanupHandle, adminKey };\n}\n\n/**\n * Upgrade in place: hand the existing data directory to the new binary, which\n * migrates its own on-disk state on startup (the same path self-hosted\n * deployments take).\n */\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n instanceSecret: string;\n adminKey: string;\n cloudProjectId: number | undefined;\n },\n): Promise<{ cleanupHandle: string }> {\n const isDowngrade = _isDowngrade(args.oldVersion, args.newVersion);\n if (isDowngrade) {\n logWarning(\n `Moving a local deployment back to an older backend version (${args.oldVersion} \u2192 ${args.newVersion}) isn't supported: ` +\n `the older backend may not be able to read data written by the newer one. ` +\n `If it fails to start, delete the deployment's state directory to start fresh on this version.`,\n );\n }\n\n logVerbose(`Running backend on new version ${args.newVersion}`);\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n backendVersion: args.newVersion,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logFinishedStep(\n `Successfully ${isDowngrade ? \"moved\" : \"upgraded\"} to backend version ${args.newVersion}`,\n );\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n cloudProjectId: args.cloudProjectId,\n });\n\n return { cleanupHandle };\n}\n\n/** Whether `newVersion` predates `oldVersion`, as far as we can tell. */\nexport function _isDowngrade(oldVersion: string, newVersion: string): boolean {\n const oldDate = releaseDate(oldVersion);\n const newDate = releaseDate(newVersion);\n return oldDate !== null && newDate !== null && newDate < oldDate;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["cleanupHandle"]
|
|
7
7
|
}
|
|
@@ -21,7 +21,8 @@ __export(utils_exports, {
|
|
|
21
21
|
LOCAL_BACKEND_INSTANCE_SECRET: () => LOCAL_BACKEND_INSTANCE_SECRET,
|
|
22
22
|
chooseLocalBackendPorts: () => chooseLocalBackendPorts,
|
|
23
23
|
choosePorts: () => choosePorts,
|
|
24
|
-
printLocalDeploymentWelcomeMessage: () => printLocalDeploymentWelcomeMessage
|
|
24
|
+
printLocalDeploymentWelcomeMessage: () => printLocalDeploymentWelcomeMessage,
|
|
25
|
+
releaseDate: () => releaseDate
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(utils_exports);
|
|
27
28
|
var import_log = require("../../../bundler/log.js");
|
|
@@ -89,4 +90,7 @@ function printLocalDeploymentWelcomeMessage() {
|
|
|
89
90
|
);
|
|
90
91
|
}
|
|
91
92
|
const LOCAL_BACKEND_INSTANCE_SECRET = "4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974";
|
|
93
|
+
function releaseDate(version) {
|
|
94
|
+
return /^precompiled-(\d{4}-\d{2}-\d{2})-/.exec(version)?.[1] ?? null;
|
|
95
|
+
}
|
|
92
96
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,mBAA4B;AAE5B,eAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,UAAM,2BAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,UAAM,2BAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,gCACX;",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n\n// Backend releases are tagged `precompiled-YYYY-MM-DD-<commit>`, so the dates\n// sort lexicographically.\nexport function releaseDate(version: string): string | null {\n return /^precompiled-(\\d{4}-\\d{2}-\\d{2})-/.exec(version)?.[1] ?? null;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,mBAA4B;AAE5B,eAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,UAAM,2BAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,UAAM,2BAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,gCACX;AAIK,SAAS,YAAY,SAAgC;AAC1D,SAAO,oCAAoC,KAAK,OAAO,IAAI,CAAC,KAAK;AACnE;",
|
|
6
6
|
"names": ["port"]
|
|
7
7
|
}
|
|
@@ -32,19 +32,22 @@ var import_requestContext = require("../requestContext.js");
|
|
|
32
32
|
const envListInputSchema = import_zod.z.object({
|
|
33
33
|
deploymentSelector: import_zod.z.string().describe(
|
|
34
34
|
"Deployment selector (from the status tool) to list environment variables from."
|
|
35
|
+
),
|
|
36
|
+
includeValues: import_zod.z.boolean().optional().describe(
|
|
37
|
+
"Also return each variable's value. Values are often secrets like API keys, so leave this off unless you need every value, and use envGet to read a single variable instead."
|
|
35
38
|
)
|
|
36
39
|
});
|
|
37
40
|
const envListOutputSchema = import_zod.z.object({
|
|
38
41
|
variables: import_zod.z.array(
|
|
39
42
|
import_zod.z.object({
|
|
40
43
|
name: import_zod.z.string(),
|
|
41
|
-
value: import_zod.z.string()
|
|
44
|
+
value: import_zod.z.string().optional().describe("Only present when includeValues is true.")
|
|
42
45
|
})
|
|
43
46
|
)
|
|
44
47
|
});
|
|
45
48
|
const EnvListTool = {
|
|
46
49
|
name: "envList",
|
|
47
|
-
description: "List all environment variables in your Convex deployment.",
|
|
50
|
+
description: "List the names of all environment variables in your Convex deployment. Values are left out unless includeValues is true.",
|
|
48
51
|
inputSchema: envListInputSchema,
|
|
49
52
|
outputSchema: envListOutputSchema,
|
|
50
53
|
handler: async (ctx, args) => {
|
|
@@ -67,7 +70,11 @@ const EnvListTool = {
|
|
|
67
70
|
componentPath: void 0,
|
|
68
71
|
args: {}
|
|
69
72
|
});
|
|
70
|
-
return {
|
|
73
|
+
return {
|
|
74
|
+
variables: variables.map(
|
|
75
|
+
({ name, value }) => args.includeValues ? { name, value } : { name }
|
|
76
|
+
)
|
|
77
|
+
};
|
|
71
78
|
}
|
|
72
79
|
};
|
|
73
80
|
const envGetInputSchema = import_zod.z.object({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/cli/lib/mcp/tools/env.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { loadSelectedDeploymentCredentials } from \"../../api.js\";\nimport { deploymentEnvBackend, envSet, envRemove, EnvVar } from \"../../env.js\";\nimport { runSystemQuery } from \"../../run.js\";\nimport { getMcpDeploymentSelection } from \"../requestContext.js\";\n\n// List Environment Variables\nconst envListInputSchema = z.object({\n deploymentSelector: z\n .string()\n .describe(\n \"Deployment selector (from the status tool) to list environment variables from.\",\n ),\n});\n\nconst envListOutputSchema = z.object({\n variables: z.array(\n z.object({\n name: z.string(),\n value: z.string(),\n }),\n ),\n});\n\nexport const EnvListTool: ConvexTool<\n typeof envListInputSchema,\n typeof envListOutputSchema\n> = {\n name: \"envList\",\n description
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAElB,iBAAkD;AAClD,iBAAgE;AAChE,iBAA+B;AAC/B,4BAA0C;AAG1C,MAAM,qBAAqB,aAAE,OAAO;AAAA,EAClC,oBAAoB,aACjB,OAAO,EACP;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAED,MAAM,sBAAsB,aAAE,OAAO;AAAA,EACnC,WAAW,aAAE;AAAA,IACX,aAAE,OAAO;AAAA,MACP,MAAM,aAAE,OAAO;AAAA,MACf,OAAO,
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { loadSelectedDeploymentCredentials } from \"../../api.js\";\nimport { deploymentEnvBackend, envSet, envRemove, EnvVar } from \"../../env.js\";\nimport { runSystemQuery } from \"../../run.js\";\nimport { getMcpDeploymentSelection } from \"../requestContext.js\";\n\n// List Environment Variables\nconst envListInputSchema = z.object({\n deploymentSelector: z\n .string()\n .describe(\n \"Deployment selector (from the status tool) to list environment variables from.\",\n ),\n includeValues: z\n .boolean()\n .optional()\n .describe(\n \"Also return each variable's value. Values are often secrets like API keys, so leave this off unless you need every value, and use envGet to read a single variable instead.\",\n ),\n});\n\nconst envListOutputSchema = z.object({\n variables: z.array(\n z.object({\n name: z.string(),\n value: z\n .string()\n .optional()\n .describe(\"Only present when includeValues is true.\"),\n }),\n ),\n});\n\nexport const EnvListTool: ConvexTool<\n typeof envListInputSchema,\n typeof envListOutputSchema\n> = {\n name: \"envList\",\n description:\n \"List the names of all environment variables in your Convex deployment. Values are left out unless includeValues is true.\",\n inputSchema: envListInputSchema,\n outputSchema: envListOutputSchema,\n handler: async (ctx, args) => {\n const { projectDir, deployment } = await ctx.decodeDeploymentSelector(\n args.deploymentSelector,\n );\n process.chdir(projectDir);\n const deploymentSelection = await getMcpDeploymentSelection(\n ctx,\n deployment,\n );\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const variables = (await runSystemQuery(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as EnvVar[];\n return {\n variables: variables.map(({ name, value }) =>\n args.includeValues ? { name, value } : { name },\n ),\n };\n },\n};\n\n// Get Environment Variable\nconst envGetInputSchema = z.object({\n deploymentSelector: z\n .string()\n .describe(\n \"Deployment selector (from the status tool) to get environment variable from.\",\n ),\n name: z\n .string()\n .describe(\"The name of the environment variable to retrieve.\"),\n});\n\nconst envGetOutputSchema = z.object({\n value: z.union([z.string(), z.null()]),\n});\n\nexport const EnvGetTool: ConvexTool<\n typeof envGetInputSchema,\n typeof envGetOutputSchema\n> = {\n name: \"envGet\",\n description:\n \"Get a specific environment variable from your Convex deployment.\",\n inputSchema: envGetInputSchema,\n outputSchema: envGetOutputSchema,\n handler: async (ctx, args) => {\n const { projectDir, deployment } = await ctx.decodeDeploymentSelector(\n args.deploymentSelector,\n );\n process.chdir(projectDir);\n const deploymentSelection = await getMcpDeploymentSelection(\n ctx,\n deployment,\n );\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const envVar = (await runSystemQuery(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName: \"_system/cli/queryEnvironmentVariables:get\",\n componentPath: undefined,\n args: { name: args.name },\n })) as { name: string; value: string } | null;\n return { value: envVar?.value ?? null };\n },\n};\n\n// Set Environment Variable\nconst envSetInputSchema = z.object({\n deploymentSelector: z\n .string()\n .describe(\n \"Deployment selector (from the status tool) to set environment variable on.\",\n ),\n name: z.string().describe(\"The name of the environment variable to set.\"),\n value: z.string().describe(\"The value to set for the environment variable.\"),\n});\n\nconst envSetOutputSchema = z.object({\n success: z.boolean(),\n});\n\nexport const EnvSetTool: ConvexTool<\n typeof envSetInputSchema,\n typeof envSetOutputSchema\n> = {\n name: \"envSet\",\n description: \"Set an environment variable in your Convex deployment.\",\n inputSchema: envSetInputSchema,\n outputSchema: envSetOutputSchema,\n handler: async (ctx, args) => {\n const { projectDir, deployment } = await ctx.decodeDeploymentSelector(\n args.deploymentSelector,\n );\n process.chdir(projectDir);\n const deploymentSelection = await getMcpDeploymentSelection(\n ctx,\n deployment,\n );\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const deploymentInfo = {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n deploymentNotice: \"\",\n };\n const backend = deploymentEnvBackend(ctx, deploymentInfo);\n await envSet(ctx, backend, args.name, args.value);\n return { success: true };\n },\n};\n\n// Remove Environment Variable\nconst envRemoveInputSchema = z.object({\n deploymentSelector: z\n .string()\n .describe(\n \"Deployment selector (from the status tool) to remove environment variable from.\",\n ),\n name: z.string().describe(\"The name of the environment variable to remove.\"),\n});\n\nconst envRemoveOutputSchema = z.object({\n success: z.boolean(),\n});\n\nexport const EnvRemoveTool: ConvexTool<\n typeof envRemoveInputSchema,\n typeof envRemoveOutputSchema\n> = {\n name: \"envRemove\",\n description: \"Remove an environment variable from your Convex deployment.\",\n inputSchema: envRemoveInputSchema,\n outputSchema: envRemoveOutputSchema,\n handler: async (ctx, args) => {\n const { projectDir, deployment } = await ctx.decodeDeploymentSelector(\n args.deploymentSelector,\n );\n process.chdir(projectDir);\n const deploymentSelection = await getMcpDeploymentSelection(\n ctx,\n deployment,\n );\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const deploymentInfo = {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n deploymentNotice: \"\",\n };\n const backend = deploymentEnvBackend(ctx, deploymentInfo);\n await envRemove(ctx, backend, args.name);\n return { success: true };\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/cli/lib/run.js
CHANGED
|
@@ -399,6 +399,11 @@ async function pushToDeployment(ctx, args) {
|
|
|
399
399
|
pushAllModules: false,
|
|
400
400
|
largeIndexDeletionCheck: "no verification",
|
|
401
401
|
// `convex run` can’t push to prod
|
|
402
|
+
largeIndexBackfillCheck: "no verification",
|
|
403
|
+
// ditto
|
|
404
|
+
stagedValidatorDeletionCheck: "no verification",
|
|
405
|
+
// ditto
|
|
406
|
+
warnOnSlowSchemaValidation: true,
|
|
402
407
|
message: null
|
|
403
408
|
},
|
|
404
409
|
{
|