feat(cli): prisma + workers, prisma + turso, planetscale (postgres/mysql) support (#567)

This commit is contained in:
Aman Varshney
2025-09-08 12:15:26 +05:30
committed by GitHub
parent 33344d91be
commit cd5d0f0aeb
66 changed files with 1486 additions and 729 deletions

View File

@@ -3,7 +3,6 @@ import fs from "fs-extra";
import type { ProjectConfig } from "../../types";
import { writeBtsConfig } from "../../utils/bts-config";
import { exitWithError } from "../../utils/errors";
import { formatProjectWithBiome } from "../../utils/format-with-biome";
import { setupAddons } from "../addons/addons-setup";
import { setupExamples } from "../addons/examples-setup";
import { setupApi } from "../core/api-setup";
@@ -86,8 +85,6 @@ export async function createProject(options: ProjectConfig) {
await writeBtsConfig(options);
await formatProjectWithBiome(projectDir);
if (isConvex) {
await runConvexCodegen(projectDir, options.packageManager);
}

View File

@@ -9,6 +9,7 @@ import { setupCloudflareD1 } from "../database-providers/d1-setup";
import { setupDockerCompose } from "../database-providers/docker-compose-setup";
import { setupMongoDBAtlas } from "../database-providers/mongodb-atlas-setup";
import { setupNeonPostgres } from "../database-providers/neon-setup";
import { setupPlanetScale } from "../database-providers/planetscale-setup";
import { setupPrismaPostgres } from "../database-providers/prisma-postgres-setup";
import { setupSupabase } from "../database-providers/supabase-setup";
import { setupTurso } from "../database-providers/turso-setup";
@@ -36,11 +37,29 @@ export async function setupDatabase(config: ProjectConfig) {
try {
if (orm === "prisma") {
await addPackageDependency({
dependencies: ["@prisma/client"],
devDependencies: ["prisma"],
projectDir: serverDir,
});
if (database === "mysql" && dbSetup === "planetscale") {
await addPackageDependency({
dependencies: [
"@prisma/client",
"@prisma/adapter-planetscale",
"@planetscale/database",
],
devDependencies: ["prisma"],
projectDir: serverDir,
});
} else if (database === "sqlite" && dbSetup === "turso") {
await addPackageDependency({
dependencies: ["@prisma/client", "@prisma/adapter-libsql"],
devDependencies: ["prisma"],
projectDir: serverDir,
});
} else {
await addPackageDependency({
dependencies: ["@prisma/client"],
devDependencies: ["prisma"],
projectDir: serverDir,
});
}
} else if (orm === "drizzle") {
if (database === "sqlite") {
await addPackageDependency({
@@ -55,6 +74,12 @@ export async function setupDatabase(config: ProjectConfig) {
devDependencies: ["drizzle-kit", "@types/ws"],
projectDir: serverDir,
});
} else if (dbSetup === "planetscale") {
await addPackageDependency({
dependencies: ["drizzle-orm", "pg"],
devDependencies: ["drizzle-kit", "@types/pg"],
projectDir: serverDir,
});
} else {
await addPackageDependency({
dependencies: ["drizzle-orm", "pg"],
@@ -63,11 +88,19 @@ export async function setupDatabase(config: ProjectConfig) {
});
}
} else if (database === "mysql") {
await addPackageDependency({
dependencies: ["drizzle-orm", "mysql2"],
devDependencies: ["drizzle-kit"],
projectDir: serverDir,
});
if (dbSetup === "planetscale") {
await addPackageDependency({
dependencies: ["drizzle-orm", "@planetscale/database"],
devDependencies: ["drizzle-kit"],
projectDir: serverDir,
});
} else {
await addPackageDependency({
dependencies: ["drizzle-orm", "mysql2"],
devDependencies: ["drizzle-kit"],
projectDir: serverDir,
});
}
}
} else if (orm === "mongoose") {
await addPackageDependency({
@@ -88,9 +121,15 @@ export async function setupDatabase(config: ProjectConfig) {
await setupPrismaPostgres(config);
} else if (dbSetup === "neon") {
await setupNeonPostgres(config);
} else if (dbSetup === "planetscale") {
await setupPlanetScale(config);
} else if (dbSetup === "supabase") {
await setupSupabase(config);
}
} else if (database === "mysql") {
if (dbSetup === "planetscale") {
await setupPlanetScale(config);
}
} else if (database === "mongodb" && dbSetup === "mongodb-atlas") {
await setupMongoDBAtlas(config);
}

View File

@@ -232,16 +232,8 @@ export async function setupEnvironmentVariables(config: ProjectConfig) {
}
let databaseUrl: string | null = null;
const specializedSetup =
dbSetup === "turso" ||
dbSetup === "prisma-postgres" ||
dbSetup === "mongodb-atlas" ||
dbSetup === "neon" ||
dbSetup === "supabase" ||
dbSetup === "d1" ||
dbSetup === "docker";
if (database !== "none" && !specializedSetup) {
if (database !== "none" && dbSetup === "none") {
switch (database) {
case "postgres":
databaseUrl = "postgresql://postgres:password@localhost:5432/postgres";
@@ -281,7 +273,7 @@ export async function setupEnvironmentVariables(config: ProjectConfig) {
{
key: "DATABASE_URL",
value: databaseUrl,
condition: database !== "none" && !specializedSetup,
condition: database !== "none" && dbSetup === "none",
},
{
key: "GOOGLE_GENERATIVE_AI_API_KEY",

View File

@@ -287,22 +287,40 @@ async function getDatabaseInstructions(
}
if (dbSetup === "d1" && serverDeploy === "alchemy") {
instructions.push(
`${pc.yellow(
"NOTE:",
)} D1 migrations are automatically handled by Alchemy`,
);
}
if (orm === "prisma") {
if (dbSetup === "turso") {
if (orm === "drizzle") {
instructions.push(
`${pc.yellow(
"NOTE:",
)} Turso support with Prisma is in Early Access and requires\n additional setup. Learn more at:\n https://www.prisma.io/docs/orm/overview/databases/turso`,
)} D1 migrations are automatically handled by Alchemy`,
);
} else if (orm === "prisma") {
instructions.push(
`${pc.cyan("•")} Generate migrations: ${`${runCmd} db:generate`}`,
);
instructions.push(
`${pc.cyan("•")} Apply migrations: ${`${runCmd} db:migrate`}`,
);
}
}
if (dbSetup === "planetscale") {
if (database === "mysql" && orm === "drizzle") {
instructions.push(
`${pc.yellow(
"NOTE:",
)} Enable foreign key constraints in PlanetScale database settings`,
);
}
if (database === "mysql" && orm === "prisma") {
instructions.push(
`${pc.yellow(
"NOTE:",
)} How to handle Prisma migrations with PlanetScale:\n https://github.com/prisma/prisma/issues/7292`,
);
}
}
if (orm === "prisma") {
if (database === "mongodb" && dbSetup === "docker") {
instructions.push(
`${pc.yellow(

View File

@@ -76,9 +76,7 @@ async function updateRootPackageJson(
}
if (options.orm === "prisma") {
scripts["db:generate"] = `turbo -F ${backendPackageName} db:generate`;
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`;
}
scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`;
} else if (options.orm === "drizzle") {
scripts["db:generate"] = `turbo -F ${backendPackageName} db:generate`;
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
@@ -110,10 +108,8 @@ async function updateRootPackageJson(
if (options.orm === "prisma") {
scripts["db:generate"] =
`pnpm --filter ${backendPackageName} db:generate`;
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
scripts["db:migrate"] =
`pnpm --filter ${backendPackageName} db:migrate`;
}
scripts["db:migrate"] =
`pnpm --filter ${backendPackageName} db:migrate`;
} else if (options.orm === "drizzle") {
scripts["db:generate"] =
`pnpm --filter ${backendPackageName} db:generate`;
@@ -149,10 +145,8 @@ async function updateRootPackageJson(
if (options.orm === "prisma") {
scripts["db:generate"] =
`npm run db:generate --workspace ${backendPackageName}`;
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
scripts["db:migrate"] =
`npm run db:migrate --workspace ${backendPackageName}`;
}
scripts["db:migrate"] =
`npm run db:migrate --workspace ${backendPackageName}`;
} else if (options.orm === "drizzle") {
scripts["db:generate"] =
`npm run db:generate --workspace ${backendPackageName}`;
@@ -189,10 +183,8 @@ async function updateRootPackageJson(
if (options.orm === "prisma") {
scripts["db:generate"] =
`bun run --filter ${backendPackageName} db:generate`;
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
scripts["db:migrate"] =
`bun run --filter ${backendPackageName} db:migrate`;
}
scripts["db:migrate"] =
`bun run --filter ${backendPackageName} db:migrate`;
} else if (options.orm === "drizzle") {
scripts["db:generate"] =
`bun run --filter ${backendPackageName} db:generate`;
@@ -278,9 +270,7 @@ async function updateServerPackageJson(
scripts["db:studio"] = "prisma studio";
}
scripts["db:generate"] = "prisma generate";
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {
scripts["db:migrate"] = "prisma migrate dev";
}
scripts["db:migrate"] = "prisma migrate dev";
} else if (options.orm === "drizzle") {
scripts["db:push"] = "drizzle-kit push";
if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) {