From 3c9811b0538f1b211c5ed1b6d679d19472c4667e Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Sat, 23 Aug 2025 16:23:02 +0530 Subject: [PATCH] fix(cli): improve Alchemy deployment and D1 scripts --- .../cli/src/helpers/core/post-installation.ts | 32 ++++++-- apps/cli/src/helpers/core/project-config.ts | 79 +++++++++++++------ 2 files changed, 81 insertions(+), 30 deletions(-) diff --git a/apps/cli/src/helpers/core/post-installation.ts b/apps/cli/src/helpers/core/post-installation.ts index 261a4d7..6513ca4 100644 --- a/apps/cli/src/helpers/core/post-installation.ts +++ b/apps/cli/src/helpers/core/post-installation.ts @@ -29,7 +29,12 @@ export async function displayPostInstallInstructions( } = config; const isConvex = backend === "convex"; - const runCmd = packageManager === "npm" ? "npm run" : packageManager; + const runCmd = + packageManager === "npm" + ? "npm run" + : packageManager === "pnpm" + ? "pnpm run" + : "bun run"; const cdCmd = `cd ${relativePath}`; const hasHuskyOrBiome = addons?.includes("husky") || addons?.includes("biome"); @@ -253,7 +258,7 @@ async function getDatabaseInstructions( ); instructions.push( `${pc.cyan("4.")} Generate migrations: ${pc.white( - `cd apps/server && ${packageManager} db:generate`, + `cd apps/server && ${runCmd} db:generate`, )}`, ); instructions.push( @@ -269,6 +274,11 @@ async function getDatabaseInstructions( } if (dbSetup === "d1" && serverDeploy === "alchemy") { + instructions.push( + `${pc.yellow( + "NOTE:", + )} D1 migrations are automatically handled by Alchemy`, + ); } if (orm === "prisma") { @@ -293,7 +303,11 @@ async function getDatabaseInstructions( ); } instructions.push(`${pc.cyan("•")} Apply schema: ${`${runCmd} db:push`}`); - instructions.push(`${pc.cyan("•")} Database UI: ${`${runCmd} db:studio`}`); + if (!(dbSetup === "d1" && serverDeploy === "alchemy")) { + instructions.push( + `${pc.cyan("•")} Database UI: ${`${runCmd} db:studio`}`, + ); + } } else if (orm === "drizzle") { if (dbSetup === "docker") { instructions.push( @@ -303,7 +317,11 @@ async function getDatabaseInstructions( if (dbSetup !== "d1") { instructions.push(`${pc.cyan("•")} Apply schema: ${`${runCmd} db:push`}`); } - instructions.push(`${pc.cyan("•")} Database UI: ${`${runCmd} db:studio`}`); + if (!(dbSetup === "d1" && serverDeploy === "alchemy")) { + instructions.push( + `${pc.cyan("•")} Database UI: ${`${runCmd} db:studio`}`, + ); + } if (database === "sqlite" && dbSetup !== "d1") { instructions.push( `${pc.cyan( @@ -394,15 +412,15 @@ function getAlchemyDeployInstructions( if (webDeploy === "alchemy" && serverDeploy !== "alchemy") { instructions.push( - `${pc.bold("Deploy web to Alchemy:")}\n${pc.cyan("•")} Deploy: ${`cd apps/web && ${runCmd} deploy`}`, + `${pc.bold("Deploy web with Alchemy:")}\n${pc.cyan("•")} Dev: ${`cd apps/web && ${runCmd} alchemy:dev`}\n${pc.cyan("•")} Deploy: ${`cd apps/web && ${runCmd} deploy`}\n${pc.cyan("•")} Destroy: ${`cd apps/web && ${runCmd} destroy`}`, ); } else if (serverDeploy === "alchemy" && webDeploy !== "alchemy") { instructions.push( - `${pc.bold("Deploy server to Alchemy:")}\n${pc.cyan("•")} Deploy: ${`cd apps/server && ${runCmd} deploy`}`, + `${pc.bold("Deploy server with Alchemy:")}\n${pc.cyan("•")} Dev: ${`cd apps/server && ${runCmd} alchemy:dev`}\n${pc.cyan("•")} Deploy: ${`cd apps/server && ${runCmd} deploy`}\n${pc.cyan("•")} Destroy: ${`cd apps/server && ${runCmd} destroy`}`, ); } else if (webDeploy === "alchemy" && serverDeploy === "alchemy") { instructions.push( - `${pc.bold("Deploy to Alchemy:")}\n${pc.cyan("•")} Deploy: ${`${runCmd} deploy`}`, + `${pc.bold("Deploy with Alchemy:")}\n${pc.cyan("•")} Dev: ${`${runCmd} alchemy:dev`}\n${pc.cyan("•")} Deploy: ${`${runCmd} deploy`}\n${pc.cyan("•")} Destroy: ${`${runCmd} destroy`}`, ); } diff --git a/apps/cli/src/helpers/core/project-config.ts b/apps/cli/src/helpers/core/project-config.ts index 7e30fb5..152d203 100644 --- a/apps/cli/src/helpers/core/project-config.ts +++ b/apps/cli/src/helpers/core/project-config.ts @@ -71,13 +71,19 @@ async function updateRootPackageJson( } if (needsDbScripts) { scripts["db:push"] = `turbo -F ${backendPackageName} db:push`; - scripts["db:studio"] = `turbo -F ${backendPackageName} db:studio`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = `turbo -F ${backendPackageName} db:studio`; + } if (options.orm === "prisma") { scripts["db:generate"] = `turbo -F ${backendPackageName} db:generate`; - scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`; + } } else if (options.orm === "drizzle") { scripts["db:generate"] = `turbo -F ${backendPackageName} db:generate`; - scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = `turbo -F ${backendPackageName} db:migrate`; + } } } if (options.dbSetup === "docker") { @@ -98,17 +104,23 @@ async function updateRootPackageJson( } if (needsDbScripts) { scripts["db:push"] = `pnpm --filter ${backendPackageName} db:push`; - scripts["db:studio"] = `pnpm --filter ${backendPackageName} db:studio`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = `pnpm --filter ${backendPackageName} db:studio`; + } if (options.orm === "prisma") { scripts["db:generate"] = `pnpm --filter ${backendPackageName} db:generate`; - scripts["db:migrate"] = - `pnpm --filter ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `pnpm --filter ${backendPackageName} db:migrate`; + } } else if (options.orm === "drizzle") { scripts["db:generate"] = `pnpm --filter ${backendPackageName} db:generate`; - scripts["db:migrate"] = - `pnpm --filter ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `pnpm --filter ${backendPackageName} db:migrate`; + } } } if (options.dbSetup === "docker") { @@ -130,18 +142,24 @@ async function updateRootPackageJson( } if (needsDbScripts) { scripts["db:push"] = `npm run db:push --workspace ${backendPackageName}`; - scripts["db:studio"] = - `npm run db:studio --workspace ${backendPackageName}`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = + `npm run db:studio --workspace ${backendPackageName}`; + } if (options.orm === "prisma") { scripts["db:generate"] = `npm run db:generate --workspace ${backendPackageName}`; - scripts["db:migrate"] = - `npm run db:migrate --workspace ${backendPackageName}`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `npm run db:migrate --workspace ${backendPackageName}`; + } } else if (options.orm === "drizzle") { scripts["db:generate"] = `npm run db:generate --workspace ${backendPackageName}`; - scripts["db:migrate"] = - `npm run db:migrate --workspace ${backendPackageName}`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `npm run db:migrate --workspace ${backendPackageName}`; + } } } if (options.dbSetup === "docker") { @@ -164,17 +182,24 @@ async function updateRootPackageJson( } if (needsDbScripts) { scripts["db:push"] = `bun run --filter ${backendPackageName} db:push`; - scripts["db:studio"] = `bun run --filter ${backendPackageName} db:studio`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = + `bun run --filter ${backendPackageName} db:studio`; + } if (options.orm === "prisma") { scripts["db:generate"] = `bun run --filter ${backendPackageName} db:generate`; - scripts["db:migrate"] = - `bun run --filter ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `bun run --filter ${backendPackageName} db:migrate`; + } } else if (options.orm === "drizzle") { scripts["db:generate"] = `bun run --filter ${backendPackageName} db:generate`; - scripts["db:migrate"] = - `bun run --filter ${backendPackageName} db:migrate`; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = + `bun run --filter ${backendPackageName} db:migrate`; + } } } if (options.dbSetup === "docker") { @@ -249,14 +274,22 @@ async function updateServerPackageJson( if (options.orm === "prisma") { scripts["db:push"] = "prisma db push"; - scripts["db:studio"] = "prisma studio"; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = "prisma studio"; + } scripts["db:generate"] = "prisma generate"; - scripts["db:migrate"] = "prisma migrate dev"; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = "prisma migrate dev"; + } } else if (options.orm === "drizzle") { scripts["db:push"] = "drizzle-kit push"; - scripts["db:studio"] = "drizzle-kit studio"; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:studio"] = "drizzle-kit studio"; + } scripts["db:generate"] = "drizzle-kit generate"; - scripts["db:migrate"] = "drizzle-kit migrate"; + if (!(options.dbSetup === "d1" && options.serverDeploy === "alchemy")) { + scripts["db:migrate"] = "drizzle-kit migrate"; + } } }