convex 1.42.3 → 1.43.0-alpha.1
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/bin/main-dev +6 -1
- package/dist/browser.bundle.js +49 -10
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/simple_client-node.js +35 -35
- package/dist/cjs/browser/simple_client-node.js.map +2 -2
- package/dist/cjs/browser/sync/paginated_query_client.js +20 -9
- package/dist/cjs/browser/sync/paginated_query_client.js.map +2 -2
- package/dist/cjs/cli/codegen_templates/validator_helpers.js +2 -0
- package/dist/cjs/cli/codegen_templates/validator_helpers.js.map +2 -2
- package/dist/cjs/cli/deployment.js +2 -1
- package/dist/cjs/cli/deployment.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js.map +2 -2
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/deployApi/validator.js +1 -0
- package/dist/cjs/cli/lib/deployApi/validator.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/generateDocs.js +1 -1
- package/dist/cjs/cli/lib/generateDocs.js.map +2 -2
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/projectMismatch.js.map +2 -2
- package/dist/cjs/cli/lib/login.js +23 -23
- package/dist/cjs/cli/lib/login.js.map +2 -2
- package/dist/cjs/cli/lib/typecheck.js +28 -25
- package/dist/cjs/cli/lib/typecheck.js.map +2 -2
- package/dist/cjs/cli/lib/usageLimits.js +164 -0
- package/dist/cjs/cli/lib/usageLimits.js.map +7 -0
- package/dist/cjs/cli/usageLimits.js +326 -0
- package/dist/cjs/cli/usageLimits.js.map +7 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/cron.js +33 -29
- package/dist/cjs/server/cron.js.map +2 -2
- package/dist/cjs/server/database.js.map +1 -1
- package/dist/cjs/server/impl/database_impl.js +3 -0
- package/dist/cjs/server/impl/database_impl.js.map +2 -2
- package/dist/cjs/server/log.js +2 -1
- package/dist/cjs/server/log.js.map +2 -2
- package/dist/cjs/server/logVars.js +12 -1
- package/dist/cjs/server/logVars.js.map +2 -2
- package/dist/cjs/values/compare.js +5 -1
- package/dist/cjs/values/compare.js.map +2 -2
- package/dist/cjs/values/index.js +1 -0
- package/dist/cjs/values/index.js.map +2 -2
- package/dist/cjs/values/size.js +4 -0
- package/dist/cjs/values/size.js.map +2 -2
- package/dist/cjs/values/validator.js +11 -0
- package/dist/cjs/values/validator.js.map +2 -2
- package/dist/cjs/values/validators.js +20 -0
- package/dist/cjs/values/validators.js.map +2 -2
- package/dist/cjs/values/value.js +31 -0
- package/dist/cjs/values/value.js.map +2 -2
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +2 -2
- package/dist/cjs-types/cli/generatedApi.d.ts +43 -43
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/validator.d.ts +6 -0
- package/dist/cjs-types/cli/lib/deployApi/validator.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -2
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
- package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +24 -24
- package/dist/cjs-types/cli/lib/typecheck.d.ts +2 -0
- package/dist/cjs-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/usageLimits.d.ts +46 -0
- package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -0
- package/dist/cjs-types/cli/usageLimits.d.ts +22 -0
- package/dist/cjs-types/cli/usageLimits.d.ts.map +1 -0
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/index.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +26 -8
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.d.ts +20 -11
- package/dist/cjs-types/server/cron.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.test.d.ts +2 -0
- package/dist/cjs-types/server/cron.test.d.ts.map +1 -0
- package/dist/cjs-types/server/database.d.ts +14 -0
- package/dist/cjs-types/server/database.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/database_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/log.d.ts.map +1 -1
- package/dist/cjs-types/server/logVars.d.ts +14 -1
- package/dist/cjs-types/server/logVars.d.ts.map +1 -1
- package/dist/cjs-types/values/compare.d.ts.map +1 -1
- package/dist/cjs-types/values/index.d.ts +2 -2
- package/dist/cjs-types/values/index.d.ts.map +1 -1
- package/dist/cjs-types/values/size.d.ts +1 -1
- package/dist/cjs-types/values/size.d.ts.map +1 -1
- package/dist/cjs-types/values/validator.d.ts +10 -1
- package/dist/cjs-types/values/validator.d.ts.map +1 -1
- package/dist/cjs-types/values/validators.d.ts +14 -3
- package/dist/cjs-types/values/validators.d.ts.map +1 -1
- package/dist/cjs-types/values/value.d.ts +18 -1
- package/dist/cjs-types/values/value.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +2534 -2009
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/simple_client-node.js +35 -35
- package/dist/esm/browser/simple_client-node.js.map +1 -1
- package/dist/esm/browser/sync/paginated_query_client.js +20 -9
- package/dist/esm/browser/sync/paginated_query_client.js.map +2 -2
- package/dist/esm/cli/codegen_templates/validator_helpers.js +2 -0
- package/dist/esm/cli/codegen_templates/validator_helpers.js.map +2 -2
- package/dist/esm/cli/deployment.js +2 -1
- package/dist/esm/cli/deployment.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/validator.js +1 -0
- package/dist/esm/cli/lib/deployApi/validator.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/generateDocs.js +1 -1
- package/dist/esm/cli/lib/generateDocs.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/projectMismatch.js.map +2 -2
- package/dist/esm/cli/lib/login.js +23 -23
- package/dist/esm/cli/lib/login.js.map +2 -2
- package/dist/esm/cli/lib/typecheck.js +27 -25
- package/dist/esm/cli/lib/typecheck.js.map +2 -2
- package/dist/esm/cli/lib/usageLimits.js +129 -0
- package/dist/esm/cli/lib/usageLimits.js.map +7 -0
- package/dist/esm/cli/usageLimits.js +316 -0
- package/dist/esm/cli/usageLimits.js.map +7 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/cron.js +33 -29
- package/dist/esm/server/cron.js.map +2 -2
- package/dist/esm/server/impl/database_impl.js +4 -1
- package/dist/esm/server/impl/database_impl.js.map +2 -2
- package/dist/esm/server/log.js +3 -2
- package/dist/esm/server/log.js.map +2 -2
- package/dist/esm/server/logVars.js +11 -1
- package/dist/esm/server/logVars.js.map +2 -2
- package/dist/esm/values/compare.js +5 -1
- package/dist/esm/values/compare.js.map +2 -2
- package/dist/esm/values/index.js +1 -1
- package/dist/esm/values/index.js.map +2 -2
- package/dist/esm/values/size.js +4 -0
- package/dist/esm/values/size.js.map +2 -2
- package/dist/esm/values/validator.js +12 -0
- package/dist/esm/values/validator.js.map +2 -2
- package/dist/esm/values/validators.js +19 -0
- package/dist/esm/values/validators.js.map +2 -2
- package/dist/esm/values/value.js +29 -1
- package/dist/esm/values/value.js.map +2 -2
- package/dist/esm-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +2 -2
- package/dist/esm-types/cli/generatedApi.d.ts +43 -43
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/validator.d.ts +6 -0
- package/dist/esm-types/cli/lib/deployApi/validator.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -2
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
- package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +24 -24
- package/dist/esm-types/cli/lib/typecheck.d.ts +2 -0
- package/dist/esm-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/typecheck.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/usageLimits.d.ts +46 -0
- package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -0
- package/dist/esm-types/cli/usageLimits.d.ts +22 -0
- package/dist/esm-types/cli/usageLimits.d.ts.map +1 -0
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/index.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +26 -8
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/cron.d.ts +20 -11
- package/dist/esm-types/server/cron.d.ts.map +1 -1
- package/dist/esm-types/server/cron.test.d.ts +2 -0
- package/dist/esm-types/server/cron.test.d.ts.map +1 -0
- package/dist/esm-types/server/database.d.ts +14 -0
- package/dist/esm-types/server/database.d.ts.map +1 -1
- package/dist/esm-types/server/impl/database_impl.d.ts.map +1 -1
- package/dist/esm-types/server/log.d.ts.map +1 -1
- package/dist/esm-types/server/logVars.d.ts +14 -1
- package/dist/esm-types/server/logVars.d.ts.map +1 -1
- package/dist/esm-types/values/compare.d.ts.map +1 -1
- package/dist/esm-types/values/index.d.ts +2 -2
- package/dist/esm-types/values/index.d.ts.map +1 -1
- package/dist/esm-types/values/size.d.ts +1 -1
- package/dist/esm-types/values/size.d.ts.map +1 -1
- package/dist/esm-types/values/validator.d.ts +10 -1
- package/dist/esm-types/values/validator.d.ts.map +1 -1
- package/dist/esm-types/values/validators.d.ts +14 -3
- package/dist/esm-types/values/validators.d.ts.map +1 -1
- package/dist/esm-types/values/value.d.ts +18 -1
- package/dist/esm-types/values/value.d.ts.map +1 -1
- package/dist/react.bundle.js +53 -11
- package/dist/react.bundle.js.map +2 -2
- package/package.json +9 -10
- package/schemas/convex.schema.json +2 -1
- package/src/browser/sync/paginated_query_client.test.ts +209 -1
- package/src/browser/sync/paginated_query_client.ts +26 -9
- package/src/cli/codegen_templates/validator_helpers.test.ts +31 -0
- package/src/cli/codegen_templates/validator_helpers.ts +6 -0
- package/src/cli/deployment.ts +4 -1
- package/src/cli/deploymentCreate.test.ts +2 -2
- package/src/cli/deploymentCreate.ts +2 -2
- package/src/cli/generatedApi.ts +43 -43
- package/src/cli/lib/deployApi/validator.ts +1 -0
- package/src/cli/lib/deploymentSelection.ts +2 -2
- package/src/cli/lib/generateDocs.test.ts +1 -1
- package/src/cli/lib/generateDocs.ts +3 -3
- package/src/cli/lib/generatedFunctionLogsApi.ts +45 -45
- package/src/cli/lib/localDeployment/projectMismatch.ts +2 -2
- package/src/cli/lib/login.ts +33 -30
- package/src/cli/lib/typecheck.test.ts +71 -0
- package/src/cli/lib/typecheck.ts +33 -27
- package/src/cli/lib/usageLimits.ts +242 -0
- package/src/cli/usageLimits.ts +420 -0
- package/src/index.ts +1 -1
- package/src/server/audit_logging.test.ts +2 -0
- package/src/server/components/index.test.ts +33 -1
- package/src/server/components/index.ts +41 -14
- package/src/server/cron.test.ts +58 -0
- package/src/server/cron.ts +82 -21
- package/src/server/database.ts +15 -0
- package/src/server/impl/database_impl.ts +4 -1
- package/src/server/log.ts +4 -1
- package/src/server/logVars.ts +17 -1
- package/src/server/schema.test.ts +6 -1
- package/src/values/compare.ts +5 -2
- package/src/values/index.ts +2 -1
- package/src/values/size.test.ts +5 -0
- package/src/values/size.ts +5 -1
- package/src/values/validator.test.ts +16 -1
- package/src/values/validator.ts +13 -0
- package/src/values/validators.ts +29 -1
- package/src/values/value.test.ts +35 -0
- package/src/values/value.ts +56 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/generatedApi.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport interface paths {\n \"/teams\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get: operations[\"get_teams_for_member\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_slug}/projects\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get: operations[\"get_cli_projects_for_team\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/delete_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Delete a WorkOS environment. This removes the environment from both WorkOS and the Convex database. */\n post: operations[\"delete_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/disconnect_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Disconnect a WorkOS team from a Convex team. This is a destructive action that will prevent new WorkOS environments from being provisioned, though existing environments will continue to work. */\n post: operations[\"disconnect_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/available_workos_team_emails\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get candidate email addresses to be WorkOS admins. */\n get: operations[\"get_available_workos_team_emails\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/deployments/{deployment_name}/has_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if a deployment has an associated WorkOS team */\n get: operations[\"get_has_associated_workos_team\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/get_or_provision_workos_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Get or provision a WorkOS environment for a deployment */\n post: operations[\"get_or_provision_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/deployments/{deployment_name}/workos_environment_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if the WorkOS environment associated with this deployment is still accessible */\n get: operations[\"get_workos_environment_health\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_id}/workos_invitation_eligible_emails\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get emails eligible for WorkOS team invitation (all verified emails except those that are admin of a different WorkOS team) */\n get: operations[\"get_workos_invitation_eligible_emails\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_id}/workos_team_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if the WorkOS team associated with this Convex team is still accessible */\n get: operations[\"get_workos_team_health\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/invite_team_member\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Invite a member to the WorkOS team associated with a Convex team */\n post: operations[\"invite_workos_team_member\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/has_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Check if a deployment has an associated WorkOS team */\n post: operations[\"has_associated_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/provision_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Provision a WorkOS team for a Convex team */\n post: operations[\"provision_associated_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/projects/{project_id}/workos_environments\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description List all WorkOS environments for a project */\n get: operations[\"get_project_workos_environments\"];\n put?: never;\n /** @description Create a new WorkOS environment for a project */\n post: operations[\"provision_project_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/projects/{project_id}/workos_environments/{client_id}\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get a specific WorkOS environment for a project including credentials. This action is audited. */\n get: operations[\"get_project_workos_environment\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/delete_project_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Delete a WorkOS environment from a project */\n post: operations[\"delete_project_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/check_project_environment_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Check the health of a project WorkOS environment. Returns HTTP error on failure. */\n post: operations[\"check_project_environment_health\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n}\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n AvailableWorkOSTeamEmailsResponse: {\n availableEmails: string[];\n usedEmails: string[];\n };\n CheckProjectEnvironmentHealthRequest: {\n /** @description WorkOS client ID */\n clientId: string;\n /**\n * Format: int64\n * @description Project ID\n */\n projectId: number;\n };\n DeleteProjectEnvironmentRequest: {\n /** @description WorkOS client ID of the environment to delete */\n clientId: string;\n /**\n * Format: int64\n * @description Project ID for the environment to delete\n */\n projectId: number;\n };\n /** @description Response for deleting a project environment - matches\n * DeleteWorkOSEnvironmentResponse */\n DeleteProjectEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosTeamId: string;\n };\n DeleteWorkOSEnvironmentRequest: {\n /** @description Deployment name for the environment to delete */\n deploymentName: string;\n };\n DeleteWorkOSEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosTeamId: string;\n };\n DisconnectWorkOSTeamRequest: {\n /** @description Convex team ID to disconnect from WorkOS */\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n DisconnectWorkOSTeamResponse: {\n workosTeamId: string;\n workosTeamName: string;\n };\n GetOrProvisionEnvironmentRequest: {\n deploymentName: string;\n environmentName?: string | null;\n isProduction?: boolean | null;\n };\n /** @description Response for getting a project WorkOS environment with credentials - matches\n * ProvisionProjectEnvironmentResponse pattern with workos_ prefix */\n GetProjectEnvironmentResponse: {\n isProduction: boolean;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n workosApiKey: string;\n workosClientId: string;\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n };\n GetProjectEnvironmentsResponse: {\n environments: components[\"schemas\"][\"ProjectEnvironmentSummary\"][];\n };\n HasAssociatedWorkOSTeamRequest: {\n deploymentName: string;\n };\n HasAssociatedWorkOSTeamResponse: {\n /** @description Email of Convex team member who created the WorkOS account.\n * This field should always be present when has_associated_workos_team is\n * true. */\n adminConvexEmail?: string | null;\n /** @description Email address used to provision the WorkOS account. This field should\n * always be present if has_associated_workos_team is true. */\n adminEmail?: string | null;\n /** @description Name of Convex team member who created the WorkOS account.\n * This field is optional even when has_associated_workos_team is true. */\n adminName?: string | null;\n hasAssociatedWorkosTeam: boolean;\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n InvitationEligibleEmailsResponse: {\n /** @description The admin email used to create this team's WorkOS account (always\n * eligible for re-invitation) */\n adminEmail?: string | null;\n eligibleEmails: string[];\n };\n InviteWorkOSTeamMemberRequest: {\n /** @description Email address to invite to the WorkOS team,\n * must be a verified email address associated with the user's account */\n email: string;\n /** @description Convex team ID that has an associated WorkOS team */\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n InviteWorkOSTeamMemberResponse: {\n email: string;\n roleSlug: string;\n };\n ManagedBy: \"vercel\" | {\n oauthApp: string;\n };\n /** Format: int64 */\n MemberId: number;\n ProjectDetails: {\n /** Format: int64 */\n createTime: number;\n devDeploymentName?: string | null;\n id: components[\"schemas\"][\"ProjectId\"];\n name: components[\"schemas\"][\"ProjectName\"];\n prodDeploymentName?: string | null;\n slug: components[\"schemas\"][\"ProjectSlug\"];\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n /** @description Summary of a project WorkOS environment for list responses - slimmer than\n * full environment details, uses workos_ prefix for consistency with\n * deployment */\n ProjectEnvironmentSummary: {\n isProduction: boolean;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n workosClientId: string;\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n };\n /** Format: int64 */\n ProjectId: number;\n ProjectName: string;\n ProjectSlug: string;\n ProvisionEnvironmentResponse: {\n apiKey: string;\n clientId: string;\n environmentId: string;\n environmentName: string;\n newlyProvisioned: boolean;\n };\n ProvisionProjectEnvironmentRequest: {\n environmentName: string;\n isProduction?: boolean | null;\n };\n /** @description Response for provisioning a project WorkOS environment - matches\n * ProvisionEnvironmentResponse pattern with workos_ prefix for consistency */\n ProvisionProjectEnvironmentResponse: {\n newlyProvisioned: boolean;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n workosApiKey: string;\n workosClientId: string;\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n };\n ProvisionWorkOSTeamRequest: {\n /** @description Email address to use for the WorkOS team admin,\n * must be a verified email address associated with the user's account */\n email: string;\n /** @description Convex team ID, no WorkOS team exists at this point */\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n ProvisionWorkOSTeamResponse: {\n adminEmail: string;\n workosTeamId: string;\n workosTeamName: string;\n };\n ReferralCode: string;\n /** @enum {string} */\n RegionName: \"aws-us-east-1\" | \"aws-eu-west-1\";\n /** Format: int64 */\n TeamId: number;\n TeamName: string;\n TeamResponse: {\n creator?: null | components[\"schemas\"][\"MemberId\"];\n defaultRegion?: null | components[\"schemas\"][\"RegionName\"];\n id: components[\"schemas\"][\"TeamId\"];\n managedBy?: null | components[\"schemas\"][\"ManagedBy\"];\n managedByUrl?: string | null;\n name: components[\"schemas\"][\"TeamName\"];\n referralCode: components[\"schemas\"][\"ReferralCode\"];\n referredBy?: null | components[\"schemas\"][\"TeamId\"];\n slug: components[\"schemas\"][\"TeamSlug\"];\n ssoLoginId?: string | null;\n suspended: boolean;\n };\n TeamSlug: string;\n WorkOSEnvironmentHealthResponse: {\n clientId: string;\n id: string;\n name: string;\n };\n /** @enum {string} */\n WorkOSProductionState: \"active\" | \"inactive\" | \"suspended\" | \"deleting\";\n WorkOSTeamHealthResponse: {\n teamInfo?: null | components[\"schemas\"][\"WorkOSTeamInfo\"];\n /** @description Whether a WorkOS team has been provisioned for this Convex team */\n teamProvisioned: boolean;\n };\n WorkOSTeamInfo: {\n id: string;\n name: string;\n productionState: components[\"schemas\"][\"WorkOSProductionState\"];\n };\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type AvailableWorkOsTeamEmailsResponse = components['schemas']['AvailableWorkOSTeamEmailsResponse'];\nexport type CheckProjectEnvironmentHealthRequest = components['schemas']['CheckProjectEnvironmentHealthRequest'];\nexport type DeleteProjectEnvironmentRequest = components['schemas']['DeleteProjectEnvironmentRequest'];\nexport type DeleteProjectEnvironmentResponse = components['schemas']['DeleteProjectEnvironmentResponse'];\nexport type DeleteWorkOsEnvironmentRequest = components['schemas']['DeleteWorkOSEnvironmentRequest'];\nexport type DeleteWorkOsEnvironmentResponse = components['schemas']['DeleteWorkOSEnvironmentResponse'];\nexport type DisconnectWorkOsTeamRequest = components['schemas']['DisconnectWorkOSTeamRequest'];\nexport type DisconnectWorkOsTeamResponse = components['schemas']['DisconnectWorkOSTeamResponse'];\nexport type GetOrProvisionEnvironmentRequest = components['schemas']['GetOrProvisionEnvironmentRequest'];\nexport type GetProjectEnvironmentResponse = components['schemas']['GetProjectEnvironmentResponse'];\nexport type GetProjectEnvironmentsResponse = components['schemas']['GetProjectEnvironmentsResponse'];\nexport type HasAssociatedWorkOsTeamRequest = components['schemas']['HasAssociatedWorkOSTeamRequest'];\nexport type HasAssociatedWorkOsTeamResponse = components['schemas']['HasAssociatedWorkOSTeamResponse'];\nexport type InvitationEligibleEmailsResponse = components['schemas']['InvitationEligibleEmailsResponse'];\nexport type InviteWorkOsTeamMemberRequest = components['schemas']['InviteWorkOSTeamMemberRequest'];\nexport type InviteWorkOsTeamMemberResponse = components['schemas']['InviteWorkOSTeamMemberResponse'];\nexport type ManagedBy = components['schemas']['ManagedBy'];\nexport type MemberId = components['schemas']['MemberId'];\nexport type ProjectDetails = components['schemas']['ProjectDetails'];\nexport type ProjectEnvironmentSummary = components['schemas']['ProjectEnvironmentSummary'];\nexport type ProjectId = components['schemas']['ProjectId'];\nexport type ProjectName = components['schemas']['ProjectName'];\nexport type ProjectSlug = components['schemas']['ProjectSlug'];\nexport type ProvisionEnvironmentResponse = components['schemas']['ProvisionEnvironmentResponse'];\nexport type ProvisionProjectEnvironmentRequest = components['schemas']['ProvisionProjectEnvironmentRequest'];\nexport type ProvisionProjectEnvironmentResponse = components['schemas']['ProvisionProjectEnvironmentResponse'];\nexport type ProvisionWorkOsTeamRequest = components['schemas']['ProvisionWorkOSTeamRequest'];\nexport type ProvisionWorkOsTeamResponse = components['schemas']['ProvisionWorkOSTeamResponse'];\nexport type ReferralCode = components['schemas']['ReferralCode'];\nexport type RegionName = components['schemas']['RegionName'];\nexport type TeamId = components['schemas']['TeamId'];\nexport type TeamName = components['schemas']['TeamName'];\nexport type TeamResponse = components['schemas']['TeamResponse'];\nexport type TeamSlug = components['schemas']['TeamSlug'];\nexport type WorkOsEnvironmentHealthResponse = components['schemas']['WorkOSEnvironmentHealthResponse'];\nexport type WorkOsProductionState = components['schemas']['WorkOSProductionState'];\nexport type WorkOsTeamHealthResponse = components['schemas']['WorkOSTeamHealthResponse'];\nexport type WorkOsTeamInfo = components['schemas']['WorkOSTeamInfo'];\nexport type $defs = Record<string, never>;\nexport interface operations {\n get_teams_for_member: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"TeamResponse\"][];\n };\n };\n };\n };\n get_cli_projects_for_team: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Team slug identifier */\n team_slug: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProjectDetails\"][];\n };\n };\n };\n };\n delete_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteWorkOSEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteWorkOSEnvironmentResponse\"];\n };\n };\n };\n };\n disconnect_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DisconnectWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DisconnectWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_available_workos_team_emails: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"AvailableWorkOSTeamEmailsResponse\"];\n };\n };\n };\n };\n get_has_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Deployment name */\n deployment_name: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_or_provision_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"GetOrProvisionEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionEnvironmentResponse\"];\n };\n };\n };\n };\n get_workos_environment_health: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Deployment name */\n deployment_name: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSEnvironmentHealthResponse\"];\n };\n };\n };\n };\n get_workos_invitation_eligible_emails: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Convex team ID */\n team_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"InvitationEligibleEmailsResponse\"];\n };\n };\n };\n };\n get_workos_team_health: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Convex team ID */\n team_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSTeamHealthResponse\"];\n };\n };\n };\n };\n invite_workos_team_member: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"InviteWorkOSTeamMemberRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"InviteWorkOSTeamMemberResponse\"];\n };\n };\n };\n };\n has_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamResponse\"];\n };\n };\n };\n };\n provision_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_project_workos_environments: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"GetProjectEnvironmentsResponse\"];\n };\n };\n };\n };\n provision_project_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n };\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionProjectEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionProjectEnvironmentResponse\"];\n };\n };\n };\n };\n get_project_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n client_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"GetProjectEnvironmentResponse\"];\n };\n };\n };\n };\n delete_project_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteProjectEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteProjectEnvironmentResponse\"];\n };\n };\n };\n };\n check_project_environment_health: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"CheckProjectEnvironmentHealthRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSEnvironmentHealthResponse\"];\n };\n };\n };\n };\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport interface paths {\n \"/teams\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get: operations[\"get_teams_for_member\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_slug}/projects\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get: operations[\"get_cli_projects_for_team\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/delete_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Delete a WorkOS environment. This removes the environment from both WorkOS and the Convex database. */\n post: operations[\"delete_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/disconnect_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Disconnect a WorkOS team from a Convex team. This is a destructive action that will prevent new WorkOS environments from being provisioned, though existing environments will continue to work. */\n post: operations[\"disconnect_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/available_workos_team_emails\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get candidate email addresses to be WorkOS admins. */\n get: operations[\"get_available_workos_team_emails\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/deployments/{deployment_name}/has_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if a deployment has an associated WorkOS team */\n get: operations[\"get_has_associated_workos_team\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/get_or_provision_workos_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Get or provision a WorkOS environment for a deployment */\n post: operations[\"get_or_provision_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/deployments/{deployment_name}/workos_environment_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if the WorkOS environment associated with this deployment is still accessible */\n get: operations[\"get_workos_environment_health\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_id}/workos_invitation_eligible_emails\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get emails eligible for WorkOS team invitation (all verified emails except those that are admin of a different WorkOS team) */\n get: operations[\"get_workos_invitation_eligible_emails\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/teams/{team_id}/workos_team_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Check if the WorkOS team associated with this Convex team is still accessible */\n get: operations[\"get_workos_team_health\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/invite_team_member\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Invite a member to the WorkOS team associated with a Convex team */\n post: operations[\"invite_workos_team_member\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/has_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Check if a deployment has an associated WorkOS team */\n post: operations[\"has_associated_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/provision_associated_workos_team\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Provision a WorkOS team for a Convex team */\n post: operations[\"provision_associated_workos_team\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/projects/{project_id}/workos_environments\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description List all WorkOS environments for a project */\n get: operations[\"get_project_workos_environments\"];\n put?: never;\n /** @description Create a new WorkOS environment for a project */\n post: operations[\"provision_project_workos_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/projects/{project_id}/workos_environments/{client_id}\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n /** @description Get a specific WorkOS environment for a project including credentials. This action is audited. */\n get: operations[\"get_project_workos_environment\"];\n put?: never;\n post?: never;\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/delete_project_environment\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Delete a WorkOS environment from a project */\n post: operations[\"delete_project_environment\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n \"/workos/check_project_environment_health\": {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n get?: never;\n put?: never;\n /** @description Check the health of a project WorkOS environment. Returns HTTP error on failure. */\n post: operations[\"check_project_environment_health\"];\n delete?: never;\n options?: never;\n head?: never;\n patch?: never;\n trace?: never;\n };\n}\nexport type webhooks = Record<string, never>;\nexport interface components {\n schemas: {\n AvailableWorkOSTeamEmailsResponse: {\n availableEmails: string[];\n usedEmails: string[];\n };\n CheckProjectEnvironmentHealthRequest: {\n /**\n * Format: int64\n * @description Project ID\n */\n projectId: number;\n /** @description WorkOS client ID */\n clientId: string;\n };\n DeleteProjectEnvironmentRequest: {\n /**\n * Format: int64\n * @description Project ID for the environment to delete\n */\n projectId: number;\n /** @description WorkOS client ID of the environment to delete */\n clientId: string;\n };\n /** @description Response for deleting a project environment - matches\n * DeleteWorkOSEnvironmentResponse */\n DeleteProjectEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosTeamId: string;\n };\n DeleteWorkOSEnvironmentRequest: {\n /** @description Deployment name for the environment to delete */\n deploymentName: string;\n };\n DeleteWorkOSEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosTeamId: string;\n };\n DisconnectWorkOSTeamRequest: {\n /** @description Convex team ID to disconnect from WorkOS */\n teamId: components[\"schemas\"][\"TeamId\"];\n };\n DisconnectWorkOSTeamResponse: {\n workosTeamId: string;\n workosTeamName: string;\n };\n GetOrProvisionEnvironmentRequest: {\n deploymentName: string;\n environmentName?: string | null;\n isProduction?: boolean | null;\n };\n /** @description Response for getting a project WorkOS environment with credentials - matches\n * ProvisionProjectEnvironmentResponse pattern with workos_ prefix */\n GetProjectEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosClientId: string;\n workosApiKey: string;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n isProduction: boolean;\n };\n GetProjectEnvironmentsResponse: {\n environments: components[\"schemas\"][\"ProjectEnvironmentSummary\"][];\n };\n HasAssociatedWorkOSTeamRequest: {\n deploymentName: string;\n };\n HasAssociatedWorkOSTeamResponse: {\n hasAssociatedWorkosTeam: boolean;\n teamId: components[\"schemas\"][\"TeamId\"];\n /** @description Email address used to provision the WorkOS account. This field should\n * always be present if has_associated_workos_team is true. */\n adminEmail?: string | null;\n /** @description Name of Convex team member who created the WorkOS account.\n * This field is optional even when has_associated_workos_team is true. */\n adminName?: string | null;\n /** @description Email of Convex team member who created the WorkOS account.\n * This field should always be present when has_associated_workos_team is\n * true. */\n adminConvexEmail?: string | null;\n };\n InvitationEligibleEmailsResponse: {\n eligibleEmails: string[];\n /** @description The admin email used to create this team's WorkOS account (always\n * eligible for re-invitation) */\n adminEmail?: string | null;\n };\n InviteWorkOSTeamMemberRequest: {\n /** @description Convex team ID that has an associated WorkOS team */\n teamId: components[\"schemas\"][\"TeamId\"];\n /** @description Email address to invite to the WorkOS team,\n * must be a verified email address associated with the user's account */\n email: string;\n };\n InviteWorkOSTeamMemberResponse: {\n email: string;\n roleSlug: string;\n };\n ManagedBy: \"vercel\" | {\n oauthApp: string;\n };\n /** Format: int64 */\n MemberId: number;\n ProjectDetails: {\n id: components[\"schemas\"][\"ProjectId\"];\n name: components[\"schemas\"][\"ProjectName\"];\n slug: components[\"schemas\"][\"ProjectSlug\"];\n teamId: components[\"schemas\"][\"TeamId\"];\n /** Format: int64 */\n createTime: number;\n prodDeploymentName?: string | null;\n devDeploymentName?: string | null;\n };\n /** @description Summary of a project WorkOS environment for list responses - slimmer than\n * full environment details, uses workos_ prefix for consistency with\n * deployment */\n ProjectEnvironmentSummary: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosClientId: string;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n isProduction: boolean;\n };\n /** Format: int64 */\n ProjectId: number;\n ProjectName: string;\n ProjectSlug: string;\n ProvisionEnvironmentResponse: {\n environmentId: string;\n environmentName: string;\n clientId: string;\n apiKey: string;\n newlyProvisioned: boolean;\n };\n ProvisionProjectEnvironmentRequest: {\n environmentName: string;\n isProduction?: boolean | null;\n };\n /** @description Response for provisioning a project WorkOS environment - matches\n * ProvisionEnvironmentResponse pattern with workos_ prefix for consistency */\n ProvisionProjectEnvironmentResponse: {\n workosEnvironmentId: string;\n workosEnvironmentName: string;\n workosClientId: string;\n workosApiKey: string;\n newlyProvisioned: boolean;\n /** @description The user-provided environment name (e.g., \"staging\", \"development\") */\n userEnvironmentName: string;\n };\n ProvisionWorkOSTeamRequest: {\n /** @description Convex team ID, no WorkOS team exists at this point */\n teamId: components[\"schemas\"][\"TeamId\"];\n /** @description Email address to use for the WorkOS team admin,\n * must be a verified email address associated with the user's account */\n email: string;\n };\n ProvisionWorkOSTeamResponse: {\n workosTeamId: string;\n workosTeamName: string;\n adminEmail: string;\n };\n ReferralCode: string;\n /** @enum {string} */\n RegionName: \"aws-us-east-1\" | \"aws-eu-west-1\";\n /** Format: int64 */\n TeamId: number;\n TeamName: string;\n TeamResponse: {\n id: components[\"schemas\"][\"TeamId\"];\n name: components[\"schemas\"][\"TeamName\"];\n slug: components[\"schemas\"][\"TeamSlug\"];\n creator?: null | components[\"schemas\"][\"MemberId\"];\n suspended: boolean;\n referralCode: components[\"schemas\"][\"ReferralCode\"];\n referredBy?: null | components[\"schemas\"][\"TeamId\"];\n managedBy?: null | components[\"schemas\"][\"ManagedBy\"];\n defaultRegion?: null | components[\"schemas\"][\"RegionName\"];\n ssoLoginId?: string | null;\n managedByUrl?: string | null;\n };\n TeamSlug: string;\n WorkOSEnvironmentHealthResponse: {\n id: string;\n name: string;\n clientId: string;\n };\n /** @enum {string} */\n WorkOSProductionState: \"active\" | \"inactive\" | \"suspended\" | \"deleting\";\n WorkOSTeamHealthResponse: {\n /** @description Whether a WorkOS team has been provisioned for this Convex team */\n teamProvisioned: boolean;\n teamInfo?: null | components[\"schemas\"][\"WorkOSTeamInfo\"];\n };\n WorkOSTeamInfo: {\n id: string;\n name: string;\n productionState: components[\"schemas\"][\"WorkOSProductionState\"];\n };\n };\n responses: never;\n parameters: never;\n requestBodies: never;\n headers: never;\n pathItems: never;\n}\nexport type AvailableWorkOsTeamEmailsResponse = components['schemas']['AvailableWorkOSTeamEmailsResponse'];\nexport type CheckProjectEnvironmentHealthRequest = components['schemas']['CheckProjectEnvironmentHealthRequest'];\nexport type DeleteProjectEnvironmentRequest = components['schemas']['DeleteProjectEnvironmentRequest'];\nexport type DeleteProjectEnvironmentResponse = components['schemas']['DeleteProjectEnvironmentResponse'];\nexport type DeleteWorkOsEnvironmentRequest = components['schemas']['DeleteWorkOSEnvironmentRequest'];\nexport type DeleteWorkOsEnvironmentResponse = components['schemas']['DeleteWorkOSEnvironmentResponse'];\nexport type DisconnectWorkOsTeamRequest = components['schemas']['DisconnectWorkOSTeamRequest'];\nexport type DisconnectWorkOsTeamResponse = components['schemas']['DisconnectWorkOSTeamResponse'];\nexport type GetOrProvisionEnvironmentRequest = components['schemas']['GetOrProvisionEnvironmentRequest'];\nexport type GetProjectEnvironmentResponse = components['schemas']['GetProjectEnvironmentResponse'];\nexport type GetProjectEnvironmentsResponse = components['schemas']['GetProjectEnvironmentsResponse'];\nexport type HasAssociatedWorkOsTeamRequest = components['schemas']['HasAssociatedWorkOSTeamRequest'];\nexport type HasAssociatedWorkOsTeamResponse = components['schemas']['HasAssociatedWorkOSTeamResponse'];\nexport type InvitationEligibleEmailsResponse = components['schemas']['InvitationEligibleEmailsResponse'];\nexport type InviteWorkOsTeamMemberRequest = components['schemas']['InviteWorkOSTeamMemberRequest'];\nexport type InviteWorkOsTeamMemberResponse = components['schemas']['InviteWorkOSTeamMemberResponse'];\nexport type ManagedBy = components['schemas']['ManagedBy'];\nexport type MemberId = components['schemas']['MemberId'];\nexport type ProjectDetails = components['schemas']['ProjectDetails'];\nexport type ProjectEnvironmentSummary = components['schemas']['ProjectEnvironmentSummary'];\nexport type ProjectId = components['schemas']['ProjectId'];\nexport type ProjectName = components['schemas']['ProjectName'];\nexport type ProjectSlug = components['schemas']['ProjectSlug'];\nexport type ProvisionEnvironmentResponse = components['schemas']['ProvisionEnvironmentResponse'];\nexport type ProvisionProjectEnvironmentRequest = components['schemas']['ProvisionProjectEnvironmentRequest'];\nexport type ProvisionProjectEnvironmentResponse = components['schemas']['ProvisionProjectEnvironmentResponse'];\nexport type ProvisionWorkOsTeamRequest = components['schemas']['ProvisionWorkOSTeamRequest'];\nexport type ProvisionWorkOsTeamResponse = components['schemas']['ProvisionWorkOSTeamResponse'];\nexport type ReferralCode = components['schemas']['ReferralCode'];\nexport type RegionName = components['schemas']['RegionName'];\nexport type TeamId = components['schemas']['TeamId'];\nexport type TeamName = components['schemas']['TeamName'];\nexport type TeamResponse = components['schemas']['TeamResponse'];\nexport type TeamSlug = components['schemas']['TeamSlug'];\nexport type WorkOsEnvironmentHealthResponse = components['schemas']['WorkOSEnvironmentHealthResponse'];\nexport type WorkOsProductionState = components['schemas']['WorkOSProductionState'];\nexport type WorkOsTeamHealthResponse = components['schemas']['WorkOSTeamHealthResponse'];\nexport type WorkOsTeamInfo = components['schemas']['WorkOSTeamInfo'];\nexport type $defs = Record<string, never>;\nexport interface operations {\n get_teams_for_member: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"TeamResponse\"][];\n };\n };\n };\n };\n get_cli_projects_for_team: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Team slug identifier */\n team_slug: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProjectDetails\"][];\n };\n };\n };\n };\n delete_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteWorkOSEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteWorkOSEnvironmentResponse\"];\n };\n };\n };\n };\n disconnect_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DisconnectWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DisconnectWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_available_workos_team_emails: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"AvailableWorkOSTeamEmailsResponse\"];\n };\n };\n };\n };\n get_has_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Deployment name */\n deployment_name: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_or_provision_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"GetOrProvisionEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionEnvironmentResponse\"];\n };\n };\n };\n };\n get_workos_environment_health: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Deployment name */\n deployment_name: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSEnvironmentHealthResponse\"];\n };\n };\n };\n };\n get_workos_invitation_eligible_emails: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Convex team ID */\n team_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"InvitationEligibleEmailsResponse\"];\n };\n };\n };\n };\n get_workos_team_health: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n /** @description Convex team ID */\n team_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSTeamHealthResponse\"];\n };\n };\n };\n };\n invite_workos_team_member: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"InviteWorkOSTeamMemberRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"InviteWorkOSTeamMemberResponse\"];\n };\n };\n };\n };\n has_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"HasAssociatedWorkOSTeamResponse\"];\n };\n };\n };\n };\n provision_associated_workos_team: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionWorkOSTeamRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionWorkOSTeamResponse\"];\n };\n };\n };\n };\n get_project_workos_environments: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"GetProjectEnvironmentsResponse\"];\n };\n };\n };\n };\n provision_project_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n };\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionProjectEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"ProvisionProjectEnvironmentResponse\"];\n };\n };\n };\n };\n get_project_workos_environment: {\n parameters: {\n query?: never;\n header?: never;\n path: {\n project_id: number;\n client_id: string;\n };\n cookie?: never;\n };\n requestBody?: never;\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"GetProjectEnvironmentResponse\"];\n };\n };\n };\n };\n delete_project_environment: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteProjectEnvironmentRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"DeleteProjectEnvironmentResponse\"];\n };\n };\n };\n };\n check_project_environment_health: {\n parameters: {\n query?: never;\n header?: never;\n path?: never;\n cookie?: never;\n };\n requestBody: {\n content: {\n \"application/json\": components[\"schemas\"][\"CheckProjectEnvironmentHealthRequest\"];\n };\n };\n responses: {\n 200: {\n headers: {\n [name: string]: unknown;\n };\n content: {\n \"application/json\": components[\"schemas\"][\"WorkOSEnvironmentHealthResponse\"];\n };\n };\n };\n };\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -27,6 +27,7 @@ const baseConvexValidator = import_zod.z.discriminatedUnion("type", [
|
|
|
27
27
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("null") }),
|
|
28
28
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("number") }),
|
|
29
29
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("bigint") }),
|
|
30
|
+
(0, import_utils.looseObject)({ type: import_zod.z.literal("commitTs") }),
|
|
30
31
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("boolean") }),
|
|
31
32
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("string") }),
|
|
32
33
|
(0, import_utils.looseObject)({ type: import_zod.z.literal("bytes") }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/deployApi/validator.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nconst baseConvexValidator = z.discriminatedUnion(\"type\", [\n looseObject({ type: z.literal(\"null\") }),\n looseObject({ type: z.literal(\"number\") }),\n looseObject({ type: z.literal(\"bigint\") }),\n looseObject({ type: z.literal(\"boolean\") }),\n looseObject({ type: z.literal(\"string\") }),\n looseObject({ type: z.literal(\"bytes\") }),\n looseObject({ type: z.literal(\"any\") }),\n looseObject({ type: z.literal(\"literal\"), value: z.any() }),\n looseObject({ type: z.literal(\"id\"), tableName: z.string() }),\n]);\nexport type ConvexValidator =\n | z.infer<typeof baseConvexValidator>\n | { type: \"array\"; value: ConvexValidator }\n | {\n type: \"record\";\n keys: ConvexValidator;\n values: { fieldType: ConvexValidator; optional: false };\n }\n | { type: \"union\"; value: ConvexValidator[] }\n | {\n type: \"object\";\n value: Record<string, { fieldType: ConvexValidator; optional: boolean }>;\n };\nexport const convexValidator: z.ZodType<ConvexValidator> = z.lazy(() =>\n z.union([\n baseConvexValidator,\n looseObject({ type: z.literal(\"array\"), value: convexValidator }),\n looseObject({\n type: z.literal(\"record\"),\n keys: convexValidator,\n values: z.object({\n fieldType: convexValidator,\n optional: z.literal(false),\n }),\n }),\n looseObject({\n type: z.literal(\"union\"),\n value: z.array(convexValidator),\n }),\n looseObject({\n type: z.literal(\"object\"),\n value: z.record(\n looseObject({\n fieldType: convexValidator,\n optional: z.boolean(),\n }),\n ),\n }),\n ]),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAA4B;AAE5B,MAAM,sBAAsB,aAAE,mBAAmB,QAAQ;AAAA,MACvD,0BAAY,EAAE,MAAM,aAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MACvC,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,MAC1C,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MACxC,0BAAY,EAAE,MAAM,aAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,MACtC,0BAAY,EAAE,MAAM,aAAE,QAAQ,SAAS,GAAG,OAAO,aAAE,IAAI,EAAE,CAAC;AAAA,MAC1D,0BAAY,EAAE,MAAM,aAAE,QAAQ,IAAI,GAAG,WAAW,aAAE,OAAO,EAAE,CAAC;AAC9D,CAAC;AAcM,MAAM,kBAA8C,aAAE;AAAA,EAAK,MAChE,aAAE,MAAM;AAAA,IACN;AAAA,QACA,0BAAY,EAAE,MAAM,aAAE,QAAQ,OAAO,GAAG,OAAO,gBAAgB,CAAC;AAAA,QAChE,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ,aAAE,OAAO;AAAA,QACf,WAAW;AAAA,QACX,UAAU,aAAE,QAAQ,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAAA,QACD,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,OAAO;AAAA,MACvB,OAAO,aAAE,MAAM,eAAe;AAAA,IAChC,CAAC;AAAA,QACD,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,MACxB,OAAO,aAAE;AAAA,YACP,0BAAY;AAAA,UACV,WAAW;AAAA,UACX,UAAU,aAAE,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nconst baseConvexValidator = z.discriminatedUnion(\"type\", [\n looseObject({ type: z.literal(\"null\") }),\n looseObject({ type: z.literal(\"number\") }),\n looseObject({ type: z.literal(\"bigint\") }),\n looseObject({ type: z.literal(\"commitTs\") }),\n looseObject({ type: z.literal(\"boolean\") }),\n looseObject({ type: z.literal(\"string\") }),\n looseObject({ type: z.literal(\"bytes\") }),\n looseObject({ type: z.literal(\"any\") }),\n looseObject({ type: z.literal(\"literal\"), value: z.any() }),\n looseObject({ type: z.literal(\"id\"), tableName: z.string() }),\n]);\nexport type ConvexValidator =\n | z.infer<typeof baseConvexValidator>\n | { type: \"array\"; value: ConvexValidator }\n | {\n type: \"record\";\n keys: ConvexValidator;\n values: { fieldType: ConvexValidator; optional: false };\n }\n | { type: \"union\"; value: ConvexValidator[] }\n | {\n type: \"object\";\n value: Record<string, { fieldType: ConvexValidator; optional: boolean }>;\n };\nexport const convexValidator: z.ZodType<ConvexValidator> = z.lazy(() =>\n z.union([\n baseConvexValidator,\n looseObject({ type: z.literal(\"array\"), value: convexValidator }),\n looseObject({\n type: z.literal(\"record\"),\n keys: convexValidator,\n values: z.object({\n fieldType: convexValidator,\n optional: z.literal(false),\n }),\n }),\n looseObject({\n type: z.literal(\"union\"),\n value: z.array(convexValidator),\n }),\n looseObject({\n type: z.literal(\"object\"),\n value: z.record(\n looseObject({\n fieldType: convexValidator,\n optional: z.boolean(),\n }),\n ),\n }),\n ]),\n);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,mBAA4B;AAE5B,MAAM,sBAAsB,aAAE,mBAAmB,QAAQ;AAAA,MACvD,0BAAY,EAAE,MAAM,aAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MACvC,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC3C,0BAAY,EAAE,MAAM,aAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,MAC1C,0BAAY,EAAE,MAAM,aAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACzC,0BAAY,EAAE,MAAM,aAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MACxC,0BAAY,EAAE,MAAM,aAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,MACtC,0BAAY,EAAE,MAAM,aAAE,QAAQ,SAAS,GAAG,OAAO,aAAE,IAAI,EAAE,CAAC;AAAA,MAC1D,0BAAY,EAAE,MAAM,aAAE,QAAQ,IAAI,GAAG,WAAW,aAAE,OAAO,EAAE,CAAC;AAC9D,CAAC;AAcM,MAAM,kBAA8C,aAAE;AAAA,EAAK,MAChE,aAAE,MAAM;AAAA,IACN;AAAA,QACA,0BAAY,EAAE,MAAM,aAAE,QAAQ,OAAO,GAAG,OAAO,gBAAgB,CAAC;AAAA,QAChE,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ,aAAE,OAAO;AAAA,QACf,WAAW;AAAA,QACX,UAAU,aAAE,QAAQ,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAAA,QACD,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,OAAO;AAAA,MACvB,OAAO,aAAE,MAAM,eAAe;AAAA,IAChC,CAAC;AAAA,QACD,0BAAY;AAAA,MACV,MAAM,aAAE,QAAQ,QAAQ;AAAA,MACxB,OAAO,aAAE;AAAA,YACP,0BAAY;AAAA,UACV,WAAW;AAAA,UACX,UAAU,aAAE,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/deploymentSelection.ts"],
|
|
4
|
-
"sourcesContent": ["import { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n getTeamAndProjectSlugForDeployment,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n targetProjectForLocalSelector,\n} from \"./localDeployment/projectMismatch.js\";\nimport { chalkStderr } from \"chalk\";\nimport { getBuildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n processDeployKeyValue,\n readDeployKeyFromEnv,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// These guards mirror the management API's auth rules client-side so we can\n// fail with a clear message instead of an opaque 401; the server stays\n// authoritative. Creating a deployment also allows project keys, while the\n// deploy-key commands stay personal-access-token only.\n\n/** Crashes unless logged in with a personal access token (not a deploy key). */\nexport async function ensureLoggedInWithAccessToken(\n ctx: Context,\n action: string,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (auth !== null && auth.kind === \"accessToken\") {\n return;\n }\n // Name whichever deploy-key env var is in effect (CONVEX_DEPLOY_KEY wins).\n const prefix =\n auth === null\n ? \"Run \"\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&\n !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `\n : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `${action} requires being logged in with a personal access token. ${prefix}${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n}\n\n/**\n * Crashes unless the auth can create a deployment: personal access tokens and\n * project keys are accepted, deploy keys are not.\n */\nexport async function ensureAuthCanCreateDeployment(\n ctx: Context,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (\n auth !== null &&\n (auth.kind === \"accessToken\" || auth.kind === \"projectKey\")\n ) {\n return;\n }\n if (auth === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment requires logging in. Run ${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n }\n const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment isn't supported with a deploy key (${envVar}). Run ${chalkStderr.bold(\n \"npx convex login\",\n )} (or use a project key) and try again.`,\n });\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref or\n // deployment name), we don't need a current project context \u2192 handle it\n // before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind !== \"local\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n // team:project:local \u2014 we have the cloud project context up front and\n // don't need to consult env vars at all.\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n null,\n );\n }\n }\n\n const baseSelection = await resolveBaseDeploymentSelection(\n ctx,\n cliArgs,\n selectionWithinProject,\n );\n\n // If --deployment is a project-scoped local selector (`local` or\n // `project:local`), override the env-var-derived selection with the local\n // deployment after performing a cloud-project-mismatch check.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (\n (parsed.kind === \"inCurrentProject\" || parsed.kind === \"inProject\") &&\n parsed.selector.kind === \"local\"\n ) {\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n baseSelection,\n );\n }\n }\n\n return baseSelection;\n}\n\nasync function resolveBaseDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n selectionWithinProject: DeploymentSelectionWithinProject,\n): Promise<DeploymentSelection> {\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n !process.stdin.isTTY) &&\n !cliArgs.implicitProd &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\n/**\n * Handles the `[team:project:]local` selector. Loads the on-disk local config\n * and (if the config has a `cloudProjectId`) verifies it matches the cloud\n * project the user is asking about. Crashes on mismatch.\n */\nasync function resolveLocalDeploymentSelection(\n ctx: Context,\n parsed: ParsedDeploymentSelector,\n selectionWithinProject: DeploymentSelectionWithinProject,\n currentSelection: DeploymentSelection | null,\n): Promise<DeploymentSelection> {\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 // Only resolve the target cloud project if the on-disk config has a\n // `cloudProjectId` to compare against \u2014 this avoids unnecessary platform\n // calls for older configs and anonymous mode.\n if (localConfig.config.cloudProjectId !== undefined) {\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection ?? { kind: \"chooseProject\", selectionWithinProject },\n );\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(\n ctx,\n localConfig.config,\n target,\n );\n if (match === \"mismatch\") {\n const newSelector = `${target.teamSlug}:${target.slug}:local`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `The local deployment in this directory is in a different project than \\`${target.teamSlug}:${target.slug}\\`. ` +\n `\\n${chalkStderr.dim(`${chalkStderr.bold(\"Hint\")}: If you want to move the local deployment to this project, run ${chalkStderr.bold(`npx convex deployment select ${newSelector}`)}`)}`,\n });\n }\n }\n }\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: localConfig.deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = readDeployKeyFromEnv(getEnv);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n reference: slugs.reference,\n isDefault: slugs.isDefault,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n // Overwrite the selection within project\n const newSelectionWithinProject =\n selectionWithinProject.kind === \"unspecified\" &&\n // Fetching local deployment credentials uses the \"unspecified\" code path\n targetDeploymentType !== \"local\"\n ? {\n kind: \"deploymentName\" as const,\n deploymentName: targetDeploymentName,\n }\n : selectionWithinProject;\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject: newSelectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<PlatformProjectDetails> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return 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 getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n });\n }\n\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { ProjectResponse } from \"@convex-dev/platform/managementApi\";\nimport { BigBrainAuth, Context } from \"../../bundler/context.js\";\nimport { logVerbose } from \"../../bundler/log.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentSelectionOptions,\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n DeploymentType,\n fetchTeamAndProjectForKey,\n getTeamAndProjectSlugForDeployment,\n validateDeploymentSelectionForExistingDeployment,\n} from \"./api.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isDeploymentKey,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n targetProjectForLocalSelector,\n} from \"./localDeployment/projectMismatch.js\";\nimport { chalkStderr } from \"chalk\";\nimport { getBuildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n processDeployKeyValue,\n readDeployKeyFromEnv,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A deployment key if a deployment key (set via `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n * Deployment keys take precedence over the the access token.\n * This makes using one of these keys while logged in or logged out work the same.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n // No deploy key was found in the env file, so fall back on using the global config\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n deploymentKey: isDeploymentKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n deploymentKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n deploymentKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n if (opts.deploymentKey !== null) {\n // Deployment keys take precedence over global config.\n return {\n header: `Bearer ${opts.deploymentKey}`,\n kind: \"deploymentKey\",\n deploymentKey: opts.deploymentKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// These guards mirror the management API's auth rules client-side so we can\n// fail with a clear message instead of an opaque 401; the server stays\n// authoritative. Creating a deployment also allows project keys, while the\n// deploy-key commands stay personal-access-token only.\n\n/** Crashes unless logged in with a personal access token (not a deploy key). */\nexport async function ensureLoggedInWithAccessToken(\n ctx: Context,\n action: string,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (auth !== null && auth.kind === \"accessToken\") {\n return;\n }\n // Name whichever deploy-key env var is in effect (CONVEX_DEPLOY_KEY wins).\n const prefix =\n auth === null\n ? \"Run \"\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] &&\n !process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? `Unset ${CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run `\n : `Unset ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `${action} requires being logged in with a personal access token. ${prefix}${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n}\n\n/**\n * Crashes unless the auth can create a deployment: personal access tokens and\n * project keys are accepted, deploy keys are not.\n */\nexport async function ensureAuthCanCreateDeployment(\n ctx: Context,\n): Promise<void> {\n const auth = ctx.bigBrainAuth();\n if (\n auth !== null &&\n (auth.kind === \"accessToken\" || auth.kind === \"projectKey\")\n ) {\n return;\n }\n if (auth === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment requires logging in. Run ${chalkStderr.bold(\n \"npx convex login\",\n )} and try again.`,\n });\n }\n const envVar = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Creating a deployment isn't supported with a deploy key (${envVar}). Run ${chalkStderr.bold(\n \"npx convex login\",\n )} (or use a project key) and try again.`,\n });\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n } & (\n | {\n deploymentFields: DeploymentFields;\n source: \"deployKey\";\n }\n | {\n deploymentFields: null;\n source: \"selfHosted\" | \"cliArgs\";\n }\n );\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"chooseProject\";\n selectionWithinProject: DeploymentSelectionWithinProject;\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n selectionWithinProject: DeploymentSelectionWithinProject;\n };\n\ntype DeploymentFields = {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n reference: string | null;\n isDefault: boolean;\n};\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n if (metadata.kind === \"existingDeployment\") {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n await validateDeploymentSelectionForExistingDeployment(\n ctx,\n selectionWithinProject,\n metadata.deploymentToActOn.source,\n );\n }\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(_ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(`Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(`Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n selection satisfies never;\n logVerbose(`Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n selection satisfies never;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n): Promise<DeploymentSelection> {\n const selectionWithinProject =\n deploymentSelectionWithinProjectFromOptions(cliArgs);\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url !== undefined && cliArgs.adminKey !== undefined) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n // If --deployment is a fully qualified selector (team:project:ref or\n // deployment name), we don't need a current project context \u2192 handle it\n // before env var resolution.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind !== \"local\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"deploymentName\") {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: parsed.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: cliArgs.deployment,\n },\n };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n // team:project:local \u2014 we have the cloud project context up front and\n // don't need to consult env vars at all.\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n null,\n );\n }\n }\n\n const baseSelection = await resolveBaseDeploymentSelection(\n ctx,\n cliArgs,\n selectionWithinProject,\n );\n\n // If --deployment is a project-scoped local selector (`local` or\n // `project:local`), override the env-var-derived selection with the local\n // deployment after performing a cloud-project-mismatch check.\n if (cliArgs.deployment !== undefined) {\n const parsed = parseDeploymentSelector(cliArgs.deployment);\n if (\n (parsed.kind === \"inCurrentProject\" || parsed.kind === \"inProject\") &&\n parsed.selector.kind === \"local\"\n ) {\n return await resolveLocalDeploymentSelection(\n ctx,\n parsed,\n selectionWithinProject,\n baseSelection,\n );\n }\n }\n\n return baseSelection;\n}\n\nasync function resolveBaseDeploymentSelection(\n ctx: Context,\n cliArgs: DeploymentSelectionOptions,\n selectionWithinProject: DeploymentSelectionWithinProject,\n): Promise<DeploymentSelection> {\n if (cliArgs.envFile !== undefined) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(`Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(\n ctx,\n selectionWithinProject,\n (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n },\n );\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (\n (!isLoggedIn ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n !process.stdin.isTTY) &&\n !cliArgs.implicitProd &&\n shouldAllowAnonymousDevelopment()\n ) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n selectionWithinProject,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n selectionWithinProject,\n };\n}\n\n/**\n * Handles the `[team:project:]local` selector. Loads the on-disk local config\n * and (if the config has a `cloudProjectId`) verifies it matches the cloud\n * project the user is asking about. Crashes on mismatch.\n */\nasync function resolveLocalDeploymentSelection(\n ctx: Context,\n parsed: ParsedDeploymentSelector,\n selectionWithinProject: DeploymentSelectionWithinProject,\n currentSelection: DeploymentSelection | null,\n): Promise<DeploymentSelection> {\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 // Only resolve the target cloud project if the on-disk config has a\n // `cloudProjectId` to compare against \u2014 this avoids unnecessary platform\n // calls for older configs and anonymous mode.\n if (localConfig.config.cloudProjectId !== undefined) {\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection ?? { kind: \"chooseProject\", selectionWithinProject },\n );\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(\n ctx,\n localConfig.config,\n target,\n );\n if (match === \"mismatch\") {\n const newSelector = `${target.teamSlug}:${target.slug}:local`;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `The local deployment in this directory is in a different project than \\`${target.teamSlug}:${target.slug}\\`. ` +\n `\\n${chalkStderr.dim(`${chalkStderr.bold(\"Hint\")}: If you want to move the local deployment to this project, run ${chalkStderr.bold(`npx convex deployment select ${newSelector}`)}`)}`,\n });\n }\n }\n }\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: localConfig.deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject,\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n selectionWithinProject: DeploymentSelectionWithinProject,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const rawDeployKey = readDeployKeyFromEnv(getEnv);\n const deployKey = await processDeployKeyValue(ctx, rawDeployKey);\n if (deployKey !== undefined) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n selectionWithinProject,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n selectionWithinProject,\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n reference: slugs.reference,\n isDefault: slugs.isDefault,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n deployKeyType satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n // --deployment-name\u2019s deployment may be in a different project from CONVEX_DEPLOYMENT.\n if (selectionWithinProject.kind === \"deploymentName\") {\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: selectionWithinProject.deploymentName,\n deploymentType: null,\n },\n selectionWithinProject,\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n\n // Commands can select a deployment within the project that this deployment belongs to.\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n selectionWithinProject,\n },\n };\n }\n\n // Overwrite the selection within project\n const newSelectionWithinProject =\n selectionWithinProject.kind === \"unspecified\" &&\n // Fetching local deployment credentials uses the \"unspecified\" code path\n targetDeploymentType !== \"local\"\n ? {\n kind: \"deploymentName\" as const,\n deploymentName: targetDeploymentName,\n }\n : selectionWithinProject;\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n selectionWithinProject: newSelectionWithinProject,\n },\n };\n }\n\n // Throw a nice error if we're in something like a CI environment where we need a valid deployment configuration\n await checkIfBuildEnvironmentRequiresDeploymentConfig(ctx);\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentRequiresDeploymentConfig(ctx: Context) {\n const buildEnvironment = getBuildEnvironment();\n if (buildEnvironment) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironment} build environment detected but no Convex deployment configuration found.\\n` +\n `Set one of:\\n` +\n ` \u2022 ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} for Convex Cloud deployments\\n` +\n ` \u2022 ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} for self-hosted deployments\\n` +\n `See https://docs.convex.dev/production/hosting or https://docs.convex.dev/self-hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n default: {\n selection satisfies never;\n }\n }\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n\n/**\n * Fetch the project details corresponding to the given ProjectSelection.\n */\nexport async function getProjectDetails(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<ProjectResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return 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 getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n });\n }\n\n const deployment = (\n await typedPlatformClient(ctx).GET(\"/deployments/{deployment_name}\", {\n params: {\n path: { deployment_name: projectSelection.deploymentName },\n },\n })\n ).data!;\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: deployment.projectId } },\n })\n ).data!;\n }\n case \"teamAndProjectSlugs\": {\n return (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}\",\n {\n params: {\n path: {\n team_id_or_slug: projectSelection.teamSlug,\n project_slug: projectSelection.projectSlug,\n },\n },\n },\n )\n ).data!;\n }\n case \"projectDeployKey\": {\n const result = await fetchTeamAndProjectForKey(\n ctx,\n projectSelection.projectDeployKey,\n );\n return (\n await typedPlatformClient(ctx).GET(\"/projects/{project_id}\", {\n params: { path: { project_id: result.projectId } },\n })\n ).data!;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["rawDeployKey", "deployKey", "result"]
|
|
7
7
|
}
|
|
@@ -119,7 +119,7 @@ function renderCommand(entry, all, options) {
|
|
|
119
119
|
lines.push("");
|
|
120
120
|
}
|
|
121
121
|
const usage = commandUsage(command);
|
|
122
|
-
lines.push(`${h2}
|
|
122
|
+
lines.push(`${h2} Syntax`);
|
|
123
123
|
lines.push("");
|
|
124
124
|
lines.push("```sh");
|
|
125
125
|
lines.push(`${display} ${usage}`.trim());
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/generateDocs.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CommandUnknownOpts } from \"@commander-js/extra-typings\";\n\nexport type GeneratedDocs = Record<string, string>;\n\ntype CommandInfo = {\n command: CommandUnknownOpts;\n // Full path of command names from the root, e.g. [\"convex\", \"env\", \"set\"].\n path: string[];\n};\n\n/**\n * Generate Markdown reference docs for a Commander main command.\n *\n * Returns a map of file paths (relative, e.g. `env.mdx`) to Markdown\n * contents. One file is generated for each visible main command (a direct\n * child of the root); the root itself gets no page, so \"Command Reference\"\n * is a sidebar section with no landing page. Descendant subcommands are\n * rendered as sections inside their main command's file, with their heading\n * level reflecting their depth: a direct subcommand (`env default`) is an\n * `## h2`, a sub-subcommand (`env default set`) an `### h3`, and so on.\n *\n * Each page carries a `description` frontmatter equal to the command's\n * summary; the `/cli` page reads these back via Docusaurus metadata to render\n * the list of commands dynamically.\n */\nexport function generateDocs(root: CommandUnknownOpts): GeneratedDocs {\n const docs: GeneratedDocs = {};\n const all = collectCommands(root, [root.name()]);\n\n let mainCommandPosition = 0;\n for (const entry of all) {\n // Skip the root command (no landing page) and any descendant beyond a\n // main command (those are rendered inside their main command's file).\n if (entry.path.length !== 2) continue;\n const filePath = `${entry.path[1]}.mdx`;\n const sidebarPosition = ++mainCommandPosition;\n const summary =\n entry.command.summary() || entry.command.description() || \"\";\n // Collapse to a single line so it's a valid YAML frontmatter scalar, and\n // quote it safely (summaries contain `[BETA]`, `:`, etc.).\n const description = JSON.stringify(summary.replace(/\\s+/g, \" \").trim());\n\n const lines: string[] = [];\n const sidebarLabel = `npx ${entry.path.join(\" \")}`;\n lines.push(\"---\");\n lines.push(`sidebar_position: ${sidebarPosition}`);\n // Set an explicit `title` so the Docusaurus <title> (and browser tab) reads\n // the full command, e.g. `npx convex dev | \u2026`. Without it Docusaurus\n // derives the title from the doc id (the file name), which would be just\n // `dev`.\n lines.push(`title: \"${sidebarLabel}\"`);\n lines.push(`sidebar_label: \"${sidebarLabel}\"`);\n lines.push(`description: ${description}`);\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\n \"{/* @generated from the command definitions, do not edit manually (run `just regenerate-cli-docs` to regenerate) */}\",\n );\n lines.push(\"\");\n lines.push(renderCommand(entry, all, { headingLevel: 1 }));\n\n const descendants = all.filter(\n (e) =>\n e.path.length > entry.path.length &&\n entry.path.every((p, i) => e.path[i] === p),\n );\n for (const d of descendants) {\n // Render the heading hierarchically by depth below the root: a direct\n // subcommand (`env default`, path length 3) is an h2, a sub-subcommand\n // (`env default set`, path length 4) is an h3, and so on. This nests\n // sub-subcommands under their parent group instead of flattening every\n // descendant to the same h2 level.\n lines.push(\n renderCommand(d, all, {\n headingLevel: d.path.length - 1,\n includeSubcommandsList: false,\n }),\n );\n }\n\n docs[filePath] = lines.join(\"\\n\");\n }\n\n return docs;\n}\n\nfunction collectCommands(\n command: CommandUnknownOpts,\n path: string[],\n): CommandInfo[] {\n const result: CommandInfo[] = [{ command, path }];\n for (const sub of command.commands) {\n // Skip hidden commands and Commander's built-in help command.\n if ((sub as any)._hidden) continue;\n if (sub.name() === \"help\") continue;\n result.push(...collectCommands(sub, [...path, sub.name()]));\n }\n return result;\n}\n\nfunction displayName(path: string[]): string {\n return `npx ${path.join(\" \")}`;\n}\n\n// Build the usage suffix (everything after the command name) for the Usage\n// code block. We derive the argument portion from the command's registered\n// arguments rather than trusting a manual `.usage()` override, so the Usage\n// line always agrees with the Arguments section below. For example `env set`\n// overrides `.usage()` to show `<name> <value>` (pretending the args are\n// required) for nicer `--help` output, even though it registers them as\n// optional `[name] [value]`; reproducing the override verbatim would make the\n// generated page contradict itself. Commands with no registered arguments keep\n// their `.usage()` string verbatim (e.g. the root's `<command> [options]`).\nfunction commandUsage(command: CommandUnknownOpts): string {\n const args = (command as any).registeredArguments ?? [];\n if (args.length === 0) {\n return command.usage();\n }\n // Mirror Commander's default usage order: options, then a subcommand\n // placeholder, then the positional arguments. `[options]` is always present\n // because the built-in `--help` option is always registered.\n const parts = [\"[options]\"];\n if (command.commands.length > 0) {\n parts.push(\"[command]\");\n }\n for (const arg of args) {\n const name = `${arg._name}${arg.variadic ? \"...\" : \"\"}`;\n parts.push(arg.required ? `<${name}>` : `[${name}]`);\n }\n return parts.join(\" \");\n}\n\n// Anchor id for a descendant command rendered as an h2 section inside its\n// main command's file. Built from the path segments below the main command,\n// joined with `-`, so sub-subcommands stay unique. For example, both\n// `deployment create` and `deployment token create` would collide on `#create`\n// if we used only the leaf name; instead they become `#create` and\n// `#token-create`.\nfunction anchorSlug(path: string[]): string {\n return path.slice(2).join(\"-\");\n}\n\n// Link target for a subcommand listed inside a command's \"Subcommands\"\n// section. From the root index, main commands live in sibling files. From a\n// main command page, descendants are rendered as h2 sections in the same\n// file, anchored by their path below the main command.\nfunction subcommandLink(parentPath: string[], subPath: string[]): string {\n if (parentPath.length === 1) {\n return `./${subPath[1]}`;\n }\n return `#${anchorSlug(subPath)}`;\n}\n\nfunction renderCommand(\n entry: CommandInfo,\n all: CommandInfo[],\n options: { headingLevel: number; includeSubcommandsList?: boolean },\n): string {\n const { headingLevel, includeSubcommandsList = true } = options;\n const h1 = \"#\".repeat(headingLevel);\n const h2 = \"#\".repeat(headingLevel + 1);\n\n const { command, path } = entry;\n const display = displayName(path);\n const description = renderCopyableCommands(\n escapeMdx(\n formatExampleLines(\n replaceBullets(command.description() || command.summary() || \"\"),\n ),\n ),\n );\n\n const lines: string[] = [];\n // For nested subcommand sections, pin the heading id to the path below the\n // main command so anchors like `#set` and `#token-create` stay unique even\n // when leaf names collide across different parents.\n const headingSuffix = headingLevel > 1 ? ` \\\\{#${anchorSlug(path)}}` : \"\";\n lines.push(`${h1} \\`${display}\\`${headingSuffix}`);\n lines.push(\"\");\n if (description) {\n lines.push(description);\n lines.push(\"\");\n }\n\n const usage = commandUsage(command);\n lines.push(`${h2} Usage`);\n lines.push(\"\");\n lines.push(\"```sh\");\n lines.push(`${display} ${usage}`.trim());\n lines.push(\"```\");\n lines.push(\"\");\n\n const aliases = command.aliases();\n if (aliases.length > 0) {\n lines.push(`${h2} Aliases`);\n lines.push(\"\");\n for (const alias of aliases) {\n lines.push(`- \\`${alias}\\``);\n }\n lines.push(\"\");\n }\n\n const args = (command as any).registeredArguments ?? [];\n if (args.length > 0) {\n lines.push(`${h2} Arguments`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const arg of args) {\n const name = arg.required ? `<${arg._name}>` : `[${arg._name}]`;\n const desc = escapeMdx(replaceBullets(arg.description || \"\"));\n lines.push(`<dt>\\`${name}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n const opts = command.options.filter((o: any) => !o.hidden);\n if (opts.length > 0) {\n lines.push(`${h2} Options`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const opt of opts) {\n const flags = (opt as any).flags as string;\n const desc = escapeMdx(replaceBullets(opt.description || \"\"));\n lines.push(`<dt>\\`${flags}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n if (includeSubcommandsList) {\n const subEntries = all.filter(\n (e) =>\n e.path.length === path.length + 1 &&\n path.every((p, i) => e.path[i] === p),\n );\n if (subEntries.length > 0) {\n lines.push(`${h2} Subcommands`);\n lines.push(\"\");\n for (const sub of subEntries) {\n const subDisplay = displayName(sub.path);\n const target = subcommandLink(path, sub.path);\n const subDesc = indentContinuation(\n escapeMdx(sub.command.summary() || sub.command.description() || \"\"),\n );\n lines.push(`- [\\`${subDisplay}\\`](${target}) \u2014 ${subDesc}`.trimEnd());\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// Escape characters that MDX would otherwise parse as JSX. Backslash-escaping\n// `<` and `{` keeps placeholder text like `<team_slug>` rendering as literal\n// text instead of being interpreted as a tag or expression.\n//\n// MDX only parses `<` and `{` specially in prose \u2014 inside an inline code span\n// (backticks) both are already literal, and a backslash there renders verbatim\n// (e.g. `` `\\<nameOrToken>` `` shows the backslash). So leave code spans\n// untouched and escape only the surrounding prose.\nfunction escapeMdx(text: string): string {\n return text\n .split(/(`[^`]*`)/)\n .map((segment, i) =>\n // Odd indices are the captured code spans; even indices are prose.\n i % 2 === 1 ? segment : segment.replace(/[<{]/g, (c) => `\\\\${c}`),\n )\n .join(\"\");\n}\n\n// Turn inline code spans that are full `npx convex ...` commands into a\n// CodeWithCopyButton component so readers can copy them with one click. The\n// component is registered globally in the docs site's MDXComponents, so no\n// import is needed in the generated page. This runs after escapeMdx, which\n// leaves code spans verbatim, so the command text inside the backticks is\n// unescaped and drops straight into the `text` attribute.\n//\n// We pass the command as a JSX expression containing a JSON-encoded string\n// (`text={\"...\"}`) rather than a plain attribute (`text=\"...\"`) because\n// commands routinely contain double quotes (e.g. JSON arguments like\n// `'{\"body\": \"hello\"}'`), which would otherwise terminate the attribute value\n// and produce invalid MDX. JSON.stringify escapes quotes and backslashes for\n// us.\nfunction renderCopyableCommands(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) =>\n /^- /.test(line)\n ? line.replace(\n /`(npx convex [^`]*)`/g,\n (_, command) =>\n `<CodeWithCopyButton text={${JSON.stringify(command)}} />`,\n )\n : line,\n )\n .join(\"\\n\");\n}\n\n// Replace \"\u2022\" bullet points with markdown \"-\" bullet points. Every line that is\n// (maybe leading spaces +) \"\u2022 \" becomes the same spaces + \"- \". This runs before\n// formatExampleLines and renderCopyableCommands so that `npx convex ...` commands\n// in bulleted help text are recognized as list items and get a copy button.\nexport function replaceBullets(text: string): string {\n return text.replace(/^( *)\u2022 /gm, \"$1- \");\n}\n\n// Convert indented example lines (e.g., from CLI help text) into markdown lists\n// so they render with proper line breaks instead of collapsing into one line.\n// Consecutive indented lines are gathered into a block; any line indented by at\n// least two spaces belongs to the block, regardless of how deeply it nests.\n//\n// How much the block is dedented depends on what precedes it:\n// - When the block follows a list item, its indentation encodes real nesting\n// (a sub-list under that item), so it is preserved verbatim. This keeps a\n// 3-level list like the deploy command's preview-key description intact\n// instead of flattening the 2-space sub-item to a top-level bullet.\n// - When the block follows prose (or starts the text), the indentation is\n// just help-text formatting, so the block is dedented by its smallest\n// indent to the left margin. Otherwise an indented list wouldn't interrupt\n// the preceding paragraph and would collapse into it.\nfunction formatExampleLines(text: string): string {\n const lines = text.split(\"\\n\");\n const result: string[] = [];\n let blockLines: string[] = [];\n\n const flushBlock = () => {\n if (blockLines.length === 0) {\n return;\n }\n const prev = result[result.length - 1];\n const followsListItem = prev !== undefined && isListItem(prev);\n const dedent = followsListItem\n ? 0\n : Math.min(...blockLines.map(indentWidth));\n for (const blockLine of blockLines) {\n result.push(toListItem(blockLine.substring(dedent)));\n }\n blockLines = [];\n };\n\n for (const line of lines) {\n // Any line indented by at least two spaces (and not blank) is part of an\n // example block, regardless of nesting depth.\n if (/^ {2,}\\S/.test(line)) {\n blockLines.push(line);\n } else {\n flushBlock();\n result.push(line);\n }\n }\n flushBlock();\n\n return result.join(\"\\n\");\n}\n\nfunction indentWidth(line: string): number {\n return line.length - line.trimStart().length;\n}\n\nfunction isListItem(line: string): boolean {\n const content = line.trimStart();\n return content.startsWith(\"- \") || /^\\d+\\.\\s/.test(content);\n}\n\n// Render an example line as a markdown list item, preserving any leading indent\n// so nested items stay nested. Lines that are already list items \u2014 either a\n// bullet (`- `) or an ordered-list item (`1. `) \u2014 are kept verbatim so they\n// render as their intended list type. Prefixing an ordered-list item with `- `\n// would nest it inside a bullet, which renders as roman numerals instead of the\n// numbered steps.\nfunction toListItem(line: string): string {\n if (isListItem(line)) {\n return line;\n }\n const indent = line.slice(0, indentWidth(line));\n return `${indent}- ${line.trimStart()}`;\n}\n\nfunction indentContinuation(text: string): string {\n return text.replace(/\\n/g, \"\\n \");\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBO,SAAS,aAAa,MAAyC;AACpE,QAAM,OAAsB,CAAC;AAC7B,QAAM,MAAM,gBAAgB,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;AAE/C,MAAI,sBAAsB;AAC1B,aAAW,SAAS,KAAK;AAGvB,QAAI,MAAM,KAAK,WAAW,EAAG;AAC7B,UAAM,WAAW,GAAG,MAAM,KAAK,CAAC,CAAC;AACjC,UAAM,kBAAkB,EAAE;AAC1B,UAAM,UACJ,MAAM,QAAQ,QAAQ,KAAK,MAAM,QAAQ,YAAY,KAAK;AAG5D,UAAM,cAAc,KAAK,UAAU,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC;AAEtE,UAAM,QAAkB,CAAC;AACzB,UAAM,eAAe,OAAO,MAAM,KAAK,KAAK,GAAG,CAAC;AAChD,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,qBAAqB,eAAe,EAAE;AAKjD,UAAM,KAAK,WAAW,YAAY,GAAG;AACrC,UAAM,KAAK,mBAAmB,YAAY,GAAG;AAC7C,UAAM,KAAK,gBAAgB,WAAW,EAAE;AACxC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc,OAAO,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AAEzD,UAAM,cAAc,IAAI;AAAA,MACtB,CAAC,MACC,EAAE,KAAK,SAAS,MAAM,KAAK,UAC3B,MAAM,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;AAAA,IAC9C;AACA,eAAW,KAAK,aAAa;AAM3B,YAAM;AAAA,QACJ,cAAc,GAAG,KAAK;AAAA,UACpB,cAAc,EAAE,KAAK,SAAS;AAAA,UAC9B,wBAAwB;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,SACA,MACe;AACf,QAAM,SAAwB,CAAC,EAAE,SAAS,KAAK,CAAC;AAChD,aAAW,OAAO,QAAQ,UAAU;AAElC,QAAK,IAAY,QAAS;AAC1B,QAAI,IAAI,KAAK,MAAM,OAAQ;AAC3B,WAAO,KAAK,GAAG,gBAAgB,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAwB;AAC3C,SAAO,OAAO,KAAK,KAAK,GAAG,CAAC;AAC9B;AAWA,SAAS,aAAa,SAAqC;AACzD,QAAM,OAAQ,QAAgB,uBAAuB,CAAC;AACtD,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,QAAQ,MAAM;AAAA,EACvB;AAIA,QAAM,QAAQ,CAAC,WAAW;AAC1B,MAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,UAAM,KAAK,WAAW;AAAA,EACxB;AACA,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,WAAW,QAAQ,EAAE;AACrD,UAAM,KAAK,IAAI,WAAW,IAAI,IAAI,MAAM,IAAI,IAAI,GAAG;AAAA,EACrD;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAQA,SAAS,WAAW,MAAwB;AAC1C,SAAO,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAC/B;AAMA,SAAS,eAAe,YAAsB,SAA2B;AACvE,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,SAAO,IAAI,WAAW,OAAO,CAAC;AAChC;AAEA,SAAS,cACP,OACA,KACA,SACQ;AACR,QAAM,EAAE,cAAc,yBAAyB,KAAK,IAAI;AACxD,QAAM,KAAK,IAAI,OAAO,YAAY;AAClC,QAAM,KAAK,IAAI,OAAO,eAAe,CAAC;AAEtC,QAAM,EAAE,SAAS,KAAK,IAAI;AAC1B,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,cAAc;AAAA,IAClB;AAAA,MACE;AAAA,QACE,eAAe,QAAQ,YAAY,KAAK,QAAQ,QAAQ,KAAK,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AAIzB,QAAM,gBAAgB,eAAe,IAAI,QAAQ,WAAW,IAAI,CAAC,MAAM;AACvE,QAAM,KAAK,GAAG,EAAE,MAAM,OAAO,KAAK,aAAa,EAAE;AACjD,QAAM,KAAK,EAAE;AACb,MAAI,aAAa;AACf,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,QAAQ,aAAa,OAAO;AAClC,QAAM,KAAK,GAAG,EAAE,
|
|
4
|
+
"sourcesContent": ["import type { CommandUnknownOpts } from \"@commander-js/extra-typings\";\n\nexport type GeneratedDocs = Record<string, string>;\n\ntype CommandInfo = {\n command: CommandUnknownOpts;\n // Full path of command names from the root, e.g. [\"convex\", \"env\", \"set\"].\n path: string[];\n};\n\n/**\n * Generate Markdown reference docs for a Commander main command.\n *\n * Returns a map of file paths (relative, e.g. `env.mdx`) to Markdown\n * contents. One file is generated for each visible main command (a direct\n * child of the root); the root itself gets no page, so \"Command Reference\"\n * is a sidebar section with no landing page. Descendant subcommands are\n * rendered as sections inside their main command's file, with their heading\n * level reflecting their depth: a direct subcommand (`env default`) is an\n * `## h2`, a sub-subcommand (`env default set`) an `### h3`, and so on.\n *\n * Each page carries a `description` frontmatter equal to the command's\n * summary; the `/cli` page reads these back via Docusaurus metadata to render\n * the list of commands dynamically.\n */\nexport function generateDocs(root: CommandUnknownOpts): GeneratedDocs {\n const docs: GeneratedDocs = {};\n const all = collectCommands(root, [root.name()]);\n\n let mainCommandPosition = 0;\n for (const entry of all) {\n // Skip the root command (no landing page) and any descendant beyond a\n // main command (those are rendered inside their main command's file).\n if (entry.path.length !== 2) continue;\n const filePath = `${entry.path[1]}.mdx`;\n const sidebarPosition = ++mainCommandPosition;\n const summary =\n entry.command.summary() || entry.command.description() || \"\";\n // Collapse to a single line so it's a valid YAML frontmatter scalar, and\n // quote it safely (summaries contain `[BETA]`, `:`, etc.).\n const description = JSON.stringify(summary.replace(/\\s+/g, \" \").trim());\n\n const lines: string[] = [];\n const sidebarLabel = `npx ${entry.path.join(\" \")}`;\n lines.push(\"---\");\n lines.push(`sidebar_position: ${sidebarPosition}`);\n // Set an explicit `title` so the Docusaurus <title> (and browser tab) reads\n // the full command, e.g. `npx convex dev | \u2026`. Without it Docusaurus\n // derives the title from the doc id (the file name), which would be just\n // `dev`.\n lines.push(`title: \"${sidebarLabel}\"`);\n lines.push(`sidebar_label: \"${sidebarLabel}\"`);\n lines.push(`description: ${description}`);\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\n \"{/* @generated from the command definitions, do not edit manually (run `just regenerate-cli-docs` to regenerate) */}\",\n );\n lines.push(\"\");\n lines.push(renderCommand(entry, all, { headingLevel: 1 }));\n\n const descendants = all.filter(\n (e) =>\n e.path.length > entry.path.length &&\n entry.path.every((p, i) => e.path[i] === p),\n );\n for (const d of descendants) {\n // Render the heading hierarchically by depth below the root: a direct\n // subcommand (`env default`, path length 3) is an h2, a sub-subcommand\n // (`env default set`, path length 4) is an h3, and so on. This nests\n // sub-subcommands under their parent group instead of flattening every\n // descendant to the same h2 level.\n lines.push(\n renderCommand(d, all, {\n headingLevel: d.path.length - 1,\n includeSubcommandsList: false,\n }),\n );\n }\n\n docs[filePath] = lines.join(\"\\n\");\n }\n\n return docs;\n}\n\nfunction collectCommands(\n command: CommandUnknownOpts,\n path: string[],\n): CommandInfo[] {\n const result: CommandInfo[] = [{ command, path }];\n for (const sub of command.commands) {\n // Skip hidden commands and Commander's built-in help command.\n if ((sub as any)._hidden) continue;\n if (sub.name() === \"help\") continue;\n result.push(...collectCommands(sub, [...path, sub.name()]));\n }\n return result;\n}\n\nfunction displayName(path: string[]): string {\n return `npx ${path.join(\" \")}`;\n}\n\n// Build the usage suffix (everything after the command name) for the Syntax\n// code block. We derive the argument portion from the command's registered\n// arguments rather than trusting a manual `.usage()` override, so the Syntax\n// line always agrees with the Arguments section below. For example `env set`\n// overrides `.usage()` to show `<name> <value>` (pretending the args are\n// required) for nicer `--help` output, even though it registers them as\n// optional `[name] [value]`; reproducing the override verbatim would make the\n// generated page contradict itself. Commands with no registered arguments keep\n// their `.usage()` string verbatim (e.g. the root's `<command> [options]`).\nfunction commandUsage(command: CommandUnknownOpts): string {\n const args = (command as any).registeredArguments ?? [];\n if (args.length === 0) {\n return command.usage();\n }\n // Mirror Commander's default usage order: options, then a subcommand\n // placeholder, then the positional arguments. `[options]` is always present\n // because the built-in `--help` option is always registered.\n const parts = [\"[options]\"];\n if (command.commands.length > 0) {\n parts.push(\"[command]\");\n }\n for (const arg of args) {\n const name = `${arg._name}${arg.variadic ? \"...\" : \"\"}`;\n parts.push(arg.required ? `<${name}>` : `[${name}]`);\n }\n return parts.join(\" \");\n}\n\n// Anchor id for a descendant command rendered as an h2 section inside its\n// main command's file. Built from the path segments below the main command,\n// joined with `-`, so sub-subcommands stay unique. For example, both\n// `deployment create` and `deployment token create` would collide on `#create`\n// if we used only the leaf name; instead they become `#create` and\n// `#token-create`.\nfunction anchorSlug(path: string[]): string {\n return path.slice(2).join(\"-\");\n}\n\n// Link target for a subcommand listed inside a command's \"Subcommands\"\n// section. From the root index, main commands live in sibling files. From a\n// main command page, descendants are rendered as h2 sections in the same\n// file, anchored by their path below the main command.\nfunction subcommandLink(parentPath: string[], subPath: string[]): string {\n if (parentPath.length === 1) {\n return `./${subPath[1]}`;\n }\n return `#${anchorSlug(subPath)}`;\n}\n\nfunction renderCommand(\n entry: CommandInfo,\n all: CommandInfo[],\n options: { headingLevel: number; includeSubcommandsList?: boolean },\n): string {\n const { headingLevel, includeSubcommandsList = true } = options;\n const h1 = \"#\".repeat(headingLevel);\n const h2 = \"#\".repeat(headingLevel + 1);\n\n const { command, path } = entry;\n const display = displayName(path);\n const description = renderCopyableCommands(\n escapeMdx(\n formatExampleLines(\n replaceBullets(command.description() || command.summary() || \"\"),\n ),\n ),\n );\n\n const lines: string[] = [];\n // For nested subcommand sections, pin the heading id to the path below the\n // main command so anchors like `#set` and `#token-create` stay unique even\n // when leaf names collide across different parents.\n const headingSuffix = headingLevel > 1 ? ` \\\\{#${anchorSlug(path)}}` : \"\";\n lines.push(`${h1} \\`${display}\\`${headingSuffix}`);\n lines.push(\"\");\n if (description) {\n lines.push(description);\n lines.push(\"\");\n }\n\n const usage = commandUsage(command);\n lines.push(`${h2} Syntax`);\n lines.push(\"\");\n lines.push(\"```sh\");\n lines.push(`${display} ${usage}`.trim());\n lines.push(\"```\");\n lines.push(\"\");\n\n const aliases = command.aliases();\n if (aliases.length > 0) {\n lines.push(`${h2} Aliases`);\n lines.push(\"\");\n for (const alias of aliases) {\n lines.push(`- \\`${alias}\\``);\n }\n lines.push(\"\");\n }\n\n const args = (command as any).registeredArguments ?? [];\n if (args.length > 0) {\n lines.push(`${h2} Arguments`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const arg of args) {\n const name = arg.required ? `<${arg._name}>` : `[${arg._name}]`;\n const desc = escapeMdx(replaceBullets(arg.description || \"\"));\n lines.push(`<dt>\\`${name}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n const opts = command.options.filter((o: any) => !o.hidden);\n if (opts.length > 0) {\n lines.push(`${h2} Options`);\n lines.push(\"\");\n lines.push(\"<dl>\");\n for (const opt of opts) {\n const flags = (opt as any).flags as string;\n const desc = escapeMdx(replaceBullets(opt.description || \"\"));\n lines.push(`<dt>\\`${flags}\\`</dt>`);\n lines.push(`<dd>`);\n lines.push(\"\");\n lines.push(desc);\n lines.push(\"\");\n lines.push(`</dd>`);\n }\n lines.push(\"</dl>\");\n lines.push(\"\");\n }\n\n if (includeSubcommandsList) {\n const subEntries = all.filter(\n (e) =>\n e.path.length === path.length + 1 &&\n path.every((p, i) => e.path[i] === p),\n );\n if (subEntries.length > 0) {\n lines.push(`${h2} Subcommands`);\n lines.push(\"\");\n for (const sub of subEntries) {\n const subDisplay = displayName(sub.path);\n const target = subcommandLink(path, sub.path);\n const subDesc = indentContinuation(\n escapeMdx(sub.command.summary() || sub.command.description() || \"\"),\n );\n lines.push(`- [\\`${subDisplay}\\`](${target}) \u2014 ${subDesc}`.trimEnd());\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// Escape characters that MDX would otherwise parse as JSX. Backslash-escaping\n// `<` and `{` keeps placeholder text like `<team_slug>` rendering as literal\n// text instead of being interpreted as a tag or expression.\n//\n// MDX only parses `<` and `{` specially in prose \u2014 inside an inline code span\n// (backticks) both are already literal, and a backslash there renders verbatim\n// (e.g. `` `\\<nameOrToken>` `` shows the backslash). So leave code spans\n// untouched and escape only the surrounding prose.\nfunction escapeMdx(text: string): string {\n return text\n .split(/(`[^`]*`)/)\n .map((segment, i) =>\n // Odd indices are the captured code spans; even indices are prose.\n i % 2 === 1 ? segment : segment.replace(/[<{]/g, (c) => `\\\\${c}`),\n )\n .join(\"\");\n}\n\n// Turn inline code spans that are full `npx convex ...` commands into a\n// CodeWithCopyButton component so readers can copy them with one click. The\n// component is registered globally in the docs site's MDXComponents, so no\n// import is needed in the generated page. This runs after escapeMdx, which\n// leaves code spans verbatim, so the command text inside the backticks is\n// unescaped and drops straight into the `text` attribute.\n//\n// We pass the command as a JSX expression containing a JSON-encoded string\n// (`text={\"...\"}`) rather than a plain attribute (`text=\"...\"`) because\n// commands routinely contain double quotes (e.g. JSON arguments like\n// `'{\"body\": \"hello\"}'`), which would otherwise terminate the attribute value\n// and produce invalid MDX. JSON.stringify escapes quotes and backslashes for\n// us.\nfunction renderCopyableCommands(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) =>\n /^- /.test(line)\n ? line.replace(\n /`(npx convex [^`]*)`/g,\n (_, command) =>\n `<CodeWithCopyButton text={${JSON.stringify(command)}} />`,\n )\n : line,\n )\n .join(\"\\n\");\n}\n\n// Replace \"\u2022\" bullet points with markdown \"-\" bullet points. Every line that is\n// (maybe leading spaces +) \"\u2022 \" becomes the same spaces + \"- \". This runs before\n// formatExampleLines and renderCopyableCommands so that `npx convex ...` commands\n// in bulleted help text are recognized as list items and get a copy button.\nexport function replaceBullets(text: string): string {\n return text.replace(/^( *)\u2022 /gm, \"$1- \");\n}\n\n// Convert indented example lines (e.g., from CLI help text) into markdown lists\n// so they render with proper line breaks instead of collapsing into one line.\n// Consecutive indented lines are gathered into a block; any line indented by at\n// least two spaces belongs to the block, regardless of how deeply it nests.\n//\n// How much the block is dedented depends on what precedes it:\n// - When the block follows a list item, its indentation encodes real nesting\n// (a sub-list under that item), so it is preserved verbatim. This keeps a\n// 3-level list like the deploy command's preview-key description intact\n// instead of flattening the 2-space sub-item to a top-level bullet.\n// - When the block follows prose (or starts the text), the indentation is\n// just help-text formatting, so the block is dedented by its smallest\n// indent to the left margin. Otherwise an indented list wouldn't interrupt\n// the preceding paragraph and would collapse into it.\nfunction formatExampleLines(text: string): string {\n const lines = text.split(\"\\n\");\n const result: string[] = [];\n let blockLines: string[] = [];\n\n const flushBlock = () => {\n if (blockLines.length === 0) {\n return;\n }\n const prev = result[result.length - 1];\n const followsListItem = prev !== undefined && isListItem(prev);\n const dedent = followsListItem\n ? 0\n : Math.min(...blockLines.map(indentWidth));\n for (const blockLine of blockLines) {\n result.push(toListItem(blockLine.substring(dedent)));\n }\n blockLines = [];\n };\n\n for (const line of lines) {\n // Any line indented by at least two spaces (and not blank) is part of an\n // example block, regardless of nesting depth.\n if (/^ {2,}\\S/.test(line)) {\n blockLines.push(line);\n } else {\n flushBlock();\n result.push(line);\n }\n }\n flushBlock();\n\n return result.join(\"\\n\");\n}\n\nfunction indentWidth(line: string): number {\n return line.length - line.trimStart().length;\n}\n\nfunction isListItem(line: string): boolean {\n const content = line.trimStart();\n return content.startsWith(\"- \") || /^\\d+\\.\\s/.test(content);\n}\n\n// Render an example line as a markdown list item, preserving any leading indent\n// so nested items stay nested. Lines that are already list items \u2014 either a\n// bullet (`- `) or an ordered-list item (`1. `) \u2014 are kept verbatim so they\n// render as their intended list type. Prefixing an ordered-list item with `- `\n// would nest it inside a bullet, which renders as roman numerals instead of the\n// numbered steps.\nfunction toListItem(line: string): string {\n if (isListItem(line)) {\n return line;\n }\n const indent = line.slice(0, indentWidth(line));\n return `${indent}- ${line.trimStart()}`;\n}\n\nfunction indentContinuation(text: string): string {\n return text.replace(/\\n/g, \"\\n \");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|