convex 1.42.0 → 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.
Files changed (142) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/browser.bundle.js +24 -6
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/simple_client.js +2 -2
  5. package/dist/cjs/browser/simple_client.js.map +2 -2
  6. package/dist/cjs/browser/sync/authentication_manager.js +21 -4
  7. package/dist/cjs/browser/sync/authentication_manager.js.map +2 -2
  8. package/dist/cjs/browser/sync/client.js +2 -1
  9. package/dist/cjs/browser/sync/client.js.map +2 -2
  10. package/dist/cjs/cli/dev.js +1 -0
  11. package/dist/cjs/cli/dev.js.map +2 -2
  12. package/dist/cjs/cli/generatedApi.js.map +1 -1
  13. package/dist/cjs/cli/lib/api.js.map +2 -2
  14. package/dist/cjs/cli/lib/typecheck.js +28 -10
  15. package/dist/cjs/cli/lib/typecheck.js.map +2 -2
  16. package/dist/cjs/cli/lib/utils/utils.js +4 -12
  17. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  18. package/dist/cjs/index.js +1 -1
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/react/client.js +1 -1
  21. package/dist/cjs/react/client.js.map +2 -2
  22. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js +2 -1
  23. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +2 -2
  24. package/dist/cjs/server/database.js.map +1 -1
  25. package/dist/cjs/server/impl/meta_impl.js +2 -2
  26. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  27. package/dist/cjs/server/impl/query_impl.js.map +2 -2
  28. package/dist/cjs/server/impl/registration_impl.js +0 -2
  29. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  30. package/dist/cjs/server/meta.js.map +1 -1
  31. package/dist/cjs/server/query.js.map +1 -1
  32. package/dist/cjs/server/registration.js.map +1 -1
  33. package/dist/cjs/server/schema.js.map +1 -1
  34. package/dist/cjs-types/browser/simple_client.d.ts +1 -2
  35. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  36. package/dist/cjs-types/browser/sync/authentication_manager.d.ts +2 -0
  37. package/dist/cjs-types/browser/sync/authentication_manager.d.ts.map +1 -1
  38. package/dist/cjs-types/browser/sync/client.d.ts +16 -0
  39. package/dist/cjs-types/browser/sync/client.d.ts.map +1 -1
  40. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  41. package/dist/cjs-types/cli/dev.test.d.ts +2 -0
  42. package/dist/cjs-types/cli/dev.test.d.ts.map +1 -0
  43. package/dist/cjs-types/cli/generatedApi.d.ts +0 -1
  44. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  45. package/dist/cjs-types/cli/lib/api.d.ts +0 -1
  46. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  47. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  48. package/dist/cjs-types/index.d.ts +1 -1
  49. package/dist/cjs-types/index.d.ts.map +1 -1
  50. package/dist/cjs-types/react/client.d.ts.map +1 -1
  51. package/dist/cjs-types/react/client_provided_base_client.test.d.ts +2 -0
  52. package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +1 -0
  53. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
  54. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
  55. package/dist/cjs-types/server/database.d.ts.map +1 -1
  56. package/dist/cjs-types/server/impl/query_impl.d.ts.map +1 -1
  57. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  58. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  59. package/dist/cjs-types/server/query.d.ts.map +1 -1
  60. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  61. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  62. package/dist/cli.bundle.cjs +58 -28
  63. package/dist/cli.bundle.cjs.map +3 -3
  64. package/dist/esm/browser/simple_client.js +5 -3
  65. package/dist/esm/browser/simple_client.js.map +2 -2
  66. package/dist/esm/browser/sync/authentication_manager.js +21 -4
  67. package/dist/esm/browser/sync/authentication_manager.js.map +2 -2
  68. package/dist/esm/browser/sync/client.js +2 -1
  69. package/dist/esm/browser/sync/client.js.map +2 -2
  70. package/dist/esm/cli/dev.js +3 -1
  71. package/dist/esm/cli/dev.js.map +2 -2
  72. package/dist/esm/cli/lib/api.js.map +2 -2
  73. package/dist/esm/cli/lib/typecheck.js +28 -10
  74. package/dist/esm/cli/lib/typecheck.js.map +3 -3
  75. package/dist/esm/cli/lib/utils/utils.js +4 -12
  76. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  77. package/dist/esm/index.js +1 -1
  78. package/dist/esm/index.js.map +1 -1
  79. package/dist/esm/react/client.js +1 -1
  80. package/dist/esm/react/client.js.map +2 -2
  81. package/dist/esm/react-clerk/ConvexProviderWithClerk.js +2 -1
  82. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +2 -2
  83. package/dist/esm/server/impl/meta_impl.js +2 -2
  84. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  85. package/dist/esm/server/impl/query_impl.js.map +2 -2
  86. package/dist/esm/server/impl/registration_impl.js +0 -2
  87. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  88. package/dist/esm/server/schema.js.map +1 -1
  89. package/dist/esm-types/browser/simple_client.d.ts +1 -2
  90. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  91. package/dist/esm-types/browser/sync/authentication_manager.d.ts +2 -0
  92. package/dist/esm-types/browser/sync/authentication_manager.d.ts.map +1 -1
  93. package/dist/esm-types/browser/sync/client.d.ts +16 -0
  94. package/dist/esm-types/browser/sync/client.d.ts.map +1 -1
  95. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  96. package/dist/esm-types/cli/dev.test.d.ts +2 -0
  97. package/dist/esm-types/cli/dev.test.d.ts.map +1 -0
  98. package/dist/esm-types/cli/generatedApi.d.ts +0 -1
  99. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  100. package/dist/esm-types/cli/lib/api.d.ts +0 -1
  101. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  102. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  103. package/dist/esm-types/index.d.ts +1 -1
  104. package/dist/esm-types/index.d.ts.map +1 -1
  105. package/dist/esm-types/react/client.d.ts.map +1 -1
  106. package/dist/esm-types/react/client_provided_base_client.test.d.ts +2 -0
  107. package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +1 -0
  108. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
  109. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
  110. package/dist/esm-types/server/database.d.ts.map +1 -1
  111. package/dist/esm-types/server/impl/query_impl.d.ts.map +1 -1
  112. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  113. package/dist/esm-types/server/meta.d.ts.map +1 -1
  114. package/dist/esm-types/server/query.d.ts.map +1 -1
  115. package/dist/esm-types/server/registration.d.ts.map +1 -1
  116. package/dist/esm-types/server/schema.d.ts.map +1 -1
  117. package/dist/react.bundle.js +25 -7
  118. package/dist/react.bundle.js.map +2 -2
  119. package/package.json +2 -2
  120. package/src/browser/simple_client.ts +12 -10
  121. package/src/browser/sync/authentication_manager.ts +42 -14
  122. package/src/browser/sync/client.ts +17 -0
  123. package/src/cli/dev.test.ts +157 -0
  124. package/src/cli/dev.ts +7 -0
  125. package/src/cli/generatedApi.ts +0 -1
  126. package/src/cli/lib/api.ts +0 -1
  127. package/src/cli/lib/config.test.ts +1 -4
  128. package/src/cli/lib/typecheck.ts +26 -10
  129. package/src/cli/lib/utils/utils.ts +4 -12
  130. package/src/index.ts +1 -1
  131. package/src/react/ConvexAuthState.test.tsx +145 -0
  132. package/src/react/client.ts +23 -6
  133. package/src/react/client_provided_base_client.test.tsx +56 -0
  134. package/src/react-clerk/ConvexProviderWithClerk.tsx +3 -1
  135. package/src/server/database.ts +6 -4
  136. package/src/server/impl/meta_impl.ts +2 -2
  137. package/src/server/impl/query_impl.ts +1 -3
  138. package/src/server/impl/registration_impl.ts +0 -2
  139. package/src/server/meta.ts +10 -0
  140. package/src/server/query.ts +9 -6
  141. package/src/server/registration.ts +10 -10
  142. 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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAuC;AACvC,wBAAqD;AACrD,iBAGO;AACP,mBAMO;AACP,iBAAkB;AAKlB,6BAA+C;AAC/C,uBAAwC;AACxC,gCAGO;AACP,uBAAuC;AACvC,mBAA4B;AAmB5B,eAAsB,cACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAUC;AACD,QAAM,WAAW,UAAM,kCAAoB,GAAG,EAAE;AAAA,IAC9C;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE;AAAA,MACpC,MAAM;AAAA,QACJ;AAAA,QACA,gBAAgB,uBAAuB,kBAAkB;AAAA,QACzD,kBAAkB,uBAAuB,UAAU;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc,SAAS,MAAM;AACnC,MAAI,gBAAgB,QAAW;AAC7B,UAAM,QACJ,8CAA8C,KAAK,UAAU,QAAQ;AACvE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAMO,MAAM,yCAAyC,aAAE;AAAA,EACtD;AAAA,EACA;AAAA,IACE,aAAE,OAAO,EAAE,MAAM,aAAE,QAAQ,aAAa,GAAG,aAAa,aAAE,OAAO,EAAE,CAAC;AAAA,IACpE,aAAE,OAAO,EAAE,MAAM,aAAE,QAAQ,gBAAgB,GAAG,gBAAgB,aAAE,OAAO,EAAE,CAAC;AAAA,IAC1E,aAAE,OAAO,EAAE,MAAM,aAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpC,aAAE,OAAO,EAAE,MAAM,aAAE,QAAQ,cAAc,EAAE,CAAC;AAAA,IAC5C,aAAE,OAAO,EAAE,MAAM,aAAE,QAAQ,aAAa,EAAE,CAAC;AAAA,IAC3C,aAAE,OAAO;AAAA,MACP,MAAM,aAAE,QAAQ,oBAAoB;AAAA,MACpC,UAAU,aAAE,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAwBO,SAAS,4CACd,SACkC;AAClC,MAAI,QAAQ,eAAe,QAAW;AACpC,WAAO,EAAE,MAAM,sBAAsB,UAAU,QAAQ,WAAW;AAAA,EACpE;AACA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO,EAAE,MAAM,eAAe,aAAa,QAAQ,YAAY;AAAA,EACjE;AACA,MAAI,QAAQ,mBAAmB,QAAW;AACxC,WAAO,EAAE,MAAM,kBAAkB,gBAAgB,QAAQ,eAAe;AAAA,EAC1E;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,MAAI,QAAQ,cAAc;AACxB,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AACA,SAAO,EAAE,MAAM,cAAc;AAC/B;AAEA,eAAsB,iDACpB,KACA,qBACA,QACA;AACA,MACE,oBAAoB,SAAS,iBAC7B,oBAAoB,SAAS,gBAC7B;AAEA;AAAA,EACF;AACA,MAAI,oBAAoB,SAAS,sBAAsB;AACrD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,IACL;AAAA,EACF;AACA,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH,KAAK;AACH;AAAA,QACE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH;AAAA,QACE;AAAA,MACF;AACA;AAAA,EACJ;AACF;AAMA,eAAe,mBACb,KACA,UACkB;AAClB,MAAI;AACF,cAAM,qCAAuB;AAAA,MAC3B;AAAA,MACA,MAAM,SAAS,SAAS,QAAQ,aAAa,SAAS,WAAW;AAAA,MACjE,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QACE,eAAe,oCACd,IAAI,iBAAiB,SAAS,kBAC7B,IAAI,iBAAiB,SAAS,oBAChC;AACA,aAAO;AAAA,IACT;AACA,eAAO,qCAAuB,KAAK,GAAG;AAAA,EACxC;AACF;AAEA,eAAsB,6BACpB,KACA,kBAKA;AACA,UAAQ,iBAAiB,MAAM;AAAA,IAC7B,KAAK,kBAAkB;AACrB,YAAM,SAAS,MAAM,mCAAmC,KAAK;AAAA,QAC3D,gBAAgB,iBAAiB;AAAA,MACnC,CAAC;AACD,UAAI,WAAW,MAAM;AACnB,eAAO,EAAE,MAAM,WAAW;AAAA,MAC5B;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,YAAY,MAAM,mBAAmB,KAAK;AAAA,QAC9C,UAAU,iBAAiB;AAAA,QAC3B,aAAa,iBAAiB;AAAA,MAChC,CAAC;AACD,UAAI,CAAC,WAAW;AACd,eAAO,EAAE,MAAM,WAAW;AAAA,MAC5B;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,iBAAiB;AAAA,QAC3B,aAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,IACA,KAAK;AAGH,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B,SAAS;AACP;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,8BAA+B,iBAAyB,IAAI;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,mCACpB,KACA,UAC2D;AAC3D,MAAI;AACF,UAAM,OAAO,UAAM,qCAAuB;AAAA,MACxC;AAAA,MACA,MAAM,cAAc,SAAS,cAAc;AAAA,MAC3C,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,EAAE,UAAU,KAAK,MAAM,aAAa,KAAK,QAAQ;AAAA,EAC1D,SAAS,KAAK;AACZ,QACE,eAAe,oCACd,IAAI,iBAAiB,SAAS,wBAC7B,IAAI,iBAAiB,SAAS,oBAChC;AACA,aAAO;AAAA,IACT;AACA,eAAO,qCAAuB,KAAK,GAAG;AAAA,EACxC;AACF;AAOA,eAAsB,2DACpB,KACA,kBAGA,gBAOC;AACD,MAAI,iBAAiB,SAAS,oBAAoB;AAChD,UAAM,OAAO,IAAI,aAAa;AAC9B,UAAM,gBACJ,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,eAAe,iBAAiB;AACvC,QAAI,CAAC,eAAe;AAClB,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,cAAc,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,WAAO,UAAM,qCAAuB;AAAA,MAClC;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,UACE,iBAAiB,SAAS,wBACtB,iBAAiB,WACjB;AAAA,QACN,aACE,iBAAiB,SAAS,wBACtB,iBAAiB,cACjB;AAAA,QACN,gBAAgB,mBAAmB,SAAS,SAAS;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,MAAM,yCAAyC;AACrD,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc,IAAI,MAAM,GAAG;AAAA,MAC3B,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,QAAM,EAAE,UAAU,KAAK,gBAAgB,WAAW,UAAU,IAAI;AAChE,MAAI,aAAa,UAAa,QAAQ,QAAW;AAC/C,UAAM,MAAM,yCAAyC,KAAK,UAAU,IAAI;AACxE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc,IAAI,MAAM,GAAG;AAAA,MAC3B,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,EAAE,UAAU,eAAe,KAAK,gBAAgB,WAAW,UAAU;AAC9E;AAEA,eAAe,6CACb,KACA,gBACiC;AACjC,QAAM,QAAQ,MAAM,oBAAoB,KAAK,cAAc;AAC3D,QAAM,cACJ,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF,SAAO;AAAA,IACL,gBAAgB,YAAY;AAAA,IAC5B,UAAU,YAAY;AAAA,IACtB,KAAK,YAAY;AAAA,IACjB,gBAAgB;AAAA,IAChB,WAAW,YAAY;AAAA,IACvB,WAAW,YAAY;AAAA,EACzB;AACF;AAkBA,eAAe,aACb,KACA,kBACiC;AACjC,UAAQ,iBAAiB,MAAM;AAAA,IAC7B,KAAK,kBAAkB;AACrB,UAAI,iBAAiB,mBAAmB,SAAS;AAC/C,cAAM,cAAc,UAAM;AAAA,UACxB;AAAA,UACA,iBAAiB;AAAA,QACnB;AACA,eAAO;AAAA,UACL,gBAAgB,iBAAiB;AAAA,UACjC,UAAU,YAAY;AAAA,UACtB,KAAK,YAAY;AAAA,UACjB,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AACA,aAAO,MAAM;AAAA,QACX;AAAA,QACA,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,oBAAoB;AAEvB,YAAM,cACJ,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACF,aAAO;AAAA,QACL,KAAK,YAAY;AAAA,QACjB,UAAU,YAAY;AAAA,QACtB,gBAAgB,YAAY;AAAA,QAC5B,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,QACvB,WAAW,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,IACA,SAAS;AACP;AACA,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA;AAAA,QAEX,gBAAgB;AAAA,QAChB,cAAc,iCAAkC,iBAAyB,IAAI;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,WACb,KACA,kBAC8D;AAC9D,UAAQ,iBAAiB,MAAM;AAAA,IAC7B,KAAK,kBAAkB;AACrB,YAAM,cAAc,UAAM,0BAAY;AAAA,QACpC;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,gBAAgB,iBAAiB;AAAA,QACnC;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,KAAK,oBAAoB;AACvB,YAAM,cACJ,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACF,aAAO;AAAA,QACL,KAAK,YAAY;AAAA,QACjB,UAAU,YAAY;AAAA,QACtB,gBAAgB,YAAY;AAAA,QAC5B,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,QACvB,WAAW,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,cACb,KACA,aACA,kBACiE;AACjE,UAAQ,iBAAiB,MAAM;AAAA,IAC7B,KAAK;AAAA,IACL,KAAK,uBAAuB;AAC1B,YAAM,cAAc,UAAM,0BAAY;AAAA,QACpC;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AAEH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,EACL;AACF;AAEA,eAAe,qBACb,KACA,gBACA,kBACiC;AACjC,UAAQ,iBAAiB,MAAM;AAAA,IAC7B,KAAK;AAAA,IACL,KAAK,uBAAuB;AAC1B,YAAM,cAAc,UAAM,0BAAY;AAAA,QACpC;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,wBAAwB;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAEH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,EACL;AACF;AAEA,eAAe,+CACb,KACA,kBACA,qBACiC;AACjC,UAAQ,oBAAoB,MAAM;AAAA,IAChC,KAAK,eAAe;AAGlB,aAAO,MAAM,aAAa,KAAK,gBAAgB;AAAA,IACjD;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,aAAO,MAAM,WAAW,KAAK,gBAAgB;AAAA,IAC/C;AAAA,IACA,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF,SAAS;AACP;AACA,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA;AAAA,QAEX,gBAAgB;AAAA,QAChB,cAAc,oCAAoC,mBAA0B;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,iCACb,KACA,UACA,aACA,WACiB;AACjB,MAAI;AACF,UAAM,SAAS,UAAM,kCAAoB,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,UACN,MAAM,EAAE,iBAAiB,UAAU,cAAc,YAAY;AAAA,UAC7D,OAAO,EAAE,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,KAAM;AAAA,EACtB,SAAS,KAAK;AACZ,QACE,eAAe,mCACf,IAAI,iBAAiB,SAAS,sBAC9B;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,oBAAe,SAAS,qDAAgD,yBAAY,KAAK,gCAAgC,QAAQ,IAAI,WAAW,IAAI,SAAS,WAAW,CAAC;AAAA,QACzL,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO,UAAM,qCAAuB,KAAK,GAAG;AAAA,EAC9C;AACF;AAEA,eAAe,mBACb,KACA,UACA,kBACiC;AACjC,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,SAAS;AAGZ,YAAM,kBAAc,yCAAuB,GAAG;AAC9C,UAAI,gBAAgB,MAAM;AACxB,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kCAAkC,yBAAY,KAAK,oCAAoC,CAAC;AAAA,QAC1G,CAAC;AAAA,MACH;AACA,YAAM,cAAc,UAAM;AAAA,QACxB;AAAA,QACA,YAAY;AAAA,MACd;AACA,aAAO;AAAA,QACL,gBAAgB,YAAY;AAAA,QAC5B,UAAU,YAAY;AAAA,QACtB,KAAK,YAAY;AAAA,QACjB,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,SAAS,MAAM,6BAA6B,KAAK,gBAAgB;AACvE,UAAI,OAAO,SAAS,aAAa;AAC/B,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAKA,aAAO,MAAM,qBAAqB,KAAK,gBAAgB;AAAA,QACrD,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,MAAM,WAAW,KAAK,gBAAgB;AAAA,IAC/C,KAAK,aAAa;AAChB,YAAM,SAAS,MAAM,6BAA6B,KAAK,gBAAgB;AACvE,UAAI,OAAO,SAAS,aAAa;AAC/B,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AACA,aAAO,MAAM,qBAAqB,KAAK,gBAAgB,gBAAgB;AAAA,IACzE;AAAA,EACF;AACF;AAEA,eAAe,yBACb,KACA,UACA,kBACiC;AACjC,QAAM,aAAS,mDAAwB,QAAQ;AAC/C,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,MAAM,mBAAmB,KAAK,OAAO,UAAU,gBAAgB;AAAA,IACxE,KAAK,aAAa;AAChB,YAAM,SAAS,MAAM,6BAA6B,KAAK,gBAAgB;AACvE,UAAI,OAAO,SAAS,aAAa;AAC/B,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,aAAO,MAAM,mBAAmB,KAAK,OAAO,UAAU;AAAA,QACpD,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,MAAM,mBAAmB,KAAK,OAAO,UAAU;AAAA,QACpD,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,MACtB,CAAC;AAAA,EACL;AACF;AAEA,eAAe,6CACb,KACA,eACA,qBACA,EAAE,mBAAmB,IAAI,EAAE,oBAAoB,KAAK,GACZ;AACxC,QAAM,eAAe,MAAM,6BAA6B,KAAK,aAAa;AAC1E,MAAI,aAAa,SAAS,YAAY;AACpC,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,mBAAmB,OAAO,GAAG,sBAAsB,OAAO,cAAc,sBAAsB,OAAO,cAAc;AAAA,EACrH;AACA,MAAI,sBAAsB,OAAO,mBAAmB,SAAS;AAC3D,cAAM,sCAA0B,KAAK;AAAA,MACnC,KAAK,OAAO;AAAA,MACZ,gBAAgB,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,kBAAkB;AAAA,MAChB,gBAAgB,OAAO;AAAA,MACvB,gBAAgB,OAAO;AAAA,MACvB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,aACE,aAAa,SAAS,cAAc,aAAa,cAAc;AAAA,MACjE,UACE,aAAa,SAAS,cAAc,aAAa,WAAW;AAAA,IAChE;AAAA,EACF;AACF;AAkBA,eAAsB,kCACpB,KACA,qBACA,EAAE,mBAAmB,IAAI,EAAE,oBAAoB,KAAK,GACZ;AACxC,UAAQ,oBAAoB,MAAM;AAAA,IAChC,KAAK;AAEH;AAAA,QACE,mBAAmB,oBAAoB,kBAAkB,GAAG,sBAAsB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,SAAS,sBAAsB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,SAAS;AAAA,MAChR;AACA,aAAO;AAAA,QACL,UAAU,oBAAoB,kBAAkB;AAAA,QAChD,KAAK,oBAAoB,kBAAkB;AAAA,QAC3C,kBACE,oBAAoB,kBAAkB;AAAA,MAC1C;AAAA,IACF,KAAK;AACH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH,KAAK,WAAW;AACd,YAAM,QAAQ,UAAM;AAAA,QAClB;AAAA,QACA,oBAAoB;AAAA,MACtB;AACA,aAAO,MAAM;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,QACrB;AAAA;AAAA,QAEA,oBAAoB;AAAA,QACpB,EAAE,mBAAmB;AAAA,MACvB;AAAA,IACF;AAAA,IACA,KAAK,2BAA2B;AAC9B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,QACpB,EAAE,mBAAmB;AAAA,MACvB;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,UAAI,oBAAoB,mBAAmB,MAAM;AAC/C,eAAO,MAAM,IAAI,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,SAAS,UAAM;AAAA,QACnB;AAAA,QACA,oBAAoB;AAAA,MACtB;AACA,YAAM,UAAM,+BAAmB,OAAO,MAAM,KAAK;AACjD,UAAI,oBAAoB;AACtB,kBAAM,sCAA0B,KAAK;AAAA,UACnC;AAAA,UACA,gBAAgB,oBAAoB;AAAA,QACtC,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,UAAU,OAAO;AAAA,QACjB;AAAA,QACA,kBAAkB;AAAA,UAChB,gBAAgB,oBAAoB;AAAA,UACpC,gBAAgB;AAAA,UAChB,aAAa;AAAA,UACb,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AACP;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,oBACpB,KACA,gBACA;AACA,QAAM,OAAQ,UAAM,0BAAY;AAAA,IAC9B;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,cAAc,cAAc;AAAA,EACpC,CAAC;AAOD,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,MAAI,SAAS,UAAa,YAAY,QAAW;AAC/C,UAAM,MACJ,mDAAmD,KAAK,UAAU,IAAI;AACxE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc,IAAI,MAAM,GAAG;AAAA,MAC3B,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,0BACpB,KAEA,WACA;AACA,QAAM,OAAQ,UAAM,0BAAY;AAAA,IAC9B;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AASD,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,MAAI,SAAS,UAAa,YAAY,QAAW;AAC/C,UAAM,MACJ,mDAAmD,KAAK,UAAU,IAAI;AACxE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc,IAAI,MAAM,GAAG;AAAA,MAC3B,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,gBAAgB,KAAc;AAClD,QAAM,QAAQ,UAAM;AAAA,IAClB;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,qCACb,KACA,UACA,aACiB;AACjB,MAAI;AACF,UAAM,SAAS,UAAM,kCAAoB,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,UACN,MAAM,EAAE,iBAAiB,UAAU,cAAc,YAAY;AAAA,UAC7D,OAAO,EAAE,YAAY,KAAK;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO,KAAM;AAAA,EACtB,SAAS,KAAK;AACZ,QACE,eAAe,mCACf,IAAI,iBAAiB,SAAS,sBAC9B;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,4EAAuE,yBAAY,KAAK,mDAAmD,CAAC;AAAA,QAC5J,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO,UAAM,qCAAuB,KAAK,GAAG;AAAA,EAC9C;AACF;",
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
  }
