convex 1.44.0 → 1.45.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 +13 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/convexExport.js +1 -1
- package/dist/cjs/cli/convexExport.js.map +1 -1
- package/dist/cjs/cli/index.js +2 -32
- package/dist/cjs/cli/index.js.map +2 -2
- package/dist/cjs/cli/lib/api.js +11 -5
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/convexExport.js +12 -1
- package/dist/cjs/cli/lib/convexExport.js.map +2 -2
- package/dist/cjs/cli/lib/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/indexes.js +1 -1
- package/dist/cjs/cli/lib/indexes.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +23 -188
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/cjs/cli/lib/mcp/tools/index.js.map +1 -1
- package/dist/cjs/cli/mcp.js +76 -69
- package/dist/cjs/cli/mcp.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/impl/actions_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/convexExport.d.ts +1 -0
- package/dist/cjs-types/cli/lib/convexExport.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dashboard.d.ts.map +1 -1
- 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/upgrade.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/mcp.d.ts +3 -0
- package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/server/impl/actions_impl.d.ts +14 -0
- package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +31210 -25495
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/convexExport.js +1 -1
- package/dist/esm/cli/convexExport.js.map +1 -1
- package/dist/esm/cli/index.js +2 -32
- package/dist/esm/cli/index.js.map +2 -2
- package/dist/esm/cli/lib/api.js +11 -5
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/convexExport.js +16 -3
- package/dist/esm/cli/lib/convexExport.js.map +2 -2
- package/dist/esm/cli/lib/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/indexes.js +1 -1
- package/dist/esm/cli/lib/indexes.js.map +1 -1
- package/dist/esm/cli/lib/localDeployment/upgrade.js +22 -190
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/index.js.map +1 -1
- package/dist/esm/cli/mcp.js +75 -72
- package/dist/esm/cli/mcp.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/impl/actions_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/convexExport.d.ts +1 -0
- package/dist/esm-types/cli/lib/convexExport.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dashboard.d.ts.map +1 -1
- 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/upgrade.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/index.d.ts +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
- package/dist/esm-types/cli/mcp.d.ts +3 -0
- package/dist/esm-types/cli/mcp.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/server/impl/actions_impl.d.ts +14 -0
- package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +3 -3
- package/src/cli/convexExport.ts +1 -1
- package/src/cli/index.ts +2 -35
- package/src/cli/lib/api.ts +11 -5
- package/src/cli/lib/convexExport.ts +21 -0
- package/src/cli/lib/dashboard.ts +2 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
- package/src/cli/lib/indexes.ts +1 -1
- package/src/cli/lib/localDeployment/upgrade.ts +34 -207
- package/src/cli/lib/mcp/tools/index.ts +1 -1
- package/src/cli/mcp.ts +91 -77
- package/src/index.ts +1 -1
- package/src/server/impl/actions_impl.ts +3 -1
- package/src/server/index.ts +0 -3
- package/dist/cjs-types/browser/http_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/http_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/query_options.test.d.ts +0 -2
- package/dist/cjs-types/browser/query_options.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/simple_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/simple_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client.test.d.ts +0 -5
- package/dist/cjs-types/browser/sync/client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client_node.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/client_node.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts +0 -44
- package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/local_state.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/local_state.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/protocol.test.d.ts +0 -5
- package/dist/cjs-types/browser/sync/protocol.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/request_manager.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/request_manager.test.d.ts.map +0 -1
- package/dist/cjs-types/bundler/fs.test.d.ts +0 -2
- package/dist/cjs-types/bundler/fs.test.d.ts.map +0 -1
- package/dist/cjs-types/bundler/index.test.d.ts +0 -2
- package/dist/cjs-types/bundler/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/api.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/api.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/configure.test.d.ts +0 -2
- package/dist/cjs-types/cli/configure.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentCreate.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentCreate.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentSelect.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentSelect.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentSelection.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentSelection.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentToken.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/dev.test.d.ts +0 -2
- package/dist/cjs-types/cli/dev.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/envDefault.test.d.ts +0 -2
- package/dist/cjs-types/cli/envDefault.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/codegen.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/codegen.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/components.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/components.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/config.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/deployment.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deployment.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/env.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/env.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/expiration.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/fsUtils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/fsUtils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/indexes.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/indexes.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/run.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/run.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/updates.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/updates.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/utils/hash.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/utils/hash.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/utils/utils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/utils/utils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/versionApi.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/versionApi.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/workos/workos.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/workos/workos.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/login.test.d.ts +0 -2
- package/dist/cjs-types/cli/login.test.d.ts.map +0 -1
- package/dist/cjs-types/common/index.test.d.ts +0 -2
- package/dist/cjs-types/common/index.test.d.ts.map +0 -1
- package/dist/cjs-types/nextjs/nextjs.test.d.ts +0 -2
- package/dist/cjs-types/nextjs/nextjs.test.d.ts.map +0 -1
- package/dist/cjs-types/react/ConvexAuthState.test.d.ts +0 -2
- package/dist/cjs-types/react/ConvexAuthState.test.d.ts.map +0 -1
- package/dist/cjs-types/react/auth_helpers.test.d.ts +0 -2
- package/dist/cjs-types/react/auth_helpers.test.d.ts.map +0 -1
- package/dist/cjs-types/react/auth_websocket.test.d.ts +0 -2
- package/dist/cjs-types/react/auth_websocket.test.d.ts.map +0 -1
- package/dist/cjs-types/react/client.test.d.ts +0 -2
- package/dist/cjs-types/react/client.test.d.ts.map +0 -1
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts +0 -2
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +0 -1
- package/dist/cjs-types/react/queries_observer.test.d.ts +0 -2
- package/dist/cjs-types/react/queries_observer.test.d.ts.map +0 -1
- package/dist/cjs-types/react/react_node.test.d.ts +0 -2
- package/dist/cjs-types/react/react_node.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_paginated_query.test.d.ts +0 -2
- package/dist/cjs-types/react/use_paginated_query.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_queries.test.d.ts +0 -5
- package/dist/cjs-types/react/use_queries.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query_object_options.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query_result.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query_result.test.d.ts.map +0 -1
- package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
- package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
- package/dist/cjs-types/server/api.intersect.test.d.ts +0 -2
- package/dist/cjs-types/server/api.intersect.test.d.ts.map +0 -1
- package/dist/cjs-types/server/api.test.d.ts +0 -2
- package/dist/cjs-types/server/api.test.d.ts.map +0 -1
- package/dist/cjs-types/server/audit_logging.test.d.ts +0 -2
- package/dist/cjs-types/server/audit_logging.test.d.ts.map +0 -1
- package/dist/cjs-types/server/components/index.test.d.ts +0 -2
- package/dist/cjs-types/server/components/index.test.d.ts.map +0 -1
- package/dist/cjs-types/server/cron.test.d.ts +0 -2
- package/dist/cjs-types/server/cron.test.d.ts.map +0 -1
- package/dist/cjs-types/server/data_model.test.d.ts +0 -2
- package/dist/cjs-types/server/data_model.test.d.ts.map +0 -1
- package/dist/cjs-types/server/database.test.d.ts +0 -2
- package/dist/cjs-types/server/database.test.d.ts.map +0 -1
- package/dist/cjs-types/server/database_api.test.d.ts +0 -2
- package/dist/cjs-types/server/database_api.test.d.ts.map +0 -1
- package/dist/cjs-types/server/filter_builder.test.d.ts +0 -2
- package/dist/cjs-types/server/filter_builder.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/actions_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/actions_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/query_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/query_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/pagination.test.d.ts +0 -2
- package/dist/cjs-types/server/pagination.test.d.ts.map +0 -1
- package/dist/cjs-types/server/query.test.d.ts +0 -2
- package/dist/cjs-types/server/query.test.d.ts.map +0 -1
- package/dist/cjs-types/server/registration.test.d.ts +0 -2
- package/dist/cjs-types/server/registration.test.d.ts.map +0 -1
- package/dist/cjs-types/server/router.test.d.ts +0 -2
- package/dist/cjs-types/server/router.test.d.ts.map +0 -1
- package/dist/cjs-types/server/scheduler.test.d.ts +0 -2
- package/dist/cjs-types/server/scheduler.test.d.ts.map +0 -1
- package/dist/cjs-types/server/schema.test.d.ts +0 -2
- package/dist/cjs-types/server/schema.test.d.ts.map +0 -1
- package/dist/cjs-types/test/fake_watch.d.ts +0 -16
- package/dist/cjs-types/test/fake_watch.d.ts.map +0 -1
- package/dist/cjs-types/test/type_testing.d.ts +0 -9
- package/dist/cjs-types/test/type_testing.d.ts.map +0 -1
- package/dist/cjs-types/type_utils.test.d.ts +0 -2
- package/dist/cjs-types/type_utils.test.d.ts.map +0 -1
- package/dist/cjs-types/values/size.test.d.ts +0 -2
- package/dist/cjs-types/values/size.test.d.ts.map +0 -1
- package/dist/cjs-types/values/validator.test.d.ts +0 -2
- package/dist/cjs-types/values/validator.test.d.ts.map +0 -1
- package/dist/cjs-types/values/value.test.d.ts +0 -2
- package/dist/cjs-types/values/value.test.d.ts.map +0 -1
- package/dist/esm-types/browser/http_client.test.d.ts +0 -2
- package/dist/esm-types/browser/http_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/query_options.test.d.ts +0 -2
- package/dist/esm-types/browser/query_options.test.d.ts.map +0 -1
- package/dist/esm-types/browser/simple_client.test.d.ts +0 -2
- package/dist/esm-types/browser/simple_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client.test.d.ts +0 -5
- package/dist/esm-types/browser/sync/client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client_node.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/client_node.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts +0 -44
- package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/local_state.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/local_state.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/protocol.test.d.ts +0 -5
- package/dist/esm-types/browser/sync/protocol.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/request_manager.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/request_manager.test.d.ts.map +0 -1
- package/dist/esm-types/bundler/fs.test.d.ts +0 -2
- package/dist/esm-types/bundler/fs.test.d.ts.map +0 -1
- package/dist/esm-types/bundler/index.test.d.ts +0 -2
- package/dist/esm-types/bundler/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/api.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/api.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/templates.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
- package/dist/esm-types/cli/configure.test.d.ts +0 -2
- package/dist/esm-types/cli/configure.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentCreate.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentCreate.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentSelect.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentSelect.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentSelection.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentSelection.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentToken.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentToken.test.d.ts.map +0 -1
- package/dist/esm-types/cli/dev.test.d.ts +0 -2
- package/dist/esm-types/cli/dev.test.d.ts.map +0 -1
- package/dist/esm-types/cli/envDefault.test.d.ts +0 -2
- package/dist/esm-types/cli/envDefault.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/codegen.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/codegen.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/components.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/components.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/config.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/deployment.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/deployment.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/env.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/env.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/expiration.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/expiration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/fsUtils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/fsUtils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/indexes.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/indexes.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/run.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/run.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/runTestFunction.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/typecheck.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/updates.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/updates.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/utils/hash.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/utils/hash.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/utils/utils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/utils/utils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/versionApi.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/versionApi.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/workos/workos.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/workos/workos.test.d.ts.map +0 -1
- package/dist/esm-types/cli/login.test.d.ts +0 -2
- package/dist/esm-types/cli/login.test.d.ts.map +0 -1
- package/dist/esm-types/common/index.test.d.ts +0 -2
- package/dist/esm-types/common/index.test.d.ts.map +0 -1
- package/dist/esm-types/nextjs/nextjs.test.d.ts +0 -2
- package/dist/esm-types/nextjs/nextjs.test.d.ts.map +0 -1
- package/dist/esm-types/react/ConvexAuthState.test.d.ts +0 -2
- package/dist/esm-types/react/ConvexAuthState.test.d.ts.map +0 -1
- package/dist/esm-types/react/auth_helpers.test.d.ts +0 -2
- package/dist/esm-types/react/auth_helpers.test.d.ts.map +0 -1
- package/dist/esm-types/react/auth_websocket.test.d.ts +0 -2
- package/dist/esm-types/react/auth_websocket.test.d.ts.map +0 -1
- package/dist/esm-types/react/client.test.d.ts +0 -2
- package/dist/esm-types/react/client.test.d.ts.map +0 -1
- package/dist/esm-types/react/client_provided_base_client.test.d.ts +0 -2
- package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +0 -1
- package/dist/esm-types/react/queries_observer.test.d.ts +0 -2
- package/dist/esm-types/react/queries_observer.test.d.ts.map +0 -1
- package/dist/esm-types/react/react_node.test.d.ts +0 -2
- package/dist/esm-types/react/react_node.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_paginated_query.test.d.ts +0 -2
- package/dist/esm-types/react/use_paginated_query.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_queries.test.d.ts +0 -5
- package/dist/esm-types/react/use_queries.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query.test.d.ts +0 -5
- package/dist/esm-types/react/use_query.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query_object_options.test.d.ts +0 -5
- package/dist/esm-types/react/use_query_object_options.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query_result.test.d.ts +0 -5
- package/dist/esm-types/react/use_query_result.test.d.ts.map +0 -1
- package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
- package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
- package/dist/esm-types/server/api.intersect.test.d.ts +0 -2
- package/dist/esm-types/server/api.intersect.test.d.ts.map +0 -1
- package/dist/esm-types/server/api.test.d.ts +0 -2
- package/dist/esm-types/server/api.test.d.ts.map +0 -1
- package/dist/esm-types/server/audit_logging.test.d.ts +0 -2
- package/dist/esm-types/server/audit_logging.test.d.ts.map +0 -1
- package/dist/esm-types/server/components/index.test.d.ts +0 -2
- package/dist/esm-types/server/components/index.test.d.ts.map +0 -1
- package/dist/esm-types/server/cron.test.d.ts +0 -2
- package/dist/esm-types/server/cron.test.d.ts.map +0 -1
- package/dist/esm-types/server/data_model.test.d.ts +0 -2
- package/dist/esm-types/server/data_model.test.d.ts.map +0 -1
- package/dist/esm-types/server/database.test.d.ts +0 -2
- package/dist/esm-types/server/database.test.d.ts.map +0 -1
- package/dist/esm-types/server/database_api.test.d.ts +0 -2
- package/dist/esm-types/server/database_api.test.d.ts.map +0 -1
- package/dist/esm-types/server/filter_builder.test.d.ts +0 -2
- package/dist/esm-types/server/filter_builder.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/actions_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/actions_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/query_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/query_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/pagination.test.d.ts +0 -2
- package/dist/esm-types/server/pagination.test.d.ts.map +0 -1
- package/dist/esm-types/server/query.test.d.ts +0 -2
- package/dist/esm-types/server/query.test.d.ts.map +0 -1
- package/dist/esm-types/server/registration.test.d.ts +0 -2
- package/dist/esm-types/server/registration.test.d.ts.map +0 -1
- package/dist/esm-types/server/router.test.d.ts +0 -2
- package/dist/esm-types/server/router.test.d.ts.map +0 -1
- package/dist/esm-types/server/scheduler.test.d.ts +0 -2
- package/dist/esm-types/server/scheduler.test.d.ts.map +0 -1
- package/dist/esm-types/server/schema.test.d.ts +0 -2
- package/dist/esm-types/server/schema.test.d.ts.map +0 -1
- package/dist/esm-types/test/fake_watch.d.ts +0 -16
- package/dist/esm-types/test/fake_watch.d.ts.map +0 -1
- package/dist/esm-types/test/type_testing.d.ts +0 -9
- package/dist/esm-types/test/type_testing.d.ts.map +0 -1
- package/dist/esm-types/type_utils.test.d.ts +0 -2
- package/dist/esm-types/type_utils.test.d.ts.map +0 -1
- package/dist/esm-types/values/size.test.d.ts +0 -2
- package/dist/esm-types/values/size.test.d.ts.map +0 -1
- package/dist/esm-types/values/validator.test.d.ts +0 -2
- package/dist/esm-types/values/validator.test.d.ts.map +0 -1
- package/dist/esm-types/values/value.test.d.ts +0 -2
- package/dist/esm-types/values/value.test.d.ts.map +0 -1
- package/src/browser/http_client.test.ts +0 -202
- package/src/browser/query_options.test.ts +0 -43
- package/src/browser/simple_client.test.ts +0 -104
- package/src/browser/sync/client.test.ts +0 -44
- package/src/browser/sync/client_node.test.ts +0 -1207
- package/src/browser/sync/client_node_test_helpers.ts +0 -200
- package/src/browser/sync/local_state.test.ts +0 -128
- package/src/browser/sync/optimistic_query_set.test.ts +0 -253
- package/src/browser/sync/paginated_query_client.test.ts +0 -597
- package/src/browser/sync/protocol.test.ts +0 -14
- package/src/browser/sync/request_manager.test.ts +0 -273
- package/src/bundler/fs.test.ts +0 -86
- package/src/bundler/index.test.ts +0 -210
- package/src/bundler/test_fixtures/js/project01/bar.js +0 -4
- package/src/bundler/test_fixtures/js/project01/file with spaces.js +0 -1
- package/src/bundler/test_fixtures/js/project01/foo.js +0 -9
- package/src/bundler/test_fixtures/js/project_with_https/https.js +0 -9
- package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/default.js +0 -3
- package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/more_code/https.js +0 -5
- package/src/bundler/test_fixtures/js/project_with_https_without_router/https.js +0 -1
- package/src/bundler/test_fixtures/js/project_with_node_shims/uses_node_shims.js +0 -4
- package/src/cli/codegen_templates/api.test.ts +0 -18
- package/src/cli/codegen_templates/common.test.ts +0 -52
- package/src/cli/codegen_templates/templates.test.ts +0 -16
- package/src/cli/codegen_templates/validator_helpers.test.ts +0 -31
- package/src/cli/configure.test.ts +0 -138
- package/src/cli/deploymentCreate.test.ts +0 -1376
- package/src/cli/deploymentSelect.test.ts +0 -1291
- package/src/cli/deploymentSelection.test.ts +0 -2546
- package/src/cli/deploymentToken.test.ts +0 -397
- package/src/cli/dev.test.ts +0 -157
- package/src/cli/envDefault.test.ts +0 -495
- package/src/cli/lib/__snapshots__/formatTargetedDeployment.test.ts.snap +0 -94
- package/src/cli/lib/aiFiles/agentsmd.test.ts +0 -133
- package/src/cli/lib/aiFiles/claudemd.test.ts +0 -92
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +0 -50
- package/src/cli/lib/aiFiles/index.test.ts +0 -986
- package/src/cli/lib/aiFiles/integration.test.ts +0 -692
- package/src/cli/lib/aiFiles/prompt.test.ts +0 -202
- package/src/cli/lib/aiFiles/state.test.ts +0 -305
- package/src/cli/lib/aiFiles/utils.test.ts +0 -50
- package/src/cli/lib/codegen.test.ts +0 -49
- package/src/cli/lib/components.test.ts +0 -227
- package/src/cli/lib/config.test.ts +0 -1026
- package/src/cli/lib/deployment.test.ts +0 -85
- package/src/cli/lib/deploymentSelector.test.ts +0 -107
- package/src/cli/lib/env.test.ts +0 -60
- package/src/cli/lib/expiration.test.ts +0 -159
- package/src/cli/lib/extractDeploymentNameForWorkOS.test.ts +0 -30
- package/src/cli/lib/formatEnvValueForDotfile.test.ts +0 -294
- package/src/cli/lib/formatTargetedDeployment.test.ts +0 -281
- package/src/cli/lib/fsUtils.test.ts +0 -67
- package/src/cli/lib/generateDocs.test.ts +0 -326
- package/src/cli/lib/indexes.test.ts +0 -77
- package/src/cli/lib/localDeployment/run.test.ts +0 -104
- package/src/cli/lib/localDeployment/secrets.test.ts +0 -53
- package/src/cli/lib/run.test.ts +0 -54
- package/src/cli/lib/runTestFunction.test.ts +0 -84
- package/src/cli/lib/typecheck.test.ts +0 -71
- package/src/cli/lib/updates.test.ts +0 -157
- package/src/cli/lib/utils/hash.test.ts +0 -25
- package/src/cli/lib/utils/utils.test.ts +0 -340
- package/src/cli/lib/versionApi.test.ts +0 -471
- package/src/cli/lib/workos/environmentApi.test.ts +0 -107
- package/src/cli/lib/workos/workos.test.ts +0 -242
- package/src/cli/login.test.ts +0 -261
- package/src/common/README.md +0 -2
- package/src/common/index.test.ts +0 -35
- package/src/nextjs/nextjs.test.tsx +0 -94
- package/src/react/ConvexAuthState.test.tsx +0 -702
- package/src/react/auth_helpers.test.tsx +0 -45
- package/src/react/auth_websocket.test.tsx +0 -1177
- package/src/react/client.test.tsx +0 -261
- package/src/react/client_provided_base_client.test.tsx +0 -174
- package/src/react/queries_observer.test.ts +0 -176
- package/src/react/react_node.test.ts +0 -78
- package/src/react/use_paginated_query.test.tsx +0 -1420
- package/src/react/use_queries.test.ts +0 -140
- package/src/react/use_query.test.ts +0 -71
- package/src/react/use_query_object_options.test.ts +0 -51
- package/src/react/use_query_result.test.ts +0 -75
- package/src/react-auth0/ConvexProviderWithAuth0.test.tsx +0 -17
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +0 -18
- package/src/server/README.md +0 -15
- package/src/server/api.intersect.test.ts +0 -109
- package/src/server/api.test.ts +0 -447
- package/src/server/audit_logging.test.ts +0 -131
- package/src/server/components/index.test.ts +0 -48
- package/src/server/cron.test.ts +0 -58
- package/src/server/data_model.test.ts +0 -221
- package/src/server/database.test.ts +0 -184
- package/src/server/database_api.test.ts +0 -439
- package/src/server/filter_builder.test.ts +0 -102
- package/src/server/impl/actions_impl.test.ts +0 -59
- package/src/server/impl/filter_builder_impl.test.ts +0 -13
- package/src/server/impl/query_impl.test.ts +0 -46
- package/src/server/pagination.test.ts +0 -49
- package/src/server/query.test.ts +0 -112
- package/src/server/registration.test.ts +0 -589
- package/src/server/router.test.ts +0 -148
- package/src/server/scheduler.test.ts +0 -31
- package/src/server/schema.test.ts +0 -1081
- package/src/test/fake_watch.ts +0 -54
- package/src/test/type_testing.ts +0 -21
- package/src/type_utils.test.ts +0 -62
- package/src/values/size.test.ts +0 -95
- package/src/values/validator.test.ts +0 -619
- package/src/values/value.test.ts +0 -232
- package/src/vendor/README.md +0 -18
- package/src/vendor/jwt-decode/README.md +0 -1
|
@@ -58,7 +58,7 @@ const convexExport = new import_extra_typings.Command("export").summary("Export
|
|
|
58
58
|
deploymentNotice,
|
|
59
59
|
snapshotExportDashboardLink: (0, import_dashboard.deploymentDashboardUrlPage)(
|
|
60
60
|
deployment.deploymentFields?.deploymentName ?? null,
|
|
61
|
-
"/settings/
|
|
61
|
+
"/settings/snapshots"
|
|
62
62
|
)
|
|
63
63
|
});
|
|
64
64
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/convexExport.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { deploymentDashboardUrlPage } from \"./lib/dashboard.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { exportFromDeployment } from \"./lib/convexExport.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nexport const convexExport = new Command(\"export\")\n .summary(\"Export data from your deployment to a ZIP file\")\n .description(\n [\n \"Export data, and optionally file storage, from your Convex deployment to a ZIP file.\",\n \"\",\n \"\u2022 Export to a directory: `npx convex export --path dir/`\",\n \"\u2022 Export to a ZIP file: `npx convex export --path snapshot.zip`\",\n \"\u2022 Include file storage: `npx convex export --include-file-storage --path dir/`\",\n \"\",\n \"By default, this exports from your dev deployment.\",\n \"\",\n \"See the data export guide (https://docs.convex.dev/database/import-export/export) for details and use cases.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .addExportOptions()\n .addDeploymentSelectionOptions(actionDescription(\"Export data from\"))\n .showHelpAfterError()\n .action(async (options) => {\n const ctx = await oneoffContext(options);\n await ensureHasConvexDependency(ctx, \"export\");\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n\n const deploymentNotice = options.prod\n ? ` in your ${chalkStderr.bold(\"prod\")} deployment`\n : \"\";\n await exportFromDeployment(ctx, {\n ...options,\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentNotice,\n snapshotExportDashboardLink: deploymentDashboardUrlPage(\n deployment.deploymentFields?.deploymentName ?? null,\n \"/settings/
|
|
4
|
+
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { deploymentDashboardUrlPage } from \"./lib/dashboard.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { exportFromDeployment } from \"./lib/convexExport.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nexport const convexExport = new Command(\"export\")\n .summary(\"Export data from your deployment to a ZIP file\")\n .description(\n [\n \"Export data, and optionally file storage, from your Convex deployment to a ZIP file.\",\n \"\",\n \"\u2022 Export to a directory: `npx convex export --path dir/`\",\n \"\u2022 Export to a ZIP file: `npx convex export --path snapshot.zip`\",\n \"\u2022 Include file storage: `npx convex export --include-file-storage --path dir/`\",\n \"\",\n \"By default, this exports from your dev deployment.\",\n \"\",\n \"See the data export guide (https://docs.convex.dev/database/import-export/export) for details and use cases.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .addExportOptions()\n .addDeploymentSelectionOptions(actionDescription(\"Export data from\"))\n .showHelpAfterError()\n .action(async (options) => {\n const ctx = await oneoffContext(options);\n await ensureHasConvexDependency(ctx, \"export\");\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n\n const deploymentNotice = options.prod\n ? ` in your ${chalkStderr.bold(\"prod\")} deployment`\n : \"\";\n await exportFromDeployment(ctx, {\n ...options,\n deploymentUrl: deployment.url,\n adminKey: deployment.adminKey,\n deploymentNotice,\n snapshotExportDashboardLink: deploymentDashboardUrlPage(\n deployment.deploymentFields?.deploymentName ?? null,\n \"/settings/snapshots\",\n ),\n });\n });\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,mBAA4B;AAC5B,mBAA0C;AAC1C,qBAA8B;AAC9B,iBAAkD;AAClD,uBAA2C;AAC3C,qBAAkC;AAClC,0BAAqC;AACrC,iCAAuC;AAChC,MAAM,eAAe,IAAI,6BAAQ,QAAQ,EAC7C,QAAQ,gDAAgD,EACxD;AAAA,EACC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb,EACC,qBAAqB,KAAK,EAC1B,iBAAiB,EACjB,kCAA8B,kCAAkB,kBAAkB,CAAC,EACnE,mBAAmB,EACnB,OAAO,OAAO,YAAY;AACzB,QAAM,MAAM,UAAM,8BAAc,OAAO;AACvC,YAAM,wCAA0B,KAAK,QAAQ;AAE7C,QAAM,sBAAsB,UAAM,mDAAuB,KAAK,OAAO;AACrE,QAAM,aAAa,UAAM;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB,QAAQ,OAC7B,YAAY,yBAAY,KAAK,MAAM,CAAC,gBACpC;AACJ,YAAM,0CAAqB,KAAK;AAAA,IAC9B,GAAG;AAAA,IACH,eAAe,WAAW;AAAA,IAC1B,UAAU,WAAW;AAAA,IACrB;AAAA,IACA,iCAA6B;AAAA,MAC3B,WAAW,kBAAkB,kBAAkB;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/cli/index.js
CHANGED
|
@@ -30,9 +30,8 @@ var import_node_net = __toESM(require("node:net"), 1);
|
|
|
30
30
|
var import_undici = require("undici");
|
|
31
31
|
var import_log = require("../bundler/log.js");
|
|
32
32
|
var import_program = require("./program.js");
|
|
33
|
-
const HARD_MINIMUM_NODE_MAJOR_VERSION =
|
|
34
|
-
const HARD_MINIMUM_NODE_MINOR_VERSION =
|
|
35
|
-
const SOFT_MINIMUM_NODE_MAJOR_VERSION = 20;
|
|
33
|
+
const HARD_MINIMUM_NODE_MAJOR_VERSION = 20;
|
|
34
|
+
const HARD_MINIMUM_NODE_MINOR_VERSION = 0;
|
|
36
35
|
function logToStderr(...args) {
|
|
37
36
|
process.stderr.write(`${(0, import_util.format)(...args)}
|
|
38
37
|
`);
|
|
@@ -76,35 +75,6 @@ async function main() {
|
|
|
76
75
|
);
|
|
77
76
|
process.exit(1);
|
|
78
77
|
}
|
|
79
|
-
if (majorVersion < SOFT_MINIMUM_NODE_MAJOR_VERSION) {
|
|
80
|
-
logToStderr(
|
|
81
|
-
import_chalk.chalkStderr.yellow(
|
|
82
|
-
`Warning: Your Node version ${nodeVersion} is below the recommended minimum of Node v${SOFT_MINIMUM_NODE_MAJOR_VERSION}.x. Convex may work but could behave unexpectedly.`
|
|
83
|
-
)
|
|
84
|
-
);
|
|
85
|
-
logToStderr(
|
|
86
|
-
import_chalk.chalkStderr.gray(
|
|
87
|
-
`We recommend upgrading Node to v${SOFT_MINIMUM_NODE_MAJOR_VERSION} or newer.`
|
|
88
|
-
)
|
|
89
|
-
);
|
|
90
|
-
logToStderr(
|
|
91
|
-
import_chalk.chalkStderr.gray(
|
|
92
|
-
`You can use ${import_chalk.chalkStderr.bold(
|
|
93
|
-
"nvm"
|
|
94
|
-
)} (https://github.com/nvm-sh/nvm#installing-and-updating) to manage different versions of Node.`
|
|
95
|
-
)
|
|
96
|
-
);
|
|
97
|
-
logToStderr(
|
|
98
|
-
import_chalk.chalkStderr.gray(
|
|
99
|
-
"After installing `nvm`, install the latest version of Node with " + import_chalk.chalkStderr.bold("`nvm install node`.")
|
|
100
|
-
)
|
|
101
|
-
);
|
|
102
|
-
logToStderr(
|
|
103
|
-
import_chalk.chalkStderr.gray(
|
|
104
|
-
"Then, activate the installed version in your terminal with " + import_chalk.chalkStderr.bold("`nvm use`.")
|
|
105
|
-
)
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
78
|
const program = (0, import_program.buildProgram)();
|
|
109
79
|
try {
|
|
110
80
|
await program.parseAsync(process.argv);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as Sentry from \"@sentry/node\";\nimport { initSentry } from \"./lib/utils/sentry.js\";\nimport { format } from \"util\";\nimport dns from \"node:dns\";\nimport net from \"node:net\";\nimport { setGlobalDispatcher, EnvHttpProxyAgent } from \"undici\";\nimport { logVerbose } from \"../bundler/log.js\";\nimport { buildProgram } from \"./program.js\";\n\nconst HARD_MINIMUM_NODE_MAJOR_VERSION =
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAA4B;AAC5B,aAAwB;AACxB,oBAA2B;AAC3B,kBAAuB;AACvB,sBAAgB;AAChB,sBAAgB;AAChB,oBAAuD;AACvD,iBAA2B;AAC3B,qBAA6B;AAE7B,MAAM,kCAAkC;AACxC,MAAM,kCAAkC;
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as Sentry from \"@sentry/node\";\nimport { initSentry } from \"./lib/utils/sentry.js\";\nimport { format } from \"util\";\nimport dns from \"node:dns\";\nimport net from \"node:net\";\nimport { setGlobalDispatcher, EnvHttpProxyAgent } from \"undici\";\nimport { logVerbose } from \"../bundler/log.js\";\nimport { buildProgram } from \"./program.js\";\n\nconst HARD_MINIMUM_NODE_MAJOR_VERSION = 20;\nconst HARD_MINIMUM_NODE_MINOR_VERSION = 0;\n\n// console.error before it started being red by default in Node.js v20\nfunction logToStderr(...args: unknown[]) {\n process.stderr.write(`${format(...args)}\\n`);\n}\n\nasync function main() {\n const nodeVersion = process.versions.node;\n const majorVersion = parseInt(nodeVersion.split(\".\")[0], 10);\n const minorVersion = parseInt(nodeVersion.split(\".\")[1], 10);\n\n const proxy = process.env.HTTPS_PROXY || process.env.HTTP_PROXY;\n if (proxy) {\n setGlobalDispatcher(new EnvHttpProxyAgent());\n logVerbose(`[proxy-bootstrap] Using proxy: ${proxy}`);\n }\n\n // Use ipv4 first for 127.0.0.1 in tests\n dns.setDefaultResultOrder(\"ipv4first\");\n\n // Increase the timeout from default 250ms for high latency situations,\n // see https://github.com/nodejs/node/issues/54359.\n if (majorVersion >= 20) {\n // While we use Node.js v18 types\n (net as any).setDefaultAutoSelectFamilyAttemptTimeout?.(1000);\n }\n\n initSentry();\n\n if (\n majorVersion < HARD_MINIMUM_NODE_MAJOR_VERSION ||\n (majorVersion === HARD_MINIMUM_NODE_MAJOR_VERSION &&\n minorVersion < HARD_MINIMUM_NODE_MINOR_VERSION)\n ) {\n logToStderr(\n chalkStderr.red(\n `Your Node version ${nodeVersion} is too old. Convex requires at least Node v${HARD_MINIMUM_NODE_MAJOR_VERSION}.${HARD_MINIMUM_NODE_MINOR_VERSION}`,\n ),\n );\n logToStderr(\n chalkStderr.gray(\n `You can use ${chalkStderr.bold(\n \"nvm\",\n )} (https://github.com/nvm-sh/nvm#installing-and-updating) to manage different versions of Node.`,\n ),\n );\n logToStderr(\n chalkStderr.gray(\n \"After installing `nvm`, install the latest version of Node with \" +\n chalkStderr.bold(\"`nvm install node`.\"),\n ),\n );\n logToStderr(\n chalkStderr.gray(\n \"Then, activate the installed version in your terminal with \" +\n chalkStderr.bold(\"`nvm use`.\"),\n ),\n );\n process.exit(1);\n }\n\n const program = buildProgram();\n\n // Run the command and be sure to flush Sentry before exiting.\n try {\n await program.parseAsync(process.argv);\n } catch (e) {\n Sentry.captureException(e);\n process.exitCode = 1;\n // This is too early to use `logError`, so just log directly.\n // eslint-disable-next-line no-console\n console.error(chalkStderr.red(\"Unexpected Error: \" + e));\n } finally {\n await Sentry.close();\n }\n // When stdout is a pipe, Node buffers writes and `process.exit()` does not\n // wait for them to flush \u2014 drain first so piped output isn't truncated.\n await Promise.all([\n new Promise<void>((resolve) => process.stdout.write(\"\", () => resolve())),\n new Promise<void>((resolve) => process.stderr.write(\"\", () => resolve())),\n ]);\n process.exit();\n}\nvoid main();\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAA4B;AAC5B,aAAwB;AACxB,oBAA2B;AAC3B,kBAAuB;AACvB,sBAAgB;AAChB,sBAAgB;AAChB,oBAAuD;AACvD,iBAA2B;AAC3B,qBAA6B;AAE7B,MAAM,kCAAkC;AACxC,MAAM,kCAAkC;AAGxC,SAAS,eAAe,MAAiB;AACvC,UAAQ,OAAO,MAAM,OAAG,oBAAO,GAAG,IAAI,CAAC;AAAA,CAAI;AAC7C;AAEA,eAAe,OAAO;AACpB,QAAM,cAAc,QAAQ,SAAS;AACrC,QAAM,eAAe,SAAS,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC3D,QAAM,eAAe,SAAS,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAE3D,QAAM,QAAQ,QAAQ,IAAI,eAAe,QAAQ,IAAI;AACrD,MAAI,OAAO;AACT,2CAAoB,IAAI,gCAAkB,CAAC;AAC3C,+BAAW,kCAAkC,KAAK,EAAE;AAAA,EACtD;AAGA,kBAAAA,QAAI,sBAAsB,WAAW;AAIrC,MAAI,gBAAgB,IAAI;AAEtB,IAAC,gBAAAC,QAAY,2CAA2C,GAAI;AAAA,EAC9D;AAEA,gCAAW;AAEX,MACE,eAAe,mCACd,iBAAiB,mCAChB,eAAe,iCACjB;AACA;AAAA,MACE,yBAAY;AAAA,QACV,qBAAqB,WAAW,+CAA+C,+BAA+B,IAAI,+BAA+B;AAAA,MACnJ;AAAA,IACF;AACA;AAAA,MACE,yBAAY;AAAA,QACV,eAAe,yBAAY;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA;AAAA,MACE,yBAAY;AAAA,QACV,qEACE,yBAAY,KAAK,qBAAqB;AAAA,MAC1C;AAAA,IACF;AACA;AAAA,MACE,yBAAY;AAAA,QACV,gEACE,yBAAY,KAAK,YAAY;AAAA,MACjC;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAU,6BAAa;AAG7B,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,GAAG;AACV,WAAO,iBAAiB,CAAC;AACzB,YAAQ,WAAW;AAGnB,YAAQ,MAAM,yBAAY,IAAI,uBAAuB,CAAC,CAAC;AAAA,EACzD,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AAGA,QAAM,QAAQ,IAAI;AAAA,IAChB,IAAI,QAAc,CAAC,YAAY,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,IACxE,IAAI,QAAc,CAAC,YAAY,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC1E,CAAC;AACD,UAAQ,KAAK;AACf;AACA,KAAK,KAAK;",
|
|
6
6
|
"names": ["dns", "net"]
|
|
7
7
|
}
|
package/dist/cjs/cli/lib/api.js
CHANGED
|
@@ -150,11 +150,17 @@ async function validateDeploymentSelectionForExistingDeployment(ctx, deploymentS
|
|
|
150
150
|
}
|
|
151
151
|
async function hasAccessToProject(ctx, selector) {
|
|
152
152
|
try {
|
|
153
|
-
await (0, import_utils.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
await (0, import_utils.typedPlatformClient)(ctx, { throw: true }).GET(
|
|
154
|
+
"/teams/{team_id_or_slug}/projects/{project_slug}",
|
|
155
|
+
{
|
|
156
|
+
params: {
|
|
157
|
+
path: {
|
|
158
|
+
team_id_or_slug: selector.teamSlug,
|
|
159
|
+
project_slug: selector.projectSlug
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
);
|
|
158
164
|
return true;
|
|
159
165
|
} catch (err) {
|
|
160
166
|
if (err instanceof import_utils.ThrowingFetchError && (err.serverErrorData?.code === "TeamNotFound" || err.serverErrorData?.code === "ProjectNotFound")) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/api.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n path: `teams/${selector.teamSlug}/projects/${selector.projectSlug}/deployments`,\n method: \"GET\",\n });\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: selector.teamSlug,\n project_slug: selector.projectSlug,\n },\n },\n },\n );\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -55,7 +55,8 @@ async function exportFromDeployment(ctx, options) {
|
|
|
55
55
|
includeStorage,
|
|
56
56
|
inputPath,
|
|
57
57
|
adminKey,
|
|
58
|
-
deploymentUrl
|
|
58
|
+
deploymentUrl,
|
|
59
|
+
snapshotExportDashboardLink
|
|
59
60
|
});
|
|
60
61
|
switch (snapshotExportState.state) {
|
|
61
62
|
case "completed":
|
|
@@ -150,6 +151,16 @@ async function startSnapshotExport(ctx, args) {
|
|
|
150
151
|
}
|
|
151
152
|
);
|
|
152
153
|
} catch (e) {
|
|
154
|
+
if (e instanceof import_utils.ThrowingFetchError && e.serverErrorData?.code === "ExportInProgress") {
|
|
155
|
+
(0, import_log.failExistingSpinner)();
|
|
156
|
+
const progressAdvice = args.snapshotExportDashboardLink === void 0 ? "" : `
|
|
157
|
+
Check its progress at ${args.snapshotExportDashboardLink}`;
|
|
158
|
+
return await ctx.crash({
|
|
159
|
+
exitCode: 1,
|
|
160
|
+
errorType: "fatal",
|
|
161
|
+
printedMessage: "A snapshot export is already requested or in progress. Only one can run at a time, so wait for it to finish and try again." + progressAdvice
|
|
162
|
+
});
|
|
163
|
+
}
|
|
153
164
|
return await (0, import_utils.logAndHandleFetchError)(ctx, e);
|
|
154
165
|
}
|
|
155
166
|
const snapshotExportState = await waitForStableExportState(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/convexExport.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport {\n waitUntilCalled,\n deploymentFetch,\n logAndHandleFetchError,\n} from \"./utils/utils.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n showSpinner,\n logFinishedStep,\n logError,\n stopSpinner,\n changeSpinner,\n} from \"../../bundler/log.js\";\nimport { subscribe } from \"./run.js\";\nimport { nodeFs } from \"../../bundler/fs.js\";\nimport path from \"path\";\nimport { Readable } from \"stream\";\nimport { stringifyValueForError } from \"../../values/value.js\";\n\nexport async function exportFromDeployment(\n ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n path: string;\n includeFileStorage?: boolean;\n deploymentNotice: string;\n snapshotExportDashboardLink: string | undefined;\n },\n) {\n const includeStorage = !!options.includeFileStorage;\n const {\n deploymentUrl,\n adminKey,\n path: inputPath,\n deploymentNotice,\n snapshotExportDashboardLink,\n } = options;\n\n showSpinner(`Creating snapshot export${deploymentNotice}`);\n\n const snapshotExportState = await startSnapshotExport(ctx, {\n includeStorage,\n inputPath,\n adminKey,\n deploymentUrl,\n });\n\n switch (snapshotExportState.state) {\n case \"completed\":\n stopSpinner();\n logFinishedStep(\n `Created snapshot export at timestamp ${snapshotExportState.start_ts}`,\n );\n if (snapshotExportDashboardLink !== undefined) {\n logFinishedStep(\n `Export is available at ${snapshotExportDashboardLink}`,\n );\n }\n break;\n case \"requested\":\n case \"in_progress\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `WARNING: Export is continuing to run on the server.`,\n });\n }\n case \"failed\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Export failed. Please try again later or contact support@convex.dev for help.`,\n });\n }\n default: {\n snapshotExportState satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `unknown error: unexpected state ${stringifyValueForError(snapshotExportState as any)}`,\n errForSentry: `unexpected snapshot export state ${(snapshotExportState as any).state}`,\n });\n }\n }\n\n showSpinner(`Downloading snapshot export to ${chalkStderr.bold(inputPath)}`);\n const { filePath } = await downloadSnapshotExport(ctx, {\n snapshotExportTs: snapshotExportState.start_ts,\n inputPath,\n adminKey,\n deploymentUrl,\n });\n stopSpinner();\n logFinishedStep(\n `Downloaded snapshot export to ${chalkStderr.bold(filePath)}`,\n );\n}\n\ntype SnapshotExportState =\n | { state: \"requested\" }\n | { state: \"in_progress\" }\n | { state: \"failed\" }\n | {\n state: \"completed\";\n complete_ts: bigint;\n start_ts: bigint;\n zip_object_key: string;\n };\n\nasync function waitForStableExportState(\n ctx: Context,\n deploymentUrl: string,\n adminKey: string,\n): Promise<SnapshotExportState> {\n const [donePromise, onDone] = waitUntilCalled();\n let snapshotExportState: SnapshotExportState;\n await subscribe(ctx, {\n deploymentUrl,\n adminKey,\n parsedFunctionName: \"_system/cli/exports:getLatest\",\n parsedFunctionArgs: {},\n componentPath: undefined,\n until: donePromise,\n callbacks: {\n onChange: (value: any) => {\n // NOTE: `value` would only be `null` if there has never been an export\n // requested.\n snapshotExportState = value;\n switch (snapshotExportState.state) {\n case \"requested\":\n case \"in_progress\":\n // Not a stable state.\n break;\n case \"completed\":\n case \"failed\":\n onDone();\n break;\n default: {\n snapshotExportState satisfies never;\n onDone();\n }\n }\n },\n },\n });\n return snapshotExportState!;\n}\n\nexport async function startSnapshotExport(\n ctx: Context,\n args: {\n includeStorage: boolean;\n inputPath: string;\n adminKey: string;\n deploymentUrl: string;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n try {\n await fetch(\n `/api/export/request/zip?includeStorage=${args.includeStorage}`,\n {\n method: \"POST\",\n },\n );\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n\n const snapshotExportState = await waitForStableExportState(\n ctx,\n args.deploymentUrl,\n args.adminKey,\n );\n return snapshotExportState;\n}\n\nexport async function downloadSnapshotExport(\n ctx: Context,\n args: {\n snapshotExportTs: bigint;\n inputPath: string;\n adminKey: string;\n deploymentUrl: string;\n },\n): Promise<{ filePath: string }> {\n const inputPath = args.inputPath;\n const exportUrl = `/api/export/zip/${args.snapshotExportTs.toString()}`;\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n let response: Response;\n try {\n response = await fetch(exportUrl, {\n method: \"GET\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n\n let filePath;\n if (ctx.fs.exists(inputPath)) {\n const st = ctx.fs.stat(inputPath);\n if (st.isDirectory()) {\n const contentDisposition =\n response.headers.get(\"content-disposition\") ?? \"\";\n let filename = `snapshot_${args.snapshotExportTs.toString()}.zip`;\n if (contentDisposition.startsWith(\"attachment; filename=\")) {\n filename = contentDisposition.slice(\"attachment; filename=\".length);\n }\n filePath = path.join(inputPath, filename);\n } else {\n // TODO(sarah) -- if this is called elsewhere, I'd like to catch the error + potentially\n // have different logging\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Path ${chalkStderr.bold(inputPath)} already exists.`,\n });\n }\n } else {\n filePath = inputPath;\n }\n changeSpinner(`Downloading snapshot export to ${chalkStderr.bold(filePath)}`);\n\n try {\n await nodeFs.writeFileStream(\n filePath,\n Readable.fromWeb(response.body! as any),\n );\n } catch (e) {\n logFailure(`Exporting data failed`);\n logError(chalkStderr.red(e));\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Exporting data failed: ${chalkStderr.red(e)}`,\n });\n }\n return { filePath };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport {\n waitUntilCalled,\n deploymentFetch,\n logAndHandleFetchError,\n ThrowingFetchError,\n} from \"./utils/utils.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n showSpinner,\n logFinishedStep,\n logError,\n stopSpinner,\n changeSpinner,\n failExistingSpinner,\n} from \"../../bundler/log.js\";\nimport { subscribe } from \"./run.js\";\nimport { nodeFs } from \"../../bundler/fs.js\";\nimport path from \"path\";\nimport { Readable } from \"stream\";\nimport { stringifyValueForError } from \"../../values/value.js\";\n\nexport async function exportFromDeployment(\n ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n path: string;\n includeFileStorage?: boolean;\n deploymentNotice: string;\n snapshotExportDashboardLink: string | undefined;\n },\n) {\n const includeStorage = !!options.includeFileStorage;\n const {\n deploymentUrl,\n adminKey,\n path: inputPath,\n deploymentNotice,\n snapshotExportDashboardLink,\n } = options;\n\n showSpinner(`Creating snapshot export${deploymentNotice}`);\n\n const snapshotExportState = await startSnapshotExport(ctx, {\n includeStorage,\n inputPath,\n adminKey,\n deploymentUrl,\n snapshotExportDashboardLink,\n });\n\n switch (snapshotExportState.state) {\n case \"completed\":\n stopSpinner();\n logFinishedStep(\n `Created snapshot export at timestamp ${snapshotExportState.start_ts}`,\n );\n if (snapshotExportDashboardLink !== undefined) {\n logFinishedStep(\n `Export is available at ${snapshotExportDashboardLink}`,\n );\n }\n break;\n case \"requested\":\n case \"in_progress\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `WARNING: Export is continuing to run on the server.`,\n });\n }\n case \"failed\": {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Export failed. Please try again later or contact support@convex.dev for help.`,\n });\n }\n default: {\n snapshotExportState satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `unknown error: unexpected state ${stringifyValueForError(snapshotExportState as any)}`,\n errForSentry: `unexpected snapshot export state ${(snapshotExportState as any).state}`,\n });\n }\n }\n\n showSpinner(`Downloading snapshot export to ${chalkStderr.bold(inputPath)}`);\n const { filePath } = await downloadSnapshotExport(ctx, {\n snapshotExportTs: snapshotExportState.start_ts,\n inputPath,\n adminKey,\n deploymentUrl,\n });\n stopSpinner();\n logFinishedStep(\n `Downloaded snapshot export to ${chalkStderr.bold(filePath)}`,\n );\n}\n\ntype SnapshotExportState =\n | { state: \"requested\" }\n | { state: \"in_progress\" }\n | { state: \"failed\" }\n | {\n state: \"completed\";\n complete_ts: bigint;\n start_ts: bigint;\n zip_object_key: string;\n };\n\nasync function waitForStableExportState(\n ctx: Context,\n deploymentUrl: string,\n adminKey: string,\n): Promise<SnapshotExportState> {\n const [donePromise, onDone] = waitUntilCalled();\n let snapshotExportState: SnapshotExportState;\n await subscribe(ctx, {\n deploymentUrl,\n adminKey,\n parsedFunctionName: \"_system/cli/exports:getLatest\",\n parsedFunctionArgs: {},\n componentPath: undefined,\n until: donePromise,\n callbacks: {\n onChange: (value: any) => {\n // NOTE: `value` would only be `null` if there has never been an export\n // requested.\n snapshotExportState = value;\n switch (snapshotExportState.state) {\n case \"requested\":\n case \"in_progress\":\n // Not a stable state.\n break;\n case \"completed\":\n case \"failed\":\n onDone();\n break;\n default: {\n snapshotExportState satisfies never;\n onDone();\n }\n }\n },\n },\n });\n return snapshotExportState!;\n}\n\nexport async function startSnapshotExport(\n ctx: Context,\n args: {\n includeStorage: boolean;\n inputPath: string;\n adminKey: string;\n deploymentUrl: string;\n snapshotExportDashboardLink?: string | undefined;\n },\n) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n try {\n await fetch(\n `/api/export/request/zip?includeStorage=${args.includeStorage}`,\n {\n method: \"POST\",\n },\n );\n } catch (e) {\n if (\n e instanceof ThrowingFetchError &&\n e.serverErrorData?.code === \"ExportInProgress\"\n ) {\n failExistingSpinner();\n const progressAdvice =\n args.snapshotExportDashboardLink === undefined\n ? \"\"\n : `\\nCheck its progress at ${args.snapshotExportDashboardLink}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"A snapshot export is already requested or in progress. Only one can run at a time, so wait for it to finish and try again.\" +\n progressAdvice,\n });\n }\n return await logAndHandleFetchError(ctx, e);\n }\n\n const snapshotExportState = await waitForStableExportState(\n ctx,\n args.deploymentUrl,\n args.adminKey,\n );\n return snapshotExportState;\n}\n\nexport async function downloadSnapshotExport(\n ctx: Context,\n args: {\n snapshotExportTs: bigint;\n inputPath: string;\n adminKey: string;\n deploymentUrl: string;\n },\n): Promise<{ filePath: string }> {\n const inputPath = args.inputPath;\n const exportUrl = `/api/export/zip/${args.snapshotExportTs.toString()}`;\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n });\n let response: Response;\n try {\n response = await fetch(exportUrl, {\n method: \"GET\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n\n let filePath;\n if (ctx.fs.exists(inputPath)) {\n const st = ctx.fs.stat(inputPath);\n if (st.isDirectory()) {\n const contentDisposition =\n response.headers.get(\"content-disposition\") ?? \"\";\n let filename = `snapshot_${args.snapshotExportTs.toString()}.zip`;\n if (contentDisposition.startsWith(\"attachment; filename=\")) {\n filename = contentDisposition.slice(\"attachment; filename=\".length);\n }\n filePath = path.join(inputPath, filename);\n } else {\n // TODO(sarah) -- if this is called elsewhere, I'd like to catch the error + potentially\n // have different logging\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Path ${chalkStderr.bold(inputPath)} already exists.`,\n });\n }\n } else {\n filePath = inputPath;\n }\n changeSpinner(`Downloading snapshot export to ${chalkStderr.bold(filePath)}`);\n\n try {\n await nodeFs.writeFileStream(\n filePath,\n Readable.fromWeb(response.body! as any),\n );\n } catch (e) {\n logFailure(`Exporting data failed`);\n logError(chalkStderr.red(e));\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Exporting data failed: ${chalkStderr.red(e)}`,\n });\n }\n return { filePath };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/dashboard.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { dashboardUrl as localDashboardUrl } from \"./localDeployment/dashboard.js\";\n\nexport const DASHBOARD_HOST = process.env.CONVEX_PROVISION_HOST\n ? \"http://localhost:6789\"\n : \"https://dashboard.convex.dev\";\n\nexport async function getDashboardUrl(\n ctx: Context,\n {\n deploymentName,\n deploymentType,\n }: {\n deploymentName: string;\n deploymentType: DeploymentType;\n },\n): Promise<string | null> {\n switch (deploymentType) {\n case \"anonymous\": {\n return localDashboardUrl(ctx, deploymentName);\n }\n case \"local\":\n case \"dev\":\n case \"prod\":\n case \"preview\":\n case \"custom\":\n return deploymentDashboardUrlPage(deploymentName, \"\");\n default: {\n deploymentType satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unknown deployment type: ${deploymentType as any}`,\n });\n }\n }\n}\n\nexport function deploymentDashboardUrlPage(\n configuredDeployment: string | null,\n page: string,\n): string {\n const deploymentFrag = configuredDeployment\n ? `/d/${configuredDeployment}`\n : \"\";\n return `${DASHBOARD_HOST}${deploymentFrag}${page}`;\n}\n\nexport function deploymentDashboardUrl(\n team: string,\n project: string,\n deploymentName: string,\n) {\n return `${projectDashboardUrl(team, project)}/${deploymentName}`;\n}\n\nexport function projectDashboardUrl(team: string, project: string) {\n return `${teamDashboardUrl(team)}/${project}`;\n}\n\nexport function teamDashboardUrl(team: string) {\n return `${DASHBOARD_HOST}/t/${team}`;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,uBAAkD;AAE3C,MAAM,iBAAiB,QAAQ,IAAI,wBACtC,0BACA;AAEJ,eAAsB,gBACpB,KACA;AAAA,EACE;AAAA,EACA;AACF,GAIwB;AACxB,UAAQ,gBAAgB;AAAA,IACtB,KAAK,aAAa;AAChB,iBAAO,iBAAAA,cAAkB,KAAK,cAAc;AAAA,IAC9C;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,2BAA2B,gBAAgB,EAAE;AAAA,IACtD,SAAS;AACP;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,4BAA4B,cAAqB;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AACF;
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { dashboardUrl as localDashboardUrl } from \"./localDeployment/dashboard.js\";\n\nexport const DASHBOARD_HOST = process.env.CONVEX_PROVISION_HOST\n ? \"http://localhost:6789\"\n : \"https://dashboard.convex.dev\";\n\nexport async function getDashboardUrl(\n ctx: Context,\n {\n deploymentName,\n deploymentType,\n }: {\n deploymentName: string;\n deploymentType: DeploymentType;\n },\n): Promise<string | null> {\n switch (deploymentType) {\n case \"anonymous\": {\n return localDashboardUrl(ctx, deploymentName);\n }\n case \"local\":\n case \"dev\":\n case \"prod\":\n case \"preview\":\n case \"custom\":\n return deploymentDashboardUrlPage(deploymentName, \"\");\n default: {\n deploymentType satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unknown deployment type: ${deploymentType as any}`,\n });\n }\n }\n}\n\n// FIXME: this doesn't work correctly in local-dev/self-hosted, where the\n// dashboard isn't at DASHBOARD_HOST and deployments aren't addressed by `/d/`.\nexport function deploymentDashboardUrlPage(\n configuredDeployment: string | null,\n page: string,\n): string {\n const deploymentFrag = configuredDeployment\n ? `/d/${configuredDeployment}`\n : \"\";\n return `${DASHBOARD_HOST}${deploymentFrag}${page}`;\n}\n\nexport function deploymentDashboardUrl(\n team: string,\n project: string,\n deploymentName: string,\n) {\n return `${projectDashboardUrl(team, project)}/${deploymentName}`;\n}\n\nexport function projectDashboardUrl(team: string, project: string) {\n return `${teamDashboardUrl(team)}/${project}`;\n}\n\nexport function teamDashboardUrl(team: string) {\n return `${DASHBOARD_HOST}/t/${team}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,uBAAkD;AAE3C,MAAM,iBAAiB,QAAQ,IAAI,wBACtC,0BACA;AAEJ,eAAsB,gBACpB,KACA;AAAA,EACE;AAAA,EACA;AACF,GAIwB;AACxB,UAAQ,gBAAgB;AAAA,IACtB,KAAK,aAAa;AAChB,iBAAO,iBAAAA,cAAkB,KAAK,cAAc;AAAA,IAC9C;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,2BAA2B,gBAAgB,EAAE;AAAA,IACtD,SAAS;AACP;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,4BAA4B,cAAqB;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAIO,SAAS,2BACd,sBACA,MACQ;AACR,QAAM,iBAAiB,uBACnB,MAAM,oBAAoB,KAC1B;AACJ,SAAO,GAAG,cAAc,GAAG,cAAc,GAAG,IAAI;AAClD;AAEO,SAAS,uBACd,MACA,SACA,gBACA;AACA,SAAO,GAAG,oBAAoB,MAAM,OAAO,CAAC,IAAI,cAAc;AAChE;AAEO,SAAS,oBAAoB,MAAc,SAAiB;AACjE,SAAO,GAAG,iBAAiB,IAAI,CAAC,IAAI,OAAO;AAC7C;AAEO,SAAS,iBAAiB,MAAc;AAC7C,SAAO,GAAG,cAAc,MAAM,IAAI;AACpC;",
|
|
6
6
|
"names": ["localDashboardUrl"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/generatedFunctionLogsApi.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport type paths = Record<string, never>;\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n FunctionExecutionJson: {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n logLines: components[\"schemas\"][\"Value\"][];\n /** Format: double */\n timestamp: number;\n cachedResult: boolean;\n caller: string;\n parentExecutionId?: string | null;\n /** Format: double */\n executionTime: number;\n /** Format: double */\n userExecutionTime?: number | null;\n success?: null | components[\"schemas\"][\"Value\"];\n error?: string | null;\n requestId: string;\n executionId: string;\n usageStats: components[\"schemas\"][\"UsageStatsJson\"];\n /** Format: double */\n returnBytes?: number | null;\n occInfo?: null | components[\"schemas\"][\"OccInfoJson\"];\n willRetry: boolean;\n /** Format: double */\n executionTimestamp: number;\n identityType: string;\n environment: string;\n /** @enum {string} */\n kind: \"Completion\";\n } | {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n /** Format: double */\n timestamp: number;\n logLines: components[\"schemas\"][\"Value\"][];\n requestId: string;\n executionId: string;\n /** @enum {string} */\n kind: \"Progress\";\n };\n /** @enum {string} */\n LogLevelJson: \"DEBUG\" | \"ERROR\" | \"WARN\" | \"INFO\" | \"LOG\";\n LogLineJson: {\n messages: string[];\n isTruncated: boolean;\n /** Format: int64 */\n timestamp: number;\n level: components[\"schemas\"][\"LogLevelJson\"];\n systemMetadata?: null | components[\"schemas\"][\"SystemLogMetadataJson\"];\n componentPath?: string | null;\n udfPath?: string | null;\n };\n OccInfoJson: {\n tableName?: string | null;\n documentId?: string | null;\n writeSource?: string | null;\n componentPath?: string | null;\n /** Format: int64 */\n retryCount?: number | null;\n };\n StreamFunctionLogs: {\n /** Format: double */\n cursor: number;\n sessionId?: string | null;\n /** Format: int32 */\n clientRequestCounter?: number | null;\n };\n StreamUdfExecutionQueryArgs: {\n /** Format: double */\n cursor: number;\n };\n StreamUdfExecutionResponse: {\n entries: components[\"schemas\"][\"FunctionExecutionJson\"][];\n /** Format: double */\n newCursor: number;\n };\n SystemLogMetadataJson: {\n code: string;\n };\n /** @enum {string} */\n UdfTypeJson: \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n UsageStatsJson: {\n /** Format: int64 */\n databaseReadBytes: number;\n /** Format: int64 */\n databaseWriteBytes: number;\n /** Format: int64 */\n databaseIoReadBytes: number;\n /** Format: int64 */\n databaseIoWriteBytes: number;\n /** Format: int64 */\n databaseReadDocuments: number;\n /** Format: int64 */\n storageReadBytes: number;\n /** Format: int64 */\n storageWriteBytes: number;\n /** Format: int64 */\n vectorIndexReadBytes: number;\n /** Format: int64 */\n vectorIndexWriteBytes: number;\n /** Format: int64 */\n textIndexQueryBytes: number;\n /** Format: int64 */\n textIndexWriteQueryBytes: number;\n /** Format: int64 */\n vectorIndexReadQueryBytes: number;\n /** Format: int64 */\n vectorIndexWriteQueryBytes: number;\n /** Format: int64 */\n networkEgressBytes: number;\n /** Format: int64 */\n memoryUsedMb: number;\n };\n Value: unknown;\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type FunctionExecutionJson = components['schemas']['FunctionExecutionJson'];\nexport type LogLevelJson = components['schemas']['LogLevelJson'];\nexport type LogLineJson = components['schemas']['LogLineJson'];\nexport type OccInfoJson = components['schemas']['OccInfoJson'];\nexport type StreamFunctionLogs = components['schemas']['StreamFunctionLogs'];\nexport type StreamUdfExecutionQueryArgs = components['schemas']['StreamUdfExecutionQueryArgs'];\nexport type StreamUdfExecutionResponse = components['schemas']['StreamUdfExecutionResponse'];\nexport type SystemLogMetadataJson = components['schemas']['SystemLogMetadataJson'];\nexport type UdfTypeJson = components['schemas']['UdfTypeJson'];\nexport type UsageStatsJson = components['schemas']['UsageStatsJson'];\nexport type Value = components['schemas']['Value'];\nexport type $defs = Record<string, never>;\nexport type operations = Record<string, never>;\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport type paths = Record<string, never>;\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n FunctionExecutionJson: {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n logLines: components[\"schemas\"][\"Value\"][];\n /** Format: double */\n timestamp: number;\n cachedResult: boolean;\n caller: string;\n parentExecutionId?: string | null;\n /** Format: double */\n executionTime: number;\n /** Format: double */\n userExecutionTime?: number | null;\n success?: null | components[\"schemas\"][\"Value\"];\n error?: string | null;\n requestId: string;\n executionId: string;\n usageStats: components[\"schemas\"][\"UsageStatsJson\"];\n /** Format: double */\n returnBytes?: number | null;\n occInfo?: null | components[\"schemas\"][\"OccInfoJson\"];\n willRetry: boolean;\n /** Format: double */\n executionTimestamp: number;\n identityType: string;\n environment: string;\n /** @enum {string} */\n kind: \"Completion\";\n } | {\n udfType: components[\"schemas\"][\"UdfTypeJson\"];\n componentPath?: string | null;\n identifier: string;\n /** Format: double */\n timestamp: number;\n logLines: components[\"schemas\"][\"Value\"][];\n requestId: string;\n executionId: string;\n /** @enum {string} */\n kind: \"Progress\";\n };\n /** @enum {string} */\n LogLevelJson: \"DEBUG\" | \"ERROR\" | \"WARN\" | \"INFO\" | \"LOG\";\n LogLineJson: {\n messages: string[];\n isTruncated: boolean;\n /** Format: int64 */\n timestamp: number;\n level: components[\"schemas\"][\"LogLevelJson\"];\n systemMetadata?: null | components[\"schemas\"][\"SystemLogMetadataJson\"];\n componentPath?: string | null;\n udfPath?: string | null;\n };\n OccInfoJson: {\n tableName?: string | null;\n documentId?: string | null;\n writeSource?: string | null;\n componentPath?: string | null;\n /** Format: int64 */\n retryCount?: number | null;\n };\n StreamFunctionLogs: {\n /** Format: double */\n cursor: number;\n sessionId?: string | null;\n /** Format: int32 */\n clientRequestCounter?: number | null;\n };\n StreamUdfExecutionQueryArgs: {\n /** Format: double */\n cursor: number;\n };\n StreamUdfExecutionResponse: {\n entries: components[\"schemas\"][\"FunctionExecutionJson\"][];\n /** Format: double */\n newCursor: number;\n };\n SystemLogMetadataJson: {\n code: string;\n };\n /** @enum {string} */\n UdfTypeJson: \"Query\" | \"Mutation\" | \"Action\" | \"HttpAction\";\n UsageStatsJson: {\n /** Format: int64 */\n databaseReadBytes: number;\n /** Format: int64 */\n databaseWriteBytes: number;\n /** Format: int64 */\n databaseIoReadBytes: number;\n /** Format: int64 */\n databaseIoWriteBytes: number;\n /** Format: int64 */\n databaseReadDocuments: number;\n /** Format: int64 */\n databaseWriteDocuments: number;\n /** Format: int64 */\n storageReadBytes: number;\n /** Format: int64 */\n storageWriteBytes: number;\n /** Format: int64 */\n vectorIndexReadBytes: number;\n /** Format: int64 */\n vectorIndexWriteBytes: number;\n /** Format: int64 */\n textIndexQueryBytes: number;\n /** Format: int64 */\n textIndexWriteQueryBytes: number;\n /** Format: int64 */\n vectorIndexReadQueryBytes: number;\n /** Format: int64 */\n vectorIndexWriteQueryBytes: number;\n /** Format: int64 */\n networkEgressBytes: number;\n /** Format: int64 */\n memoryUsedMb: number;\n };\n Value: unknown;\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type FunctionExecutionJson = components['schemas']['FunctionExecutionJson'];\nexport type LogLevelJson = components['schemas']['LogLevelJson'];\nexport type LogLineJson = components['schemas']['LogLineJson'];\nexport type OccInfoJson = components['schemas']['OccInfoJson'];\nexport type StreamFunctionLogs = components['schemas']['StreamFunctionLogs'];\nexport type StreamUdfExecutionQueryArgs = components['schemas']['StreamUdfExecutionQueryArgs'];\nexport type StreamUdfExecutionResponse = components['schemas']['StreamUdfExecutionResponse'];\nexport type SystemLogMetadataJson = components['schemas']['SystemLogMetadataJson'];\nexport type UdfTypeJson = components['schemas']['UdfTypeJson'];\nexport type UsageStatsJson = components['schemas']['UsageStatsJson'];\nexport type Value = components['schemas']['Value'];\nexport type $defs = Record<string, never>;\nexport type operations = Record<string, never>;\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -28,7 +28,7 @@ function addProgressLinkIfSlow(msg, deploymentName, start) {
|
|
|
28
28
|
if (Date.now() - start > 1e4) {
|
|
29
29
|
const dashboardUrl = (0, import_dashboard.deploymentDashboardUrlPage)(
|
|
30
30
|
deploymentName,
|
|
31
|
-
`/
|
|
31
|
+
`/schema?showSchema=true`
|
|
32
32
|
);
|
|
33
33
|
msg = msg.concat(`
|
|
34
34
|
See progress here: ${dashboardUrl}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/indexes.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\n\nexport type IndexMetadata = {\n table: string;\n name: string;\n fields:\n | string[]\n | {\n searchField: string;\n filterFields: string[];\n }\n | {\n dimensions: number;\n vectorField: string;\n filterFields: string[];\n };\n backfill: {\n state: \"in_progress\" | \"done\";\n };\n staged: boolean;\n};\n\nexport type LargeIndexDeletionCheck =\n // Don\u2019t verify whether large indexes have been deleted\n | \"no verification\"\n // If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)\n | \"ask for confirmation\"\n // If large indexes are being deleted, confirm (the user has used --allow-deleting-large-indexes)\n | \"has confirmation\";\n\nexport function addProgressLinkIfSlow(\n msg: string,\n deploymentName: string | null,\n start: number,\n): string {\n if (Date.now() - start > 10_000) {\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport { DeveloperIndexConfig } from \"./deployApi/finishPush.js\";\n\nexport type IndexMetadata = {\n table: string;\n name: string;\n fields:\n | string[]\n | {\n searchField: string;\n filterFields: string[];\n }\n | {\n dimensions: number;\n vectorField: string;\n filterFields: string[];\n };\n backfill: {\n state: \"in_progress\" | \"done\";\n };\n staged: boolean;\n};\n\nexport type LargeIndexDeletionCheck =\n // Don\u2019t verify whether large indexes have been deleted\n | \"no verification\"\n // If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)\n | \"ask for confirmation\"\n // If large indexes are being deleted, confirm (the user has used --allow-deleting-large-indexes)\n | \"has confirmation\";\n\nexport function addProgressLinkIfSlow(\n msg: string,\n deploymentName: string | null,\n start: number,\n): string {\n if (Date.now() - start > 10_000) {\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/schema?showSchema=true`,\n );\n msg = msg.concat(`\\nSee progress here: ${dashboardUrl}`);\n }\n return msg;\n}\n\nexport function formatIndex(index: DeveloperIndexConfig) {\n const [tableName, indexName] = index.name.split(\".\");\n return `${tableName}.${chalkStderr.bold(indexName)} ${chalkStderr.gray(formatIndexFields(index))}${index.staged ? chalkStderr.blue(\" (staged)\") : \"\"}`;\n}\n\nfunction formatIndexFields(index: DeveloperIndexConfig) {\n switch (index.type) {\n case \"database\":\n return (\n \" \" + index.fields.map((f) => chalkStderr.underline(f)).join(\", \")\n );\n case \"search\":\n return `${chalkStderr.cyan(\"(text)\")} ${chalkStderr.underline(index.searchField)}${formatFilterFields(index.filterFields)}`;\n case \"vector\":\n return `${chalkStderr.cyan(\"(vector)\")} ${chalkStderr.underline(index.vectorField)} (${index.dimensions} dimensions)${formatFilterFields(index.filterFields)}`;\n default:\n index satisfies never;\n return \"\";\n }\n}\n\nfunction formatFilterFields(filterFields: string[]) {\n if (filterFields.length === 0) {\n return \"\";\n }\n return `, filter${filterFields.length === 1 ? \"\" : \"s\"} on ${filterFields.map((f) => chalkStderr.underline(f)).join(\", \")}`;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,uBAA2C;AA+BpC,SAAS,sBACd,KACA,gBACA,OACQ;AACR,MAAI,KAAK,IAAI,IAAI,QAAQ,KAAQ;AAC/B,UAAM,mBAAe;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,OAAO;AAAA,qBAAwB,YAAY,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA6B;AACvD,QAAM,CAAC,WAAW,SAAS,IAAI,MAAM,KAAK,MAAM,GAAG;AACnD,SAAO,GAAG,SAAS,IAAI,yBAAY,KAAK,SAAS,CAAC,IAAI,yBAAY,KAAK,kBAAkB,KAAK,CAAC,CAAC,GAAG,MAAM,SAAS,yBAAY,KAAK,YAAY,IAAI,EAAE;AACvJ;AAEA,SAAS,kBAAkB,OAA6B;AACtD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,yBAAY,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IAEtE,KAAK;AACH,aAAO,GAAG,yBAAY,KAAK,QAAQ,CAAC,MAAM,yBAAY,UAAU,MAAM,WAAW,CAAC,GAAG,mBAAmB,MAAM,YAAY,CAAC;AAAA,IAC7H,KAAK;AACH,aAAO,GAAG,yBAAY,KAAK,UAAU,CAAC,MAAM,yBAAY,UAAU,MAAM,WAAW,CAAC,KAAK,MAAM,UAAU,eAAe,mBAAmB,MAAM,YAAY,CAAC;AAAA,IAChK;AACE;AACA,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,cAAwB;AAClD,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,WAAW,aAAa,WAAW,IAAI,KAAK,GAAG,OAAO,aAAa,IAAI,CAAC,MAAM,yBAAY,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC3H;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|