mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
feat(cli): prisma + workers, prisma + turso, planetscale (postgres/mysql) support (#567)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
Reference in New Issue
Block a user