@@ -110,14 +110,32 @@ async function typeCheckFunctions(ctx, typescriptCompiler, functionsDir, handleR
110
110
  );
111
111
  }
112
112
  async function runTsc(ctx, typescriptCompiler, tscArgs, handleResult) {
113
- const tscPath = typescriptCompiler === "tsgo" ? import_path.default.join(
114
- "node_modules",
115
- "@typescript",
116
- "native-preview",
117
- "bin",
118
- "tsgo.js"
119
- ) : import_path.default.join("node_modules", "typescript", "bin", "tsc");
120
- if (!ctx.fs.exists(tscPath)) {
113
+ let compilerPath;
114
+ switch (typescriptCompiler) {
115
+ case "tsgo": {
116
+ const tsgoPaths = ["tsgo", "tsgo.js"].map(
117
+ (filename) => import_path.default.join(
118
+ "node_modules",
119
+ "@typescript",
120
+ "native-preview",
121
+ "bin",
122
+ filename
123
+ )
124
+ );
125
+ compilerPath = tsgoPaths.find((path2) => ctx.fs.exists(path2));
126
+ break;
127
+ }
128
+ case "tsc": {
129
+ const tscPath = import_path.default.join("node_modules", "typescript", "bin", "tsc");
130
+ if (ctx.fs.exists(tscPath)) {
131
+ compilerPath = tscPath;
132
+ }
133
+ break;
134
+ }
135
+ default:
136
+ typescriptCompiler;
137
+ }
138
+ if (!compilerPath) {
121
139
  return handleResult("cantTypeCheck", () => {
122
140
  (0, import_log.logError)(
123
141
  import_chalk.chalkStderr.gray(
@@ -127,12 +145,12 @@ async function runTsc(ctx, typescriptCompiler, tscArgs, handleResult) {
127
145
  });
128
146
  }
129
147
  const versionResult = await (0, import_utils.spawnAsync)(ctx, process.execPath, [
130
- tscPath,
148
+ compilerPath,
131
149
  "--version"
132
150
  ]);
133
151
  const version = versionResult.stdout.match(/Version (.*)/)?.[1] ?? null;
134
152
  const hasOlderTypeScriptVersion = version && semver.lt(version, "4.8.4");
135
- await runTscInner(ctx, tscPath, tscArgs, handleResult);
153
+ await runTscInner(ctx, compilerPath, tscArgs, handleResult);
136
154
  if (hasOlderTypeScriptVersion) {
137
155
  (0, import_log.logError)(
138
156
  import_chalk.chalkStderr.yellow(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/typecheck.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { performance } from \"perf_hooks\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logMessage,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport * as Sentry from \"@sentry/node\";\nimport * as semver from \"semver\";\nimport { formatDuration, spawnAsync } from \"./utils/utils.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { WatchContext } from \"./watch.js\";\n\nexport type TypecheckResult = \"cantTypeCheck\" | \"success\" | \"typecheckFailed\";\n\nexport type TypeCheckMode = \"enable\" | \"try\" | \"disable\";\n\nexport type TypescriptCompiler = \"tsc\" | \"tsgo\";\n\nconst SLOW_TYPECHECK_THRESHOLD_MS = 10_000;\nconst SLOW_TYPECHECK_DOCS_URL =\n \"https://docs.convex.dev/cli/troubleshooting/typecheck-performance\";\n\n/**\n * Resolves the TypeScript compiler to use based on CLI flag, config file, and default.\n * Precedence: CLI flag \u2192 config file \u2192 default \"tsc\"\n */\nexport async function resolveTypescriptCompiler(\n ctx: Context,\n cliOption?: TypescriptCompiler,\n): Promise<TypescriptCompiler> {\n const { projectConfig } = await readProjectConfig(ctx);\n return cliOption ?? projectConfig?.typescriptCompiler ?? \"tsc\";\n}\n\ntype TypecheckResultHandler = (\n result: TypecheckResult,\n logSpecificError?: () => void,\n // If given, we run it to print out errors.\n // We expect it to throw or resolve to \"success\"\n // if a concurrent change invalidated the error result.\n runOnError?: () => Promise<\"success\">,\n) => Promise<void>;\n\n/**\n * Conditionally run a typecheck function and interpret the result.\n *\n * If typeCheckMode === \"disable\", never run the typecheck function.\n * If typeCheckMode === \"enable\", run the typecheck and crash if typechecking\n * fails or we can't find tsc.\n * If typeCheckMode === \"try\", try and run the typecheck. crash if typechecking\n * fails but don't worry if tsc is missing and we can't run it.\n */\nexport async function typeCheckFunctionsInMode(\n ctx: Context,\n typeCheckMode: TypeCheckMode,\n functionsDir: string,\n): Promise<void> {\n if (typeCheckMode === \"disable\") {\n return;\n }\n const typescriptCompiler = await resolveTypescriptCompiler(ctx);\n const typecheckStart = performance.now();\n const slowTypecheckTimeout = setTimeout(() => {\n changeSpinner(\n `Still running TypeScript... see ${SLOW_TYPECHECK_DOCS_URL} to troubleshoot.`,\n );\n }, SLOW_TYPECHECK_THRESHOLD_MS);\n try {\n await typeCheckFunctions(\n ctx,\n typescriptCompiler,\n functionsDir,\n async (result, logSpecificError, runOnError) => {\n if (\n (result === \"cantTypeCheck\" && typeCheckMode === \"enable\") ||\n result === \"typecheckFailed\"\n ) {\n logSpecificError?.();\n logError(\n chalkStderr.gray(\n \"To ignore failing typecheck, use `--typecheck=disable`.\",\n ),\n );\n try {\n const result = await runOnError?.();\n // Concurrent change invalidated the error, don't fail\n if (result === \"success\") {\n return;\n }\n } catch {\n // As expected, `runOnError` threw\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n },\n );\n } finally {\n clearTimeout(slowTypecheckTimeout);\n }\n maybeLogSlowTypecheckSuggestion(ctx, performance.now() - typecheckStart);\n}\n\n// Runs TypeScript compiler to typecheck Convex query and mutation functions.\nexport async function typeCheckFunctions(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n functionsDir: string,\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n const tsconfig = path.join(functionsDir, \"tsconfig.json\");\n if (!ctx.fs.exists(tsconfig)) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n \"Found no convex/tsconfig.json to use to typecheck Convex functions, so skipping typecheck.\",\n );\n logError(\"Run `npx convex codegen --init` to create one.\");\n });\n }\n await runTsc(\n ctx,\n typescriptCompiler,\n [\"--project\", functionsDir],\n handleResult,\n );\n}\n\nasync function runTsc(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n // Check if tsc is even installed\n const tscPath =\n typescriptCompiler === \"tsgo\"\n ? path.join(\n \"node_modules\",\n \"@typescript\",\n \"native-preview\",\n \"bin\",\n \"tsgo.js\",\n )\n : path.join(\"node_modules\", \"typescript\", \"bin\", \"tsc\");\n if (!ctx.fs.exists(tscPath)) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n chalkStderr.gray(\n `No \\`${typescriptCompiler}\\` binary found, so skipping typecheck.`,\n ),\n );\n });\n }\n\n // Check the TypeScript version matches the recommendation from Convex\n const versionResult = await spawnAsync(ctx, process.execPath, [\n tscPath,\n \"--version\",\n ]);\n\n const version = versionResult.stdout.match(/Version (.*)/)?.[1] ?? null;\n const hasOlderTypeScriptVersion = version && semver.lt(version, \"4.8.4\");\n\n await runTscInner(ctx, tscPath, tscArgs, handleResult);\n\n // Print this warning after any logs from running `tsc`\n if (hasOlderTypeScriptVersion) {\n logError(\n chalkStderr.yellow(\n \"Convex works best with TypeScript version 4.8.4 or newer -- npm i --save-dev typescript@latest to update.\",\n ),\n );\n }\n}\n\nasync function runTscInner(\n ctx: Context,\n tscPath: string,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n) {\n // Run `tsc` once and have it print out the files it touched. This output won't\n // be very useful if there's an error, but we'll run it again to get a nice\n // user-facing error in this exceptional case.\n // The `--listFiles` command prints out files touched on success or error.\n const result = await spawnAsync(ctx, process.execPath, [\n tscPath,\n ...tscArgs,\n \"--listFiles\",\n ]);\n if (result.status === null) {\n return handleResult(\"typecheckFailed\", () => {\n logFailure(`TypeScript typecheck timed out.`);\n if (result.error) {\n logError(chalkStderr.red(`${result.error.toString()}`));\n }\n });\n }\n // Okay, we may have failed `tsc` but at least it returned. Try to parse its\n // output to discover which files it touched.\n const filesTouched = result.stdout\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n let anyPathsFound = false;\n for (const fileTouched of filesTouched) {\n const absPath = path.resolve(fileTouched);\n let st;\n try {\n st = ctx.fs.stat(absPath);\n anyPathsFound = true;\n } catch {\n // Just move on if we have a bogus path from `tsc`. We'll log below if\n // we fail to stat *any* of the paths emitted by `tsc`.\n // TODO: Switch to using their JS API so we can get machine readable output.\n continue;\n }\n ctx.fs.registerPath(absPath, st);\n }\n if (filesTouched.length > 0 && !anyPathsFound) {\n const err = new Error(\n `Failed to stat any files emitted by tsc (received ${filesTouched.length})`,\n );\n Sentry.captureException(err);\n }\n\n if (!result.error && result.status === 0) {\n return handleResult(\"success\");\n }\n\n // This is the \"No inputs were found\", which is fine and we shouldn't\n // report it to the user.\n if (result.stdout.startsWith(\"error TS18003\")) {\n return handleResult(\"success\");\n }\n\n // At this point we know that `tsc` failed. Rerun it without `--listFiles`\n // and with stderr redirected to have it print out a nice error.\n return handleResult(\n \"typecheckFailed\",\n () => {\n logFailure(\"TypeScript typecheck via `tsc` failed.\");\n },\n async () => {\n showSpinner(\"Collecting TypeScript errors\");\n await spawnAsync(\n ctx,\n process.execPath,\n [tscPath, ...tscArgs, \"--pretty\", \"true\"],\n {\n stdio: \"inherit\",\n },\n );\n // If this passes, we had a concurrent file change that'll overlap with\n // our observations in the first run. Invalidate our context's filesystem\n // but allow the rest of the system to observe the success.\n ctx.fs.invalidate();\n return \"success\";\n },\n );\n}\n\nfunction maybeLogSlowTypecheckSuggestion(ctx: Context, durationMs: number) {\n if (!(ctx instanceof WatchContext)) {\n return;\n }\n if (!ctx.isFirstPush) {\n return;\n }\n if (durationMs <= SLOW_TYPECHECK_THRESHOLD_MS) {\n return;\n }\n const formattedDuration = formatDuration(durationMs);\n logMessage(\n chalkStderr.gray(\n `Typechecking took ${formattedDuration}. For faster iteration, see ${SLOW_TYPECHECK_DOCS_URL} to troubleshoot typecheck performance.`,\n ),\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { performance } from \"perf_hooks\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logMessage,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport * as Sentry from \"@sentry/node\";\nimport * as semver from \"semver\";\nimport { formatDuration, spawnAsync } from \"./utils/utils.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { WatchContext } from \"./watch.js\";\n\nexport type TypecheckResult = \"cantTypeCheck\" | \"success\" | \"typecheckFailed\";\n\nexport type TypeCheckMode = \"enable\" | \"try\" | \"disable\";\n\nexport type TypescriptCompiler = \"tsc\" | \"tsgo\";\n\nconst SLOW_TYPECHECK_THRESHOLD_MS = 10_000;\nconst SLOW_TYPECHECK_DOCS_URL =\n \"https://docs.convex.dev/cli/troubleshooting/typecheck-performance\";\n\n/**\n * Resolves the TypeScript compiler to use based on CLI flag, config file, and default.\n * Precedence: CLI flag \u2192 config file \u2192 default \"tsc\"\n */\nexport async function resolveTypescriptCompiler(\n ctx: Context,\n cliOption?: TypescriptCompiler,\n): Promise<TypescriptCompiler> {\n const { projectConfig } = await readProjectConfig(ctx);\n return cliOption ?? projectConfig?.typescriptCompiler ?? \"tsc\";\n}\n\ntype TypecheckResultHandler = (\n result: TypecheckResult,\n logSpecificError?: () => void,\n // If given, we run it to print out errors.\n // We expect it to throw or resolve to \"success\"\n // if a concurrent change invalidated the error result.\n runOnError?: () => Promise<\"success\">,\n) => Promise<void>;\n\n/**\n * Conditionally run a typecheck function and interpret the result.\n *\n * If typeCheckMode === \"disable\", never run the typecheck function.\n * If typeCheckMode === \"enable\", run the typecheck and crash if typechecking\n * fails or we can't find tsc.\n * If typeCheckMode === \"try\", try and run the typecheck. crash if typechecking\n * fails but don't worry if tsc is missing and we can't run it.\n */\nexport async function typeCheckFunctionsInMode(\n ctx: Context,\n typeCheckMode: TypeCheckMode,\n functionsDir: string,\n): Promise<void> {\n if (typeCheckMode === \"disable\") {\n return;\n }\n const typescriptCompiler = await resolveTypescriptCompiler(ctx);\n const typecheckStart = performance.now();\n const slowTypecheckTimeout = setTimeout(() => {\n changeSpinner(\n `Still running TypeScript... see ${SLOW_TYPECHECK_DOCS_URL} to troubleshoot.`,\n );\n }, SLOW_TYPECHECK_THRESHOLD_MS);\n try {\n await typeCheckFunctions(\n ctx,\n typescriptCompiler,\n functionsDir,\n async (result, logSpecificError, runOnError) => {\n if (\n (result === \"cantTypeCheck\" && typeCheckMode === \"enable\") ||\n result === \"typecheckFailed\"\n ) {\n logSpecificError?.();\n logError(\n chalkStderr.gray(\n \"To ignore failing typecheck, use `--typecheck=disable`.\",\n ),\n );\n try {\n const result = await runOnError?.();\n // Concurrent change invalidated the error, don't fail\n if (result === \"success\") {\n return;\n }\n } catch {\n // As expected, `runOnError` threw\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n },\n );\n } finally {\n clearTimeout(slowTypecheckTimeout);\n }\n maybeLogSlowTypecheckSuggestion(ctx, performance.now() - typecheckStart);\n}\n\n// Runs TypeScript compiler to typecheck Convex query and mutation functions.\nexport async function typeCheckFunctions(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n functionsDir: string,\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n const tsconfig = path.join(functionsDir, \"tsconfig.json\");\n if (!ctx.fs.exists(tsconfig)) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n \"Found no convex/tsconfig.json to use to typecheck Convex functions, so skipping typecheck.\",\n );\n logError(\"Run `npx convex codegen --init` to create one.\");\n });\n }\n await runTsc(\n ctx,\n typescriptCompiler,\n [\"--project\", functionsDir],\n handleResult,\n );\n}\n\nasync function runTsc(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n // Check if the TypeScript compiler is even installed\n let compilerPath: string | undefined;\n switch (typescriptCompiler) {\n case \"tsgo\": {\n // @typescript/native-preview@7.0.0-dev.20260626.1 switched to using `bin/tsgo` instead of `bin/tsgo.js`.\n const tsgoPaths = [\"tsgo\", \"tsgo.js\"].map((filename) =>\n path.join(\n \"node_modules\",\n \"@typescript\",\n \"native-preview\",\n \"bin\",\n filename,\n ),\n );\n compilerPath = tsgoPaths.find((path) => ctx.fs.exists(path));\n break;\n }\n case \"tsc\": {\n const tscPath = path.join(\"node_modules\", \"typescript\", \"bin\", \"tsc\");\n if (ctx.fs.exists(tscPath)) {\n compilerPath = tscPath;\n }\n break;\n }\n default:\n typescriptCompiler satisfies never;\n }\n if (!compilerPath) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n chalkStderr.gray(\n `No \\`${typescriptCompiler}\\` binary found, so skipping typecheck.`,\n ),\n );\n });\n }\n\n // Check the TypeScript version matches the recommendation from Convex\n const versionResult = await spawnAsync(ctx, process.execPath, [\n compilerPath,\n \"--version\",\n ]);\n\n const version = versionResult.stdout.match(/Version (.*)/)?.[1] ?? null;\n const hasOlderTypeScriptVersion = version && semver.lt(version, \"4.8.4\");\n\n await runTscInner(ctx, compilerPath, tscArgs, handleResult);\n\n // Print this warning after any logs from running `tsc`\n if (hasOlderTypeScriptVersion) {\n logError(\n chalkStderr.yellow(\n \"Convex works best with TypeScript version 4.8.4 or newer -- npm i --save-dev typescript@latest to update.\",\n ),\n );\n }\n}\n\nasync function runTscInner(\n ctx: Context,\n tscPath: string,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n) {\n // Run `tsc` once and have it print out the files it touched. This output won't\n // be very useful if there's an error, but we'll run it again to get a nice\n // user-facing error in this exceptional case.\n // The `--listFiles` command prints out files touched on success or error.\n const result = await spawnAsync(ctx, process.execPath, [\n tscPath,\n ...tscArgs,\n \"--listFiles\",\n ]);\n if (result.status === null) {\n return handleResult(\"typecheckFailed\", () => {\n logFailure(`TypeScript typecheck timed out.`);\n if (result.error) {\n logError(chalkStderr.red(`${result.error.toString()}`));\n }\n });\n }\n // Okay, we may have failed `tsc` but at least it returned. Try to parse its\n // output to discover which files it touched.\n const filesTouched = result.stdout\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n let anyPathsFound = false;\n for (const fileTouched of filesTouched) {\n const absPath = path.resolve(fileTouched);\n let st;\n try {\n st = ctx.fs.stat(absPath);\n anyPathsFound = true;\n } catch {\n // Just move on if we have a bogus path from `tsc`. We'll log below if\n // we fail to stat *any* of the paths emitted by `tsc`.\n // TODO: Switch to using their JS API so we can get machine readable output.\n continue;\n }\n ctx.fs.registerPath(absPath, st);\n }\n if (filesTouched.length > 0 && !anyPathsFound) {\n const err = new Error(\n `Failed to stat any files emitted by tsc (received ${filesTouched.length})`,\n );\n Sentry.captureException(err);\n }\n\n if (!result.error && result.status === 0) {\n return handleResult(\"success\");\n }\n\n // This is the \"No inputs were found\", which is fine and we shouldn't\n // report it to the user.\n if (result.stdout.startsWith(\"error TS18003\")) {\n return handleResult(\"success\");\n }\n\n // At this point we know that `tsc` failed. Rerun it without `--listFiles`\n // and with stderr redirected to have it print out a nice error.\n return handleResult(\n \"typecheckFailed\",\n () => {\n logFailure(\"TypeScript typecheck via `tsc` failed.\");\n },\n async () => {\n showSpinner(\"Collecting TypeScript errors\");\n await spawnAsync(\n ctx,\n process.execPath,\n [tscPath, ...tscArgs, \"--pretty\", \"true\"],\n {\n stdio: \"inherit\",\n },\n );\n // If this passes, we had a concurrent file change that'll overlap with\n // our observations in the first run. Invalidate our context's filesystem\n // but allow the rest of the system to observe the success.\n ctx.fs.invalidate();\n return \"success\";\n },\n );\n}\n\nfunction maybeLogSlowTypecheckSuggestion(ctx: Context, durationMs: number) {\n if (!(ctx instanceof WatchContext)) {\n return;\n }\n if (!ctx.isFirstPush) {\n return;\n }\n if (durationMs <= SLOW_TYPECHECK_THRESHOLD_MS) {\n return;\n }\n const formattedDuration = formatDuration(durationMs);\n logMessage(\n chalkStderr.gray(\n `Typechecking took ${formattedDuration}. For faster iteration, see ${SLOW_TYPECHECK_DOCS_URL} to troubleshoot typecheck performance.`,\n ),\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["result", "path"]
7
7
  }
@@ -461,29 +461,21 @@ async function validateOrSelectProject(ctx, projectSlug, teamSlug, singleProject
461
461
  });
462
462
  }
463
463
  if (!projectSlug) {
464
- const nonDemoProjects = projects.filter((project) => !project.isDemo);
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 = nonDemoProjects[0];
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 nonDemoProjects[0].slug;
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: nonDemoProjects.map((project) => ({
478
+ choices: projects.map((project) => ({
487
479
  name: `${project.name} (${project.slug})`,
488
480
  value: project.slug
489
481
  }))