convex 1.42.1 → 1.42.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/simple_client.js +2 -2
- package/dist/cjs/browser/simple_client.js.map +2 -2
- package/dist/cjs/cli/codegen_templates/common.js +6 -0
- package/dist/cjs/cli/codegen_templates/common.js.map +2 -2
- package/dist/cjs/cli/dev.js +1 -0
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/codegen.js +2 -1
- package/dist/cjs/cli/lib/codegen.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +4 -12
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js +1 -1
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js +2 -1
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +2 -2
- package/dist/cjs/server/database.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +2 -2
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/query_impl.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/query.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs/server/schema.js.map +1 -1
- package/dist/cjs-types/browser/simple_client.d.ts +1 -2
- package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/common.d.ts +12 -0
- package/dist/cjs-types/cli/codegen_templates/common.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +2 -0
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.test.d.ts +2 -0
- package/dist/cjs-types/cli/dev.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/generatedApi.d.ts +0 -1
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/api.d.ts +0 -1
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts +2 -0
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
- package/dist/cjs-types/server/database.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/query_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +8 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/query.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +12 -14
- package/dist/cli.bundle.cjs.map +2 -2
- package/dist/esm/browser/simple_client.js +5 -3
- package/dist/esm/browser/simple_client.js.map +2 -2
- package/dist/esm/cli/codegen_templates/common.js +5 -0
- package/dist/esm/cli/codegen_templates/common.js.map +2 -2
- package/dist/esm/cli/dev.js +3 -1
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/codegen.js +2 -1
- package/dist/esm/cli/lib/codegen.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +4 -12
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js +1 -1
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js +2 -1
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +2 -2
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/query_impl.js.map +2 -2
- package/dist/esm/server/schema.js.map +1 -1
- package/dist/esm-types/browser/simple_client.d.ts +1 -2
- package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/common.d.ts +12 -0
- package/dist/esm-types/cli/codegen_templates/common.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts +2 -0
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +1 -0
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.test.d.ts +2 -0
- package/dist/esm-types/cli/dev.test.d.ts.map +1 -0
- package/dist/esm-types/cli/generatedApi.d.ts +0 -1
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/api.d.ts +0 -1
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/client_provided_base_client.test.d.ts +2 -0
- package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
- package/dist/esm-types/server/database.d.ts.map +1 -1
- package/dist/esm-types/server/impl/query_impl.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +8 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/query.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts.map +1 -1
- package/dist/react.bundle.js +2 -2
- package/dist/react.bundle.js.map +2 -2
- package/package.json +2 -2
- package/src/browser/simple_client.ts +12 -10
- package/src/cli/codegen_templates/common.test.ts +52 -0
- package/src/cli/codegen_templates/common.ts +17 -0
- package/src/cli/dev.test.ts +157 -0
- package/src/cli/dev.ts +7 -0
- package/src/cli/generatedApi.ts +0 -1
- package/src/cli/lib/api.ts +0 -1
- package/src/cli/lib/codegen.ts +2 -1
- package/src/cli/lib/config.test.ts +1 -4
- package/src/cli/lib/utils/utils.ts +4 -12
- package/src/index.ts +1 -1
- package/src/react/client.ts +23 -6
- package/src/react/client_provided_base_client.test.tsx +56 -0
- package/src/react-clerk/ConvexProviderWithClerk.tsx +3 -1
- package/src/server/database.ts +6 -4
- package/src/server/impl/meta_impl.ts +2 -2
- package/src/server/impl/query_impl.ts +1 -3
- package/src/server/meta.ts +8 -0
- package/src/server/query.ts +9 -6
- package/src/server/registration.ts +10 -10
- package/src/server/schema.ts +3 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/api.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n isDemo: boolean;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n path: `teams/${selector.teamSlug}/projects/${selector.projectSlug}/deployments`,\n method: \"GET\",\n });\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../bundler/context.js\";\nimport { logVerbose, logWarning } from \"../../bundler/log.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./deployment.js\";\nimport {\n assertLocalBackendRunning,\n localDeploymentUrl,\n} from \"./localDeployment/run.js\";\nimport {\n ThrowingFetchError,\n bigBrainAPI,\n bigBrainAPIMaybeThrows,\n logAndHandleFetchError,\n typedPlatformClient,\n} from \"./utils/utils.js\";\nimport { z } from \"zod\";\nimport {\n DeploymentSelection,\n ProjectSelection,\n} from \"./deploymentSelection.js\";\nimport { loadLocalDeploymentCredentials } from \"./localDeployment/localDeployment.js\";\nimport { loadAnonymousDeployment } from \"./localDeployment/anonymous.js\";\nimport {\n parseDeploymentSelector,\n InProjectSelector,\n} from \"./deploymentSelector.js\";\nimport { loadProjectLocalConfig } from \"./localDeployment/filePaths.js\";\nimport { chalkStderr } from \"chalk\";\nimport { RegionName } from \"../generatedApi.js\";\nexport type DeploymentName = string;\nexport type CloudDeploymentType = \"prod\" | \"dev\" | \"preview\" | \"custom\";\nexport type AccountRequiredDeploymentType = CloudDeploymentType | \"local\";\nexport type DeploymentType = AccountRequiredDeploymentType | \"anonymous\";\n\nexport type Project = {\n id: number;\n name: string;\n slug: string;\n};\n\ntype AdminKey = string;\n\n/**\n * Create a new project. If `deploymentToProvision` is specified, also provision a deployment for the project.\n */\nexport async function createProject(\n ctx: Context,\n {\n teamId,\n projectName,\n deploymentToProvision,\n }: {\n teamId: number;\n projectName: string;\n deploymentToProvision: {\n deploymentType: \"prod\" | \"dev\";\n region: RegionName | null;\n } | null;\n },\n): Promise<{\n projectSlug: string;\n}> {\n const response = await typedPlatformClient(ctx).POST(\n \"/teams/{team_id}/create_project\",\n {\n params: { path: { team_id: teamId } },\n body: {\n projectName,\n deploymentType: deploymentToProvision?.deploymentType ?? null,\n deploymentRegion: deploymentToProvision?.region ?? null,\n },\n },\n );\n const projectSlug = response.data?.slug;\n if (projectSlug === undefined) {\n const error =\n \"Unexpected response during provisioning: \" + JSON.stringify(response);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: error,\n });\n }\n return {\n projectSlug,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `deploymentSelectionFromOptions`\n// ----------------------------------------------------------------------\n\nexport const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(\n \"kind\",\n [\n z.object({ kind: z.literal(\"previewName\"), previewName: z.string() }),\n z.object({ kind: z.literal(\"deploymentName\"), deploymentName: z.string() }),\n z.object({ kind: z.literal(\"prod\") }),\n z.object({ kind: z.literal(\"implicitProd\") }),\n z.object({ kind: z.literal(\"unspecified\") }),\n z.object({\n kind: z.literal(\"deploymentSelector\"),\n selector: z.string(),\n }),\n ],\n);\n\nexport type DeploymentSelectionWithinProject = z.infer<\n typeof deploymentSelectionWithinProjectSchema\n>;\n\ntype DeploymentSelectionOptionsWithinProject = {\n prod?: boolean | undefined;\n // Whether this command defaults to prod when no other flags are provided. If\n // this is not set, the default will be \"ownDev\"\n implicitProd?: boolean;\n\n previewName?: string | undefined;\n deploymentName?: string | undefined;\n deployment?: string | undefined;\n};\n\nexport type DeploymentSelectionOptions =\n DeploymentSelectionOptionsWithinProject & {\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n };\n\nexport function deploymentSelectionWithinProjectFromOptions(\n options: DeploymentSelectionOptions,\n): DeploymentSelectionWithinProject {\n if (options.deployment !== undefined) {\n return { kind: \"deploymentSelector\", selector: options.deployment };\n }\n if (options.previewName !== undefined) {\n return { kind: \"previewName\", previewName: options.previewName };\n }\n if (options.deploymentName !== undefined) {\n return { kind: \"deploymentName\", deploymentName: options.deploymentName };\n }\n if (options.prod) {\n return { kind: \"prod\" };\n }\n if (options.implicitProd) {\n return { kind: \"implicitProd\" };\n }\n return { kind: \"unspecified\" };\n}\n\nexport async function validateDeploymentSelectionForExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelectionWithinProject,\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\",\n) {\n if (\n deploymentSelection.kind === \"unspecified\" ||\n deploymentSelection.kind === \"implicitProd\"\n ) {\n // These are both considered the \"default\" selection depending on the command, so this is always fine\n return;\n }\n if (deploymentSelection.kind === \"deploymentSelector\") {\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with CONVEX_DEPLOY_KEY.\",\n });\n case \"cliArgs\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--deployment` flag cannot be used with --url and --admin-key.\",\n });\n }\n }\n switch (source) {\n case \"selfHosted\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--prod`, `--preview-name`, and `--deployment-name` flags cannot be used with a self-hosted deployment.\",\n });\n case \"deployKey\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags and using deployment from CONVEX_DEPLOY_KEY\",\n );\n break;\n case \"cliArgs\":\n logWarning(\n \"Ignoring `--prod`, `--preview-name`, or `--deployment-name` flags since this command was run with --url and --admin-key\",\n );\n break;\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `checkAccessToSelectedProject`\n// ----------------------------------------------------------------------\n\nasync function hasAccessToProject(\n ctx: Context,\n selector: { projectSlug: string; teamSlug: string },\n): Promise<boolean> {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n path: `teams/${selector.teamSlug}/projects/${selector.projectSlug}/deployments`,\n method: \"GET\",\n });\n return true;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"TeamNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return false;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\nexport async function checkAccessToSelectedProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<\n | { kind: \"hasAccess\"; teamSlug: string; projectSlug: string }\n | { kind: \"noAccess\" }\n | { kind: \"unknown\" }\n> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const result = await getTeamAndProjectSlugForDeployment(ctx, {\n deploymentName: projectSelection.deploymentName,\n });\n if (result === null) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: result.teamSlug,\n projectSlug: result.projectSlug,\n };\n }\n case \"teamAndProjectSlugs\": {\n const hasAccess = await hasAccessToProject(ctx, {\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n });\n if (!hasAccess) {\n return { kind: \"noAccess\" };\n }\n return {\n kind: \"hasAccess\",\n teamSlug: projectSelection.teamSlug,\n projectSlug: projectSelection.projectSlug,\n };\n }\n case \"projectDeployKey\":\n // Ideally we would be able to do an explicit check here, but if the key is invalid,\n // it will instead fail as soon as we try to use the key.\n return { kind: \"unknown\" };\n default: {\n projectSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nexport async function getTeamAndProjectSlugForDeployment(\n ctx: Context,\n selector: { deploymentName: string },\n): Promise<{ teamSlug: string; projectSlug: string } | null> {\n try {\n const body = await bigBrainAPIMaybeThrows({\n ctx,\n path: `deployment/${selector.deploymentName}/team_and_project`,\n method: \"GET\",\n });\n return { teamSlug: body.team, projectSlug: body.project };\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n (err.serverErrorData?.code === \"DeploymentNotFound\" ||\n err.serverErrorData?.code === \"ProjectNotFound\")\n ) {\n return null;\n }\n return logAndHandleFetchError(ctx, err);\n }\n}\n\n// ----------------------------------------------------------------------\n// Helpers for fetching deployment credentials\n// ----------------------------------------------------------------------\n\n// Used by dev for upgrade from team and project in convex.json to CONVEX_DEPLOYMENT\nexport async function fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx: Context,\n projectSelection:\n | { kind: \"teamAndProjectSlugs\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectDeployKey\"; projectDeployKey: string },\n deploymentType: \"prod\" | \"dev\",\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: AdminKey;\n reference: string;\n isDefault: boolean;\n}> {\n if (projectSelection.kind === \"projectDeployKey\") {\n const auth = ctx.bigBrainAuth();\n const doesAuthMatch =\n auth !== null &&\n auth.kind === \"projectKey\" &&\n auth.projectKey === projectSelection.projectDeployKey;\n if (!doesAuthMatch) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new Error(\n \"Expected project deploy key to match the big brain auth header\",\n ),\n printedMessage: \"Unexpected error when loading the Convex deployment\",\n });\n }\n }\n let data;\n try {\n data = await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"deployment/provision_and_authorize\",\n data: {\n teamSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.teamSlug\n : null,\n projectSlug:\n projectSelection.kind === \"teamAndProjectSlugs\"\n ? projectSelection.projectSlug\n : null,\n deploymentType: deploymentType === \"prod\" ? \"prod\" : \"dev\",\n },\n });\n } catch (error) {\n const msg = \"Unknown error during authorization: \" + error;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n const { adminKey, url, deploymentName, reference, isDefault } = data;\n if (adminKey === undefined || url === undefined) {\n const msg = \"Unknown error during authorization: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n return { adminKey, deploymentUrl: url, deploymentName, reference, isDefault };\n}\n\nasync function fetchExistingDevDeploymentCredentialsOrCrash(\n ctx: Context,\n deploymentName: DeploymentName,\n): Promise<DeploymentAuthResponse> {\n const slugs = await fetchTeamAndProject(ctx, deploymentName);\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n \"dev\",\n );\n return {\n deploymentName: credentials.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n}\n\n// ----------------------------------------------------------------------\n// Helpers for `loadSelectedDeploymentCredentials`\n// ----------------------------------------------------------------------\n\ntype DeploymentAuthResponse = {\n deploymentName: string;\n adminKey: string;\n url: string;\n deploymentType: DeploymentType;\n reference: string | null; // null = local deployment\n isDefault: boolean;\n};\n\n// Returns the user's own dev deployment, which may be a local deployment\n// if one is configured. Used for dev commands (including `npx convex dev`)\n// when no specific deployment is specified.\nasync function handleOwnDev(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n if (projectSelection.deploymentType === \"local\") {\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n projectSelection.deploymentName,\n );\n return {\n deploymentName: projectSelection.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n return await fetchExistingDevDeploymentCredentialsOrCrash(\n ctx,\n projectSelection.deploymentName,\n );\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n // Note -- this provisions a dev deployment if one doesn't exist\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"dev\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"dev\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n default: {\n projectSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected project selection: ${(projectSelection as any).kind}`,\n });\n }\n }\n}\n\nasync function handleProd(\n ctx: Context,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"prod\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_prod\",\n data: {\n deploymentName: projectSelection.deploymentName,\n },\n });\n return credentials;\n }\n case \"teamAndProjectSlugs\":\n case \"projectDeployKey\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n projectSelection,\n \"prod\",\n );\n return {\n url: credentials.deploymentUrl,\n adminKey: credentials.adminKey,\n deploymentName: credentials.deploymentName,\n deploymentType: \"prod\",\n reference: credentials.reference,\n isDefault: credentials.isDefault,\n };\n }\n }\n}\n\nasync function handlePreview(\n ctx: Context,\n previewName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse & { deploymentType: \"preview\" }> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_preview\",\n data: {\n previewName: previewName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported for preview deployments\",\n });\n }\n}\n\nasync function handleDeploymentName(\n ctx: Context,\n deploymentName: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (projectSelection.kind) {\n case \"deploymentName\":\n case \"teamAndProjectSlugs\": {\n const credentials = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"deployment/authorize_within_current_project\",\n data: {\n selectedDeploymentName: deploymentName,\n projectSelection: projectSelection,\n },\n });\n return credentials;\n }\n case \"projectDeployKey\":\n // TODO -- this should be supported\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Project deploy keys are not supported with the --deployment-name flag\",\n });\n }\n}\n\nasync function fetchDeploymentCredentialsWithinCurrentProject(\n ctx: Context,\n projectSelection: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n): Promise<DeploymentAuthResponse> {\n switch (deploymentSelection.kind) {\n case \"unspecified\": {\n // default to the user's default dev deployment\n // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind\n return await handleOwnDev(ctx, projectSelection);\n }\n case \"implicitProd\":\n case \"prod\": {\n return await handleProd(ctx, projectSelection);\n }\n case \"previewName\":\n return await handlePreview(\n ctx,\n deploymentSelection.previewName,\n projectSelection,\n );\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n deploymentSelection.deploymentName,\n projectSelection,\n );\n case \"deploymentSelector\":\n return await handleDeploymentSelector(\n ctx,\n deploymentSelection.selector,\n projectSelection,\n );\n default: {\n deploymentSelection satisfies never;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n // This should be unreachable, so don't bother with a printed message.\n printedMessage: null,\n errForSentry: `Unexpected deployment selection: ${deploymentSelection as any}`,\n });\n }\n }\n}\n\nasync function resolveDeploymentNameByReference(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n reference: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { reference },\n },\n },\n );\n\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Deployment \u201C${reference}\u201D not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\nasync function handleRefInProject(\n ctx: Context,\n selector: InProjectSelector,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n switch (selector.kind) {\n case \"local\": {\n // The mismatch check for `[team:project:]local` has already happened in\n // `_getDeploymentSelection`, so we only need to load credentials here.\n const localConfig = loadProjectLocalConfig(ctx);\n if (localConfig === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const credentials = await loadLocalDeploymentCredentials(\n ctx,\n localConfig.deploymentName,\n );\n return {\n deploymentName: localConfig.deploymentName,\n adminKey: credentials.adminKey,\n url: credentials.deploymentUrl,\n deploymentType: \"local\",\n reference: null,\n isDefault: false,\n };\n }\n case \"dev\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDefaultCloudDevDeploymentName(\n ctx,\n access.teamSlug,\n access.projectSlug,\n );\n // Pass teamAndProjectSlugs instead of the original projectSelection,\n // because handleDeploymentName sends projectSelection to Big Brain's\n // authorize_within_current_project endpoint, which doesn't understand\n // deploymentType \"local\".\n return await handleDeploymentName(ctx, deploymentName, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: access.projectSlug,\n });\n }\n case \"prod\":\n return await handleProd(ctx, projectSelection);\n case \"reference\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const deploymentName = await resolveDeploymentNameByReference(\n ctx,\n access.teamSlug,\n access.projectSlug,\n selector.reference,\n );\n return await handleDeploymentName(ctx, deploymentName, projectSelection);\n }\n }\n}\n\nasync function handleDeploymentSelector(\n ctx: Context,\n selector: string,\n projectSelection: ProjectSelection,\n): Promise<DeploymentAuthResponse> {\n const parsed = parseDeploymentSelector(selector);\n switch (parsed.kind) {\n case \"deploymentName\":\n return await handleDeploymentName(\n ctx,\n parsed.deploymentName,\n projectSelection,\n );\n case \"inCurrentProject\":\n return await handleRefInProject(ctx, parsed.selector, projectSelection);\n case \"inProject\": {\n const access = await checkAccessToSelectedProject(ctx, projectSelection);\n if (access.kind !== \"hasAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: access.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n case \"inTeamProject\":\n return await handleRefInProject(ctx, parsed.selector, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n });\n }\n}\n\nasync function _loadExistingDeploymentCredentialsForProject(\n ctx: Context,\n targetProject: ProjectSelection,\n deploymentSelection: DeploymentSelectionWithinProject,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n const accessResult = await checkAccessToSelectedProject(ctx, targetProject);\n if (accessResult.kind === \"noAccess\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"You don't have access to the selected project. Run `npx convex dev` to select a different project.\",\n });\n }\n const result = await fetchDeploymentCredentialsWithinCurrentProject(\n ctx,\n targetProject,\n deploymentSelection,\n );\n logVerbose(\n `Deployment URL: ${result.url}, Deployment Name: ${result.deploymentName}, Deployment Type: ${result.deploymentType}`,\n );\n if (ensureLocalRunning && result.deploymentType === \"local\") {\n await assertLocalBackendRunning(ctx, {\n url: result.url,\n deploymentName: result.deploymentName,\n });\n }\n return {\n ...result,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: result.deploymentType,\n reference: result.reference,\n isDefault: result.isDefault,\n projectSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.projectSlug : null,\n teamSlug:\n accessResult.kind === \"hasAccess\" ? accessResult.teamSlug : null,\n },\n };\n}\n\nexport type DetailedDeploymentCredentials = {\n adminKey: string;\n url: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n reference: string | null;\n isDefault: boolean;\n } | null;\n};\n\n/**\n * This is used by most commands to determine which deployment to act on, taking into account the deployment selection flags.\n */\nexport async function loadSelectedDeploymentCredentials(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n { ensureLocalRunning } = { ensureLocalRunning: true },\n): Promise<DetailedDeploymentCredentials> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n // We're already set up.\n logVerbose(\n `Deployment URL: ${deploymentSelection.deploymentToActOn.url}, Deployment Name: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentName ?? \"unknown\"}, Deployment Type: ${deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ?? \"unknown\"}`,\n );\n return {\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n url: deploymentSelection.deploymentToActOn.url,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n },\n // Note that the user could select a non-preview deployment here, and it would succeed if the user is logged in locally because getBigBrainAuth prefers the user's access token over the preview deploy key.\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"deploymentWithinProject\": {\n return await _loadExistingDeploymentCredentialsForProject(\n ctx,\n deploymentSelection.targetProject,\n deploymentSelection.selectionWithinProject,\n { ensureLocalRunning },\n );\n }\n case \"anonymous\": {\n if (deploymentSelection.deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No CONVEX_DEPLOYMENT set, run `npx convex dev` to configure a Convex project\",\n });\n }\n const config = await loadAnonymousDeployment(\n ctx,\n deploymentSelection.deploymentName,\n );\n const url = localDeploymentUrl(config.ports.cloud);\n if (ensureLocalRunning) {\n await assertLocalBackendRunning(ctx, {\n url,\n deploymentName: deploymentSelection.deploymentName,\n });\n }\n return {\n adminKey: config.adminKey,\n url,\n deploymentFields: {\n deploymentName: deploymentSelection.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n reference: null,\n isDefault: false,\n },\n };\n }\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Unknown deployment type\",\n });\n }\n }\n}\n\nexport async function fetchTeamAndProject(\n ctx: Context,\n deploymentName: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: `deployment/${deploymentName}/team_and_project`,\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function fetchTeamAndProjectForKey(\n ctx: Context,\n // Deployment deploy key, like `prod:happy-animal-123|<stuff>`\n deployKey: string,\n) {\n const data = (await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: `deployment/team_and_project_for_key`,\n data: {\n deployKey: deployKey,\n },\n })) as {\n team: string; // slug\n project: string; // slug\n teamId: number;\n projectId: number;\n reference: string | null;\n isDefault: boolean;\n };\n\n const { team, project } = data;\n if (team === undefined || project === undefined) {\n const msg =\n \"Unknown error when fetching team and project: \" + JSON.stringify(data);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: new Error(msg),\n printedMessage: msg,\n });\n }\n\n return data;\n}\n\nexport async function getTeamsForUser(ctx: Context) {\n const teams = await bigBrainAPI<{ id: number; name: string; slug: string }[]>(\n {\n ctx,\n method: \"GET\",\n path: \"teams\",\n },\n );\n return teams;\n}\n\nasync function resolveDefaultCloudDevDeploymentName(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n): Promise<string> {\n try {\n const result = await typedPlatformClient(ctx, { throw: true }).GET(\n \"/teams/{team_id_or_slug}/projects/{project_slug}/deployment\",\n {\n params: {\n path: { team_id_or_slug: teamSlug, project_slug: projectSlug },\n query: { defaultDev: true },\n },\n },\n );\n return result.data!.name;\n } catch (err) {\n if (\n err instanceof ThrowingFetchError &&\n err.serverErrorData?.code === \"DeploymentNotFound\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `You don\u2019t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold(\"npx convex deployment create --type dev --default\")} to create one.`,\n errForSentry: err,\n });\n }\n return await logAndHandleFetchError(ctx, err);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -42,6 +42,7 @@ var import_fs = require("../../bundler/fs.js");
|
|
|
42
42
|
var import_bundler = require("../../bundler/index.js");
|
|
43
43
|
var import_api = require("../codegen_templates/api.js");
|
|
44
44
|
var import_api_cjs = require("../codegen_templates/api_cjs.js");
|
|
45
|
+
var import_common = require("../codegen_templates/common.js");
|
|
45
46
|
var import_dataModel = require("../codegen_templates/dataModel.js");
|
|
46
47
|
var import_readme = require("../codegen_templates/readme.js");
|
|
47
48
|
var import_server = require("../codegen_templates/server.js");
|
|
@@ -564,7 +565,7 @@ async function doInitialComponentApiCodegen(ctx, isRoot, tmpDir, codegenDir, use
|
|
|
564
565
|
}
|
|
565
566
|
async function doApiCodegen(ctx, tmpDir, functionsDir2, codegenDir, useTypeScript, generateCommonJSApi, opts) {
|
|
566
567
|
const absModulePaths = await (0, import_bundler.entryPoints)(ctx, functionsDir2);
|
|
567
|
-
const modulePaths = absModulePaths.map((p) => import_path.default.relative(functionsDir2, p)).sort();
|
|
568
|
+
const modulePaths = absModulePaths.map((p) => import_path.default.relative(functionsDir2, p)).sort(import_common.compareModulePaths);
|
|
568
569
|
const writtenFiles = [];
|
|
569
570
|
if (!useTypeScript) {
|
|
570
571
|
const apiContent = (0, import_api.apiCodegen)(modulePaths, { useTypeScript: false });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/codegen.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport {\n dynamicDataModelDTS,\n dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return { codegenDir, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const { codegenDir } = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const { codegenDir } = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\n\n/* This component defined in a dist directory; it is probably in a node_module\n * directory, installed from a package. It is stuck with the files it has.\n * Heuristics for this:\n * - component definition has a dist/ directory as an ancestor\n * - component definition is a .js file\n * - presence of .js.map files\n * We may improve this heuristic.\n */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n // We never codegen for a published package (you need to link to the convex.config.ts file instead).\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(`Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort();\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(`# ${path.resolve(destination)}`);\n logOutput(formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(`Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport { compareModulePaths } from \"../codegen_templates/common.js\";\nimport {\n dynamicDataModelDTS,\n dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return { codegenDir, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const { codegenDir } = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const { codegenDir } = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n useTypeScript,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\n\n/* This component defined in a dist directory; it is probably in a node_module\n * directory, installed from a package. It is stuck with the files it has.\n * Heuristics for this:\n * - component definition has a dist/ directory as an ancestor\n * - component definition is a .js file\n * - presence of .js.map files\n * We may improve this heuristic.\n */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n // We never codegen for a published package (you need to link to the convex.config.ts file instead).\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(`Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort(compareModulePaths);\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n writtenFiles.push(\"api.js\", \"api.d.ts\");\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS!,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(`# ${path.resolve(destination)}`);\n logOutput(formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(`Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "functionsDir", "isPublishedPackage", "prettier"]
|
|
7
7
|
}
|
|
@@ -461,29 +461,21 @@ async function validateOrSelectProject(ctx, projectSlug, teamSlug, singleProject
|
|
|
461
461
|
});
|
|
462
462
|
}
|
|
463
463
|
if (!projectSlug) {
|
|
464
|
-
|
|
465
|
-
if (nonDemoProjects.length === 0) {
|
|
466
|
-
return await ctx.crash({
|
|
467
|
-
exitCode: 1,
|
|
468
|
-
errorType: "fatal",
|
|
469
|
-
printedMessage: `No existing non-demo projects! Run this command again and choose "create a new project."`
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
switch (nonDemoProjects.length) {
|
|
464
|
+
switch (projects.length) {
|
|
473
465
|
case 1: {
|
|
474
|
-
const project =
|
|
466
|
+
const project = projects[0];
|
|
475
467
|
const confirmed = await (0, import_prompts.promptYesNo)(ctx, {
|
|
476
468
|
message: `${singleProjectPrompt} ${project.name} (${project.slug})?`
|
|
477
469
|
});
|
|
478
470
|
if (!confirmed) {
|
|
479
471
|
return null;
|
|
480
472
|
}
|
|
481
|
-
return
|
|
473
|
+
return projects[0].slug;
|
|
482
474
|
}
|
|
483
475
|
default:
|
|
484
476
|
return await (0, import_prompts.promptSearch)(ctx, {
|
|
485
477
|
message: multiProjectPrompt,
|
|
486
|
-
choices:
|
|
478
|
+
choices: projects.map((project) => ({
|
|
487
479
|
name: `${project.name} (${project.slug})`,
|
|
488
480
|
value: project.slug
|
|
489
481
|
}))
|