convex 1.42.1 → 1.42.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/simple_client.js +2 -2
- package/dist/cjs/browser/simple_client.js.map +2 -2
- package/dist/cjs/cli/dev.js +1 -0
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +4 -12
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js +1 -1
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js +2 -1
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +2 -2
- package/dist/cjs/server/database.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +2 -2
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/query_impl.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/query.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs/server/schema.js.map +1 -1
- package/dist/cjs-types/browser/simple_client.d.ts +1 -2
- package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.test.d.ts +2 -0
- package/dist/cjs-types/cli/dev.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/generatedApi.d.ts +0 -1
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/api.d.ts +0 -1
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/index.d.ts.map +1 -1
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts +2 -0
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
- package/dist/cjs-types/server/database.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/query_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/query.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +6 -13
- package/dist/cli.bundle.cjs.map +2 -2
- package/dist/esm/browser/simple_client.js +5 -3
- package/dist/esm/browser/simple_client.js.map +2 -2
- package/dist/esm/cli/dev.js +3 -1
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +4 -12
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js +1 -1
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js +2 -1
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +2 -2
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/query_impl.js.map +2 -2
- package/dist/esm/server/schema.js.map +1 -1
- package/dist/esm-types/browser/simple_client.d.ts +1 -2
- package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.test.d.ts +2 -0
- package/dist/esm-types/cli/dev.test.d.ts.map +1 -0
- package/dist/esm-types/cli/generatedApi.d.ts +0 -1
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/api.d.ts +0 -1
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/index.d.ts.map +1 -1
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/client_provided_base_client.test.d.ts +2 -0
- package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
- package/dist/esm-types/server/database.d.ts.map +1 -1
- package/dist/esm-types/server/impl/query_impl.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/query.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts.map +1 -1
- package/dist/react.bundle.js +2 -2
- package/dist/react.bundle.js.map +2 -2
- package/package.json +2 -2
- package/src/browser/simple_client.ts +12 -10
- package/src/cli/dev.test.ts +157 -0
- package/src/cli/dev.ts +7 -0
- package/src/cli/generatedApi.ts +0 -1
- package/src/cli/lib/api.ts +0 -1
- package/src/cli/lib/config.test.ts +1 -4
- package/src/cli/lib/utils/utils.ts +4 -12
- package/src/index.ts +1 -1
- package/src/react/client.ts +23 -6
- package/src/react/client_provided_base_client.test.tsx +56 -0
- package/src/react-clerk/ConvexProviderWithClerk.tsx +3 -1
- package/src/server/database.ts +6 -4
- package/src/server/impl/meta_impl.ts +2 -2
- package/src/server/impl/query_impl.ts +1 -3
- package/src/server/meta.ts +10 -0
- package/src/server/query.ts +9 -6
- package/src/server/registration.ts +10 -10
- package/src/server/schema.ts +3 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/api.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n isDemo: boolean;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n path: `teams/${selector.teamSlug}/projects/${selector.projectSlug}/deployments`,\n method: \"GET\",\n });\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n path: `teams/${selector.teamSlug}/projects/${selector.projectSlug}/deployments`,\n method: \"GET\",\n });\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -461,29 +461,21 @@ async function validateOrSelectProject(ctx, projectSlug, teamSlug, singleProject
|
|
|
461
461
|
});
|
|
462
462
|
}
|
|
463
463
|
if (!projectSlug) {
|
|
464
|
-
|
|
465
|
-
if (nonDemoProjects.length === 0) {
|
|
466
|
-
return await ctx.crash({
|
|
467
|
-
exitCode: 1,
|
|
468
|
-
errorType: "fatal",
|
|
469
|
-
printedMessage: `No existing non-demo projects! Run this command again and choose "create a new project."`
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
switch (nonDemoProjects.length) {
|
|
464
|
+
switch (projects.length) {
|
|
473
465
|
case 1: {
|
|
474
|
-
const project =
|
|
466
|
+
const project = projects[0];
|
|
475
467
|
const confirmed = await (0, import_prompts.promptYesNo)(ctx, {
|
|
476
468
|
message: `${singleProjectPrompt} ${project.name} (${project.slug})?`
|
|
477
469
|
});
|
|
478
470
|
if (!confirmed) {
|
|
479
471
|
return null;
|
|
480
472
|
}
|
|
481
|
-
return
|
|
473
|
+
return projects[0].slug;
|
|
482
474
|
}
|
|
483
475
|
default:
|
|
484
476
|
return await (0, import_prompts.promptSearch)(ctx, {
|
|
485
477
|
message: multiProjectPrompt,
|
|
486
|
-
choices:
|
|
478
|
+
choices: projects.map((project) => ({
|
|
487
479
|
name: `${project.name} (${project.slug})`,
|
|
488
480
|
value: project.slug
|
|
489
481
|
}))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/utils/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n const nonDemoProjects = projects.filter((project) => !project.isDemo);\n if (nonDemoProjects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing non-demo projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n // Prompt the user to select project.\n switch (nonDemoProjects.length) {\n case 1: {\n const project = nonDemoProjects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return nonDemoProjects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: nonDemoProjects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA4B;AAC5B,gBAAe;AACf,kBAAiB;AAIjB,2BAAsB;AACtB,uBAAqC;AACrC,yBAA0D;AAE1D,iBAKO;AACP,qBAAwB;AAExB,qBAAyD;AACzD,sBAGO;AAMP,2BAAyB;AAEzB,MAAM,oBAAgB,mBAAAA,SAAkB,KAAK;AAEtC,MAAM,0BAA0B;AAChC,MAAM,gBACX,QAAQ,IAAI,yBAAyB;AAChC,MAAM,gBAAgB,GAAG,aAAa;AAC7C,MAAM,8BAA8B,GAAG,aAAa;AAC7C,MAAM,oBAAoB;AAC1B,MAAM,iCAAiC;AAEvC,MAAM,uCAAuC;AAC7C,MAAM,iCAAiC;AACvC,MAAM,kCAAkC;AACxC,MAAM,wCACX;AACF,MAAM,cAAc;AAEpB,MAAM,sBAAsB;AAa5B,eAAsB,sBACpB,KACA,WAC6B;AAC7B,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAGA,MAAI,cAAc,uBAAuB;AACvC,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB;AAC1B,QAAM,QAAQ,UAAU,MAAM,iBAAiB;AAC/C,MAAI,OAAO;AACT,UAAM,eAAe,MAAM,CAAC;AAC5B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAOO,SAAS,qBACd,QACoB;AACpB,QAAM,gBAAgB,OAAO,8BAA8B;AAC3D,QAAM,YAAY,OAAO,oCAAoC;AAC7D,SAAO,iBAAiB,aAAa;AACvC;AAKA,MAAM,mCACJ;AAEF,SAAS,4BAA2C;AAGlD,QAAM,aAAa,QAAQ,IAAI,8BAA8B,IACzD,iCACA,QAAQ,IAAI,oCAAoC,IAC9C,uCACA;AACN,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AACA,SAAO,oDAAoD,UAAU;AACvE;AAWO,SAAS,6BACd,cACe;AACf,QAAM,QAAQ,aAAa,QAAQ,gCAAgC;AACnE,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,aAAa,MAAM,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK;AACxD,QAAM,SAAS,0BAA0B;AACzC,MAAI,QAAQ;AACV,UAAM,GAAG,GAAG;AAAA,EAAK,MAAM;AAAA,EACzB;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAe;AAClD,QAAM,cAAc,aAAa,KAAK;AACtC,MAAI,eAAe,GAAG;AAEpB,UAAM,IAAI,sCAAqB,wBAAwB;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,OAAe;AAC1C,QAAM,cAAc,CAAC;AACrB,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,IAAI,sCAAqB,eAAe;AAAA,EAChD;AACA,SAAO;AACT;AAWO,MAAM,2BAA2B,MAAM;AAAA,EAI5C,YACE,KACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA;AAAA;AAAA;AAVF;AACA;AASE;AAAA;AACA,QAAI,SAAS,UAAa,YAAY,QAAW;AAC/C,cAAM,GAAG,GAAG,KAAK,IAAI,KAAK,OAAO,EAAE;AACnC,WAAK,kBAAkB,EAAE,MAAM,QAAQ;AAAA,IACzC,OAAO;AACL,cAAM,GAAG;AAAA,IACX;AAEA,WAAO,eAAe,MAAM,mBAAmB,SAAS;AAExD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,aAAoB,aAClB,UACA,KAC6B;AAC7B,UAAM,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU;AACtE,QAAI,MAAM;AACV,QAAI;AACF,OAAC,EAAE,MAAM,QAAQ,IAAI,MAAM,SAAS,KAAK;AAAA,IAC3C,QAAQ;AAAA,IAER;AACA,WAAO,IAAI,mBAAmB,KAAK,EAAE,MAAM,SAAS,SAAS,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,OAAO,KAA8B;AACzC,QAAI,aAAwB;AAC5B,UAAM,8BAA8B,KAAK,KAAK,QAAQ;AAEtD,QAAI,MAAM,KAAK;AAEf,QAAI,KAAK,SAAS,WAAW,KAAK;AAChC,mBAAa;AAAA,IACf,WAAW,KAAK,SAAS,WAAW,KAAK;AACvC,mBAAa;AACb,YAAM,GAAG,GAAG;AAAA;AAAA,IACd,WAAW,KAAK,SAAS,WAAW,KAAK;AACvC,mBAAa;AAIb,YAAM,KAAK,iBAAiB,WAAW;AACvC,YAAM,SAAS,0BAA0B;AACzC,UAAI,QAAQ;AACV,cAAM,GAAG,GAAG;AAAA,EAAK,MAAM;AAAA,MACzB;AAAA,IACF,WAAW,KAAK,SAAS,WAAW,KAAK;AACvC,mBAAa;AACb,YAAM,GAAG,GAAG,KAAK,KAAK,SAAS,GAAG;AAAA,IACpC;AAEA,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB,yBAAY,IAAI,IAAI,KAAK,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AACF;AASA,eAAsB,cACpB,UACA,SACmB;AACnB,QAAM,WAAW,MAAM,cAAc,UAAU,OAAO;AACtD,MAAI,CAAC,SAAS,IAAI;AAGhB,UAAM,MAAM,mBAAmB;AAAA,MAC7B;AAAA,MACA,kBAAkB,SAAS,SAAS,QAAQ,SAAS,MAAM,EAAE,IAC3D,OAAO,aAAa,WAChB,WACA,SAAS,WACP,SAAS,MACT,SAAS,SAAS,CAC1B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,eAAsB,uBACpB,KACA,KACgB;AAEhB,sCAAoB;AAEpB,MAAI,eAAe,oBAAoB;AACrC,WAAO,MAAM,IAAI,OAAO,GAAG;AAAA,EAC7B,OAAO;AACL,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB,yBAAY,IAAI,GAAG;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBAAsB,KAAc,oBAA4B;AACvE,MAAI,IAAI,2BAA2B;AACjC;AAAA,EACF;AACA,MAAI,4BAA4B;AAChC,6BAAW,yBAAY,OAAO,kBAAkB,CAAC;AACnD;AAEA,eAAe,8BAA8B,KAAc,MAAgB;AACzE,QAAM,UAAU,KAAK;AACrB,MAAI,SAAS;AACX,UAAM,mBAAmB,QAAQ,IAAI,4BAA4B;AACjE,UAAM,qBAAqB,QAAQ,IAAI,8BAA8B;AACrE,YAAQ,kBAAkB;AAAA,MACxB,KAAK;AACH;AAAA,MACF,KAAK;AAMH,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,yBAAY,IAAI,kBAAkB;AAAA,QACpD,CAAC;AAAA,MACH;AAGE;AAAA,UACE;AAAA,UACA,sBAAsB;AAAA,QACxB;AACA;AAAA,IACJ;AAAA,EACF;AACF;AAIO,SAAS,wBAAwB,KAAc,MAAgB;AACpE,QAAM,UAAU,KAAK;AACrB,MAAI,SAAS;AACX,UAAM,mBAAmB,QAAQ,IAAI,4BAA4B;AACjE,UAAM,qBAAqB,QAAQ,IAAI,8BAA8B;AACrE,YAAQ,kBAAkB;AAAA,MACxB,KAAK;AACH;AAAA,MACF,KAAK;AAGH,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACE;AAAA,UACE;AAAA,UACA,sBAAsB;AAAA,QACxB;AACA;AAAA,IACJ;AAAA,EACF;AACF;AAEA,eAAsB,QAAQ,KAAc,UAAkB;AAC5D,QAAM,SAAS,MAAM,oBAAoB,GAAG,EAAE,IAAI,QAAQ,GAAG;AAC7D,SAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ;AACpD;AAEA,eAAsB,qBACpB,KACA,UACA,eACkD;AAClD,QAAM,SAAS,MAAM,oBAAoB,GAAG,EAAE,IAAI,QAAQ,GAAG;AAC7D,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB,yBAAY,IAAI,uBAAuB;AAAA,IACzD,CAAC;AAAA,EACH;AACA,MAAI,CAAC,UAAU;AAEb,YAAQ,MAAM,QAAQ;AAAA,MACpB,KAAK;AACH,eAAO,EAAE,MAAM,MAAM,CAAC,GAAG,QAAQ,MAAM;AAAA,MACzC,SAAS;AACP,cAAMC,YAAW,UAAM,6BAAa,KAAK;AAAA,UACvC,SAAS;AAAA,UACT,SAAS,MAAM,IAAI,CAACC,WAAU;AAAA,YAC5B,MAAM,GAAGA,MAAK,IAAI,KAAKA,MAAK,IAAI;AAAA,YAChC,OAAOA,MAAK;AAAA,UACd,EAAE;AAAA,QACJ,CAAC;AACD,cAAM,OAAO,MAAM,KAAK,CAACA,UAASA,MAAK,SAASD,SAAQ;AACxD,YAAI,CAAC,MAAM;AACT,iBAAO,MAAM,IAAI,MAAM;AAAA,YACrB,UAAU;AAAA,YACV,WAAW;AAAA,YACX,gBAAgB;AAAA,UAClB,CAAC;AAAA,QACH;AACA,eAAO,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,OAAO,MAAM,KAAK,CAACC,UAASA,MAAK,SAAS,QAAQ;AACxD,QAAI,CAAC,MAAM;AACT,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,eAAe,QAAQ;AAAA,MACzC,CAAC;AAAA,IACH;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,EAC/B;AACF;AAEA,eAAsB,wBACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AACF,GAkB+C;AAC/C,MAAI,sBAAuB,QAAO,EAAE,eAAe,sBAAsB;AAEzE,MAAI,kBAAkB,cAAc,wBAAwB,MAAM;AAEhE,QAAI,UAAM,4CAA2B,KAAK,EAAE,aAAa,SAAS,CAAC,GAAG;AAEpE,aAAO,EAAE,eAAe,QAAQ;AAAA,IAClC;AAAA,EACF;AAIA,MAAI,wBAAwB,SAAS,CAAC,qCAAqC;AACzE,WAAO,EAAE,eAAe,QAAQ;AAAA,EAClC;AAIA,QAAM,kBACH,UAAM,+CAA8B,GAAG,GAAG,cAAc,SACzD;AACF,MAAI,gBAAgB;AAClB,WAAO,EAAE,eAAe,QAAQ;AAAA,EAClC;AAGA,QAAM,gBAAmC,UAAM,8BAAc,KAAK;AAAA,IAChE,SACE;AAAA,IACF,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,oBAAoB,OAAO,QAAQ;AAAA,MAC3C,EAAE,MAAM,2BAA2B,OAAO,QAAQ;AAAA,IACpD;AAAA,EACF,CAAC;AACD,SAAO,EAAE,cAAc;AACzB;AAEA,eAAsB,0BAA0B,UAAkB;AAChE,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,iBAAiB;AAC3D,QAAM,yBAAyB,yBAAY;AAAA,IACzC,4DAA4D,yBAAY,UAAU,GAAG,iBAAiB,QAAQ,CAAC,WAAW,CAAC;AAAA,EAC7H;AACA,6BAAW,sBAAsB;AACnC;AAEA,eAAsB,yBACpB,KACA,cACA,gBACA;AACA,MAAI,CAAC,QAAQ,MAAM,OAAO;AAExB,QAAI,CAAC,aAAa,eAAe;AAC/B,YAAM,0BAA0B,aAAa,IAAI;AAAA,IACnD;AACA,WAAO,aAAa,iBAAiB;AAAA,EACvC;AACA,QAAM,qBACJ,aAAa,iBACZ,MAAM,aAAa,KAAK,aAAa,IAAI,cAAc;AAC1D,MAAI,CAAC,aAAa,eAAe;AAE/B,UAAM,0BAA0B,aAAa,IAAI;AAAA,EACnD;AACA,SAAO;AACT;AAEA,eAAsB,aACpB,KACA,QACA,gBACqB;AACrB,QAAM,mBACJ,MAAM,oBAAoB,GAAG,EAAE;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,QACN,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GACA;AACF,QAAM,UAAU,gBAAgB,MAC7B,OAAO,CAAC,SAAS,QAAQ,KAAK,SAAS,CAAC,EACxC,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,EACd,EAAE,EACD,KAAK,CAAC,GAAG,MAAM;AAEd,QAAI,EAAE,UAAU,gBAAiB,QAAO;AACxC,QAAI,EAAE,UAAU,gBAAiB,QAAO;AACxC,WAAO;AAAA,EACT,CAAC;AACH,SAAO,UAAM,8BAAc,KAAK;AAAA,IAC9B,SAAS,qBAAqB,cAAc;AAAA,IAC5C,QAAQ;AAAA,EAAK,yBAAY;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,WACpB,KACA,UACA,aACA;AACA,MAAI;AACF,UAAM,YACJ,MAAM,oBAAoB,GAAG,EAAE,IAAI,+BAA+B;AAAA,MAChE,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC,GACD;AACF,WAAO,CAAC,CAAC,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,WAAW;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAY,KAAc;AAC9C,SAAO,CAAC,CAAE,MAAM,YAAY,EAAE,KAAK,QAAQ,OAAO,MAAM,eAAe,CAAC;AAC1E;AAEA,eAAsB,wBACpB,KACA,aACA,UACA,qBACA,oBACwB;AACxB,QAAM,YACJ,MAAM,oBAAoB,GAAG,EAAE,IAAI,+BAA+B;AAAA,IAChE,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC,GACD;AACF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,MAAI,CAAC,aAAa;AAChB,UAAM,kBAAkB,SAAS,OAAO,CAAC,YAAY,CAAC,QAAQ,MAAM;AACpE,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,YAAQ,gBAAgB,QAAQ;AAAA,MAC9B,KAAK,GAAG;AACN,cAAM,UAAU,gBAAgB,CAAC;AACjC,cAAM,YAAY,UAAM,4BAAY,KAAK;AAAA,UACvC,SAAS,GAAG,mBAAmB,IAAI,QAAQ,IAAI,KAAK,QAAQ,IAAI;AAAA,QAClE,CAAC;AAED,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,QACT;AACA,eAAO,gBAAgB,CAAC,EAAE;AAAA,MAC5B;AAAA,MACA;AACE,eAAO,UAAM,6BAAa,KAAK;AAAA,UAC7B,SAAS;AAAA,UACT,SAAS,gBAAgB,IAAI,CAAC,aAAsB;AAAA,YAClD,MAAM,GAAG,QAAQ,IAAI,KAAK,QAAQ,IAAI;AAAA,YACtC,OAAO,QAAQ;AAAA,UACjB,EAAE;AAAA,QACJ,CAAC;AAAA,IACL;AAAA,EACF,OAAO;AAEL,QAAI,CAAC,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,WAAW,GAAG;AAC7D,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,kBAAkB,WAAW;AAAA,MAC/C,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAOA,eAAsB,gBACpB,KACA,kBAAkB,OACe;AACjC,MAAI;AACJ,MAAI;AACF,kBAAc,IAAI,GAAG,aAAa,cAAc;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,qCACd,GACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,WAAW;AAAA,EAC9B,SAAS,KAAK;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB,iCAAiC,GAAU;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,QAAM,WAAW;AAAA,IACf,GAAI,kBAAmB,IAAI,oBAAoB,CAAC,IAAK,CAAC;AAAA,IACtD,GAAI,IAAI,gBAAgB,CAAC;AAAA,IACzB,GAAI,IAAI,mBAAmB,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,eAAsB,0BAA0B,KAAc,KAAa;AACzE,QAAM,WAAW,MAAM,gBAAgB,KAAK,IAAI;AAChD,QAAM,sBAAsB,YAAY;AACxC,MAAI,CAAC,qBAAqB;AACxB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,eAAe,GAAG;AAAA,IACpC,CAAC;AAAA,EACH;AACF;AAGO,MAAM,SAAS,CAAI,KAAU,QAA6B;AAC/D,QAAM,SAAS,CAAC,GAAG,GAAG;AACtB,QAAM,MAAM,CAAC,GAAM,MAAS;AAC1B,QAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAG,QAAO;AAC5B,QAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAG,QAAO;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,GAAG;AACxB;AAEO,SAAS,aACd,YACA,eACQ;AACR,SAAO,YAAAC,QAAK,KAAK,YAAAA,QAAK,QAAQ,UAAU,GAAG,cAAc,SAAS;AACpE;AAEA,SAAS,aAAa;AAEpB,MAAI,QAAQ,IAAI,uBAAuB;AACrC,UAAM,OAAO,QAAQ,IAAI,sBAAsB,MAAM,GAAG,EAAE,CAAC;AAC3D,QAAI,SAAS,UAAa,SAAS,QAAQ;AACzC,aAAO;AAAA,IACT,OAAO;AACL,aAAO,eAAe,IAAI;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAwB;AACtC,SAAO,YAAAA,QAAK,KAAK,UAAAC,QAAG,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE;AACnD;AAEO,SAAS,WAAW;AACzB,QAAM,OAAO,WAAW;AACxB,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,SAAS;AAGxB,QAAI,QAAQ,IAAI,cAAc;AAC5B,aAAO,YAAAD,QAAK,KAAK,QAAQ,IAAI,cAAc,IAAI;AAAA,IACjD;AACA,QAAI,QAAQ,IAAI,aAAa;AAC3B,aAAO,YAAAA,QAAK,KAAK,QAAQ,IAAI,aAAa,WAAW,SAAS,IAAI;AAAA,IACpE;AACA,WAAO,YAAAA,QAAK,KAAK,UAAAC,QAAG,QAAQ,GAAG,WAAW,SAAS,IAAI;AAAA,EACzD;AACA,SAAO,YAAAD,QAAK,KAAK,UAAAC,QAAG,QAAQ,GAAG,UAAU,IAAI;AAC/C;AAOO,SAAS,cAAc,KAA4B;AACxD,QAAM,aAAa,IAAI,aAAa,GAAG;AACvC,QAAM,kBAA0C,aAC5C;AAAA,IACE,eAAe;AAAA,IACf,iBAAiB,WAAW,sBAAO;AAAA,EACrC,IACA;AAAA,IACE,iBAAiB,WAAW,sBAAO;AAAA,EACrC;AACJ,SAAO,CAAC,UAA6B,YAAqC;AACxE,UAAM,EAAE,SAAS,gBAAgB,GAAG,KAAK,IAAI,WAAW,CAAC;AAEzD,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,GAAI,mBACD,oBAAoB,UACjB,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC,IAC7C,CAAC;AAAA,IACT;AACA,UAAM,OAAO;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,cAAc,UAAU,IAAI;AAAA,EACrC;AACF;AAEA,eAAsB,YAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EACA,MAAAD;AAAA,EACA;AACF,GAKe;AACb,QAAM,aACJ,SAAS,SACL,SACA,OAAO,SAAS,WACd,OACA,KAAK,UAAU,IAAI;AAC3B,MAAI;AACF,WAAO,MAAM,uBAAuB;AAAA,MAClC;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,KAAc;AACrB,WAAO,MAAM,uBAAuB,KAAK,GAAG;AAAA,EAC9C;AACF;AAQA,SAAS,sBACP,SACA,cACA;AACA,SAAO,CAAC,KAAc,UAA+B,CAAC,MAAM;AAQ1D,UAAM,aAAS,qBAAAE,SAAoB;AAAA,MACjC;AAAA,MACA,OAAO,aAAa,GAAG;AAAA,IACzB,CAAC;AAGD,WAAO,IAAI,MAAM,QAAQ;AAAA,MACvB,IAAI,QAAQ,MAAM;AAChB,cAAM,iBAAiB,OAAO,IAA2B;AAEzD,YACE,SAAS,SACT,SAAS,UACT,SAAS,UACT,SAAS,aACT,SAAS,SACT,SAAS,YACT,SAAS,WACT,SAAS,SACT;AACA,iBAAO,UAAU,SAAgB;AAC/B,gBAAI;AACF,qBAAO,MAAO,eAA4B,MAAM,QAAQ,IAAI;AAAA,YAC9D,SAAS,KAAc;AACrB,kBAAI,QAAQ,OAAO;AAEjB,sBAAM;AAAA,cACR;AACA,qBAAO,MAAM,uBAAuB,KAAK,GAAG;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AACF;AACO,MAAM,sBACX;AAAA,EACE;AAAA,EACA;AACF;AAEK,SAAS,sBACd,KACA,MACA,UAA+B,CAAC,GAChC;AACA,SAAO;AAAA,IACL,GAAG,KAAK,aAAa;AAAA,IACrB,CAACC,SACC,gBAAgBA,MAAK;AAAA,MACnB,eAAe,KAAK;AAAA,MACpB,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,EACL,EAAE,KAAK,OAAO;AAChB;AAEA,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,MAAAH;AAAA,EACA;AACF,GAKiB;AACf,QAAMI,SAAQ,cAAc,GAAG;AAC/B,QAAM,aACJ,SAAS,SACL,WAAW,SACT,KAAK,UAAU,CAAC,CAAC,IACjB,SACF,OAAO,SAAS,WACd,OACA,KAAK,UAAU,IAAI;AAC3B,QAAM,MAAM,MAAMA,OAAM,IAAI,IAAIJ,OAAM,aAAa,GAAG;AAAA,IACpD;AAAA,IACA,GAAI,aAAa,EAAE,MAAM,WAAW,IAAI,CAAC;AAAA,IACzC,SACE,WAAW,SACP;AAAA,MACE,gBAAgB;AAAA,IAClB,IACA,CAAC;AAAA,EACT,CAAC;AACD,0BAAwB,KAAK,GAAG;AAChC,MAAI,IAAI,WAAW,KAAK;AACtB,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB;AACF;AAUO,MAAM,OAAO,eAClBI,QACA,WACA,SAAS,KACT;AACA,MAAI,SAAS,MAAMA,OAAM;AACzB,SAAO,CAAC,UAAU,MAAM,GAAG;AACzB,UAAM,KAAK,MAAM;AACjB,aAAS,MAAMA,OAAM;AAAA,EACvB;AACA,SAAO;AACT;AAEA,MAAM,OAAO,SAAU,QAAgB;AACrC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,MAAM;AAAA,EAC5B,CAAC;AACH;AAEO,SAAS,cAAc;AAE5B,SAAO,IAAI,QAAQ,CAAC,MAAM;AAAA,EAE1B,CAAC;AACH;AAGO,SAAS,kBAAkD;AAChE,MAAI;AACJ,QAAM,cAAc,IAAI,QAAQ,CAAC,YAAa,WAAW,OAAQ;AACjE,SAAO,CAAC,aAAa,MAAM,SAAS,IAAI,CAAC;AAC3C;AAEA,MAAM,aAAiC;AAAA,EACrC,CAAC,KAAK,IAAI,KAAK;AAAA,EACf,CAAC,KAAe,IAAI;AAAA,EACpB,CAAC,KAAK,IAAI,KAAK;AAAA,EACf,CAAC,KAAW,IAAI;AAAA,EAChB,CAAC,KAAK,IAAI,KAAK;AAAA,EACf,CAAC,KAAO,IAAI;AACd;AASO,SAAS,WAAW,GAAmB;AAC5C,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,aAAW,CAAC,UAAU,QAAQ,KAAK,YAAY;AAC7C,QAAI,IAAI,UAAU;AAChB;AAAA,IACF;AACA,QAAI,IAAI,aAAa,GAAG;AACtB,aAAO,GAAG,IAAI,QAAQ,IAAI,QAAQ;AAAA,IACpC;AACA,QAAK,IAAI,KAAM,aAAa,GAAG;AAC7B,YAAM,QAAQ,KAAK,MAAM,IAAI,QAAQ;AACrC,YAAM,OAAO,KAAK,MAAO,IAAI,KAAM,QAAQ,IAAI;AAC/C,aAAO,GAAG,KAAK,IAAI,IAAI,IAAI,QAAQ;AAAA,IACrC;AAAA,EACF;AACA,SAAO,GAAG,CAAC;AACb;AAEO,SAAS,eAAe,IAAoB;AACjD,QAAM,YAAY,CAAC,GAAW,SAC5B,GAAG,EAAE,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC,GAAG,IAAI;AAEnE,MAAI,KAAK,MAAM;AACb,WAAO,UAAU,KAAK,KAAK,IAAI;AAAA,EACjC;AACA,MAAI,KAAK,GAAG;AACV,WAAO,UAAU,KAAK,KAAK,OAAI;AAAA,EACjC;AACA,MAAI,KAAK,KAAK;AACZ,WAAO,UAAU,IAAI,IAAI;AAAA,EAC3B;AACA,QAAM,IAAI,KAAK;AACf,MAAI,IAAI,IAAI;AACV,WAAO,UAAU,KAAK,KAAK,GAAG;AAAA,EAChC;AACA,SAAO,UAAU,IAAI,IAAI,GAAG;AAC9B;AAEO,SAAS,uBAAuB;AACrC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,QAAQ,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,QAAM,UAAU,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,UAAU,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO;AACvC;AAIA,eAAsB,kBAAkB,KAGrC;AACD,QAAM,oBAAoB,OAAO,KAAK,cAAc;AACpD,MAAI,CAAC,mBAAmB;AACtB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,QAAM,sBACJ,qBACA,YAAAJ,QAAK,KAAK,YAAAA,QAAK,QAAQ,iBAAiB,GAAG,aAAa;AAC1D,QAAM,mBACJ,uBAAuB,IAAI,GAAG,OAAO,mBAAmB,IACpD,sBACA;AACN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,OAAO,KAAc,UAAsC;AAClE,MAAI,SAAS,YAAAA,QAAK,QAAQ,GAAG;AAC7B,MAAI,YAAY;AAChB,KAAG;AACD,UAAM,YAAY,YAAAA,QAAK,KAAK,QAAQ,QAAQ;AAC5C,QAAI,IAAI,GAAG,OAAO,SAAS,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,aAAS;AACT,gBAAY,YAAAA,QAAK,QAAQ,MAAM;AAAA,EACjC,SAAS,cAAc;AACvB;AACF;AAMA,eAAsB,oBAAoB,KAAc;AACtD,QAAM,EAAE,mBAAmB,iBAAiB,IAAI,MAAM,kBAAkB,GAAG;AAC3E,MAAI,sBAAsB,YAAAA,QAAK,QAAQ,cAAc,GAAG;AACtD,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,CAAC,CAAC;AACX;AA0BO,SAAS,WACd,MACA,SACA,MACA,SACA;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAQ,4BAAM,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC;AAC5D,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,aAAa,SAAS,UAAU;AAEtC,QAAI,YAAY;AACd,YAAM,OAAO;AAAA,QAAG;AAAA,QAAQ,CAAC,aACvB,uBAAW,KAAK,SAAS,OAAO,EAAE,QAAQ,CAAC;AAAA,MAC7C;AACA,YAAM,OAAO;AAAA,QAAG;AAAA,QAAQ,CAAC,aACvB,qBAAS,KAAK,SAAS,OAAO,EAAE,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,YAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,kBAAU,KAAK,SAAS,OAAO;AAAA,MACjC,CAAC;AAED,YAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAChC,kBAAU,KAAK,SAAS,OAAO;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,UAAM,qBAAqB,CAAC,SAAwB;AAClD,YAAM,eAAe,SAAS,aAAa;AAC3C,YAAM,SAAS,aACX,EAAE,QAAQ,KAAK,IACf,EAAE,QAAQ,QAAQ,QAAQ,KAAK;AACnC,UAAI,SAAS,GAAG;AACd,cAAM,iBACJ,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK;AACnD,cAAM,QAAQ,IAAI;AAAA,UAChB,KAAK,OAAO,GAAG,cAAc,iCAAiC,IAAI;AAAA,QACpE;AACA,YAAI,YAAY;AACd,iBAAO,EAAE,GAAG,QAAQ,MAAM,CAAC;AAAA,QAC7B,OAAO;AACL,kBAAQ,EAAE,GAAG,QAAQ,MAAM,CAAC;AAAA,QAC9B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,UAAiB;AACtC,YAAM,eAAe,QAAQ,kBAAkB;AAC/C,YAAM,eAAe,SAAS,kBAAkB;AAChD,UAAI,YAAY;AACd,eAAO,EAAE,OAAO,QAAQ,KAAK,CAAC;AAAA,MAChC,OAAO;AACL,gBAAQ,EAAE,OAAO,QAAQ,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,YAAY;AACd,YAAM,KAAK,QAAQ,kBAAkB;AAAA,IACvC,OAAO;AACL,YAAM,KAAK,SAAS,kBAAkB;AAAA,IACxC;AACA,UAAM,KAAK,SAAS,aAAa;AAAA,EACnC,CAAC;AACH;AAEA,MAAM,qBAAqB,CAAC,OAAO,QAAQ,OAAO,UAAU,WAAW,OAAO;AAE9E,SAAS,WACP,SACA,QACA,WACQ;AAER,QAAM,QAAQ,YAAY,IAAI,IAAI,MAAM,UAAU,KAAK;AACvD,QAAM,YAAY,QAAQ,MAAM,KAAK,OAAO;AAC5C,SAAO,QAAQ;AACjB;AAEA,SAAS,uBACP,SACA,QACA;AACA,QAAM,cAAc,SAClB,UACA,OACA,UACkD;AAElD,QAAI,UAAU,MAAM;AAGlB,aAAO,EAAE,MAAM,SAAS,MAAa;AAAA,IACvC;AAGA,QAAI,UAAU,WAAW,KAAK;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,iCAAiC,SAAS,MAAM;AAAA,MACzD;AAAA,IACF;AAGA,QACE,YACA,CAAC,SAAS,MACV,UACA,mBAAmB,SAAS,OAAO,YAAY,CAAC,GAChD;AAEA,UACE;AAAA,QACE;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF,EAAE,SAAS,SAAS,MAAM,GAC1B;AACA,eAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,iCAAiC,SAAS,MAAM;AAAA,MACzD;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,SAAO,SACL,SACA,OACA,UACA;AACA,UAAM,SAAS,YAAY,SAAS,OAAO,QAAQ;AACnD,QAAI,OAAO,SAAS,SAAS;AAC3B,gBAAU,OAAO,OAAO,OAAO;AAAA,IACjC;AACA,QAAI,WAAW,aAAa;AAG1B,aAAO;AAAA,IACT;AACA,WAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAMO,SAAS,oBACd,MACA,SAIsB;AACtB,QAAM,EAAE,eAAe,QAAQ,IAAI;AACnC,QAAM,qBAAqB,CAAC,KAAU,YAAoB;AACxD,cAAU,GAAG;AACb,QAAI,WAAW,qBAAqB;AAClC;AAAA,QACE,yBAAY;AAAA,UACV,6BAA6B,OAAO,IAAI,WAAW;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,UAA6BK,aAAqC;AACxE,UAAM,MACJ,oBAAoB,MAChB,SAAS,WACT,OAAO,aAAa,WAClB,IAAI,IAAI,UAAU,aAAa,IAC/B,IAAI,IAAI,SAAS,KAAK,aAAa;AAC3C,UAAM,OAAO,cAAc,KAAK;AAAA,MAC9B;AAAA,MACA,SAAS,uBAAuB,oBAAoBA,UAAS,MAAM;AAAA,MACnE,GAAGA;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAQO,SAAS,gBACd,MACA,SAKc;AACd,QAAM,EAAE,eAAe,UAAU,QAAQ,IAAI;AAC7C,QAAM,qBAAqB,CAAC,KAAU,YAAoB;AACxD,cAAU,GAAG;AACb,QAAI,WAAW,qBAAqB;AAClC;AAAA,QACE,yBAAY;AAAA,UACV,6BAA6B,OAAO,IAAI,WAAW;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,UAA6BA,aAAqC;AACxE,UAAM,MACJ,oBAAoB,MAChB,SAAS,WACT,OAAO,aAAa,WAClB,IAAI,IAAI,UAAU,aAAa,IAC/B,IAAI,IAAI,SAAS,KAAK,aAAa;AAE3C,UAAM,UAAU,IAAI,QAAQA,UAAS,WAAW,CAAC,CAAC;AAClD,QAAI,CAAC,QAAQ,IAAI,eAAe,GAAG;AACjC,cAAQ,IAAI,iBAAiB,UAAU,QAAQ,EAAE;AAAA,IACnD;AACA,QAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,cAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AACA,QAAI,CAAC,QAAQ,IAAI,eAAe,GAAG;AACjC,cAAQ,IAAI,iBAAiB,WAAW,sBAAO,EAAE;AAAA,IACnD;AACA,UAAM,OAAO,cAAc,KAAK;AAAA,MAC9B;AAAA,MACA,SAAS,uBAAuB,oBAAoBA,UAAS,MAAM;AAAA,MACnE,GAAGA;AAAA,MACH;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAOO,SAAS,iBAA0B;AAExC,MAAI,QAAQ,IAAI,iCAAiC;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB;AACvB,MAAI,QAAQ,SAAS,iBAAiB,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,uBAAmB,eAAe,qBAAqB;AAAA,EAGzD,QAAQ;AAAA,EAAC;AACT,SAAO,qBAAqB,QAAQ,qBAAqB;AAC3D;AAGA,eAAsB,uBACpB,KACwB;AACxB,QAAM,EAAE,mBAAmB,gBAAgB,IAAI,MAAM,kBAAkB,GAAG;AAC1E,MAAI;AACJ,MAAI;AACF,UAAM,oBAAoB,IAAI,GAAG,aAAa,eAAe;AAC7D,kBAAc,KAAK,MAAM,iBAAiB;AAAA,EAC5C,SAAS,OAAY;AACnB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,mBAAmB,eAAe,0CAA0C,KAAK;AAAA,IACnG,CAAC;AAAA,EACH;AACA,QAAM,OAAO,YAAY,UAAU;AACnC,MAAI,OAAO,SAAS,UAAU;AAE5B,WAAO;AAAA,EACT;AACA,SAAO;AACT;",
|
|
4
|
+
"sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n // Prompt the user to select project.\n switch (projects.length) {\n case 1: {\n const project = projects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return projects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: projects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fetchRetryFactory", "teamSlug", "team", "path", "os", "createClient", "ctx", "fetch", "options"]
|
|
7
7
|
}
|