Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/cli/src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,8 +321,13 @@ export function createInitCommand() {
const orm = ADAPTERS.find(
(item) => item.key === adapter,
)?.ormForGenerate;
const outputPath = getOutputForAdapter(adapter);
const args = orm
? [`--orm=${orm}`, `--config=${stackPath}`]
? [
`--orm=${orm}`,
`--config=${stackPath}`,
...(outputPath ? [`--output=${outputPath}`] : []),
]
: [`--config=${stackPath}`];
const exitCode = await runCliPassthrough({
cwd,
Expand Down
17 changes: 11 additions & 6 deletions packages/cli/src/utils/passthrough.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,24 @@ export function adapterNeedsGenerate(adapter: Adapter): boolean {
return Boolean(ADAPTERS.find((item) => item.key === adapter)?.ormForGenerate);
}

export function getOutputForAdapter(adapter: Adapter): string | null {
const meta = ADAPTERS.find((item) => item.key === adapter);
if (!meta?.ormForGenerate) return null;

if (meta.ormForGenerate === "prisma") return "prisma/schema.prisma";
if (meta.ormForGenerate === "drizzle") return "src/db/schema.ts";
return "migrations/schema.sql";
}

export function getGenerateHintForAdapter(
adapter: Adapter,
configPath: string,
): string | null {
const meta = ADAPTERS.find((item) => item.key === adapter);
if (!meta?.ormForGenerate) return null;

const output =
meta.ormForGenerate === "prisma"
? "schema.prisma"
: meta.ormForGenerate === "drizzle"
? "src/db/schema.ts"
: "migrations/schema.sql";
const output = getOutputForAdapter(adapter);
if (!output) return null;

return `npx @btst/codegen generate --orm=${meta.ormForGenerate} --config=${configPath} --output=${output}`;
}
Expand Down
33 changes: 27 additions & 6 deletions packages/cli/src/utils/scaffold-plan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ function buildPluginTemplateContext(
};
}

function buildAdapterTemplateContext(adapter: Adapter) {
function buildAdapterTemplateContext(adapter: Adapter, stackPath: string) {
const meta = ADAPTERS.find((item) => item.key === adapter);
if (!meta) {
throw new Error(`Unsupported adapter: ${adapter}`);
Expand All @@ -337,15 +337,19 @@ function buildAdapterTemplateContext(adapter: Adapter) {
}

if (adapter === "prisma") {
const depth = stackPath.split("/").length - 1;
const prismaClientPath = `${"../".repeat(depth)}generated/prisma/client`;
return {
adapterImport: `import { createPrismaAdapter } from "${meta.packageName}"
import { PrismaClient } from "@prisma/client"`,
adapterSetup: `const prisma = new PrismaClient()
import { PrismaClient } from "${prismaClientPath}"
import { PrismaPg } from "@prisma/adapter-pg"`,
Comment thread
cursor[bot] marked this conversation as resolved.
adapterSetup: `const pgAdapter = new PrismaPg({ connectionString: process.env.DATABASE_URL! })
const prisma = new PrismaClient({ adapter: pgAdapter })

const provider = process.env.BTST_PRISMA_PROVIDER ?? "postgresql"
const provider = (process.env.BTST_PRISMA_PROVIDER ?? "postgresql") as "postgresql" | "sqlite" | "cockroachdb" | "mysql" | "sqlserver" | "mongodb"
`,
adapterStackLine:
"adapter: (db) => createPrismaAdapter(prisma, db, { provider }),",
"adapter: (db) => createPrismaAdapter(prisma, db, { provider })({}),",
};
}

Expand Down Expand Up @@ -385,7 +389,10 @@ export async function buildScaffoldPlan(
input.plugins,
input.framework,
);
const adapterContext = buildAdapterTemplateContext(input.adapter);
const adapterContext = buildAdapterTemplateContext(
input.adapter,
frameworkPaths.stackPath,
);

const sharedContext = {
alias: input.alias,
Expand All @@ -402,6 +409,20 @@ export async function buildScaffoldPlan(
content: await renderTemplate("shared/lib/stack.ts.hbs", sharedContext),
description: "BTST backend stack configuration",
},
...(input.adapter === "prisma"
? [
{
path: "prisma/schema.prisma",
content: `generator client {\n provider = "prisma-client"\n output = "../generated/prisma"\n}\n\ndatasource db {\n provider = "postgresql"\n}\n`,
description: "Prisma schema with explicit client output path",
},
{
path: "prisma.config.ts",
content: `import { defineConfig } from 'prisma/config'\n\nexport default defineConfig({\n schema: 'prisma/schema.prisma',\n datasource: {\n url: process.env.DATABASE_URL ?? '',\n },\n})\n`,
description: "Prisma configuration file",
},
]
: []),
{
path: frameworkPaths.stackClientPath,
content: await renderTemplate(
Expand Down
Loading