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

@@ -4,7 +4,7 @@ import { prismaAdapter } from "better-auth/adapters/prisma";
{{#if (or (includes frontend "native-nativewind") (includes frontend "native-unistyles"))}}
import { expo } from "@better-auth/expo";
{{/if}}
import prisma from "../../prisma";
import prisma from "../db";
export const auth = betterAuth({
database: prismaAdapter(prisma, {

View File

@@ -1,4 +1,15 @@
{{#if (or (eq runtime "bun") (eq runtime "node"))}}
{{#if (eq dbSetup "planetscale")}}
import { drizzle } from "drizzle-orm/planetscale-serverless";
export const db = drizzle({
connection: {
host: process.env.DATABASE_HOST,
username: process.env.DATABASE_USERNAME,
password: process.env.DATABASE_PASSWORD,
},
});
{{else}}
import { drizzle } from "drizzle-orm/mysql2";
export const db = drizzle({
@@ -7,8 +18,21 @@ export const db = drizzle({
},
});
{{/if}}
{{/if}}
{{#if (eq runtime "workers")}}
{{#if (eq dbSetup "planetscale")}}
import { drizzle } from "drizzle-orm/planetscale-serverless";
import { env } from "cloudflare:workers";
export const db = drizzle({
connection: {
host: env.DATABASE_HOST,
username: env.DATABASE_USERNAME,
password: env.DATABASE_PASSWORD,
},
});
{{else}}
import { drizzle } from "drizzle-orm/mysql2";
import { env } from "cloudflare:workers";
@@ -18,3 +42,4 @@ export const db = drizzle({
},
});
{{/if}}
{{/if}}

View File

@@ -1,5 +0,0 @@
import { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -0,0 +1,5 @@
import { PrismaClient } from "../../prisma/generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -1,5 +0,0 @@
import { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -11,9 +11,15 @@ generator client {
{{#if (eq runtime "workers")}}
runtime = "workerd"
{{/if}}
{{#if (eq dbSetup "planetscale")}}
previewFeatures = ["driverAdapters"]
{{/if}}
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
{{#if (eq dbSetup "planetscale")}}
relationMode = "prisma"
{{/if}}
}

View File

@@ -0,0 +1,12 @@
import { PrismaClient } from "../../prisma/generated/client";
{{#if (eq dbSetup "planetscale")}}
import { PrismaPlanetScale } from '@prisma/adapter-planetscale'
const adapter = new PrismaPlanetScale({ url: process.env.DATABASE_URL })
const prisma = new PrismaClient({adapter});
{{else}}
const prisma = new PrismaClient();
{{/if}}
export default prisma;

View File

@@ -1,5 +0,0 @@
import { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -19,4 +19,7 @@ datasource db {
{{#if (eq dbSetup "supabase")}}
directUrl = env("DIRECT_URL")
{{/if}}
{{#if (eq dbSetup "planetscale")}}
relationMode = "prisma"
{{/if}}
}

View File

@@ -0,0 +1,5 @@
import { PrismaClient } from "../../prisma/generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -1,10 +1,38 @@
import "dotenv/config";
import path from "node:path";
import type { PrismaConfig } from "prisma";
{{#if (eq dbSetup "d1")}}
import { PrismaD1 } from "@prisma/adapter-d1";
{{/if}}
{{#if (eq dbSetup "turso")}}
import { PrismaLibSQL } from "@prisma/adapter-libsql";
{{/if}}
export default {
{{#if (or (eq dbSetup "d1") (eq dbSetup "turso"))}}
experimental: {
adapter: true
},
{{/if}}
schema: path.join("prisma", "schema"),
migrations: {
path: path.join("prisma", "migrations"),
}
},
{{#if (eq dbSetup "d1")}}
async adapter() {
return new PrismaD1({
CLOUDFLARE_D1_TOKEN: process.env.CLOUDFLARE_D1_TOKEN,
CLOUDFLARE_ACCOUNT_ID: process.env.CLOUDFLARE_ACCOUNT_ID,
CLOUDFLARE_DATABASE_ID: process.env.CLOUDFLARE_DATABASE_ID,
});
},
{{/if}}
{{#if (eq dbSetup "turso")}}
async adapter() {
return new PrismaLibSQL({
url: process.env.DATABASE_URL || "",
authToken: process.env.DATABASE_AUTH_TOKEN,
});
},
{{/if}}
} satisfies PrismaConfig;

View File

@@ -1,5 +0,0 @@
import { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
export default prisma;

View File

@@ -10,10 +10,20 @@ generator client {
{{/if}}
{{#if (eq runtime "workers")}}
runtime = "workerd"
{{#if (eq dbSetup "d1")}}
previewFeatures = ["driverAdapters"]
{{/if}}
{{/if}}
{{#if (eq dbSetup "turso")}}
previewFeatures = ["driverAdapters"]
{{/if}}
}
datasource db {
provider = "sqlite"
{{#if (eq dbSetup "turso")}}
url = "file:./local.db"
{{else}}
url = env("DATABASE_URL")
{{/if}}
}

View File

@@ -0,0 +1,28 @@
{{#if (eq dbSetup "d1")}}
import { env } from "cloudflare:workers";
import { PrismaD1 } from "@prisma/adapter-d1";
import { PrismaClient } from "../../prisma/generated/client";
const adapter = new PrismaD1(env.DB);
const prisma = new PrismaClient({ adapter });
export default prisma;
{{else if (eq dbSetup "turso")}}
import { PrismaLibSQL } from "@prisma/adapter-libsql";
import { PrismaClient } from "../../prisma/generated/client";
const adapter = new PrismaLibSQL({
url: process.env.DATABASE_URL || "",
authToken: process.env.DATABASE_AUTH_TOKEN,
});
const prisma = new PrismaClient({ adapter });
export default prisma;
{{else}}
import { PrismaClient } from "../../prisma/generated/client";
const prisma = new PrismaClient();
export default prisma;
{{/if}}

View File

@@ -1,7 +1,7 @@
import alchemy from "alchemy";
{{#if (eq webDeploy "alchemy")}}
{{#if (includes frontend "next")}}
import { Next } from "alchemy/cloudflare";
import { Nextjs } from "alchemy/cloudflare";
{{else if (includes frontend "nuxt")}}
import { Nuxt } from "alchemy/cloudflare";
{{else if (includes frontend "svelte")}}
@@ -44,13 +44,17 @@ await Exec("db-generate", {
});
const db = await D1Database("database", {
{{#if (eq orm "prisma")}}
migrationsDir: "apps/server/prisma/migrations",
{{else if (eq orm "drizzle")}}
migrationsDir: "apps/server/src/db/migrations",
{{/if}}
});
{{/if}}
{{#if (eq webDeploy "alchemy")}}
{{#if (includes frontend "next")}}
export const web = await Next("web", {
export const web = await Nextjs("web", {
{{#if (eq serverDeploy "alchemy")}}cwd: "apps/web",{{/if}}
bindings: {
{{#if (eq backend "convex")}}

View File

@@ -27,7 +27,12 @@
"database_name": "YOUR_DB_NAME",
"database_id": "YOUR_DB_ID",
"preview_database_id": "local-test-db",
{{#if (eq orm "drizzle")}}
"migrations_dir": "./src/db/migrations"
{{/if}}
{{#if (eq orm "prisma")}}
"migrations_dir": "./prisma/migrations"
{{/if}}
}
]
{{/if}}

View File

@@ -1,6 +1,6 @@
{{#if (eq api "orpc")}}
import z from "zod";
import prisma from "../../prisma";
import prisma from "../db";
import { publicProcedure } from "../lib/orpc";
export const todoRouter = {
@@ -52,7 +52,7 @@ export const todoRouter = {
{{#if (eq api "trpc")}}
import { TRPCError } from "@trpc/server";
import z from "zod";
import prisma from "../../prisma";
import prisma from "../db";
import { publicProcedure, router } from "../lib/trpc";
export const todoRouter = router({

View File

@@ -1,7 +1,2 @@
[install]
{{#if (or (or (includes frontend "nuxt") (includes frontend "native-nativewind")) (includes frontend
"native-unistyles"))}}
# linker = "isolated"
{{else}}
linker = "isolated"
{{/if}}

View File

@@ -1,3 +1,6 @@
{{#if (or (eq webDeploy "alchemy") (eq webDeploy "wrangler"))}}
import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
{{/if}}
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
@@ -5,3 +8,7 @@ const nextConfig: NextConfig = {
};
export default nextConfig;
{{#if (or (eq webDeploy "alchemy") (eq webDeploy "wrangler"))}}
initOpenNextCloudflareForDev();
{{/if}}