From 9032a598d0014f9215807b78e8771e10bec8011b Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Thu, 20 Feb 2025 09:20:29 +0530 Subject: [PATCH] add flags and prompt for orm selection --- apps/cli/src/consts.ts | 1 + apps/cli/src/index.ts | 32 +++++++++++++++++++ apps/cli/src/types.ts | 3 ++ .../utils/generate-reproducible-command.ts | 4 +++ 4 files changed, 40 insertions(+) diff --git a/apps/cli/src/consts.ts b/apps/cli/src/consts.ts index de14d87..19a3151 100644 --- a/apps/cli/src/consts.ts +++ b/apps/cli/src/consts.ts @@ -13,4 +13,5 @@ export const DEFAULT_CONFIG: ProjectConfig = { features: [], git: true, packageManager: "npm", + orm: "drizzle", }; diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index 805647a..dc7d86b 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -21,6 +21,7 @@ import type { ProjectConfig, ProjectDatabase, ProjectFeature, + ProjectORM, } from "./types"; import { generateReproducibleCommand } from "./utils/generate-reproducible-command"; import { getUserPkgManager } from "./utils/get-package-manager"; @@ -101,6 +102,25 @@ async function gatherConfig( }, ], }), + orm: () => + flags.orm !== undefined + ? Promise.resolve(flags.orm) + : select({ + message: "Which ORM would you like to use?", + options: [ + { + value: "drizzle", + label: "Drizzle", + hint: "Type-safe, lightweight ORM (recommended)", + }, + // { + // value: "prisma", + // label: "Prisma (coming soon)", + // hint: "Feature-rich ORM with great DX", + // }, + ], + initialValue: "drizzle", + }), auth: () => flags.auth !== undefined ? Promise.resolve(flags.auth) @@ -186,6 +206,7 @@ async function gatherConfig( return { projectName: result.projectName ?? DEFAULT_CONFIG.projectName, database: result.database ?? DEFAULT_CONFIG.database, + orm: result.orm ?? DEFAULT_CONFIG.orm, auth: result.auth ?? DEFAULT_CONFIG.auth, features: result.features ?? DEFAULT_CONFIG.features, git: result.git ?? DEFAULT_CONFIG.git, @@ -202,6 +223,9 @@ function displayConfig(config: Partial) { if (config.database) { configDisplay.push(`${pc.blue("Database:")} ${config.database}`); } + if (config.orm) { + configDisplay.push(`${pc.blue("ORM:")} ${config.orm}`); + } if (config.auth !== undefined) { configDisplay.push(`${pc.blue("Authentication:")} ${config.auth}`); } @@ -245,6 +269,8 @@ async function main() { .option("--pnpm", "Use pnpm package manager") .option("--yarn", "Use yarn package manager") .option("--bun", "Use bun package manager") + .option("--drizzle", "Use Drizzle ORM") + .option("--prisma", "Use Prisma ORM (coming soon)") .parse(); const options = program.opts(); @@ -257,6 +283,7 @@ async function main() { : options.postgres ? "postgres" : undefined, + orm: options.drizzle ? "drizzle" : options.prisma ? "prisma" : undefined, auth: "auth" in options ? options.auth : undefined, packageManager: options.npm ? "npm" @@ -293,6 +320,11 @@ async function main() { yes: true, projectName: projectDirectory ?? DEFAULT_CONFIG.projectName, database: options.database ?? DEFAULT_CONFIG.database, + orm: options.drizzle + ? "drizzle" + : options.prisma + ? "prisma" + : DEFAULT_CONFIG.orm, // Add this line auth: options.auth ?? DEFAULT_CONFIG.auth, git: options.git ?? DEFAULT_CONFIG.git, packageManager: diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts index 11f5983..c1b2776 100644 --- a/apps/cli/src/types.ts +++ b/apps/cli/src/types.ts @@ -4,6 +4,8 @@ export type ProjectDatabase = "sqlite" | "postgres"; export type PackageManager = "npm" | "yarn" | "pnpm" | "bun"; +export type ProjectORM = "drizzle" | "prisma"; + export type ProjectConfig = { yes?: boolean; projectName: string; @@ -12,4 +14,5 @@ export type ProjectConfig = { auth: boolean; packageManager: PackageManager; features: ProjectFeature[]; + orm: ProjectORM; }; diff --git a/apps/cli/src/utils/generate-reproducible-command.ts b/apps/cli/src/utils/generate-reproducible-command.ts index f4b6c35..6e1cec1 100644 --- a/apps/cli/src/utils/generate-reproducible-command.ts +++ b/apps/cli/src/utils/generate-reproducible-command.ts @@ -18,6 +18,10 @@ export function generateReproducibleCommand(config: ProjectConfig): string { flags.push(config.database === "sqlite" ? "--sqlite" : "--postgres"); } + if (config.orm !== DEFAULT_CONFIG.orm) { + flags.push(config.orm === "drizzle" ? "--drizzle" : "--prisma"); + } + if (config.auth !== DEFAULT_CONFIG.auth) { flags.push("--no-auth"); }