@victusvinceere/saas-cli 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/logger.ts","../src/commands/init.ts","../src/commands/add.ts","../src/commands/generate.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { printBanner } from \"./utils/logger.js\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { generate } from \"./commands/generate.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"saas-kit\")\n .description(\"CLI tool for scaffolding SaaS Kit projects\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new SaaS Kit project\")\n .option(\"-t, --template <template>\", \"Use a specific template\")\n .action((name, options) => {\n printBanner();\n init(name, options);\n });\n\nprogram\n .command(\"add [module]\")\n .description(\"Add a module to your project (payments, admin, blog, landing)\")\n .action((module) => {\n add(module);\n });\n\nprogram\n .command(\"generate [type]\")\n .alias(\"g\")\n .description(\"Generate routes and files (auth, dashboard, api)\")\n .action((type) => {\n generate(type);\n });\n\nprogram.parse();\n","import chalk from \"chalk\";\n\nexport const logger = {\n info: (message: string) => console.log(chalk.blue(\"info\"), message),\n success: (message: string) => console.log(chalk.green(\"✓\"), message),\n warn: (message: string) => console.log(chalk.yellow(\"⚠\"), message),\n error: (message: string) => console.log(chalk.red(\"✗\"), message),\n log: (message: string) => console.log(message),\n};\n\nexport function printBanner() {\n console.log();\n console.log(chalk.bold.cyan(\" ███████╗ █████╗ █████╗ ███████╗\"));\n console.log(chalk.bold.cyan(\" ██╔════╝██╔══██╗██╔══██╗██╔════╝\"));\n console.log(chalk.bold.cyan(\" ███████╗███████║███████║███████╗\"));\n console.log(chalk.bold.cyan(\" ╚════██║██╔══██║██╔══██║╚════██║\"));\n console.log(chalk.bold.cyan(\" ███████║██║ ██║██║ ██║███████║\"));\n console.log(chalk.bold.cyan(\" ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝\"));\n console.log();\n console.log(chalk.bold(\" SaaS Kit CLI - Build your SaaS faster\"));\n console.log();\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ninterface InitOptions {\n name?: string;\n template?: string;\n}\n\nexport async function init(projectName?: string, options: InitOptions = {}) {\n logger.log(chalk.bold(\"\\nLet's create your new SaaS project!\\n\"));\n\n // Get project name\n let name = projectName;\n if (!name) {\n const answers = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: \"What is your project name?\",\n default: \"my-saas-app\",\n validate: (input: string) => {\n if (/^[a-z0-9-]+$/.test(input)) return true;\n return \"Project name can only contain lowercase letters, numbers, and hyphens\";\n },\n },\n ]);\n name = answers.projectName;\n }\n\n // Get configuration\n const config = await inquirer.prompt([\n {\n type: \"checkbox\",\n name: \"modules\",\n message: \"Which modules would you like to include?\",\n choices: [\n { name: \"Payments (Lemon Squeezy)\", value: \"payments\", checked: true },\n { name: \"Admin Panel\", value: \"admin\", checked: true },\n { name: \"Blog (MDX)\", value: \"blog\", checked: false },\n { name: \"Landing Pages\", value: \"landing\", checked: true },\n ],\n },\n {\n type: \"checkbox\",\n name: \"providers\",\n message: \"Which auth providers do you want?\",\n choices: [\n { name: \"Google\", value: \"google\", checked: true },\n { name: \"GitHub\", value: \"github\", checked: false },\n { name: \"Email (Magic Links)\", value: \"email\", checked: true },\n ],\n },\n {\n type: \"list\",\n name: \"database\",\n message: \"Which database will you use?\",\n choices: [\n { name: \"PostgreSQL\", value: \"postgresql\" },\n { name: \"MySQL\", value: \"mysql\" },\n { name: \"SQLite\", value: \"sqlite\" },\n ],\n default: \"postgresql\",\n },\n ]);\n\n const projectDir = path.resolve(process.cwd(), name!);\n\n // Check if directory exists\n if (await fs.pathExists(projectDir)) {\n const { overwrite } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"overwrite\",\n message: `Directory ${name} already exists. Overwrite?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n logger.info(\"Aborted.\");\n return;\n }\n await fs.remove(projectDir);\n }\n\n const spinner = ora(\"Creating project...\").start();\n\n try {\n // Create project directory\n await fs.ensureDir(projectDir);\n\n // Create package.json\n const packageJson = {\n name: name,\n version: \"0.1.0\",\n private: true,\n scripts: {\n dev: \"next dev\",\n build: \"next build\",\n start: \"next start\",\n lint: \"next lint\",\n \"db:push\": \"prisma db push\",\n \"db:generate\": \"prisma generate\",\n \"db:studio\": \"prisma studio\",\n },\n dependencies: {\n \"@saas-kit/core\": \"^0.1.0\",\n ...(config.modules.includes(\"payments\") && {\n \"@saas-kit/payments\": \"^0.1.0\",\n }),\n ...(config.modules.includes(\"admin\") && {\n \"@saas-kit/admin\": \"^0.1.0\",\n }),\n ...(config.modules.includes(\"blog\") && { \"@saas-kit/blog\": \"^0.1.0\" }),\n ...(config.modules.includes(\"landing\") && {\n \"@saas-kit/landing\": \"^0.1.0\",\n }),\n next: \"^14.0.0\",\n react: \"^18.0.0\",\n \"react-dom\": \"^18.0.0\",\n \"next-auth\": \"^5.0.0-beta.0\",\n },\n devDependencies: {\n \"@types/node\": \"^20\",\n \"@types/react\": \"^18\",\n \"@types/react-dom\": \"^18\",\n typescript: \"^5\",\n prisma: \"^5.0.0\",\n tailwindcss: \"^3.4.0\",\n postcss: \"^8.4.0\",\n autoprefixer: \"^10.4.0\",\n },\n };\n\n await fs.writeJSON(path.join(projectDir, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create basic structure\n await fs.ensureDir(path.join(projectDir, \"src/app\"));\n await fs.ensureDir(path.join(projectDir, \"src/components\"));\n await fs.ensureDir(path.join(projectDir, \"src/lib\"));\n await fs.ensureDir(path.join(projectDir, \"prisma\"));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"esnext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"preserve\",\n incremental: true,\n plugins: [{ name: \"next\" }],\n paths: { \"@/*\": [\"./src/*\"] },\n },\n include: [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n exclude: [\"node_modules\"],\n };\n await fs.writeJSON(path.join(projectDir, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create .env.example\n const envExample = `# Database\nDATABASE_URL=\"postgresql://user:password@localhost:5432/mydb\"\n\n# NextAuth\nAUTH_SECRET=\"your-secret-here\"\nNEXTAUTH_URL=\"http://localhost:3000\"\n\n# Google OAuth\nGOOGLE_CLIENT_ID=\"\"\nGOOGLE_CLIENT_SECRET=\"\"\n\n# GitHub OAuth (if using)\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\n\n# Email (Resend)\nAUTH_RESEND_KEY=\"\"\nEMAIL_FROM=\"noreply@yourdomain.com\"\n\n# Lemon Squeezy (if using payments)\nLEMONSQUEEZY_API_KEY=\"\"\nLEMONSQUEEZY_STORE_ID=\"\"\nLEMONSQUEEZY_WEBHOOK_SECRET=\"\"\n\n# App\nNEXT_PUBLIC_APP_URL=\"http://localhost:3000\"\n`;\n await fs.writeFile(path.join(projectDir, \".env.example\"), envExample);\n\n // Create saas-kit.config.ts\n const configFile = `import { defineConfig } from \"@saas-kit/core\";\n\nexport default defineConfig({\n app: {\n name: \"${name}\",\n url: process.env.NEXT_PUBLIC_APP_URL,\n description: \"Your SaaS application\",\n },\n auth: {\n providers: [${config.providers.map((p: string) => `\"${p}\"`).join(\", \")}],\n pages: {\n signIn: \"/login\",\n error: \"/auth-error\",\n verifyRequest: \"/verify-request\",\n },\n },\n features: {\n payments: ${config.modules.includes(\"payments\")},\n admin: ${config.modules.includes(\"admin\")},\n blog: ${config.modules.includes(\"blog\")},\n },\n theme: {\n defaultTheme: \"system\",\n enableSystem: true,\n },\n});\n`;\n await fs.writeFile(path.join(projectDir, \"saas-kit.config.ts\"), configFile);\n\n // Create basic layout\n const layoutFile = `import { SaasKitProvider } from \"@saas-kit/core/providers\";\nimport \"./globals.css\";\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body>\n <SaasKitProvider>\n {children}\n </SaasKitProvider>\n </body>\n </html>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/layout.tsx\"),\n layoutFile\n );\n\n // Create globals.css\n const globalsCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n:root {\n --background: 0 0% 100%;\n --foreground: 222.2 47.4% 11.2%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n}\n\n.dark {\n --background: 224 71% 4%;\n --foreground: 213 31% 91%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 1.2%;\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/globals.css\"),\n globalsCss\n );\n\n // Create basic page\n const pageTsx = `export default function Home() {\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n <h1 className=\"text-4xl font-bold\">Welcome to ${name}</h1>\n <p className=\"mt-4 text-muted-foreground\">\n Your SaaS application is ready!\n </p>\n </main>\n );\n}\n`;\n await fs.writeFile(path.join(projectDir, \"src/app/page.tsx\"), pageTsx);\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n darkMode: [\"class\"],\n content: [\n \"./src/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./node_modules/@saas-kit/*/dist/**/*.{js,ts,jsx,tsx}\",\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n};\n`;\n await fs.writeFile(\n path.join(projectDir, \"tailwind.config.js\"),\n tailwindConfig\n );\n\n // Create postcss.config.js\n const postcssConfig = `module.exports = {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};\n`;\n await fs.writeFile(\n path.join(projectDir, \"postcss.config.js\"),\n postcssConfig\n );\n\n // Create next.config.js\n const nextConfig = `/** @type {import('next').NextConfig} */\nconst nextConfig = {\n experimental: {\n serverActions: true,\n },\n};\n\nmodule.exports = nextConfig;\n`;\n await fs.writeFile(path.join(projectDir, \"next.config.js\"), nextConfig);\n\n // Create .gitignore\n const gitignore = `# dependencies\nnode_modules\n.pnpm-store\n\n# next.js\n.next/\nout/\n\n# production\nbuild\ndist\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n`;\n await fs.writeFile(path.join(projectDir, \".gitignore\"), gitignore);\n\n spinner.succeed(\"Project created successfully!\");\n\n // Print next steps\n logger.log(\"\");\n logger.log(chalk.bold(\"Next steps:\"));\n logger.log(\"\");\n logger.log(chalk.cyan(` cd ${name}`));\n logger.log(chalk.cyan(\" npm install\"));\n logger.log(chalk.cyan(\" cp .env.example .env.local\"));\n logger.log(chalk.cyan(\" # Edit .env.local with your credentials\"));\n logger.log(chalk.cyan(\" npm run dev\"));\n logger.log(\"\");\n logger.success(\"Happy building!\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n logger.error(String(error));\n process.exit(1);\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ntype Module = \"payments\" | \"admin\" | \"blog\" | \"landing\";\n\nconst moduleInfo: Record<\n Module,\n { name: string; package: string; description: string }\n> = {\n payments: {\n name: \"Payments\",\n package: \"@saas-kit/payments\",\n description: \"Lemon Squeezy integration for subscriptions and payments\",\n },\n admin: {\n name: \"Admin Panel\",\n package: \"@saas-kit/admin\",\n description: \"Admin dashboard components and layouts\",\n },\n blog: {\n name: \"Blog\",\n package: \"@saas-kit/blog\",\n description: \"MDX-powered blog with components\",\n },\n landing: {\n name: \"Landing Pages\",\n package: \"@saas-kit/landing\",\n description: \"Marketing page components (Hero, Features, Pricing, etc.)\",\n },\n};\n\nexport async function add(moduleName?: string) {\n // Check if we're in a project directory\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n if (!(await fs.pathExists(packageJsonPath))) {\n logger.error(\"No package.json found. Are you in a project directory?\");\n process.exit(1);\n }\n\n let module = moduleName as Module | undefined;\n\n if (!module) {\n const { selectedModule } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"selectedModule\",\n message: \"Which module would you like to add?\",\n choices: Object.entries(moduleInfo).map(([key, value]) => ({\n name: `${value.name} - ${value.description}`,\n value: key,\n })),\n },\n ]);\n module = selectedModule as Module;\n }\n\n if (!moduleInfo[module]) {\n logger.error(`Unknown module: ${module}`);\n logger.info(\n `Available modules: ${Object.keys(moduleInfo).join(\", \")}`\n );\n process.exit(1);\n }\n\n const info = moduleInfo[module];\n const spinner = ora(`Adding ${info.name} module...`).start();\n\n try {\n // Read package.json\n const packageJson = await fs.readJSON(packageJsonPath);\n\n // Check if already installed\n if (\n packageJson.dependencies?.[info.package] ||\n packageJson.devDependencies?.[info.package]\n ) {\n spinner.warn(`${info.name} is already installed`);\n return;\n }\n\n // Add dependency\n packageJson.dependencies = packageJson.dependencies || {};\n packageJson.dependencies[info.package] = \"^0.1.0\";\n\n // Write package.json\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n\n spinner.succeed(`Added ${info.name} module`);\n\n // Print usage instructions\n logger.log(\"\");\n logger.log(chalk.bold(`Usage example for ${info.name}:`));\n logger.log(\"\");\n\n switch (module) {\n case \"payments\":\n logger.log(chalk.cyan(`import { createCheckoutUrl, createWebhookHandler } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Create a checkout URL\");\n logger.log(\"const url = await createCheckoutUrl({\");\n logger.log(' variantId: \"your-variant-id\",');\n logger.log(\" email: user.email,\");\n logger.log(\" userId: user.id,\");\n logger.log(\"});\");\n break;\n case \"admin\":\n logger.log(chalk.cyan(`import { AdminLayout, StatsCard } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Use in your admin pages\");\n logger.log(\"<AdminLayout user={user}>\");\n logger.log(\" <StatsCard title=\\\"Users\\\" value={1234} />\");\n logger.log(\"</AdminLayout>\");\n break;\n case \"blog\":\n logger.log(chalk.cyan(`import { getAllPosts, PostCard } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Get all blog posts\");\n logger.log(\"const posts = getAllPosts();\");\n break;\n case \"landing\":\n logger.log(chalk.cyan(`import { Hero, Features, Pricing } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Build your landing page\");\n logger.log(\"<Hero title=\\\"...\\\" subtitle=\\\"...\\\" />\");\n logger.log(\"<Features features={[...]} />\");\n logger.log(\"<Pricing plans={[...]} />\");\n break;\n }\n\n logger.log(\"\");\n logger.log(chalk.yellow(\"Don't forget to run: npm install\"));\n logger.log(\"\");\n } catch (error) {\n spinner.fail(`Failed to add ${info.name} module`);\n logger.error(String(error));\n process.exit(1);\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ntype GenerateType = \"auth\" | \"dashboard\" | \"api\";\n\nconst generators: Record<\n GenerateType,\n { name: string; description: string; files: string[] }\n> = {\n auth: {\n name: \"Auth Routes\",\n description: \"Login, signup, and verify-request pages\",\n files: [\"login/page.tsx\", \"signup/page.tsx\", \"verify-request/page.tsx\", \"auth-error/page.tsx\"],\n },\n dashboard: {\n name: \"Dashboard Routes\",\n description: \"Dashboard layout and basic pages\",\n files: [\"dashboard/layout.tsx\", \"dashboard/page.tsx\", \"dashboard/settings/page.tsx\"],\n },\n api: {\n name: \"API Routes\",\n description: \"Auth and webhook API routes\",\n files: [\"api/auth/[...nextauth]/route.ts\", \"api/webhooks/lemonsqueezy/route.ts\"],\n },\n};\n\nexport async function generate(type?: string) {\n let selectedType = type as GenerateType | undefined;\n\n if (!selectedType) {\n const { generatorType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"generatorType\",\n message: \"What would you like to generate?\",\n choices: Object.entries(generators).map(([key, value]) => ({\n name: `${value.name} - ${value.description}`,\n value: key,\n })),\n },\n ]);\n selectedType = generatorType as GenerateType;\n }\n\n if (!generators[selectedType]) {\n logger.error(`Unknown generator: ${selectedType}`);\n logger.info(`Available generators: ${Object.keys(generators).join(\", \")}`);\n process.exit(1);\n }\n\n const generator = generators[selectedType];\n const spinner = ora(`Generating ${generator.name}...`).start();\n\n try {\n const appDir = path.join(process.cwd(), \"src/app\");\n\n // Check if app directory exists\n if (!(await fs.pathExists(appDir))) {\n await fs.ensureDir(appDir);\n }\n\n for (const file of generator.files) {\n const filePath = path.join(appDir, file);\n const dirPath = path.dirname(filePath);\n\n await fs.ensureDir(dirPath);\n\n // Generate file content based on type\n const content = generateFileContent(selectedType, file);\n await fs.writeFile(filePath, content);\n }\n\n spinner.succeed(`Generated ${generator.name}`);\n\n logger.log(\"\");\n logger.log(chalk.bold(\"Files created:\"));\n for (const file of generator.files) {\n logger.log(chalk.cyan(` src/app/${file}`));\n }\n logger.log(\"\");\n } catch (error) {\n spinner.fail(`Failed to generate ${generator.name}`);\n logger.error(String(error));\n process.exit(1);\n }\n}\n\nfunction generateFileContent(type: GenerateType, file: string): string {\n if (type === \"auth\") {\n if (file.includes(\"login\")) {\n return `import { AuthForm } from \"@saas-kit/core/components/auth\";\n\nexport default function LoginPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8\">\n <AuthForm mode=\"login\" />\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"signup\")) {\n return `import { AuthForm } from \"@saas-kit/core/components/auth\";\n\nexport default function SignupPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8\">\n <AuthForm mode=\"signup\" />\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"verify-request\")) {\n return `export default function VerifyRequestPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8 text-center\">\n <h1 className=\"text-2xl font-bold\">Check your email</h1>\n <p className=\"mt-4 text-muted-foreground\">\n A sign in link has been sent to your email address.\n </p>\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"auth-error\")) {\n return `export default function AuthErrorPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8 text-center\">\n <h1 className=\"text-2xl font-bold text-destructive\">Authentication Error</h1>\n <p className=\"mt-4 text-muted-foreground\">\n There was an error signing you in. Please try again.\n </p>\n </div>\n </div>\n );\n}\n`;\n }\n }\n\n if (type === \"dashboard\") {\n if (file.includes(\"layout\")) {\n return `import { DashboardLayout } from \"@saas-kit/core/components/dashboard\";\nimport { UserButton } from \"@saas-kit/core/components/auth\";\nimport { LayoutDashboard, Settings, User } from \"lucide-react\";\n\nconst sidebarConfig = [\n {\n title: \"Overview\",\n items: [\n { title: \"Dashboard\", href: \"/dashboard\", icon: LayoutDashboard },\n ],\n },\n {\n title: \"Settings\",\n items: [\n { title: \"Profile\", href: \"/dashboard/settings\", icon: User },\n { title: \"Settings\", href: \"/dashboard/settings\", icon: Settings },\n ],\n },\n];\n\nexport default function DashboardLayoutPage({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <DashboardLayout\n sidebarConfig={sidebarConfig}\n headerContent={<UserButton />}\n >\n {children}\n </DashboardLayout>\n );\n}\n`;\n }\n if (file === \"dashboard/page.tsx\") {\n return `export default function DashboardPage() {\n return (\n <div>\n <h1 className=\"text-3xl font-bold\">Dashboard</h1>\n <p className=\"mt-2 text-muted-foreground\">Welcome to your dashboard.</p>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"settings\")) {\n return `export default function SettingsPage() {\n return (\n <div>\n <h1 className=\"text-3xl font-bold\">Settings</h1>\n <p className=\"mt-2 text-muted-foreground\">Manage your account settings.</p>\n </div>\n );\n}\n`;\n }\n }\n\n if (type === \"api\") {\n if (file.includes(\"nextauth\")) {\n return `import NextAuth from \"next-auth\";\nimport { createAuthConfig } from \"@saas-kit/core\";\nimport { PrismaAdapter } from \"@auth/prisma-adapter\";\nimport { prisma } from \"@/lib/prisma\";\n\nconst authConfig = createAuthConfig({\n adapter: PrismaAdapter(prisma),\n providers: [\"google\", \"email\"],\n callbacks: {\n getUserRole: async (userId) => {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: { role: true },\n });\n return user?.role || \"USER\";\n },\n },\n});\n\nconst handler = NextAuth(authConfig);\n\nexport { handler as GET, handler as POST };\n`;\n }\n if (file.includes(\"lemonsqueezy\")) {\n return `import { createWebhookHandler } from \"@saas-kit/payments\";\nimport { prisma } from \"@/lib/prisma\";\n\nexport const POST = createWebhookHandler({\n onSubscriptionCreated: async (event) => {\n const userId = event.meta.custom_data?.user_id;\n if (!userId) return;\n\n await prisma.subscription.create({\n data: {\n userId,\n lemonSqueezyId: event.data.id,\n status: event.data.attributes.status,\n // ... other fields\n },\n });\n },\n onSubscriptionUpdated: async (event) => {\n await prisma.subscription.update({\n where: { lemonSqueezyId: event.data.id },\n data: { status: event.data.attributes.status },\n });\n },\n});\n`;\n }\n }\n\n return \"// Generated file\\n\";\n}\n"],"mappings":"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","names":["chalk","chalk","fs","path","chalk","ora","inquirer","path","fs","inquirer","ora","chalk","fs","path","chalk","ora","inquirer","inquirer","ora","path","fs","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/logger.ts","../src/commands/init.ts","../src/commands/add.ts","../src/commands/generate.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { printBanner } from \"./utils/logger.js\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { generate } from \"./commands/generate.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"saas-kit\")\n .description(\"CLI tool for scaffolding SaaS Kit projects\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new SaaS Kit project\")\n .option(\"-t, --template <template>\", \"Use a specific template\")\n .option(\"-y, --yes\", \"Use defaults without prompting\")\n .option(\"--product <name>\", \"Product name\")\n .option(\"--description <desc>\", \"Product description\")\n .option(\"--color <color>\", \"Primary color (green, blue, purple, orange, red, indigo)\")\n .action((name, options) => {\n printBanner();\n init(name, options);\n });\n\nprogram\n .command(\"add [module]\")\n .description(\"Add a module to your project (payments, admin, blog, landing)\")\n .action((module) => {\n add(module);\n });\n\nprogram\n .command(\"generate [type]\")\n .alias(\"g\")\n .description(\"Generate routes and files (auth, dashboard, api)\")\n .action((type) => {\n generate(type);\n });\n\nprogram.parse();\n","import chalk from \"chalk\";\n\nexport const logger = {\n info: (message: string) => console.log(chalk.blue(\"info\"), message),\n success: (message: string) => console.log(chalk.green(\"✓\"), message),\n warn: (message: string) => console.log(chalk.yellow(\"⚠\"), message),\n error: (message: string) => console.log(chalk.red(\"✗\"), message),\n log: (message: string) => console.log(message),\n};\n\nexport function printBanner() {\n console.log();\n console.log(chalk.bold.cyan(\" ███████╗ █████╗ █████╗ ███████╗\"));\n console.log(chalk.bold.cyan(\" ██╔════╝██╔══██╗██╔══██╗██╔════╝\"));\n console.log(chalk.bold.cyan(\" ███████╗███████║███████║███████╗\"));\n console.log(chalk.bold.cyan(\" ╚════██║██╔══██║██╔══██║╚════██║\"));\n console.log(chalk.bold.cyan(\" ███████║██║ ██║██║ ██║███████║\"));\n console.log(chalk.bold.cyan(\" ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝\"));\n console.log();\n console.log(chalk.bold(\" SaaS Kit CLI - Build your SaaS faster\"));\n console.log();\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ninterface InitOptions {\n name?: string;\n template?: string;\n yes?: boolean;\n product?: string;\n description?: string;\n color?: string;\n}\n\nexport async function init(projectName?: string, options: InitOptions = {}) {\n logger.log(chalk.bold(\"\\n🚀 Let's create your new SaaS project!\\n\"));\n\n const useDefaults = options.yes;\n\n // Get project name\n let name = projectName;\n if (!name) {\n if (useDefaults) {\n name = \"my-saas-app\";\n } else {\n const answers = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: \"What is your project name?\",\n default: \"my-saas-app\",\n validate: (input: string) => {\n if (/^[a-z0-9-]+$/.test(input)) return true;\n return \"Project name can only contain lowercase letters, numbers, and hyphens\";\n },\n },\n ]);\n name = answers.projectName;\n }\n }\n\n // Get branding\n let branding: { productName: string; description: string; primaryColor: string };\n if (useDefaults) {\n branding = {\n productName: options.product || \"MySaaS\",\n description: options.description || \"The best SaaS for your needs\",\n primaryColor: options.color || \"green\",\n };\n } else {\n branding = await inquirer.prompt([\n {\n type: \"input\",\n name: \"productName\",\n message: \"What is your product name? (e.g., MySaaS)\",\n default: options.product || \"MySaaS\",\n },\n {\n type: \"input\",\n name: \"description\",\n message: \"Short description of your product:\",\n default: options.description || \"The best SaaS for your needs\",\n },\n {\n type: \"list\",\n name: \"primaryColor\",\n message: \"Choose your primary color:\",\n choices: [\n { name: \"Green\", value: \"green\" },\n { name: \"Blue\", value: \"blue\" },\n { name: \"Purple\", value: \"purple\" },\n { name: \"Orange\", value: \"orange\" },\n { name: \"Red\", value: \"red\" },\n { name: \"Indigo\", value: \"indigo\" },\n ],\n default: options.color || \"green\",\n },\n ]);\n }\n\n // Get configuration\n let config: { modules: string[]; providers: string[]; database: string };\n if (useDefaults) {\n config = {\n modules: [\"landing\", \"payments\", \"admin\"],\n providers: [\"google\", \"email\"],\n database: \"postgresql\",\n };\n } else {\n config = await inquirer.prompt([\n {\n type: \"checkbox\",\n name: \"modules\",\n message: \"Which modules would you like to include?\",\n choices: [\n { name: \"Landing Pages\", value: \"landing\", checked: true },\n { name: \"Payments (Lemon Squeezy)\", value: \"payments\", checked: true },\n { name: \"Admin Panel\", value: \"admin\", checked: true },\n { name: \"Blog (MDX)\", value: \"blog\", checked: false },\n ],\n },\n {\n type: \"checkbox\",\n name: \"providers\",\n message: \"Which auth providers do you want?\",\n choices: [\n { name: \"Google\", value: \"google\", checked: true },\n { name: \"GitHub\", value: \"github\", checked: false },\n { name: \"Email (Magic Links)\", value: \"email\", checked: true },\n ],\n },\n {\n type: \"list\",\n name: \"database\",\n message: \"Which database will you use?\",\n choices: [\n { name: \"PostgreSQL\", value: \"postgresql\" },\n { name: \"MySQL\", value: \"mysql\" },\n { name: \"SQLite\", value: \"sqlite\" },\n ],\n default: \"postgresql\",\n },\n ]);\n }\n\n const projectDir = path.resolve(process.cwd(), name!);\n\n // Check if directory exists\n if (await fs.pathExists(projectDir)) {\n if (useDefaults) {\n // In non-interactive mode, fail if directory exists\n logger.error(`Directory ${name} already exists. Use a different name or remove the directory.`);\n process.exit(1);\n }\n const { overwrite } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"overwrite\",\n message: `Directory ${name} already exists. Overwrite?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n logger.info(\"Aborted.\");\n return;\n }\n await fs.remove(projectDir);\n }\n\n const spinner = ora(\"Creating project...\").start();\n\n try {\n // Create project directory\n await fs.ensureDir(projectDir);\n\n // Create package.json\n const packageJson = {\n name: name,\n version: \"0.1.0\",\n private: true,\n scripts: {\n dev: \"next dev\",\n build: \"next build\",\n start: \"next start\",\n lint: \"next lint\",\n \"db:push\": \"prisma db push\",\n \"db:generate\": \"prisma generate\",\n \"db:studio\": \"prisma studio\",\n },\n dependencies: {\n \"@victusvinceere/saas-core\": \"latest\",\n ...(config.modules.includes(\"payments\") && {\n \"@victusvinceere/saas-payments\": \"latest\",\n }),\n ...(config.modules.includes(\"admin\") && {\n \"@victusvinceere/saas-admin\": \"latest\",\n }),\n ...(config.modules.includes(\"blog\") && {\n \"@victusvinceere/saas-blog\": \"latest\",\n }),\n ...(config.modules.includes(\"landing\") && {\n \"@victusvinceere/saas-landing\": \"latest\",\n }),\n next: \"^15.0.0\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"next-auth\": \"^5.0.0-beta.30\",\n \"@auth/prisma-adapter\": \"^2.0.0\",\n \"@prisma/client\": \"^6.0.0\",\n \"lucide-react\": \"^0.460.0\",\n \"@radix-ui/react-accordion\": \"^1.2.0\",\n \"@radix-ui/react-avatar\": \"^1.1.0\",\n \"@radix-ui/react-dropdown-menu\": \"^2.1.0\",\n \"@radix-ui/react-label\": \"^2.1.0\",\n \"@radix-ui/react-select\": \"^2.1.0\",\n \"@radix-ui/react-slot\": \"^1.1.0\",\n \"class-variance-authority\": \"^0.7.0\",\n clsx: \"^2.1.0\",\n \"tailwind-merge\": \"^2.5.0\",\n \"tailwindcss-animate\": \"^1.0.7\",\n },\n devDependencies: {\n \"@types/node\": \"^22\",\n \"@types/react\": \"^19\",\n \"@types/react-dom\": \"^19\",\n typescript: \"^5\",\n prisma: \"^6.0.0\",\n tailwindcss: \"^3.4.0\",\n postcss: \"^8.4.0\",\n autoprefixer: \"^10.4.0\",\n },\n };\n\n await fs.writeJSON(path.join(projectDir, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create basic structure\n await fs.ensureDir(path.join(projectDir, \"src/app/(auth)/login\"));\n await fs.ensureDir(path.join(projectDir, \"src/app/(auth)/signup\"));\n await fs.ensureDir(path.join(projectDir, \"src/app/(auth)/signout\"));\n await fs.ensureDir(path.join(projectDir, \"src/app/api/waitlist\"));\n await fs.ensureDir(path.join(projectDir, \"src/app/dashboard\"));\n await fs.ensureDir(path.join(projectDir, \"src/components/ui\"));\n await fs.ensureDir(path.join(projectDir, \"src/config\"));\n await fs.ensureDir(path.join(projectDir, \"src/lib\"));\n await fs.ensureDir(path.join(projectDir, \"prisma\"));\n await fs.ensureDir(path.join(projectDir, \"public\"));\n\n // Create site config\n const siteConfig = `export const siteConfig = {\n // Branding\n name: \"${branding.productName}\",\n description: \"${branding.description}\",\n\n // Theme\n theme: {\n primary: \"${branding.primaryColor}\",\n },\n\n // Navigation\n navigation: [\n { label: \"Features\", href: \"#features\" },\n { label: \"Pricing\", href: \"#pricing\" },\n { label: \"FAQ\", href: \"#faq\" },\n ],\n\n // Hero Section\n hero: {\n badge: \"Now in Beta · Early Access\",\n title: \"Your Amazing Product\",\n highlight: \"Headline\",\n description: \"${branding.description}\",\n cta: {\n primary: { label: \"Get Started\", href: \"#waitlist\" },\n secondary: { label: \"Learn More\", href: \"#features\" },\n },\n },\n\n // Features\n features: [\n {\n icon: \"Zap\",\n title: \"Lightning Fast\",\n description: \"Built for speed and performance.\",\n },\n {\n icon: \"Shield\",\n title: \"Secure by Default\",\n description: \"Enterprise-grade security out of the box.\",\n },\n {\n icon: \"Clock\",\n title: \"Save Time\",\n description: \"Automate repetitive tasks and focus on what matters.\",\n },\n {\n icon: \"CheckCircle\",\n title: \"Easy to Use\",\n description: \"Intuitive interface that anyone can master.\",\n },\n ],\n\n // Pricing\n pricing: {\n title: \"Simple, Transparent Pricing\",\n subtitle: \"Choose the plan that fits your needs\",\n plans: [\n {\n name: \"Starter\",\n price: 29,\n period: \"mo\",\n description: \"Perfect for individuals\",\n features: [\"Feature 1\", \"Feature 2\", \"Feature 3\", \"Email support\"],\n cta: { label: \"Get Started\", href: \"#waitlist\" },\n highlighted: false,\n },\n {\n name: \"Pro\",\n price: 79,\n period: \"mo\",\n description: \"For growing teams\",\n features: [\"Everything in Starter\", \"Feature 4\", \"Feature 5\", \"Priority support\"],\n cta: { label: \"Get Started\", href: \"#waitlist\" },\n highlighted: true,\n },\n ],\n },\n\n // FAQ\n faq: [\n {\n question: \"What is ${branding.productName}?\",\n answer: \"${branding.description}\",\n },\n {\n question: \"How does it work?\",\n answer: \"Sign up, configure your settings, and start using the platform immediately.\",\n },\n {\n question: \"Can I cancel anytime?\",\n answer: \"Yes, you can cancel your subscription at any time with no questions asked.\",\n },\n {\n question: \"Do you offer refunds?\",\n answer: \"Yes, we offer a 30-day money-back guarantee.\",\n },\n ],\n\n // Testimonials\n testimonials: [\n {\n quote: \"This product has completely transformed how we work!\",\n author: \"Jane Smith\",\n role: \"CEO\",\n company: \"TechCorp\",\n initial: \"J\",\n color: \"from-${branding.primaryColor}-400 to-${branding.primaryColor}-600\",\n },\n {\n quote: \"The best investment we've made this year.\",\n author: \"John Doe\",\n role: \"Product Manager\",\n company: \"StartupXYZ\",\n initial: \"J\",\n color: \"from-blue-400 to-blue-600\",\n },\n {\n quote: \"Simple, intuitive, and powerful.\",\n author: \"Sarah Johnson\",\n role: \"Founder\",\n company: \"GrowthCo\",\n initial: \"S\",\n color: \"from-purple-400 to-purple-600\",\n },\n ],\n\n // Waitlist\n waitlist: {\n title: \"Join the Waitlist\",\n description: \"Be the first to know when we launch. Early adopters get exclusive pricing.\",\n badge: \"Early Access\",\n submitText: \"Join Waitlist\",\n successMessage: \"You're on the list! We'll notify you when we launch.\",\n businessTypes: [\n { value: \"startup\", label: \"Startup\" },\n { value: \"small_business\", label: \"Small Business\" },\n { value: \"enterprise\", label: \"Enterprise\" },\n { value: \"agency\", label: \"Agency\" },\n { value: \"freelancer\", label: \"Freelancer\" },\n { value: \"other\", label: \"Other\" },\n ],\n },\n\n // Footer\n footer: {\n copyright: \"${branding.productName}\",\n links: [\n { label: \"Privacy Policy\", href: \"/privacy\" },\n { label: \"Terms of Service\", href: \"/terms\" },\n { label: \"Contact\", href: \"mailto:hello@example.com\" },\n ],\n },\n\n // Auth\n auth: {\n providers: [${config.providers.map((p: string) => `\"${p}\"`).join(\", \")}],\n redirectAfterLogin: \"/dashboard\",\n },\n\n // Links\n links: {\n demo: \"/login\",\n login: \"/login\",\n signup: \"/signup\",\n dashboard: \"/dashboard\",\n },\n} as const;\n\nexport type SiteConfig = typeof siteConfig;\n`;\n await fs.writeFile(path.join(projectDir, \"src/config/site.ts\"), siteConfig);\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"esnext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"preserve\",\n incremental: true,\n plugins: [{ name: \"next\" }],\n paths: { \"@/*\": [\"./src/*\"] },\n },\n include: [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n exclude: [\"node_modules\"],\n };\n await fs.writeJSON(path.join(projectDir, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create .env.example\n const envExample = `# Database\nDATABASE_URL=\"${config.database === \"sqlite\" ? \"file:./dev.db\" : `${config.database}://user:password@localhost:5432/mydb`}\"\n\n# NextAuth\nAUTH_SECRET=\"your-secret-here\"\nNEXTAUTH_URL=\"http://localhost:3000\"\n\n# Google OAuth\nGOOGLE_CLIENT_ID=\"\"\nGOOGLE_CLIENT_SECRET=\"\"\n\n# GitHub OAuth (if using)\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\n\n# Email (Resend)\nAUTH_RESEND_KEY=\"\"\nEMAIL_FROM=\"noreply@yourdomain.com\"\n\n# Lemon Squeezy (if using payments)\nLEMONSQUEEZY_API_KEY=\"\"\nLEMONSQUEEZY_STORE_ID=\"\"\nLEMONSQUEEZY_WEBHOOK_SECRET=\"\"\n\n# App\nNEXT_PUBLIC_APP_URL=\"http://localhost:3000\"\n`;\n await fs.writeFile(path.join(projectDir, \".env.example\"), envExample);\n\n // Create root layout\n const layoutFile = `import type { Metadata } from \"next\";\nimport { Inter } from \"next/font/google\";\nimport \"./globals.css\";\nimport { siteConfig } from \"@/config/site\";\n\nconst inter = Inter({ subsets: [\"latin\"] });\n\nexport const metadata: Metadata = {\n title: siteConfig.name,\n description: siteConfig.description,\n};\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body className={inter.className}>\n {children}\n </body>\n </html>\n );\n}\n`;\n await fs.writeFile(path.join(projectDir, \"src/app/layout.tsx\"), layoutFile);\n\n // Create globals.css with color variables\n const globalsCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 142.1 76.2% 36.3%;\n --primary-foreground: 355.7 100% 97.3%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 142.1 76.2% 36.3%;\n --radius: 0.5rem;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 142.1 76.2% 36.3%;\n --primary-foreground: 355.7 100% 97.3%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 142.1 76.2% 36.3%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n`;\n await fs.writeFile(path.join(projectDir, \"src/app/globals.css\"), globalsCss);\n\n // Create landing page\n const hasLanding = config.modules.includes(\"landing\");\n const pageTsx = hasLanding\n ? `\"use client\";\n\nimport { siteConfig } from \"@/config/site\";\nimport {\n Navbar,\n Hero,\n Features,\n Pricing,\n Faq,\n Testimonials,\n Waitlist,\n Footer,\n} from \"@victusvinceere/saas-landing/components\";\n\nexport default function Home() {\n return (\n <div className=\"min-h-screen\">\n <Navbar\n brand={siteConfig.name}\n links={siteConfig.navigation}\n cta={{ label: \"Get Started\", href: \"#waitlist\" }}\n />\n\n <Hero\n badge={siteConfig.hero.badge}\n title={siteConfig.hero.title}\n highlight={siteConfig.hero.highlight}\n description={siteConfig.hero.description}\n primaryCta={siteConfig.hero.cta.primary}\n secondaryCta={siteConfig.hero.cta.secondary}\n />\n\n <Features\n title=\"Features\"\n subtitle=\"Everything you need to succeed\"\n features={siteConfig.features}\n />\n\n <Pricing\n title={siteConfig.pricing.title}\n subtitle={siteConfig.pricing.subtitle}\n plans={siteConfig.pricing.plans}\n />\n\n <Testimonials\n title=\"What Our Customers Say\"\n testimonials={siteConfig.testimonials}\n />\n\n <Faq\n title=\"Frequently Asked Questions\"\n items={siteConfig.faq}\n />\n\n <Waitlist\n title={siteConfig.waitlist.title}\n description={siteConfig.waitlist.description}\n badge={siteConfig.waitlist.badge}\n submitText={siteConfig.waitlist.submitText}\n successMessage={siteConfig.waitlist.successMessage}\n businessTypes={siteConfig.waitlist.businessTypes}\n />\n\n <Footer\n brand={siteConfig.name}\n links={siteConfig.footer.links}\n copyright={\\`© \\${new Date().getFullYear()} \\${siteConfig.footer.copyright}. All rights reserved.\\`}\n />\n </div>\n );\n}\n`\n : `export default function Home() {\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n <h1 className=\"text-4xl font-bold\">Welcome to ${name}</h1>\n <p className=\"mt-4 text-muted-foreground\">\n Your SaaS application is ready!\n </p>\n </main>\n );\n}\n`;\n await fs.writeFile(path.join(projectDir, \"src/app/page.tsx\"), pageTsx);\n\n // Create login page\n const loginPage = `\"use client\";\n\nimport { signIn } from \"next-auth/react\";\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { siteConfig } from \"@/config/site\";\n\nexport default function LoginPage() {\n const [email, setEmail] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [emailSent, setEmailSent] = useState(false);\n\n const handleMagicLink = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n await signIn(\"resend\", { email, callbackUrl: siteConfig.auth.redirectAfterLogin });\n setEmailSent(true);\n setLoading(false);\n };\n\n if (emailSent) {\n return (\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"w-full max-w-md text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Check your email</h1>\n <p className=\"text-muted-foreground\">\n We sent a magic link to <strong>{email}</strong>\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"w-full max-w-md space-y-6\">\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold\">Welcome back</h1>\n <p className=\"text-muted-foreground\">Sign in to your account</p>\n </div>\n\n <div className=\"space-y-4\">\n <button\n onClick={() => signIn(\"google\", { callbackUrl: siteConfig.auth.redirectAfterLogin })}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border px-4 py-3 hover:bg-muted\"\n >\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\">\n <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\n <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\n </svg>\n Continue with Google\n </button>\n\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <span className=\"w-full border-t\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">Or continue with</span>\n </div>\n </div>\n\n <form onSubmit={handleMagicLink} className=\"space-y-4\">\n <input\n type=\"email\"\n placeholder=\"email@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n className=\"w-full rounded-lg border px-4 py-3 focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full rounded-lg bg-primary px-4 py-3 text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {loading ? \"Sending...\" : \"Send Magic Link\"}\n </button>\n </form>\n </div>\n\n <p className=\"text-center text-sm text-muted-foreground\">\n Don't have an account?{\" \"}\n <Link href=\"/signup\" className=\"text-primary hover:underline\">\n Sign up\n </Link>\n </p>\n </div>\n </div>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/(auth)/login/page.tsx\"),\n loginPage\n );\n\n // Create signup page\n const signupPage = `\"use client\";\n\nimport { signIn } from \"next-auth/react\";\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { siteConfig } from \"@/config/site\";\n\nexport default function SignupPage() {\n const [email, setEmail] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [emailSent, setEmailSent] = useState(false);\n\n const handleMagicLink = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n await signIn(\"resend\", { email, callbackUrl: siteConfig.auth.redirectAfterLogin });\n setEmailSent(true);\n setLoading(false);\n };\n\n if (emailSent) {\n return (\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"w-full max-w-md text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Check your email</h1>\n <p className=\"text-muted-foreground\">\n We sent a magic link to <strong>{email}</strong>\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"w-full max-w-md space-y-6\">\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold\">Create an account</h1>\n <p className=\"text-muted-foreground\">Get started with {siteConfig.name}</p>\n </div>\n\n <div className=\"space-y-4\">\n <button\n onClick={() => signIn(\"google\", { callbackUrl: siteConfig.auth.redirectAfterLogin })}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border px-4 py-3 hover:bg-muted\"\n >\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\">\n <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\n <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\n </svg>\n Continue with Google\n </button>\n\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <span className=\"w-full border-t\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">Or continue with</span>\n </div>\n </div>\n\n <form onSubmit={handleMagicLink} className=\"space-y-4\">\n <input\n type=\"email\"\n placeholder=\"email@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n className=\"w-full rounded-lg border px-4 py-3 focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full rounded-lg bg-primary px-4 py-3 text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {loading ? \"Sending...\" : \"Send Magic Link\"}\n </button>\n </form>\n </div>\n\n <p className=\"text-center text-sm text-muted-foreground\">\n Already have an account?{\" \"}\n <Link href=\"/login\" className=\"text-primary hover:underline\">\n Sign in\n </Link>\n </p>\n </div>\n </div>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/(auth)/signup/page.tsx\"),\n signupPage\n );\n\n // Create signout page\n const signoutPage = `\"use client\";\n\nimport { signOut } from \"next-auth/react\";\nimport Link from \"next/link\";\nimport { siteConfig } from \"@/config/site\";\n\nexport default function SignOutPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"w-full max-w-md space-y-6 text-center\">\n <div>\n <h1 className=\"text-2xl font-bold\">Sign out</h1>\n <p className=\"text-muted-foreground mt-2\">\n Are you sure you want to sign out?\n </p>\n </div>\n\n <div className=\"space-y-3\">\n <button\n onClick={() => signOut({ callbackUrl: \"/\" })}\n className=\"w-full rounded-lg bg-destructive px-4 py-3 text-destructive-foreground hover:bg-destructive/90\"\n >\n Yes, sign me out\n </button>\n <Link\n href={siteConfig.links.dashboard}\n className=\"block w-full rounded-lg border px-4 py-3 hover:bg-muted\"\n >\n Cancel, go back\n </Link>\n </div>\n </div>\n </div>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/(auth)/signout/page.tsx\"),\n signoutPage\n );\n\n // Create dashboard page\n const dashboardPage = `export default function DashboardPage() {\n return (\n <div className=\"p-8\">\n <h1 className=\"text-2xl font-bold mb-6\">Dashboard</h1>\n <p className=\"text-muted-foreground\">\n Welcome to your dashboard. Start building your product here.\n </p>\n </div>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/dashboard/page.tsx\"),\n dashboardPage\n );\n\n // Create dashboard layout\n const dashboardLayout = `import Link from \"next/link\";\n\nexport default function DashboardLayout({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <div className=\"min-h-screen bg-muted/30\">\n <nav className=\"border-b bg-background px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xl font-bold\">Dashboard</span>\n <Link\n href=\"/signout\"\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n >\n Sign out\n </Link>\n </div>\n </nav>\n <main>{children}</main>\n </div>\n );\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/dashboard/layout.tsx\"),\n dashboardLayout\n );\n\n // Create waitlist API route\n const waitlistRoute = `import { NextResponse } from \"next/server\";\n\nexport async function POST(request: Request) {\n try {\n const body = await request.json();\n const { email, name, businessType } = body;\n\n if (!email || !name) {\n return NextResponse.json(\n { error: \"Email and name are required\" },\n { status: 400 }\n );\n }\n\n // TODO: Save to database\n // await prisma.waitlistEntry.create({\n // data: { email, name, businessType },\n // });\n\n console.log(\"Waitlist signup:\", { email, name, businessType });\n\n return NextResponse.json({\n message: \"Successfully joined the waitlist!\",\n });\n } catch (error) {\n console.error(\"Waitlist signup error:\", error);\n return NextResponse.json(\n { error: \"Something went wrong\" },\n { status: 500 }\n );\n }\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"src/app/api/waitlist/route.ts\"),\n waitlistRoute\n );\n\n // Create lib/utils.ts\n const utilsTs = `import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n`;\n await fs.writeFile(path.join(projectDir, \"src/lib/utils.ts\"), utilsTs);\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n darkMode: [\"class\"],\n content: [\n \"./src/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./node_modules/@victusvinceere/saas-*/dist/**/*.{js,ts,jsx,tsx}\",\n ],\n theme: {\n container: {\n center: true,\n padding: \"2rem\",\n screens: {\n \"2xl\": \"1400px\",\n },\n },\n extend: {\n colors: {\n border: \"hsl(var(--border))\",\n input: \"hsl(var(--input))\",\n ring: \"hsl(var(--ring))\",\n background: \"hsl(var(--background))\",\n foreground: \"hsl(var(--foreground))\",\n primary: {\n DEFAULT: \"hsl(var(--primary))\",\n foreground: \"hsl(var(--primary-foreground))\",\n },\n secondary: {\n DEFAULT: \"hsl(var(--secondary))\",\n foreground: \"hsl(var(--secondary-foreground))\",\n },\n destructive: {\n DEFAULT: \"hsl(var(--destructive))\",\n foreground: \"hsl(var(--destructive-foreground))\",\n },\n muted: {\n DEFAULT: \"hsl(var(--muted))\",\n foreground: \"hsl(var(--muted-foreground))\",\n },\n accent: {\n DEFAULT: \"hsl(var(--accent))\",\n foreground: \"hsl(var(--accent-foreground))\",\n },\n popover: {\n DEFAULT: \"hsl(var(--popover))\",\n foreground: \"hsl(var(--popover-foreground))\",\n },\n card: {\n DEFAULT: \"hsl(var(--card))\",\n foreground: \"hsl(var(--card-foreground))\",\n },\n },\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n },\n },\n plugins: [require(\"tailwindcss-animate\")],\n};\n`;\n await fs.writeFile(\n path.join(projectDir, \"tailwind.config.js\"),\n tailwindConfig\n );\n\n // Create postcss.config.js\n const postcssConfig = `module.exports = {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};\n`;\n await fs.writeFile(\n path.join(projectDir, \"postcss.config.js\"),\n postcssConfig\n );\n\n // Create next.config.js\n const nextConfig = `/** @type {import('next').NextConfig} */\nconst nextConfig = {\n transpilePackages: [\n \"@victusvinceere/saas-core\",\n \"@victusvinceere/saas-landing\",\n \"@victusvinceere/saas-admin\",\n \"@victusvinceere/saas-payments\",\n \"@victusvinceere/saas-blog\",\n ],\n};\n\nmodule.exports = nextConfig;\n`;\n await fs.writeFile(path.join(projectDir, \"next.config.js\"), nextConfig);\n\n // Create .gitignore\n const gitignore = `# dependencies\nnode_modules\n.pnpm-store\n\n# next.js\n.next/\nout/\n\n# production\nbuild\ndist\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n`;\n await fs.writeFile(path.join(projectDir, \".gitignore\"), gitignore);\n\n // Create Prisma schema\n const prismaSchema = `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${config.database}\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Account {\n id String @id @default(cuid())\n userId String\n type String\n provider String\n providerAccountId String\n refresh_token String? ${config.database === \"mysql\" ? \"@db.Text\" : config.database === \"postgresql\" ? \"@db.Text\" : \"\"}\n access_token String? ${config.database === \"mysql\" ? \"@db.Text\" : config.database === \"postgresql\" ? \"@db.Text\" : \"\"}\n expires_at Int?\n token_type String?\n scope String?\n id_token String? ${config.database === \"mysql\" ? \"@db.Text\" : config.database === \"postgresql\" ? \"@db.Text\" : \"\"}\n session_state String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([provider, providerAccountId])\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionToken String @unique\n userId String\n expires DateTime\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel User {\n id String @id @default(cuid())\n name String?\n email String? @unique\n emailVerified DateTime?\n image String?\n role String @default(\"USER\")\n accounts Account[]\n sessions Session[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel VerificationToken {\n identifier String\n token String @unique\n expires DateTime\n\n @@unique([identifier, token])\n}\n\nmodel WaitlistEntry {\n id String @id @default(cuid())\n email String @unique\n name String\n businessType String?\n createdAt DateTime @default(now())\n}\n`;\n await fs.writeFile(\n path.join(projectDir, \"prisma/schema.prisma\"),\n prismaSchema\n );\n\n spinner.succeed(\"Project created successfully!\");\n\n // Print next steps\n logger.log(\"\");\n logger.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n logger.log(chalk.bold(\" Next steps:\"));\n logger.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n logger.log(\"\");\n logger.log(chalk.cyan(` cd ${name}`));\n logger.log(chalk.cyan(\" pnpm install\"));\n logger.log(chalk.cyan(\" cp .env.example .env.local\"));\n logger.log(chalk.gray(\" # Edit .env.local with your credentials\"));\n logger.log(chalk.cyan(\" pnpm db:push\"));\n logger.log(chalk.cyan(\" pnpm dev\"));\n logger.log(\"\");\n logger.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n logger.log(chalk.bold(\" Customization:\"));\n logger.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n logger.log(\"\");\n logger.log(chalk.gray(\" • Edit src/config/site.ts to customize content\"));\n logger.log(chalk.gray(\" • Update src/app/page.tsx to modify landing page\"));\n logger.log(chalk.gray(\" • Build features in src/app/dashboard/\"));\n logger.log(\"\");\n logger.success(\"Happy building! 🚀\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n logger.error(String(error));\n process.exit(1);\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ntype Module = \"payments\" | \"admin\" | \"blog\" | \"landing\";\n\nconst moduleInfo: Record<\n Module,\n { name: string; package: string; description: string }\n> = {\n payments: {\n name: \"Payments\",\n package: \"@saas-kit/payments\",\n description: \"Lemon Squeezy integration for subscriptions and payments\",\n },\n admin: {\n name: \"Admin Panel\",\n package: \"@saas-kit/admin\",\n description: \"Admin dashboard components and layouts\",\n },\n blog: {\n name: \"Blog\",\n package: \"@saas-kit/blog\",\n description: \"MDX-powered blog with components\",\n },\n landing: {\n name: \"Landing Pages\",\n package: \"@saas-kit/landing\",\n description: \"Marketing page components (Hero, Features, Pricing, etc.)\",\n },\n};\n\nexport async function add(moduleName?: string) {\n // Check if we're in a project directory\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n if (!(await fs.pathExists(packageJsonPath))) {\n logger.error(\"No package.json found. Are you in a project directory?\");\n process.exit(1);\n }\n\n let module = moduleName as Module | undefined;\n\n if (!module) {\n const { selectedModule } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"selectedModule\",\n message: \"Which module would you like to add?\",\n choices: Object.entries(moduleInfo).map(([key, value]) => ({\n name: `${value.name} - ${value.description}`,\n value: key,\n })),\n },\n ]);\n module = selectedModule as Module;\n }\n\n if (!moduleInfo[module]) {\n logger.error(`Unknown module: ${module}`);\n logger.info(\n `Available modules: ${Object.keys(moduleInfo).join(\", \")}`\n );\n process.exit(1);\n }\n\n const info = moduleInfo[module];\n const spinner = ora(`Adding ${info.name} module...`).start();\n\n try {\n // Read package.json\n const packageJson = await fs.readJSON(packageJsonPath);\n\n // Check if already installed\n if (\n packageJson.dependencies?.[info.package] ||\n packageJson.devDependencies?.[info.package]\n ) {\n spinner.warn(`${info.name} is already installed`);\n return;\n }\n\n // Add dependency\n packageJson.dependencies = packageJson.dependencies || {};\n packageJson.dependencies[info.package] = \"^0.1.0\";\n\n // Write package.json\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n\n spinner.succeed(`Added ${info.name} module`);\n\n // Print usage instructions\n logger.log(\"\");\n logger.log(chalk.bold(`Usage example for ${info.name}:`));\n logger.log(\"\");\n\n switch (module) {\n case \"payments\":\n logger.log(chalk.cyan(`import { createCheckoutUrl, createWebhookHandler } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Create a checkout URL\");\n logger.log(\"const url = await createCheckoutUrl({\");\n logger.log(' variantId: \"your-variant-id\",');\n logger.log(\" email: user.email,\");\n logger.log(\" userId: user.id,\");\n logger.log(\"});\");\n break;\n case \"admin\":\n logger.log(chalk.cyan(`import { AdminLayout, StatsCard } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Use in your admin pages\");\n logger.log(\"<AdminLayout user={user}>\");\n logger.log(\" <StatsCard title=\\\"Users\\\" value={1234} />\");\n logger.log(\"</AdminLayout>\");\n break;\n case \"blog\":\n logger.log(chalk.cyan(`import { getAllPosts, PostCard } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Get all blog posts\");\n logger.log(\"const posts = getAllPosts();\");\n break;\n case \"landing\":\n logger.log(chalk.cyan(`import { Hero, Features, Pricing } from \"${info.package}\";`));\n logger.log(\"\");\n logger.log(\"// Build your landing page\");\n logger.log(\"<Hero title=\\\"...\\\" subtitle=\\\"...\\\" />\");\n logger.log(\"<Features features={[...]} />\");\n logger.log(\"<Pricing plans={[...]} />\");\n break;\n }\n\n logger.log(\"\");\n logger.log(chalk.yellow(\"Don't forget to run: npm install\"));\n logger.log(\"\");\n } catch (error) {\n spinner.fail(`Failed to add ${info.name} module`);\n logger.error(String(error));\n process.exit(1);\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport { logger } from \"../utils/logger.js\";\n\ntype GenerateType = \"auth\" | \"dashboard\" | \"api\";\n\nconst generators: Record<\n GenerateType,\n { name: string; description: string; files: string[] }\n> = {\n auth: {\n name: \"Auth Routes\",\n description: \"Login, signup, and verify-request pages\",\n files: [\"login/page.tsx\", \"signup/page.tsx\", \"verify-request/page.tsx\", \"auth-error/page.tsx\"],\n },\n dashboard: {\n name: \"Dashboard Routes\",\n description: \"Dashboard layout and basic pages\",\n files: [\"dashboard/layout.tsx\", \"dashboard/page.tsx\", \"dashboard/settings/page.tsx\"],\n },\n api: {\n name: \"API Routes\",\n description: \"Auth and webhook API routes\",\n files: [\"api/auth/[...nextauth]/route.ts\", \"api/webhooks/lemonsqueezy/route.ts\"],\n },\n};\n\nexport async function generate(type?: string) {\n let selectedType = type as GenerateType | undefined;\n\n if (!selectedType) {\n const { generatorType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"generatorType\",\n message: \"What would you like to generate?\",\n choices: Object.entries(generators).map(([key, value]) => ({\n name: `${value.name} - ${value.description}`,\n value: key,\n })),\n },\n ]);\n selectedType = generatorType as GenerateType;\n }\n\n if (!generators[selectedType]) {\n logger.error(`Unknown generator: ${selectedType}`);\n logger.info(`Available generators: ${Object.keys(generators).join(\", \")}`);\n process.exit(1);\n }\n\n const generator = generators[selectedType];\n const spinner = ora(`Generating ${generator.name}...`).start();\n\n try {\n const appDir = path.join(process.cwd(), \"src/app\");\n\n // Check if app directory exists\n if (!(await fs.pathExists(appDir))) {\n await fs.ensureDir(appDir);\n }\n\n for (const file of generator.files) {\n const filePath = path.join(appDir, file);\n const dirPath = path.dirname(filePath);\n\n await fs.ensureDir(dirPath);\n\n // Generate file content based on type\n const content = generateFileContent(selectedType, file);\n await fs.writeFile(filePath, content);\n }\n\n spinner.succeed(`Generated ${generator.name}`);\n\n logger.log(\"\");\n logger.log(chalk.bold(\"Files created:\"));\n for (const file of generator.files) {\n logger.log(chalk.cyan(` src/app/${file}`));\n }\n logger.log(\"\");\n } catch (error) {\n spinner.fail(`Failed to generate ${generator.name}`);\n logger.error(String(error));\n process.exit(1);\n }\n}\n\nfunction generateFileContent(type: GenerateType, file: string): string {\n if (type === \"auth\") {\n if (file.includes(\"login\")) {\n return `import { AuthForm } from \"@saas-kit/core/components/auth\";\n\nexport default function LoginPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8\">\n <AuthForm mode=\"login\" />\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"signup\")) {\n return `import { AuthForm } from \"@saas-kit/core/components/auth\";\n\nexport default function SignupPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8\">\n <AuthForm mode=\"signup\" />\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"verify-request\")) {\n return `export default function VerifyRequestPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8 text-center\">\n <h1 className=\"text-2xl font-bold\">Check your email</h1>\n <p className=\"mt-4 text-muted-foreground\">\n A sign in link has been sent to your email address.\n </p>\n </div>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"auth-error\")) {\n return `export default function AuthErrorPage() {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"w-full max-w-md p-8 text-center\">\n <h1 className=\"text-2xl font-bold text-destructive\">Authentication Error</h1>\n <p className=\"mt-4 text-muted-foreground\">\n There was an error signing you in. Please try again.\n </p>\n </div>\n </div>\n );\n}\n`;\n }\n }\n\n if (type === \"dashboard\") {\n if (file.includes(\"layout\")) {\n return `import { DashboardLayout } from \"@saas-kit/core/components/dashboard\";\nimport { UserButton } from \"@saas-kit/core/components/auth\";\nimport { LayoutDashboard, Settings, User } from \"lucide-react\";\n\nconst sidebarConfig = [\n {\n title: \"Overview\",\n items: [\n { title: \"Dashboard\", href: \"/dashboard\", icon: LayoutDashboard },\n ],\n },\n {\n title: \"Settings\",\n items: [\n { title: \"Profile\", href: \"/dashboard/settings\", icon: User },\n { title: \"Settings\", href: \"/dashboard/settings\", icon: Settings },\n ],\n },\n];\n\nexport default function DashboardLayoutPage({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <DashboardLayout\n sidebarConfig={sidebarConfig}\n headerContent={<UserButton />}\n >\n {children}\n </DashboardLayout>\n );\n}\n`;\n }\n if (file === \"dashboard/page.tsx\") {\n return `export default function DashboardPage() {\n return (\n <div>\n <h1 className=\"text-3xl font-bold\">Dashboard</h1>\n <p className=\"mt-2 text-muted-foreground\">Welcome to your dashboard.</p>\n </div>\n );\n}\n`;\n }\n if (file.includes(\"settings\")) {\n return `export default function SettingsPage() {\n return (\n <div>\n <h1 className=\"text-3xl font-bold\">Settings</h1>\n <p className=\"mt-2 text-muted-foreground\">Manage your account settings.</p>\n </div>\n );\n}\n`;\n }\n }\n\n if (type === \"api\") {\n if (file.includes(\"nextauth\")) {\n return `import NextAuth from \"next-auth\";\nimport { createAuthConfig } from \"@saas-kit/core\";\nimport { PrismaAdapter } from \"@auth/prisma-adapter\";\nimport { prisma } from \"@/lib/prisma\";\n\nconst authConfig = createAuthConfig({\n adapter: PrismaAdapter(prisma),\n providers: [\"google\", \"email\"],\n callbacks: {\n getUserRole: async (userId) => {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: { role: true },\n });\n return user?.role || \"USER\";\n },\n },\n});\n\nconst handler = NextAuth(authConfig);\n\nexport { handler as GET, handler as POST };\n`;\n }\n if (file.includes(\"lemonsqueezy\")) {\n return `import { createWebhookHandler } from \"@saas-kit/payments\";\nimport { prisma } from \"@/lib/prisma\";\n\nexport const POST = createWebhookHandler({\n onSubscriptionCreated: async (event) => {\n const userId = event.meta.custom_data?.user_id;\n if (!userId) return;\n\n await prisma.subscription.create({\n data: {\n userId,\n lemonSqueezyId: event.data.id,\n status: event.data.attributes.status,\n // ... other fields\n },\n });\n },\n onSubscriptionUpdated: async (event) => {\n await prisma.subscription.update({\n where: { lemonSqueezyId: event.data.id },\n data: { status: event.data.attributes.status },\n });\n },\n});\n`;\n }\n }\n\n return \"// Generated file\\n\";\n}\n"],"mappings":"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","names":["chalk","chalk","fs","path","chalk","ora","inquirer","path","fs","inquirer","ora","chalk","fs","path","chalk","ora","inquirer","inquirer","ora","path","fs","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@victusvinceere/saas-cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI tool for scaffolding SaaS Kit projects",
5
5
  "bin": {
6
6
  "saas-kit": "./dist/index.js"