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
|
@@ -30,6 +30,7 @@ var deploy2_exports = {};
|
|
|
30
30
|
__export(deploy2_exports, {
|
|
31
31
|
deployToDeployment: () => deployToDeployment,
|
|
32
32
|
evaluatePush: () => evaluatePush,
|
|
33
|
+
evaluateSchema: () => evaluateSchema,
|
|
33
34
|
fetchDeploymentCanonicalUrls: () => fetchDeploymentCanonicalUrls,
|
|
34
35
|
finishPush: () => finishPush,
|
|
35
36
|
reportPushCompleted: () => reportPushCompleted,
|
|
@@ -42,6 +43,7 @@ var import_log = require("../../bundler/log.js");
|
|
|
42
43
|
var import_child_process = require("child_process");
|
|
43
44
|
var import_utils = require("./utils/utils.js");
|
|
44
45
|
var import_startPush = require("./deployApi/startPush.js");
|
|
46
|
+
var import_evaluateSchema = require("./deployApi/evaluateSchema.js");
|
|
45
47
|
var import_chalk = require("chalk");
|
|
46
48
|
var import_finishPush = require("./deployApi/finishPush.js");
|
|
47
49
|
var import_node_util = require("node:util");
|
|
@@ -88,7 +90,19 @@ async function evaluatePush(ctx, span, request, options) {
|
|
|
88
90
|
);
|
|
89
91
|
return import_startPush.evaluatePushResponse.parse(response);
|
|
90
92
|
}
|
|
91
|
-
async function
|
|
93
|
+
async function evaluateSchema(ctx, span, request, options, bestEffort) {
|
|
94
|
+
const response = await pushCode(
|
|
95
|
+
ctx,
|
|
96
|
+
span,
|
|
97
|
+
request,
|
|
98
|
+
options,
|
|
99
|
+
"/api/deploy2/evaluate_schema",
|
|
100
|
+
bestEffort
|
|
101
|
+
);
|
|
102
|
+
return import_evaluateSchema.evaluateSchemaResponse.parse(response);
|
|
103
|
+
}
|
|
104
|
+
const BEST_EFFORT_RETRIES = 5;
|
|
105
|
+
async function pushCode(ctx, span, request, options, endpoint, bestEffort) {
|
|
92
106
|
const unchangedModuleCount = request.appDefinition?.unchangedModuleHashes?.length ?? 0;
|
|
93
107
|
const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;
|
|
94
108
|
const requestSummary = {
|
|
@@ -108,7 +122,16 @@ async function pushCode(ctx, span, request, options, endpoint) {
|
|
|
108
122
|
const fetch = (0, import_utils.deploymentFetch)(ctx, {
|
|
109
123
|
deploymentUrl: options.url,
|
|
110
124
|
adminKey: request.adminKey,
|
|
111
|
-
onError
|
|
125
|
+
onError,
|
|
126
|
+
// Best-effort callers tolerate failure, so retry only plausibly
|
|
127
|
+
// transient conditions — network errors and 5xx responses (e.g. table
|
|
128
|
+
// summaries still bootstrapping) — and fail fast on everything else,
|
|
129
|
+
// like a 404 from a deployment whose backend doesn't yet expose the
|
|
130
|
+
// endpoint.
|
|
131
|
+
...bestEffort ? {
|
|
132
|
+
maxRetries: BEST_EFFORT_RETRIES,
|
|
133
|
+
shouldRetry: (error, response) => error !== null || response !== null && response.status >= 500
|
|
134
|
+
} : {}
|
|
112
135
|
});
|
|
113
136
|
try {
|
|
114
137
|
const response = await fetch(endpoint, {
|
|
@@ -122,6 +145,9 @@ async function pushCode(ctx, span, request, options, endpoint) {
|
|
|
122
145
|
});
|
|
123
146
|
return await response.json();
|
|
124
147
|
} catch (error) {
|
|
148
|
+
if (bestEffort) {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
125
151
|
return await (0, import_config.handlePushConfigError)(
|
|
126
152
|
ctx,
|
|
127
153
|
error,
|
|
@@ -333,7 +359,10 @@ async function deployToDeployment(ctx, credentials, options) {
|
|
|
333
359
|
writePushRequest: options.writePushRequest,
|
|
334
360
|
liveComponentSources: !!options.liveComponentSources,
|
|
335
361
|
pushAllModules: !!options.pushAllModules,
|
|
336
|
-
largeIndexDeletionCheck: options.allowDeletingLargeIndexes ? "has confirmation" : "ask for confirmation",
|
|
362
|
+
largeIndexDeletionCheck: options.skipLargeIndexesCheck || options.allowDeletingLargeIndexes ? "has confirmation" : "ask for confirmation",
|
|
363
|
+
largeIndexBackfillCheck: options.skipLargeIndexesCheck ? "has confirmation" : "ask for confirmation",
|
|
364
|
+
stagedValidatorDeletionCheck: options.allowUnstagingSchema ? "has confirmation" : "ask for confirmation",
|
|
365
|
+
warnOnSlowSchemaValidation: true,
|
|
337
366
|
message: options.message
|
|
338
367
|
};
|
|
339
368
|
(0, import_log.showSpinner)(`Deploying to ${url}...${options.dryRun ? " [dry run]" : ""}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/deploy2.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint: \"/api/deploy2/start_push\" | \"/api/deploy2/evaluate_push\",\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAOO;AACP,2BAA0B;AAC1B,mBAIO;AACP,uBAQO;AAKP,mBAA4B;AAC5B,wBAA+C;AAE/C,uBAA0B;AAC1B,uBAAiB;AAGjB,IAAAA,qBAAwB;AACxB,qBAAqC;AACrC,oBAIO;AACP,uBAA2C;AAC3C,qBAAsC;AACtC,oBAAoD;AAEpD,MAAM,aAAS,4BAAU,iBAAAC,QAAK,cAAc;AAE5C,eAAe,eAAe,KAAc,MAA+B;AACzE,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,SAAS,MAAM,OAAO,MAAM;AAAA,IAChC,QAAQ;AAAA,MACN,CAAC,iBAAAA,QAAK,UAAU,iBAAiB,GAAG,iBAAAA,QAAK,UAAU;AAAA,MACnD,CAAC,iBAAAA,QAAK,UAAU,oBAAoB,GAAG;AAAA,IACzC;AAAA,EACF,CAAC;AACD,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,WAAW,MAAM;AACvB;AAAA,IACE,eAAe,KAAK,SAAS,MAAM,QAAQ,CAAC,CAAC,WAAW,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,SAAU,OAAO,SAAS,KAAK,SAAU,KAAK,QAAQ,CAAC,CAAC,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,EAC9K;AACA,SAAO;AACT;AAGA,eAAsB,UACpB,KACA,MACA,SACA,SAK4B;AAC5B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,mCAAkB,MAAM,QAAQ;AACzC;AAEA,eAAsB,aACpB,KACA,MACA,SACA,SAK+B;AAC/B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,sCAAqB,MAAM,QAAQ;AAC5C;AAEA,eAAe,SACb,KACA,MACA,SACA,SAKA,
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logVerbose,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport { spawnSync } from \"child_process\";\nimport {\n deploymentFetch,\n logAndHandleFetchError,\n typedDeploymentClient,\n} from \"./utils/utils.js\";\nimport {\n EvaluatePushResponse,\n evaluatePushResponse,\n schemaStatus,\n SchemaStatus,\n StartPushRequest,\n startPushResponse,\n StartPushResponse,\n} from \"./deployApi/startPush.js\";\nimport {\n EvaluateSchemaResponse,\n evaluateSchemaResponse,\n} from \"./deployApi/evaluateSchema.js\";\nimport {\n AppDefinitionConfig,\n ComponentDefinitionConfig,\n} from \"./deployApi/definitionConfig.js\";\nimport { chalkStderr } from \"chalk\";\nimport { finishPushDiff, FinishPushDiff } from \"./deployApi/finishPush.js\";\nimport { Reporter, Span } from \"./tracing.js\";\nimport { promisify } from \"node:util\";\nimport zlib from \"node:zlib\";\nimport { PushOptions } from \"./components.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { runPush } from \"./components.js\";\nimport { suggestedEnvVarNames } from \"./envvars.js\";\nimport {\n handlePushConfigError,\n readProjectConfig,\n getAuthKitConfig,\n} from \"./config.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { addProgressLinkIfSlow } from \"./indexes.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./workos/workos.js\";\n\nconst brotli = promisify(zlib.brotliCompress);\n\nasync function brotliCompress(ctx: Context, data: string): Promise<Buffer> {\n const start = performance.now();\n const result = await brotli(data, {\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n });\n const end = performance.now();\n const duration = end - start;\n logVerbose(\n `Compressed ${(data.length / 1024).toFixed(2)}KiB to ${(result.length / 1024).toFixed(2)}KiB (${((result.length / data.length) * 100).toFixed(2)}%) in ${duration.toFixed(2)}ms`,\n );\n return result;\n}\n\n/** Push configuration2 to the given remote origin. */\nexport async function startPush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<StartPushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/start_push\",\n );\n return startPushResponse.parse(response);\n}\n\nexport async function evaluatePush(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n): Promise<EvaluatePushResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_push\",\n );\n return evaluatePushResponse.parse(response);\n}\n\nexport async function evaluateSchema(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n // When set, a failed evaluation throws the raw error instead of crashing\n // the process, so best-effort callers (e.g. advisory checks) can recover.\n bestEffort?: boolean,\n): Promise<EvaluateSchemaResponse> {\n const response = await pushCode(\n ctx,\n span,\n request,\n options,\n \"/api/deploy2/evaluate_schema\",\n bestEffort,\n );\n return evaluateSchemaResponse.parse(response);\n}\n\n// Retries for best-effort requests, where a transient failure should be\n// ridden out if possible but the command proceeds without the result\n// otherwise.\nconst BEST_EFFORT_RETRIES = 5;\n\nasync function pushCode(\n ctx: Context,\n span: Span,\n request: StartPushRequest,\n options: {\n url: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n endpoint:\n | \"/api/deploy2/start_push\"\n | \"/api/deploy2/evaluate_push\"\n | \"/api/deploy2/evaluate_schema\",\n bestEffort?: boolean,\n): Promise<unknown> {\n // Log a summary of the push request instead of the full object\n const unchangedModuleCount =\n request.appDefinition?.unchangedModuleHashes?.length ?? 0;\n const changedModuleCount = request.appDefinition?.changedModules?.length ?? 0;\n const requestSummary = {\n hasAppDefinition: request.appDefinition !== undefined,\n appFunctionCount: unchangedModuleCount + changedModuleCount,\n hasAppSchema: request.appDefinition?.schema !== null,\n componentCount: request.componentDefinitions?.length ?? 0,\n hasDependencies: request.nodeDependencies?.length > 0,\n dryRun: request.dryRun,\n };\n logVerbose(`Push request summary: ${JSON.stringify(requestSummary)}`);\n const onError = (err: any) => {\n if (err.toString() === \"TypeError: fetch failed\") {\n changeSpinner(`Fetch failed, is ${options.url} correct? Retrying...`);\n }\n };\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: request.adminKey,\n onError,\n // Best-effort callers tolerate failure, so retry only plausibly\n // transient conditions \u2014 network errors and 5xx responses (e.g. table\n // summaries still bootstrapping) \u2014 and fail fast on everything else,\n // like a 404 from a deployment whose backend doesn't yet expose the\n // endpoint.\n ...(bestEffort\n ? {\n maxRetries: BEST_EFFORT_RETRIES,\n shouldRetry: (error: Error | null, response: Response | null) =>\n error !== null || (response !== null && response.status >= 500),\n }\n : {}),\n });\n try {\n const response = await fetch(endpoint, {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return await response.json();\n } catch (error: unknown) {\n if (bestEffort) {\n // The caller handles this itself instead of crashing the process.\n // eslint-disable-next-line no-restricted-syntax\n throw error;\n }\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to start push to \" + options.url,\n options.deploymentName,\n {\n adminKey: request.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\n// Long poll every 10s for progress on schema validation.\nconst SCHEMA_TIMEOUT_MS = 10_000;\n\nexport async function waitForSchema(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n deploymentName: string | null;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n\n const start = Date.now();\n changeSpinner(\"Pushing code to your Convex deployment...\");\n\n while (true) {\n let currentStatus: SchemaStatus;\n try {\n const response = await fetch(\"/api/deploy2/wait_for_schema\", {\n body: JSON.stringify({\n adminKey: options.adminKey,\n schemaChange: startPush.schemaChange,\n timeoutMs: SCHEMA_TIMEOUT_MS,\n dryRun: options.dryRun,\n }),\n method: \"POST\",\n headers: {\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n currentStatus = schemaStatus.parse(await response.json());\n } catch (error: unknown) {\n logFailure(\"Error: Unable to wait for schema from \" + options.url);\n return await logAndHandleFetchError(ctx, error);\n }\n switch (currentStatus.type) {\n case \"inProgress\": {\n let schemaDone = true;\n let indexesComplete = 0;\n let indexesTotal = 0;\n for (const componentStatus of Object.values(currentStatus.components)) {\n if (!componentStatus.schemaValidationComplete) {\n schemaDone = false;\n }\n indexesComplete += componentStatus.indexesComplete;\n indexesTotal += componentStatus.indexesTotal;\n }\n const indexesDone = indexesComplete === indexesTotal;\n let msg: string;\n if (!indexesDone && !schemaDone) {\n msg = addProgressLinkIfSlow(\n `Backfilling indexes (${indexesComplete}/${indexesTotal} ready) and checking that documents match your schema...`,\n options.deploymentName,\n start,\n );\n } else if (!indexesDone) {\n msg = `Backfilling indexes (${indexesComplete}/${indexesTotal} ready)...`;\n // Set a more specific message if the backfill is taking a long time\n if (Date.now() - start > 10_000) {\n const rootDiff = startPush.schemaChange.indexDiffs?.[\"\"];\n const indexName = (\n rootDiff?.added_indexes[0] || rootDiff?.enabled_indexes?.[0]\n )?.name;\n if (indexName) {\n const table = indexName.split(\".\")[0];\n const dashboardUrl = deploymentDashboardUrlPage(\n options.deploymentName,\n `/data?table=${table}&showIndexes=true`,\n );\n msg = `Backfilling index ${indexName} (${indexesComplete}/${indexesTotal} ready), see progress here: ${dashboardUrl}`;\n }\n }\n } else {\n msg = addProgressLinkIfSlow(\n \"Checking that documents match your schema...\",\n options.deploymentName,\n start,\n );\n }\n changeSpinner(msg);\n break;\n }\n case \"failed\": {\n // Schema validation failed. This could be either because the data\n // is bad or the schema is wrong. Classify this as a filesystem error\n // because adjusting `schema.ts` is the most normal next step.\n let msg = \"Schema validation failed\";\n if (currentStatus.componentPath) {\n msg += ` in component \"${currentStatus.componentPath}\"`;\n }\n msg += \".\";\n logFailure(msg);\n logError(chalkStderr.red(`${currentStatus.error}`));\n return await ctx.crash({\n exitCode: 1,\n errorType: {\n \"invalid filesystem or db data\": currentStatus.tableName\n ? {\n tableName: currentStatus.tableName,\n componentPath: currentStatus.componentPath,\n }\n : null,\n },\n printedMessage: null, // TODO - move logging into here\n });\n }\n case \"raceDetected\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Schema was overwritten by another push.`,\n });\n }\n case \"complete\": {\n changeSpinner(\"Schema validation complete.\");\n return;\n }\n }\n }\n}\n\nexport async function finishPush(\n ctx: Context,\n span: Span,\n startPush: StartPushResponse,\n options: {\n adminKey: string;\n url: string;\n dryRun: boolean;\n verbose?: boolean;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n message: string | null;\n },\n): Promise<FinishPushDiff> {\n changeSpinner(\"Finalizing push...\");\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n const request = {\n adminKey: options.adminKey,\n startPush,\n dryRun: options.dryRun,\n message: options.message,\n };\n try {\n const response = await fetch(\"/api/deploy2/finish_push\", {\n body: await brotliCompress(ctx, JSON.stringify(request)),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"br\",\n traceparent: span.encodeW3CTraceparent(),\n },\n });\n return finishPushDiff.parse(await response.json());\n } catch (error: unknown) {\n return await handlePushConfigError(\n ctx,\n error,\n \"Error: Unable to finish push to \" + options.url,\n options.deploymentName,\n {\n adminKey: options.adminKey,\n deploymentUrl: options.url,\n deploymentNotice: \"\",\n },\n options.deploymentType,\n );\n }\n}\n\nexport type ComponentDefinitionConfigWithoutImpls = Omit<\n ComponentDefinitionConfig,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionConfigWithoutImpls = Omit<\n AppDefinitionConfig,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\nexport async function reportPushCompleted(\n ctx: Context,\n adminKey: string,\n url: string,\n reporter: Reporter,\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: url,\n adminKey,\n });\n try {\n const response = await fetch(\"/api/deploy2/report_push_completed\", {\n body: JSON.stringify({\n adminKey,\n spans: reporter.spans,\n }),\n method: \"POST\",\n });\n await response.json();\n } catch (error: unknown) {\n logFailure(\n \"Error: Unable to report push completed to \" + url + \": \" + error,\n );\n }\n}\n\nexport async function deployToDeployment(\n ctx: Context,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n },\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n skipWorkosCheck?: boolean | undefined;\n skipLargeIndexesCheck: boolean;\n allowDeletingLargeIndexes: boolean;\n allowUnstagingSchema: boolean;\n message: string | null;\n },\n) {\n const { url, adminKey } = credentials;\n\n // Pre-flight check: Ensure AuthKit is provisioned before building client bundle\n if (!options.skipWorkosCheck) {\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: url, adminKey },\n deploymentType,\n );\n }\n }\n }\n\n await runCommand(ctx, { ...options, url, adminKey });\n\n const pushOptions: PushOptions = {\n deploymentName: credentials.deploymentName,\n adminKey,\n verbose: !!options.verbose,\n dryRun: !!options.dryRun,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url,\n writePushRequest: options.writePushRequest,\n liveComponentSources: !!options.liveComponentSources,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck:\n options.skipLargeIndexesCheck || options.allowDeletingLargeIndexes\n ? \"has confirmation\"\n : \"ask for confirmation\",\n largeIndexBackfillCheck: options.skipLargeIndexesCheck\n ? \"has confirmation\"\n : \"ask for confirmation\",\n stagedValidatorDeletionCheck: options.allowUnstagingSchema\n ? \"has confirmation\"\n : \"ask for confirmation\",\n warnOnSlowSchemaValidation: true,\n message: options.message,\n };\n showSpinner(`Deploying to ${url}...${options.dryRun ? \" [dry run]\" : \"\"}`);\n await runPush(ctx, pushOptions);\n logFinishedStep(\n `${\n options.dryRun ? \"Would have deployed\" : \"Deployed\"\n } Convex functions to ${url}`,\n );\n}\n\nexport async function runCommand(\n ctx: Context,\n options: {\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n dryRun?: boolean | undefined;\n url: string;\n adminKey: string;\n },\n) {\n if (options.cmd === undefined) {\n return;\n }\n\n const suggestedEnvVars = await suggestedEnvVarNames(ctx);\n const urlVar = options.cmdUrlEnvVarName ?? suggestedEnvVars.convexUrlEnvVar;\n const siteVar = suggestedEnvVars.convexSiteEnvVar;\n showSpinner(\n `Running '${options.cmd}' with environment variables \"${urlVar}\" and \"${siteVar}\" set...${\n options.dryRun ? \" [dry run]\" : \"\"\n }`,\n );\n if (!options.dryRun) {\n const deployment = {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n };\n const {\n convexCloudUrl: canonicalCloudUrl,\n convexSiteUrl: canonicalSiteUrl,\n } = await fetchDeploymentCanonicalUrls(ctx, deployment);\n\n const env = { ...process.env };\n env[urlVar] = canonicalCloudUrl;\n env[siteVar] = canonicalSiteUrl;\n const result = spawnSync(options.cmd, {\n env,\n stdio: \"inherit\",\n shell: true,\n });\n if (result.status !== 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `'${options.cmd}' failed`,\n });\n }\n }\n logFinishedStep(\n `${options.dryRun ? \"Would have run\" : \"Ran\"} \"${\n options.cmd\n }\" with environment variables \"${urlVar}\" and \"${siteVar}\" set`,\n );\n}\n\nexport async function fetchDeploymentCanonicalUrls(\n ctx: Context,\n options: { deploymentUrl: string; adminKey: string },\n): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {\n const client = typedDeploymentClient(ctx, options);\n const result = await client.GET(\"/get_canonical_urls\");\n return result.data!;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_components", "zlib", "startPush"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
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 evaluateSchema_exports = {};
|
|
20
|
+
__export(evaluateSchema_exports, {
|
|
21
|
+
componentSchemaPrediction: () => componentSchemaPrediction,
|
|
22
|
+
discardedStagedValidator: () => discardedStagedValidator,
|
|
23
|
+
evaluateSchemaResponse: () => evaluateSchemaResponse,
|
|
24
|
+
indexChangePrediction: () => indexChangePrediction,
|
|
25
|
+
indexPrediction: () => indexPrediction,
|
|
26
|
+
stagedValidatorState: () => stagedValidatorState,
|
|
27
|
+
tablePrediction: () => tablePrediction,
|
|
28
|
+
tableValidationOutcome: () => tableValidationOutcome
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(evaluateSchema_exports);
|
|
31
|
+
var import_zod = require("zod");
|
|
32
|
+
var import_paths = require("./paths.js");
|
|
33
|
+
var import_finishPush = require("./finishPush.js");
|
|
34
|
+
var import_utils = require("./utils.js");
|
|
35
|
+
const tableValidationOutcome = import_zod.z.enum([
|
|
36
|
+
"notValidated",
|
|
37
|
+
"supersetOfEnforced",
|
|
38
|
+
"supersetOfStagedValidated",
|
|
39
|
+
"supersetOfShape",
|
|
40
|
+
"mustWalk"
|
|
41
|
+
]);
|
|
42
|
+
const indexChangePrediction = import_zod.z.enum([
|
|
43
|
+
"added",
|
|
44
|
+
"identical",
|
|
45
|
+
"enabled",
|
|
46
|
+
"disabled",
|
|
47
|
+
"dropped"
|
|
48
|
+
]);
|
|
49
|
+
const stagedValidatorState = import_zod.z.union([
|
|
50
|
+
(0, import_utils.looseObject)({
|
|
51
|
+
state: import_zod.z.literal("pending"),
|
|
52
|
+
numDocsValidated: import_zod.z.number(),
|
|
53
|
+
totalDocs: import_zod.z.number().nullable().optional()
|
|
54
|
+
}),
|
|
55
|
+
(0, import_utils.looseObject)({ state: import_zod.z.literal("valid") }),
|
|
56
|
+
(0, import_utils.looseObject)({ state: import_zod.z.literal("failed"), error: import_zod.z.string() })
|
|
57
|
+
]);
|
|
58
|
+
const tablePrediction = (0, import_utils.looseObject)({
|
|
59
|
+
name: import_zod.z.string(),
|
|
60
|
+
outcome: tableValidationOutcome,
|
|
61
|
+
numDocs: import_zod.z.number(),
|
|
62
|
+
sizeBytes: import_zod.z.number(),
|
|
63
|
+
staged: stagedValidatorState.optional(),
|
|
64
|
+
canSkipAfterStagedValidation: import_zod.z.boolean().optional()
|
|
65
|
+
});
|
|
66
|
+
const indexPrediction = import_zod.z.intersection(
|
|
67
|
+
import_finishPush.developerIndexConfig,
|
|
68
|
+
(0, import_utils.looseObject)({
|
|
69
|
+
change: indexChangePrediction,
|
|
70
|
+
needsBackfill: import_zod.z.boolean(),
|
|
71
|
+
numDocs: import_zod.z.number()
|
|
72
|
+
})
|
|
73
|
+
);
|
|
74
|
+
const discardedStagedValidator = (0, import_utils.looseObject)({
|
|
75
|
+
tableName: import_zod.z.string(),
|
|
76
|
+
state: import_zod.z.union([
|
|
77
|
+
(0, import_utils.looseObject)({
|
|
78
|
+
state: import_zod.z.literal("pending"),
|
|
79
|
+
numDocsValidated: import_zod.z.number(),
|
|
80
|
+
totalDocs: import_zod.z.number().nullable().optional()
|
|
81
|
+
}),
|
|
82
|
+
(0, import_utils.looseObject)({ state: import_zod.z.literal("valid") })
|
|
83
|
+
]),
|
|
84
|
+
replaced: import_zod.z.boolean()
|
|
85
|
+
});
|
|
86
|
+
const componentSchemaPrediction = (0, import_utils.looseObject)({
|
|
87
|
+
definitionPath: import_zod.z.string(),
|
|
88
|
+
schemaValidation: import_zod.z.boolean(),
|
|
89
|
+
tables: import_zod.z.array(tablePrediction),
|
|
90
|
+
indexes: import_zod.z.array(indexPrediction),
|
|
91
|
+
// Optional: responses from backends predating the field.
|
|
92
|
+
discardedStagedValidators: import_zod.z.array(discardedStagedValidator).optional()
|
|
93
|
+
});
|
|
94
|
+
const evaluateSchemaResponse = (0, import_utils.looseObject)({
|
|
95
|
+
componentSchemaEvaluations: import_zod.z.record(
|
|
96
|
+
import_paths.componentPath,
|
|
97
|
+
componentSchemaPrediction
|
|
98
|
+
),
|
|
99
|
+
newComponentDefinitions: import_zod.z.array(import_paths.componentDefinitionPath)
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=evaluateSchema.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/cli/lib/deployApi/evaluateSchema.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { developerIndexConfig } from \"./finishPush.js\";\nimport { looseObject } from \"./utils.js\";\n\n// Hand-mirrors `TableValidationOutcome` in\n// `crates/common/src/schemas/mod.rs` (`#[serde(rename_all = \"camelCase\")]`),\n// like the rest of this deployApi directory: there's no codegen sharing\n// types between the Rust backend and this package.\nexport const tableValidationOutcome = z.enum([\n \"notValidated\",\n \"supersetOfEnforced\",\n \"supersetOfStagedValidated\",\n \"supersetOfShape\",\n \"mustWalk\",\n]);\nexport type TableValidationOutcome = z.infer<typeof tableValidationOutcome>;\n\nexport const indexChangePrediction = z.enum([\n \"added\",\n \"identical\",\n \"enabled\",\n \"disabled\",\n \"dropped\",\n]);\nexport type IndexChangePrediction = z.infer<typeof indexChangePrediction>;\n\n// Mirrors `StagedValidatorState` in\n// `crates/application/src/deploy_config.rs`.\nexport const stagedValidatorState = z.union([\n looseObject({\n state: z.literal(\"pending\"),\n numDocsValidated: z.number(),\n totalDocs: z.number().nullable().optional(),\n }),\n looseObject({ state: z.literal(\"valid\") }),\n looseObject({ state: z.literal(\"failed\"), error: z.string() }),\n]);\nexport type StagedValidatorState = z.infer<typeof stagedValidatorState>;\n\nexport const tablePrediction = looseObject({\n name: z.string(),\n outcome: tableValidationOutcome,\n numDocs: z.number(),\n sizeBytes: z.number(),\n staged: stagedValidatorState.optional(),\n canSkipAfterStagedValidation: z.boolean().optional(),\n});\nexport type TablePrediction = z.infer<typeof tablePrediction>;\n\nexport const indexPrediction = z.intersection(\n developerIndexConfig,\n looseObject({\n change: indexChangePrediction,\n needsBackfill: z.boolean(),\n numDocs: z.number(),\n }),\n);\nexport type IndexPrediction = z.infer<typeof indexPrediction>;\n\n// Mirrors `SerializedDiscardedStagedValidator` in\n// `crates/local_backend/src/deploy_config2.rs`. The backend never discards a\n// failed validator, since a redeploy retries it anyway.\nexport const discardedStagedValidator = looseObject({\n tableName: z.string(),\n state: z.union([\n looseObject({\n state: z.literal(\"pending\"),\n numDocsValidated: z.number(),\n totalDocs: z.number().nullable().optional(),\n }),\n looseObject({ state: z.literal(\"valid\") }),\n ]),\n replaced: z.boolean(),\n});\nexport type DiscardedStagedValidator = z.infer<typeof discardedStagedValidator>;\n\nexport const componentSchemaPrediction = looseObject({\n definitionPath: z.string(),\n schemaValidation: z.boolean(),\n tables: z.array(tablePrediction),\n indexes: z.array(indexPrediction),\n // Optional: responses from backends predating the field.\n discardedStagedValidators: z.array(discardedStagedValidator).optional(),\n});\nexport type ComponentSchemaPrediction = z.infer<\n typeof componentSchemaPrediction\n>;\n\nexport const evaluateSchemaResponse = looseObject({\n componentSchemaEvaluations: z.record(\n componentPath,\n componentSchemaPrediction,\n ),\n newComponentDefinitions: z.array(componentDefinitionPath),\n});\nexport type EvaluateSchemaResponse = z.infer<typeof evaluateSchemaResponse>;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAAuD;AACvD,wBAAqC;AACrC,mBAA4B;AAMrB,MAAM,yBAAyB,aAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,wBAAwB,aAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,MAAM,uBAAuB,aAAE,MAAM;AAAA,MAC1C,0BAAY;AAAA,IACV,OAAO,aAAE,QAAQ,SAAS;AAAA,IAC1B,kBAAkB,aAAE,OAAO;AAAA,IAC3B,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,CAAC;AAAA,MACD,0BAAY,EAAE,OAAO,aAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,OAAO,aAAE,QAAQ,QAAQ,GAAG,OAAO,aAAE,OAAO,EAAE,CAAC;AAC/D,CAAC;AAGM,MAAM,sBAAkB,0BAAY;AAAA,EACzC,MAAM,aAAE,OAAO;AAAA,EACf,SAAS;AAAA,EACT,SAAS,aAAE,OAAO;AAAA,EAClB,WAAW,aAAE,OAAO;AAAA,EACpB,QAAQ,qBAAqB,SAAS;AAAA,EACtC,8BAA8B,aAAE,QAAQ,EAAE,SAAS;AACrD,CAAC;AAGM,MAAM,kBAAkB,aAAE;AAAA,EAC/B;AAAA,MACA,0BAAY;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,aAAE,QAAQ;AAAA,IACzB,SAAS,aAAE,OAAO;AAAA,EACpB,CAAC;AACH;AAMO,MAAM,+BAA2B,0BAAY;AAAA,EAClD,WAAW,aAAE,OAAO;AAAA,EACpB,OAAO,aAAE,MAAM;AAAA,QACb,0BAAY;AAAA,MACV,OAAO,aAAE,QAAQ,SAAS;AAAA,MAC1B,kBAAkB,aAAE,OAAO;AAAA,MAC3B,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC5C,CAAC;AAAA,QACD,0BAAY,EAAE,OAAO,aAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EAC3C,CAAC;AAAA,EACD,UAAU,aAAE,QAAQ;AACtB,CAAC;AAGM,MAAM,gCAA4B,0BAAY;AAAA,EACnD,gBAAgB,aAAE,OAAO;AAAA,EACzB,kBAAkB,aAAE,QAAQ;AAAA,EAC5B,QAAQ,aAAE,MAAM,eAAe;AAAA,EAC/B,SAAS,aAAE,MAAM,eAAe;AAAA;AAAA,EAEhC,2BAA2B,aAAE,MAAM,wBAAwB,EAAE,SAAS;AACxE,CAAC;AAKM,MAAM,6BAAyB,0BAAY;AAAA,EAChD,4BAA4B,aAAE;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACA,yBAAyB,aAAE,MAAM,oCAAuB;AAC1D,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -23,6 +23,7 @@ __export(finishPush_exports, {
|
|
|
23
23
|
componentDiff: () => componentDiff,
|
|
24
24
|
componentDiffType: () => componentDiffType,
|
|
25
25
|
cronDiff: () => cronDiff,
|
|
26
|
+
developerIndexConfig: () => developerIndexConfig,
|
|
26
27
|
finishPushDiff: () => finishPushDiff,
|
|
27
28
|
indexDiff: () => indexDiff,
|
|
28
29
|
moduleDiff: () => moduleDiff,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/deployApi/finishPush.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nexport const authDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type AuthDiff = z.infer<typeof authDiff>;\n\nexport const componentDefinitionDiff = looseObject({});\nexport type ComponentDefinitionDiff = z.infer<typeof componentDefinitionDiff>;\n\nexport const componentDiffType = z.discriminatedUnion(\"type\", [\n looseObject({\n type: z.literal(\"create\"),\n }),\n looseObject({\n type: z.literal(\"modify\"),\n }),\n looseObject({\n type: z.literal(\"unmount\"),\n }),\n looseObject({\n type: z.literal(\"remount\"),\n }),\n]);\nexport type ComponentDiffType = z.infer<typeof componentDiffType>;\n\nexport const moduleDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type ModuleDiff = z.infer<typeof moduleDiff>;\n\nexport const udfConfigDiff = looseObject({\n previous_version: z.string(),\n next_version: z.string(),\n});\nexport type UdfConfigDiff = z.infer<typeof udfConfigDiff>;\n\nexport const cronDiff = looseObject({\n added: z.array(z.string()),\n updated: z.array(z.string()),\n deleted: z.array(z.string()),\n});\nexport type CronDiff = z.infer<typeof cronDiff>;\n\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAA4B;AAErB,MAAM,eAAW,0BAAY;AAAA,EAClC,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EACzB,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAC7B,CAAC;AAGM,MAAM,8BAA0B,0BAAY,CAAC,CAAC;AAG9C,MAAM,oBAAoB,aAAE,mBAAmB,QAAQ;AAAA,MAC5D,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,SAAS;AAAA,EAC3B,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,SAAS;AAAA,EAC3B,CAAC;AACH,CAAC;AAGM,MAAM,iBAAa,0BAAY;AAAA,EACpC,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EACzB,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAC7B,CAAC;AAGM,MAAM,oBAAgB,0BAAY;AAAA,EACvC,kBAAkB,aAAE,OAAO;AAAA,EAC3B,cAAc,aAAE,OAAO;AACzB,CAAC;AAGM,MAAM,eAAW,0BAAY;AAAA,EAClC,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EACzB,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EAC3B,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAC7B,CAAC;
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nexport const authDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type AuthDiff = z.infer<typeof authDiff>;\n\nexport const componentDefinitionDiff = looseObject({});\nexport type ComponentDefinitionDiff = z.infer<typeof componentDefinitionDiff>;\n\nexport const componentDiffType = z.discriminatedUnion(\"type\", [\n looseObject({\n type: z.literal(\"create\"),\n }),\n looseObject({\n type: z.literal(\"modify\"),\n }),\n looseObject({\n type: z.literal(\"unmount\"),\n }),\n looseObject({\n type: z.literal(\"remount\"),\n }),\n]);\nexport type ComponentDiffType = z.infer<typeof componentDiffType>;\n\nexport const moduleDiff = looseObject({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n});\nexport type ModuleDiff = z.infer<typeof moduleDiff>;\n\nexport const udfConfigDiff = looseObject({\n previous_version: z.string(),\n next_version: z.string(),\n});\nexport type UdfConfigDiff = z.infer<typeof udfConfigDiff>;\n\nexport const cronDiff = looseObject({\n added: z.array(z.string()),\n updated: z.array(z.string()),\n deleted: z.array(z.string()),\n});\nexport type CronDiff = z.infer<typeof cronDiff>;\n\nexport const developerIndexConfig = z.intersection(\n z.discriminatedUnion(\"type\", [\n looseObject({\n name: z.string(),\n type: z.literal(\"database\"),\n fields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"search\"),\n searchField: z.string(),\n filterFields: z.array(z.string()),\n }),\n looseObject({\n name: z.string(),\n type: z.literal(\"vector\"),\n dimensions: z.number(),\n vectorField: z.string(),\n filterFields: z.array(z.string()),\n }),\n ]),\n z.object({ staged: z.boolean().optional() }),\n);\nexport type DeveloperIndexConfig = z.infer<typeof developerIndexConfig>;\n\nexport const indexDiff = looseObject({\n added_indexes: z.array(developerIndexConfig),\n removed_indexes: z.array(developerIndexConfig),\n enabled_indexes: z.array(developerIndexConfig).optional(),\n disabled_indexes: z.array(developerIndexConfig).optional(),\n});\nexport type IndexDiff = z.infer<typeof indexDiff>;\n\nexport const schemaDiff = looseObject({\n previous_schema: z.nullable(z.string()),\n next_schema: z.nullable(z.string()),\n});\nexport type SchemaDiff = z.infer<typeof schemaDiff>;\n\nexport const componentDiff = looseObject({\n diffType: componentDiffType,\n moduleDiff,\n udfConfigDiff: z.nullable(udfConfigDiff),\n cronDiff,\n indexDiff,\n schemaDiff: z.nullable(schemaDiff),\n});\nexport type ComponentDiff = z.infer<typeof componentDiff>;\n\nexport const finishPushDiff = looseObject({\n authDiff,\n definitionDiffs: z.record(z.string(), componentDefinitionDiff),\n componentDiffs: z.record(z.string(), componentDiff),\n});\nexport type FinishPushDiff = z.infer<typeof finishPushDiff>;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -47,7 +47,7 @@ const startPushRequest = (0, import_utils.looseObject)({
|
|
|
47
47
|
const schemaChange = (0, import_utils.looseObject)({
|
|
48
48
|
allocatedComponentIds: import_zod.z.any(),
|
|
49
49
|
schemaIds: import_zod.z.any(),
|
|
50
|
-
indexDiffs: import_zod.z.record(import_paths.
|
|
50
|
+
indexDiffs: import_zod.z.record(import_paths.componentPath, import_finishPush.indexDiff).optional()
|
|
51
51
|
});
|
|
52
52
|
const startPushResponse = (0, import_utils.looseObject)({
|
|
53
53
|
environmentVariables: import_zod.z.record(import_zod.z.string(), import_zod.z.string()),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/deployApi/startPush.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { nodeDependency, sourcePackage } from \"./modules.js\";\nimport { checkedComponent } from \"./checkedComponent.js\";\nimport { evaluatedComponentDefinition } from \"./componentDefinition.js\";\nimport {\n appDefinitionConfig,\n componentDefinitionConfig,\n} from \"./definitionConfig.js\";\nimport { authInfo } from \"./types.js\";\nimport { looseObject } from \"./utils.js\";\nimport { indexDiff } from \"./finishPush.js\";\n\nexport const startPushRequest = looseObject({\n adminKey: z.string(),\n dryRun: z.boolean(),\n\n functions: z.string(),\n\n appDefinition: appDefinitionConfig,\n componentDefinitions: z.array(componentDefinitionConfig),\n\n nodeDependencies: z.array(nodeDependency),\n\n nodeVersion: z.optional(z.string()),\n});\nexport type StartPushRequest = z.infer<typeof startPushRequest>;\n\nexport const schemaChange = looseObject({\n allocatedComponentIds: z.any(),\n schemaIds: z.any(),\n indexDiffs: z.record(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAAuD;AACvD,qBAA8C;AAC9C,8BAAiC;AACjC,iCAA6C;AAC7C,8BAGO;AACP,mBAAyB;AACzB,mBAA4B;AAC5B,wBAA0B;AAEnB,MAAM,uBAAmB,0BAAY;AAAA,EAC1C,UAAU,aAAE,OAAO;AAAA,EACnB,QAAQ,aAAE,QAAQ;AAAA,EAElB,WAAW,aAAE,OAAO;AAAA,EAEpB,eAAe;AAAA,EACf,sBAAsB,aAAE,MAAM,iDAAyB;AAAA,EAEvD,kBAAkB,aAAE,MAAM,6BAAc;AAAA,EAExC,aAAa,aAAE,SAAS,aAAE,OAAO,CAAC;AACpC,CAAC;AAGM,MAAM,mBAAe,0BAAY;AAAA,EACtC,uBAAuB,aAAE,IAAI;AAAA,EAC7B,WAAW,aAAE,IAAI;AAAA,EACjB,YAAY,aAAE,OAAO,
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { componentDefinitionPath, componentPath } from \"./paths.js\";\nimport { nodeDependency, sourcePackage } from \"./modules.js\";\nimport { checkedComponent } from \"./checkedComponent.js\";\nimport { evaluatedComponentDefinition } from \"./componentDefinition.js\";\nimport {\n appDefinitionConfig,\n componentDefinitionConfig,\n} from \"./definitionConfig.js\";\nimport { authInfo } from \"./types.js\";\nimport { looseObject } from \"./utils.js\";\nimport { indexDiff } from \"./finishPush.js\";\n\nexport const startPushRequest = looseObject({\n adminKey: z.string(),\n dryRun: z.boolean(),\n\n functions: z.string(),\n\n appDefinition: appDefinitionConfig,\n componentDefinitions: z.array(componentDefinitionConfig),\n\n nodeDependencies: z.array(nodeDependency),\n\n nodeVersion: z.optional(z.string()),\n});\nexport type StartPushRequest = z.infer<typeof startPushRequest>;\n\nexport const schemaChange = looseObject({\n allocatedComponentIds: z.any(),\n schemaIds: z.any(),\n indexDiffs: z.record(componentPath, indexDiff).optional(),\n});\nexport type SchemaChange = z.infer<typeof schemaChange>;\n\nexport const startPushResponse = looseObject({\n environmentVariables: z.record(z.string(), z.string()),\n\n externalDepsId: z.nullable(z.string()),\n componentDefinitionPackages: z.record(componentDefinitionPath, sourcePackage),\n\n appAuth: z.array(authInfo),\n analysis: z.record(componentDefinitionPath, evaluatedComponentDefinition),\n\n app: checkedComponent,\n\n schemaChange,\n});\nexport type StartPushResponse = z.infer<typeof startPushResponse>;\n\nexport const evaluatePushResponse = looseObject({\n schemaChange,\n});\nexport type EvaluatePushResponse = z.infer<typeof evaluatePushResponse>;\n\nexport const componentSchemaStatus = looseObject({\n schemaValidationComplete: z.boolean(),\n indexesComplete: z.number(),\n indexesTotal: z.number(),\n});\nexport type ComponentSchemaStatus = z.infer<typeof componentSchemaStatus>;\n\nexport const schemaStatus = z.union([\n looseObject({\n type: z.literal(\"inProgress\"),\n components: z.record(componentPath, componentSchemaStatus),\n }),\n looseObject({\n type: z.literal(\"failed\"),\n error: z.string(),\n componentPath,\n tableName: z.nullable(z.string()),\n }),\n looseObject({\n type: z.literal(\"raceDetected\"),\n }),\n looseObject({\n type: z.literal(\"complete\"),\n }),\n]);\nexport type SchemaStatus = z.infer<typeof schemaStatus>;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAAuD;AACvD,qBAA8C;AAC9C,8BAAiC;AACjC,iCAA6C;AAC7C,8BAGO;AACP,mBAAyB;AACzB,mBAA4B;AAC5B,wBAA0B;AAEnB,MAAM,uBAAmB,0BAAY;AAAA,EAC1C,UAAU,aAAE,OAAO;AAAA,EACnB,QAAQ,aAAE,QAAQ;AAAA,EAElB,WAAW,aAAE,OAAO;AAAA,EAEpB,eAAe;AAAA,EACf,sBAAsB,aAAE,MAAM,iDAAyB;AAAA,EAEvD,kBAAkB,aAAE,MAAM,6BAAc;AAAA,EAExC,aAAa,aAAE,SAAS,aAAE,OAAO,CAAC;AACpC,CAAC;AAGM,MAAM,mBAAe,0BAAY;AAAA,EACtC,uBAAuB,aAAE,IAAI;AAAA,EAC7B,WAAW,aAAE,IAAI;AAAA,EACjB,YAAY,aAAE,OAAO,4BAAe,2BAAS,EAAE,SAAS;AAC1D,CAAC;AAGM,MAAM,wBAAoB,0BAAY;AAAA,EAC3C,sBAAsB,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,OAAO,CAAC;AAAA,EAErD,gBAAgB,aAAE,SAAS,aAAE,OAAO,CAAC;AAAA,EACrC,6BAA6B,aAAE,OAAO,sCAAyB,4BAAa;AAAA,EAE5E,SAAS,aAAE,MAAM,qBAAQ;AAAA,EACzB,UAAU,aAAE,OAAO,sCAAyB,uDAA4B;AAAA,EAExE,KAAK;AAAA,EAEL;AACF,CAAC;AAGM,MAAM,2BAAuB,0BAAY;AAAA,EAC9C;AACF,CAAC;AAGM,MAAM,4BAAwB,0BAAY;AAAA,EAC/C,0BAA0B,aAAE,QAAQ;AAAA,EACpC,iBAAiB,aAAE,OAAO;AAAA,EAC1B,cAAc,aAAE,OAAO;AACzB,CAAC;AAGM,MAAM,eAAe,aAAE,MAAM;AAAA,MAClC,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,YAAY;AAAA,IAC5B,YAAY,aAAE,OAAO,4BAAe,qBAAqB;AAAA,EAC3D,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,IACxB,OAAO,aAAE,OAAO;AAAA,IAChB;AAAA,IACA,WAAW,aAAE,SAAS,aAAE,OAAO,CAAC;AAAA,EAClC,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,cAAc;AAAA,EAChC,CAAC;AAAA,MACD,0BAAY;AAAA,IACV,MAAM,aAAE,QAAQ,UAAU;AAAA,EAC5B,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/cli/lib/dev.js
CHANGED
|
@@ -119,6 +119,12 @@ async function devAgainstDeployment(ctx, credentials, devOptions) {
|
|
|
119
119
|
// Pass logManager to control logs during deploy
|
|
120
120
|
largeIndexDeletionCheck: "no verification",
|
|
121
121
|
// `convex dev` can’t push to prod
|
|
122
|
+
// `convex dev --prod` pushes straight to production, where an
|
|
123
|
+
// unstaged index on a large table blocks the push for the whole
|
|
124
|
+
// backfill; dev deployments are small enough to let it through.
|
|
125
|
+
largeIndexBackfillCheck: credentials.deploymentType === "prod" ? "ask for confirmation" : "no verification",
|
|
126
|
+
stagedValidatorDeletionCheck: credentials.deploymentType === "prod" ? devOptions.allowUnstagingSchema ? "has confirmation" : "ask for confirmation" : "no verification",
|
|
127
|
+
warnOnSlowSchemaValidation: true,
|
|
122
128
|
message: null
|
|
123
129
|
},
|
|
124
130
|
devOptions
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/dev.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\nimport { handleDashboard } from \"./localDeployment/dashboard.js\";\nimport { loadDeploymentConfig } from \"./localDeployment/filePaths.js\";\nimport { LocalDeploymentError } from \"./localDeployment/errors.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n backendVersion?: string | undefined;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.\n if (\n !devOptions.once &&\n !devOptions.untilSuccess &&\n credentials.deploymentType === \"anonymous\" &&\n credentials.deploymentName !== null\n ) {\n const deploymentConfig = loadDeploymentConfig(\n ctx,\n \"anonymous\",\n credentials.deploymentName,\n );\n if (deploymentConfig === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find local deployment config. This is a bug in Convex.`,\n errForSentry: new LocalDeploymentError(\n `Could not find local deployment config to start the anonymous dashboard.`,\n ),\n });\n }\n await handleDashboard(\n ctx,\n {\n name: credentials.deploymentName,\n cloudPort: deploymentConfig.ports.cloud,\n adminKey: deploymentConfig.adminKey,\n },\n {\n backendVersion: credentials.backendVersion,\n },\n );\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,2BAAoC;AAEpC,iBAQO;AACP,wBAAwB;AACxB,wBAA4B;AAC5B,kBAAiB;AACjB,kBAA+C;AAE/C,mBAKO;AACP,mBAA6C;AAC7C,iBAA6C;AAG7C,oBAAoD;AACpD,oBAGO;AACP,uBAAgC;AAChC,uBAAqC;AACrC,oBAAqC;AAErC,eAAsB,qBACpB,KACA,aAOA,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { OneoffCtx } from \"../../bundler/context.js\";\nimport {\n logError,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n showSpinnerIfSlow,\n stopSpinner,\n} from \"../../bundler/log.js\";\nimport { runPush } from \"./components.js\";\nimport { performance } from \"perf_hooks\";\nimport path from \"path\";\nimport { LogManager, LogMode, watchLogs } from \"./logs.js\";\nimport { PushOptions } from \"./components.js\";\nimport {\n formatDuration,\n getCurrentTimeString,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport { Crash, WatchContext, Watcher } from \"./watch.js\";\nimport { runFunctionAndLog, subscribe } from \"./run.js\";\nimport { Value } from \"../../values/index.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./config.js\";\nimport {\n syncAuthKitConfigAfterPush,\n ensureAuthKitProvisionedBeforeBuild,\n} from \"./workos/workos.js\";\nimport { handleDashboard } from \"./localDeployment/dashboard.js\";\nimport { loadDeploymentConfig } from \"./localDeployment/filePaths.js\";\nimport { LocalDeploymentError } from \"./localDeployment/errors.js\";\n\nexport async function devAgainstDeployment(\n ctx: OneoffCtx,\n credentials: {\n url: string;\n adminKey: string;\n deploymentName: string | null;\n deploymentType?: DeploymentType;\n backendVersion?: string | undefined;\n },\n devOptions: {\n verbose: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n once: boolean;\n untilSuccess: boolean;\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n tailLogs: LogMode;\n traceEvents: boolean;\n debugBundlePath?: string | undefined;\n debugNodeApis: boolean;\n liveComponentSources: boolean;\n pushAllModules: boolean;\n allowUnstagingSchema: boolean;\n },\n) {\n const logManager = new LogManager(devOptions.tailLogs);\n\n // Pre-flight check: Ensure AuthKit is provisioned before starting dev\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && credentials.deploymentName) {\n // Only provision for cloud deployments (dev/preview/prod)\n // Skip for local and anonymous deployments\n const deploymentType = credentials.deploymentType;\n if (\n deploymentType === \"dev\" ||\n deploymentType === \"preview\" ||\n deploymentType === \"prod\"\n ) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n credentials.deploymentName,\n { deploymentUrl: credentials.url, adminKey: credentials.adminKey },\n deploymentType,\n );\n }\n }\n\n // Anonymous mode starts a local dashboard server alongside long-running `npx convex dev` commands.\n if (\n !devOptions.once &&\n !devOptions.untilSuccess &&\n credentials.deploymentType === \"anonymous\" &&\n credentials.deploymentName !== null\n ) {\n const deploymentConfig = loadDeploymentConfig(\n ctx,\n \"anonymous\",\n credentials.deploymentName,\n );\n if (deploymentConfig === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find local deployment config. This is a bug in Convex.`,\n errForSentry: new LocalDeploymentError(\n `Could not find local deployment config to start the anonymous dashboard.`,\n ),\n });\n }\n await handleDashboard(\n ctx,\n {\n name: credentials.deploymentName,\n cloudPort: deploymentConfig.ports.cloud,\n adminKey: deploymentConfig.adminKey,\n },\n {\n backendVersion: credentials.backendVersion,\n },\n );\n }\n\n const promises = [];\n if (devOptions.tailLogs !== \"disable\") {\n promises.push(\n watchLogs(ctx, credentials.url, credentials.adminKey, \"stderr\", {\n logManager,\n success: false,\n }),\n );\n }\n\n promises.push(\n watchAndPush(\n ctx,\n {\n ...credentials,\n verbose: devOptions.verbose,\n dryRun: false,\n typecheck: devOptions.typecheck,\n typecheckComponents: devOptions.typecheckComponents,\n debug: false,\n debugBundlePath: devOptions.debugBundlePath,\n debugNodeApis: devOptions.debugNodeApis,\n codegen: devOptions.codegen,\n liveComponentSources: devOptions.liveComponentSources,\n pushAllModules: devOptions.pushAllModules,\n logManager, // Pass logManager to control logs during deploy\n largeIndexDeletionCheck: \"no verification\", // `convex dev` can\u2019t push to prod\n // `convex dev --prod` pushes straight to production, where an\n // unstaged index on a large table blocks the push for the whole\n // backfill; dev deployments are small enough to let it through.\n largeIndexBackfillCheck:\n credentials.deploymentType === \"prod\"\n ? \"ask for confirmation\"\n : \"no verification\",\n stagedValidatorDeletionCheck:\n credentials.deploymentType === \"prod\"\n ? devOptions.allowUnstagingSchema\n ? \"has confirmation\"\n : \"ask for confirmation\"\n : \"no verification\",\n warnOnSlowSchemaValidation: true,\n message: null,\n },\n devOptions,\n ),\n );\n await Promise.race(promises);\n await ctx.flushAndExit(0);\n}\n\nexport async function watchAndPush(\n outerCtx: OneoffCtx,\n options: PushOptions,\n cmdOptions: {\n run?:\n | { kind: \"function\"; name: string; component?: string | undefined }\n | { kind: \"shell\"; command: string }\n | undefined;\n once: boolean;\n untilSuccess: boolean;\n traceEvents: boolean;\n },\n) {\n const watch: { watcher: Watcher | undefined } = { watcher: undefined };\n const authKitCache: { lastAppliedConfig: string | undefined } = {\n lastAppliedConfig: undefined,\n };\n let numFailures = 0;\n let ran = false;\n let pushed = false;\n let shellChild: ChildProcess | undefined;\n let shellExited: Promise<void> | undefined;\n let shellCleanupHandle: string | undefined;\n let shellSigintListener: (() => void) | undefined;\n let tableNameTriggeringRetry;\n let shouldRetryOnDeploymentEnvVarChange;\n let isFirstPush = true; // Track if this is the first push in the session\n\n try {\n while (true) {\n const start = performance.now();\n tableNameTriggeringRetry = null;\n shouldRetryOnDeploymentEnvVarChange = false;\n\n const ctx = new WatchContext(\n cmdOptions.traceEvents,\n outerCtx.bigBrainAuth(),\n isFirstPush,\n );\n options.logManager?.beginDeploy();\n showSpinner(\"Preparing Convex functions...\");\n try {\n await runPush(ctx, options);\n const end = performance.now();\n // NOTE: If `runPush` throws, `endDeploy` will not be called.\n // This allows you to see the output from the failed deploy without\n // logs getting in the way.\n options.logManager?.endDeploy();\n numFailures = 0;\n logFinishedStep(\n `${getCurrentTimeString()} Convex functions ready! (${formatDuration(\n end - start,\n )})`,\n );\n\n // Sync AuthKit configuration if it has changed\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n // Check if config has changed by comparing stringified versions\n const currentConfigString = authKitConfig\n ? JSON.stringify(authKitConfig)\n : undefined;\n\n // Skip sync on first push since ensureAuthKitProvisionedBeforeBuild already configured WorkOS\n if (\n !isFirstPush &&\n currentConfigString !== authKitCache.lastAppliedConfig\n ) {\n // Config has changed, sync it\n await syncAuthKitConfigAfterPush(ctx, projectConfig, {\n deploymentUrl: options.url,\n adminKey: options.adminKey,\n });\n }\n\n // Always update cache after push (even if we skipped sync)\n authKitCache.lastAppliedConfig = currentConfigString;\n isFirstPush = false;\n if (cmdOptions.run !== undefined && !ran) {\n switch (cmdOptions.run.kind) {\n case \"function\":\n await runFunctionInDev(\n ctx,\n options,\n cmdOptions.run.name,\n cmdOptions.run.component,\n );\n break;\n case \"shell\": {\n // Spawn the shell command as a long-running child process,\n // piping stdin/stdout/stderr. It runs alongside dev and is\n // waited on during clean exit or killed on signal exit.\n const shellCommand = cmdOptions.run.command;\n const signalShellChild = (signal: NodeJS.Signals) => {\n if (!shellChild) {\n return;\n }\n const child = shellChild;\n // Kill the entire process group so children of the shell\n // are also killed.\n try {\n if (child.pid !== undefined) {\n // Kill the negative PID to signal the entire process\n // group. Falls back to the child directly if the\n // group is already gone.\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n } else {\n child.kill(signal);\n }\n } catch {\n // Child may already be dead.\n }\n };\n const clearShellSigintListener = () => {\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n };\n shellChild = spawn(shellCommand, [], {\n shell: true,\n stdio: \"inherit\",\n detached: true,\n });\n shellSigintListener = () => {\n clearShellSigintListener();\n signalShellChild(\"SIGINT\");\n };\n process.prependListener(\"SIGINT\", shellSigintListener);\n shellCleanupHandle = outerCtx.registerCleanup(async () => {\n if (shellSigintListener) {\n clearShellSigintListener();\n } else {\n // If the listener already fired (and cleared itself),\n // the child got SIGINT \u2014 give it a moment to exit on\n // its own before escalating to SIGTERM.\n const SIGTERM_ESCALATION_MS = 1000;\n await Promise.race([\n shellExited,\n new Promise((resolve) =>\n setTimeout(resolve, SIGTERM_ESCALATION_MS),\n ),\n ]);\n }\n if (shellChild) {\n signalShellChild(\"SIGTERM\");\n }\n await shellExited;\n });\n shellExited = new Promise<void>((resolve) => {\n shellChild!.on(\"error\", (error) => {\n logError(\n `Failed to run command \\`${shellCommand}\\`: ${error.message}`,\n );\n shellChild = undefined;\n resolve();\n void outerCtx.flushAndExit(1);\n });\n shellChild!.on(\"exit\", (code, signal) => {\n shellChild = undefined;\n resolve();\n // If killed by a signal (e.g. from cleanup on shutdown),\n // don't treat it as a failure \u2014 convex dev is already\n // shutting down.\n if (signal) {\n return;\n }\n if (code !== null && code !== 0) {\n logError(\n `Command \\`${shellCommand}\\` exited with code ${code}`,\n );\n void outerCtx.flushAndExit(1);\n }\n });\n });\n break;\n }\n default: {\n cmdOptions.run satisfies never;\n // Don't return this since it'll bypass the `catch` below.\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected arguments for --run`,\n errForSentry: `Unexpected arguments for --run: ${JSON.stringify(\n cmdOptions.run,\n )}`,\n });\n }\n }\n ran = true;\n }\n pushed = true;\n } catch (e: any) {\n // Crash the app on unexpected errors.\n if (!(e instanceof Crash) || !e.errorType) {\n // eslint-disable-next-line no-restricted-syntax\n throw e;\n }\n if (e.errorType === \"fatal\") {\n break;\n }\n // Retry after an exponential backoff if we hit a transient error.\n if (e.errorType === \"transient\" || e.errorType === \"already handled\") {\n const delay = nextBackoff(numFailures);\n numFailures += 1;\n if (e.errorType === \"transient\") {\n logWarning(\n chalkStderr.yellow(\n `Failed due to network error, retrying in ${formatDuration(\n delay,\n )}...`,\n ),\n );\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n // Fall through if we had a filesystem-based error.\n // TODO(sarah): Replace this with `logError`.\n // eslint-disable-next-line no-console\n console.assert(\n e.errorType === \"invalid filesystem data\" ||\n e.errorType === \"invalid filesystem or env vars\" ||\n e.errorType[\"invalid filesystem or db data\"] !== undefined,\n );\n if (e.errorType === \"invalid filesystem or env vars\") {\n shouldRetryOnDeploymentEnvVarChange = true;\n } else if (\n e.errorType !== \"invalid filesystem data\" &&\n e.errorType[\"invalid filesystem or db data\"] !== undefined\n ) {\n tableNameTriggeringRetry =\n e.errorType[\"invalid filesystem or db data\"];\n }\n if (cmdOptions.once) {\n await outerCtx.flushAndExit(1, e.errorType);\n }\n // Make sure that we don't spin if this push failed\n // in any edge cases that didn't call `logFailure`\n // before throwing.\n stopSpinner();\n }\n if (cmdOptions.once) {\n return;\n }\n if (pushed && cmdOptions.untilSuccess) {\n return;\n }\n const fileSystemWatch = getFileSystemWatch(ctx, watch, cmdOptions);\n const tableWatch = getTableWatch(\n ctx,\n options,\n tableNameTriggeringRetry?.tableName ?? null,\n tableNameTriggeringRetry?.componentPath,\n );\n const envVarWatch = getDeplymentEnvVarWatch(\n ctx,\n options,\n shouldRetryOnDeploymentEnvVarChange,\n );\n await Promise.race([\n fileSystemWatch.watch(),\n tableWatch.watch(),\n envVarWatch.watch(),\n ]);\n fileSystemWatch.stop();\n void tableWatch.stop();\n void envVarWatch.stop();\n }\n } finally {\n // On clean exit (e.g. --once, --until-success), wait for the shell\n // command to finish naturally. Keep the SIGINT listener active so\n // Ctrl+C during the wait still forwards to the child. On signal\n // exit (e.g. Ctrl+C), the registered cleanup handler will have\n // already killed it.\n if (shellExited) {\n await shellExited;\n }\n if (shellSigintListener) {\n process.off(\"SIGINT\", shellSigintListener);\n shellSigintListener = undefined;\n }\n if (shellCleanupHandle) {\n outerCtx.removeCleanup(shellCleanupHandle);\n }\n }\n}\n\nasync function runFunctionInDev(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n functionName: string,\n componentPath: string | undefined,\n) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n functionName,\n argsString: \"{}\",\n componentPath,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${functionName}\"`);\n },\n },\n });\n}\n\nfunction getTableWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n tableName: string | null,\n componentPath: string | undefined,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryTable\",\n getArgs: () => (tableName !== null ? { tableName } : null),\n componentPath,\n });\n}\n\nfunction getDeplymentEnvVarWatch(\n ctx: WatchContext,\n credentials: {\n url: string;\n adminKey: string;\n },\n shouldRetryOnDeploymentEnvVarChange: boolean,\n) {\n return getFunctionWatch(ctx, {\n deploymentUrl: credentials.url,\n adminKey: credentials.adminKey,\n parsedFunctionName: \"_system/cli/queryEnvironmentVariables\",\n getArgs: () => (shouldRetryOnDeploymentEnvVarChange ? {} : null),\n componentPath: undefined,\n });\n}\n\nfunction getFunctionWatch(\n ctx: WatchContext,\n args: {\n deploymentUrl: string;\n adminKey: string;\n parsedFunctionName: string;\n getArgs: () => Record<string, Value> | null;\n componentPath: string | undefined;\n },\n) {\n const [stopPromise, stop] = waitUntilCalled();\n return {\n watch: async () => {\n const functionArgs = args.getArgs();\n if (functionArgs === null) {\n return waitForever();\n }\n let changes = 0;\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n parsedFunctionName: args.parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: stopPromise,\n callbacks: {\n onChange: () => {\n changes++;\n // First bump is just the initial results reporting\n if (changes > 1) {\n stop();\n }\n },\n },\n });\n },\n stop: () => {\n stop();\n },\n };\n}\n\nfunction getFileSystemWatch(\n ctx: WatchContext,\n watch: { watcher: Watcher | undefined },\n cmdOptions: { traceEvents: boolean },\n) {\n let hasStopped = false;\n return {\n watch: async () => {\n const observations = ctx.fs.finalize();\n if (observations === \"invalidated\") {\n logMessage(\"Filesystem changed during push, retrying...\");\n return;\n }\n // Initialize the watcher if we haven't done it already. Chokidar expects to have a\n // nonempty watch set at initialization, so we can't do it before running our first\n // push.\n if (!watch.watcher) {\n watch.watcher = new Watcher(observations);\n await showSpinnerIfSlow(\n \"Preparing to watch files...\",\n 500,\n async () => {\n await watch.watcher!.ready();\n },\n );\n stopSpinner();\n }\n // Watch new directories if needed.\n watch.watcher.update(observations);\n\n // Process events until we find one that overlaps with our previous observations.\n let anyChanges = false;\n do {\n await watch.watcher.waitForEvent();\n if (hasStopped) {\n return;\n }\n for (const event of watch.watcher.drainEvents()) {\n if (cmdOptions.traceEvents) {\n logMessage(\n \"Processing\",\n event.name,\n path.relative(\"\", event.absPath),\n );\n }\n const result = observations.overlaps(event);\n if (result.overlaps) {\n const relPath = path.relative(\"\", event.absPath);\n if (cmdOptions.traceEvents) {\n logMessage(`${relPath} ${result.reason}, rebuilding...`);\n }\n anyChanges = true;\n break;\n }\n }\n } while (!anyChanges);\n\n // Wait for the filesystem to quiesce before starting a new push. It's okay to\n // drop filesystem events at this stage since we're already committed to doing\n // a push and resubscribing based on that push's observations.\n let deadline = performance.now() + quiescenceDelay;\n while (true) {\n const now = performance.now();\n if (now >= deadline) {\n break;\n }\n const remaining = deadline - now;\n if (cmdOptions.traceEvents) {\n logMessage(`Waiting for ${formatDuration(remaining)} to quiesce...`);\n }\n const remainingWait = new Promise<\"timeout\">((resolve) =>\n setTimeout(() => resolve(\"timeout\"), deadline - now),\n );\n const result = await Promise.race([\n remainingWait,\n watch.watcher.waitForEvent().then<\"newEvents\">(() => \"newEvents\"),\n ]);\n if (result === \"newEvents\") {\n for (const event of watch.watcher.drainEvents()) {\n const result = observations.overlaps(event);\n // Delay another `quiescenceDelay` since we had an overlapping event.\n if (result.overlaps) {\n if (cmdOptions.traceEvents) {\n logMessage(\n `Received an overlapping event at ${event.absPath}, delaying push.`,\n );\n }\n deadline = performance.now() + quiescenceDelay;\n }\n }\n } else {\n // Let the check above `break` from the loop if we're past our deadlne.\n if (result !== \"timeout\") {\n logError(\n \"Assertion failed: Unexpected result from watcher: \" + result,\n );\n }\n }\n }\n },\n stop: () => {\n hasStopped = true;\n },\n };\n}\n\nconst initialBackoff = 500;\nconst maxBackoff = 16000;\nconst quiescenceDelay = 500;\n\nexport function nextBackoff(prevFailures: number): number {\n const baseBackoff = initialBackoff * Math.pow(2, prevFailures);\n const actualBackoff = Math.min(baseBackoff, maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "result"]
|
|
7
7
|
}
|