servcraft 0.1.5 → 0.1.6
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.
- package/dist/cli/index.cjs +40 -4
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +36 -4
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/add-module.ts +80 -8
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/utils/helpers.ts","../../src/cli/commands/generate.ts","../../src/cli/utils/field-parser.ts","../../src/cli/templates/controller.ts","../../src/cli/templates/service.ts","../../src/cli/templates/repository.ts","../../src/cli/templates/types.ts","../../src/cli/templates/schemas.ts","../../src/cli/templates/routes.ts","../../src/cli/templates/module-index.ts","../../src/cli/templates/prisma-model.ts","../../src/cli/templates/dynamic-types.ts","../../src/cli/templates/dynamic-schemas.ts","../../src/cli/templates/dynamic-prisma.ts","../../src/cli/commands/add-module.ts","../../src/cli/utils/env-manager.ts","../../src/cli/utils/template-manager.ts","../../src/cli/utils/interactive-prompt.ts","../../src/cli/commands/db.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { generateCommand } from './commands/generate.js';\nimport { addModuleCommand } from './commands/add-module.js';\nimport { dbCommand } from './commands/db.js';\n\nconst program = new Command();\n\nprogram\n .name('servcraft')\n .description('Servcraft - A modular Node.js backend framework CLI')\n .version('0.1.0');\n\n// Initialize new project\nprogram.addCommand(initCommand);\n\n// Generate resources (controller, service, model, etc.)\nprogram.addCommand(generateCommand);\n\n// Add pre-built modules\nprogram.addCommand(addModuleCommand);\n\n// Database commands\nprogram.addCommand(dbCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { ensureDir, writeFile, error, warn } from '../utils/helpers.js';\n\ninterface InitOptions {\n name: string;\n language: 'typescript' | 'javascript';\n database: 'postgresql' | 'mysql' | 'sqlite' | 'mongodb' | 'none';\n orm: 'prisma' | 'mongoose' | 'none';\n validator: 'zod' | 'joi' | 'yup';\n features: string[];\n}\n\nexport const initCommand = new Command('init')\n .alias('new')\n .description('Initialize a new Servcraft project')\n .argument('[name]', 'Project name')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--ts, --typescript', 'Use TypeScript (default)')\n .option('--js, --javascript', 'Use JavaScript')\n .option('--db <database>', 'Database type (postgresql, mysql, sqlite, mongodb, none)')\n .action(\n async (\n name?: string,\n cmdOptions?: { yes?: boolean; typescript?: boolean; javascript?: boolean; db?: string }\n ) => {\n console.log(\n chalk.blue(`\n╔═══════════════════════════════════════════╗\n║ ║\n║ ${chalk.bold('🚀 Servcraft Project Generator')} ║\n║ ║\n╚═══════════════════════════════════════════╝\n`)\n );\n\n let options: InitOptions;\n\n if (cmdOptions?.yes) {\n const db = (cmdOptions.db as InitOptions['database']) || 'postgresql';\n options = {\n name: name || 'my-servcraft-app',\n language: cmdOptions.javascript ? 'javascript' : 'typescript',\n database: db,\n orm: db === 'mongodb' ? 'mongoose' : db === 'none' ? 'none' : 'prisma',\n validator: 'zod',\n features: ['auth', 'users', 'email'],\n };\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: name || 'my-servcraft-app',\n validate: (input: string) => {\n if (!/^[a-z0-9-_]+$/i.test(input)) {\n return 'Project name can only contain letters, numbers, hyphens, and underscores';\n }\n return true;\n },\n },\n {\n type: 'list',\n name: 'language',\n message: 'Select language:',\n choices: [\n { name: 'TypeScript (Recommended)', value: 'typescript' },\n { name: 'JavaScript', value: 'javascript' },\n ],\n default: 'typescript',\n },\n {\n type: 'list',\n name: 'database',\n message: 'Select database:',\n choices: [\n { name: 'PostgreSQL (Recommended for SQL)', value: 'postgresql' },\n { name: 'MySQL', value: 'mysql' },\n { name: 'SQLite (Development)', value: 'sqlite' },\n { name: 'MongoDB (NoSQL)', value: 'mongodb' },\n { name: 'None (Add later)', value: 'none' },\n ],\n default: 'postgresql',\n },\n {\n type: 'list',\n name: 'validator',\n message: 'Select validation library:',\n choices: [\n { name: 'Zod (Recommended - TypeScript-first)', value: 'zod' },\n { name: 'Joi (Battle-tested, feature-rich)', value: 'joi' },\n { name: 'Yup (Inspired by Joi, lighter)', value: 'yup' },\n ],\n default: 'zod',\n },\n {\n type: 'checkbox',\n name: 'features',\n message: 'Select features to include:',\n choices: [\n { name: 'Authentication (JWT)', value: 'auth', checked: true },\n { name: 'User Management', value: 'users', checked: true },\n { name: 'Email Service', value: 'email', checked: true },\n { name: 'Audit Logs', value: 'audit', checked: false },\n { name: 'File Upload', value: 'upload', checked: false },\n { name: 'Redis Cache', value: 'redis', checked: false },\n ],\n },\n ]);\n\n // Auto-determine ORM based on database choice\n const db = answers.database as InitOptions['database'];\n options = {\n ...answers,\n orm: db === 'mongodb' ? 'mongoose' : db === 'none' ? 'none' : 'prisma',\n } as InitOptions;\n }\n\n const projectDir = path.resolve(process.cwd(), options.name);\n const spinner = ora('Creating project...').start();\n\n try {\n // Check if directory exists\n try {\n await fs.access(projectDir);\n spinner.stop();\n error(`Directory \"${options.name}\" already exists`);\n return;\n } catch {\n // Directory doesn't exist, continue\n }\n\n // Create project directory\n await ensureDir(projectDir);\n\n spinner.text = 'Generating project files...';\n\n // Generate package.json\n const packageJson = generatePackageJson(options);\n await writeFile(\n path.join(projectDir, 'package.json'),\n JSON.stringify(packageJson, null, 2)\n );\n\n // Generate tsconfig or jsconfig\n if (options.language === 'typescript') {\n await writeFile(path.join(projectDir, 'tsconfig.json'), generateTsConfig());\n await writeFile(path.join(projectDir, 'tsup.config.ts'), generateTsupConfig());\n } else {\n await writeFile(path.join(projectDir, 'jsconfig.json'), generateJsConfig());\n }\n\n // Generate .env files\n await writeFile(path.join(projectDir, '.env.example'), generateEnvExample(options));\n await writeFile(path.join(projectDir, '.env'), generateEnvExample(options));\n\n // Generate .gitignore\n await writeFile(path.join(projectDir, '.gitignore'), generateGitignore());\n\n // Generate Docker files\n await writeFile(path.join(projectDir, 'Dockerfile'), generateDockerfile(options));\n await writeFile(\n path.join(projectDir, 'docker-compose.yml'),\n generateDockerCompose(options)\n );\n\n // Create directory structure\n const ext = options.language === 'typescript' ? 'ts' : 'js';\n const dirs = [\n 'src/core',\n 'src/config',\n 'src/modules',\n 'src/middleware',\n 'src/utils',\n 'src/types',\n 'tests/unit',\n 'tests/integration',\n ];\n\n if (options.orm === 'prisma') {\n dirs.push('prisma');\n }\n if (options.orm === 'mongoose') {\n dirs.push('src/database/models');\n }\n\n for (const dir of dirs) {\n await ensureDir(path.join(projectDir, dir));\n }\n\n // Generate main entry file\n await writeFile(path.join(projectDir, `src/index.${ext}`), generateEntryFile(options));\n\n // Generate core files\n await writeFile(\n path.join(projectDir, `src/core/server.${ext}`),\n generateServerFile(options)\n );\n await writeFile(\n path.join(projectDir, `src/core/logger.${ext}`),\n generateLoggerFile(options)\n );\n\n // Generate database files based on ORM choice\n if (options.orm === 'prisma') {\n await writeFile(\n path.join(projectDir, 'prisma/schema.prisma'),\n generatePrismaSchema(options)\n );\n } else if (options.orm === 'mongoose') {\n await writeFile(\n path.join(projectDir, `src/database/connection.${ext}`),\n generateMongooseConnection(options)\n );\n await writeFile(\n path.join(projectDir, `src/database/models/user.model.${ext}`),\n generateMongooseUserModel(options)\n );\n }\n\n spinner.succeed('Project files generated!');\n\n // Install dependencies\n const installSpinner = ora('Installing dependencies...').start();\n\n try {\n execSync('npm install', { cwd: projectDir, stdio: 'pipe' });\n installSpinner.succeed('Dependencies installed!');\n } catch {\n installSpinner.warn('Failed to install dependencies automatically');\n warn(' Run \"npm install\" manually in the project directory');\n }\n\n // Print success message\n console.log('\\n' + chalk.green('✨ Project created successfully!'));\n console.log('\\n' + chalk.bold('📁 Project structure:'));\n console.log(`\n ${options.name}/\n ├── src/\n │ ├── core/ # Core server, logger\n │ ├── config/ # Configuration\n │ ├── modules/ # Feature modules\n │ ├── middleware/ # Middlewares\n │ ├── utils/ # Utilities\n │ └── index.${ext} # Entry point\n ├── tests/ # Tests\n ├── prisma/ # Database schema\n ├── docker-compose.yml\n └── package.json\n`);\n\n console.log(chalk.bold('🚀 Get started:'));\n console.log(`\n ${chalk.cyan(`cd ${options.name}`)}\n ${options.database !== 'none' ? chalk.cyan('npm run db:push # Setup database') : ''}\n ${chalk.cyan('npm run dev # Start development server')}\n`);\n\n console.log(chalk.bold('📚 Available commands:'));\n console.log(`\n ${chalk.yellow('servcraft generate module <name>')} Generate a new module\n ${chalk.yellow('servcraft generate controller <name>')} Generate a controller\n ${chalk.yellow('servcraft generate service <name>')} Generate a service\n ${chalk.yellow('servcraft add auth')} Add authentication module\n`);\n } catch (err) {\n spinner.fail('Failed to create project');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n );\n\nfunction generatePackageJson(options: InitOptions): Record<string, unknown> {\n const isTS = options.language === 'typescript';\n\n const pkg: Record<string, unknown> = {\n name: options.name,\n version: '0.1.0',\n description: 'A Servcraft application',\n main: isTS ? 'dist/index.js' : 'src/index.js',\n type: 'module',\n scripts: {\n dev: isTS ? 'tsx watch src/index.ts' : 'node --watch src/index.js',\n build: isTS ? 'tsup' : 'echo \"No build needed for JS\"',\n start: isTS ? 'node dist/index.js' : 'node src/index.js',\n test: 'vitest',\n lint: isTS ? 'eslint src --ext .ts' : 'eslint src --ext .js',\n },\n dependencies: {\n fastify: '^4.28.1',\n '@fastify/cors': '^9.0.1',\n '@fastify/helmet': '^11.1.1',\n '@fastify/jwt': '^8.0.1',\n '@fastify/rate-limit': '^9.1.0',\n '@fastify/cookie': '^9.3.1',\n pino: '^9.5.0',\n 'pino-pretty': '^11.3.0',\n bcryptjs: '^2.4.3',\n dotenv: '^16.4.5',\n },\n devDependencies: {\n vitest: '^2.1.8',\n },\n };\n\n // Add validator library based on choice\n switch (options.validator) {\n case 'zod':\n (pkg.dependencies as Record<string, string>).zod = '^3.23.8';\n break;\n case 'joi':\n (pkg.dependencies as Record<string, string>).joi = '^17.13.3';\n break;\n case 'yup':\n (pkg.dependencies as Record<string, string>).yup = '^1.4.0';\n break;\n }\n\n if (isTS) {\n (pkg.devDependencies as Record<string, string>).typescript = '^5.7.2';\n (pkg.devDependencies as Record<string, string>).tsx = '^4.19.2';\n (pkg.devDependencies as Record<string, string>).tsup = '^8.3.5';\n (pkg.devDependencies as Record<string, string>)['@types/node'] = '^22.10.1';\n (pkg.devDependencies as Record<string, string>)['@types/bcryptjs'] = '^2.4.6';\n }\n\n if (options.orm === 'prisma') {\n (pkg.dependencies as Record<string, string>)['@prisma/client'] = '^5.22.0';\n (pkg.devDependencies as Record<string, string>).prisma = '^5.22.0';\n (pkg.scripts as Record<string, string>)['db:generate'] = 'prisma generate';\n (pkg.scripts as Record<string, string>)['db:migrate'] = 'prisma migrate dev';\n (pkg.scripts as Record<string, string>)['db:push'] = 'prisma db push';\n (pkg.scripts as Record<string, string>)['db:studio'] = 'prisma studio';\n }\n\n if (options.orm === 'mongoose') {\n (pkg.dependencies as Record<string, string>).mongoose = '^8.8.4';\n if (isTS) {\n (pkg.devDependencies as Record<string, string>)['@types/mongoose'] = '^5.11.97';\n }\n }\n\n if (options.features.includes('email')) {\n (pkg.dependencies as Record<string, string>).nodemailer = '^6.9.15';\n (pkg.dependencies as Record<string, string>).handlebars = '^4.7.8';\n if (isTS) {\n (pkg.devDependencies as Record<string, string>)['@types/nodemailer'] = '^6.4.17';\n }\n }\n\n if (options.features.includes('redis')) {\n (pkg.dependencies as Record<string, string>).ioredis = '^5.4.1';\n }\n\n return pkg;\n}\n\nfunction generateTsConfig(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n lib: ['ES2022'],\n outDir: './dist',\n rootDir: './src',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n declaration: true,\n sourceMap: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2\n );\n}\n\nfunction generateJsConfig(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n target: 'ES2022',\n checkJs: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules'],\n },\n null,\n 2\n );\n}\n\nfunction generateTsupConfig(): string {\n return `import { defineConfig } from 'tsup';\n\nexport default defineConfig({\n entry: ['src/index.ts'],\n format: ['esm'],\n dts: true,\n clean: true,\n sourcemap: true,\n target: 'node18',\n});\n`;\n}\n\nfunction generateEnvExample(options: InitOptions): string {\n let env = `# Server\nNODE_ENV=development\nPORT=3000\nHOST=0.0.0.0\n\n# JWT\nJWT_SECRET=your-super-secret-key-min-32-characters\nJWT_ACCESS_EXPIRES_IN=15m\nJWT_REFRESH_EXPIRES_IN=7d\n\n# Security\nCORS_ORIGIN=http://localhost:3000\nRATE_LIMIT_MAX=100\n\n# Logging\nLOG_LEVEL=info\n`;\n\n if (options.database === 'postgresql') {\n env += `\n# Database (PostgreSQL)\nDATABASE_PROVIDER=postgresql\nDATABASE_URL=\"postgresql://user:password@localhost:5432/mydb?schema=public\"\n`;\n } else if (options.database === 'mysql') {\n env += `\n# Database (MySQL)\nDATABASE_PROVIDER=mysql\nDATABASE_URL=\"mysql://user:password@localhost:3306/mydb\"\n`;\n } else if (options.database === 'sqlite') {\n env += `\n# Database (SQLite)\nDATABASE_PROVIDER=sqlite\nDATABASE_URL=\"file:./dev.db\"\n`;\n } else if (options.database === 'mongodb') {\n env += `\n# Database (MongoDB)\nMONGODB_URI=\"mongodb://localhost:27017/mydb\"\n`;\n }\n\n if (options.features.includes('email')) {\n env += `\n# Email\nSMTP_HOST=smtp.example.com\nSMTP_PORT=587\nSMTP_USER=\nSMTP_PASS=\nSMTP_FROM=\"App <noreply@example.com>\"\n`;\n }\n\n if (options.features.includes('redis')) {\n env += `\n# Redis\nREDIS_URL=redis://localhost:6379\n`;\n }\n\n return env;\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.env.local\n*.log\ncoverage/\n.DS_Store\n*.db\n`;\n}\n\nfunction generateDockerfile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY ${isTS ? 'dist' : 'src'} ./${isTS ? 'dist' : 'src'}\n${options.database !== 'none' && options.database !== 'mongodb' ? 'COPY prisma ./prisma\\nRUN npx prisma generate' : ''}\nEXPOSE 3000\nCMD [\"node\", \"${isTS ? 'dist' : 'src'}/index.js\"]\n`;\n}\n\nfunction generateDockerCompose(options: InitOptions): string {\n let compose = `version: '3.8'\n\nservices:\n app:\n build: .\n ports:\n - \"\\${PORT:-3000}:3000\"\n environment:\n - NODE_ENV=development\n`;\n\n if (options.database === 'postgresql') {\n compose += ` - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/mydb\n depends_on:\n - postgres\n\n postgres:\n image: postgres:16-alpine\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: mydb\n ports:\n - \"5432:5432\"\n volumes:\n - postgres-data:/var/lib/postgresql/data\n\nvolumes:\n postgres-data:\n`;\n } else if (options.database === 'mysql') {\n compose += ` - DATABASE_URL=mysql://root:root@mysql:3306/mydb\n depends_on:\n - mysql\n\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: mydb\n ports:\n - \"3306:3306\"\n volumes:\n - mysql-data:/var/lib/mysql\n\nvolumes:\n mysql-data:\n`;\n } else if (options.database === 'mongodb') {\n compose += ` - MONGODB_URI=mongodb://mongodb:27017/mydb\n depends_on:\n - mongodb\n\n mongodb:\n image: mongo:7\n environment:\n MONGO_INITDB_DATABASE: mydb\n ports:\n - \"27017:27017\"\n volumes:\n - mongodb-data:/data/db\n\nvolumes:\n mongodb-data:\n`;\n }\n\n if (options.features.includes('redis')) {\n compose += `\n redis:\n image: redis:7-alpine\n ports:\n - \"6379:6379\"\n`;\n }\n\n return compose;\n}\n\nfunction generatePrismaSchema(options: InitOptions): string {\n const provider = options.database === 'sqlite' ? 'sqlite' : options.database;\n\n return `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(uuid())\n email String @unique\n password String\n name String?\n role String @default(\"user\")\n status String @default(\"active\")\n emailVerified Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@map(\"users\")\n}\n`;\n}\n\nfunction generateEntryFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import 'dotenv/config';\\nimport { createServer } from './core/server.js';\\nimport { logger } from './core/logger.js';\" : \"require('dotenv').config();\\nconst { createServer } = require('./core/server.js');\\nconst { logger } = require('./core/logger.js');\"}\n\nasync function main()${isTS ? ': Promise<void>' : ''} {\n const server = createServer();\n\n try {\n await server.start();\n } catch (error) {\n logger.error({ err: error }, 'Failed to start server');\n process.exit(1);\n }\n}\n\nmain();\n`;\n}\n\nfunction generateServerFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${\n isTS\n ? `import Fastify from 'fastify';\nimport type { FastifyInstance } from 'fastify';\nimport { logger } from './logger.js';`\n : `const Fastify = require('fastify');\nconst { logger } = require('./logger.js');`\n }\n\n${isTS ? 'export function createServer(): { instance: FastifyInstance; start: () => Promise<void> }' : 'function createServer()'} {\n const app = Fastify({ logger });\n\n // Health check\n app.get('/health', async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n\n // Graceful shutdown\n const signals${isTS ? ': NodeJS.Signals[]' : ''} = ['SIGINT', 'SIGTERM'];\n signals.forEach((signal) => {\n process.on(signal, async () => {\n logger.info(\\`Received \\${signal}, shutting down...\\`);\n await app.close();\n process.exit(0);\n });\n });\n\n return {\n instance: app,\n start: async ()${isTS ? ': Promise<void>' : ''} => {\n const port = parseInt(process.env.PORT || '3000', 10);\n const host = process.env.HOST || '0.0.0.0';\n await app.listen({ port, host });\n logger.info(\\`Server listening on \\${host}:\\${port}\\`);\n },\n };\n}\n\n${isTS ? '' : 'module.exports = { createServer };'}\n`;\n}\n\nfunction generateLoggerFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import pino from 'pino';\\nimport type { Logger } from 'pino';\" : \"const pino = require('pino');\"}\n\n${isTS ? 'export const logger: Logger' : 'const logger'} = pino({\n level: process.env.LOG_LEVEL || 'info',\n transport: process.env.NODE_ENV !== 'production' ? {\n target: 'pino-pretty',\n options: { colorize: true },\n } : undefined,\n});\n\n${isTS ? '' : 'module.exports = { logger };'}\n`;\n}\n\nfunction generateMongooseConnection(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import mongoose from 'mongoose';\\nimport { logger } from '../core/logger.js';\" : \"const mongoose = require('mongoose');\\nconst { logger } = require('../core/logger.js');\"}\n\nconst MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/mydb';\n\n${isTS ? 'export async function connectDatabase(): Promise<typeof mongoose>' : 'async function connectDatabase()'} {\n try {\n const conn = await mongoose.connect(MONGODB_URI);\n logger.info(\\`MongoDB connected: \\${conn.connection.host}\\`);\n return conn;\n } catch (error) {\n logger.error({ err: error }, 'MongoDB connection failed');\n process.exit(1);\n }\n}\n\n${isTS ? 'export async function disconnectDatabase(): Promise<void>' : 'async function disconnectDatabase()'} {\n try {\n await mongoose.disconnect();\n logger.info('MongoDB disconnected');\n } catch (error) {\n logger.error({ err: error }, 'MongoDB disconnect failed');\n }\n}\n\n${isTS ? 'export { mongoose };' : 'module.exports = { connectDatabase, disconnectDatabase, mongoose };'}\n`;\n}\n\nfunction generateMongooseUserModel(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import mongoose, { Schema, Document } from 'mongoose';\\nimport bcrypt from 'bcryptjs';\" : \"const mongoose = require('mongoose');\\nconst bcrypt = require('bcryptjs');\\nconst { Schema } = mongoose;\"}\n\n${\n isTS\n ? `export interface IUser extends Document {\n email: string;\n password: string;\n name?: string;\n role: 'user' | 'admin';\n status: 'active' | 'inactive' | 'suspended';\n emailVerified: boolean;\n createdAt: Date;\n updatedAt: Date;\n comparePassword(candidatePassword: string): Promise<boolean>;\n}`\n : ''\n}\n\nconst userSchema = new Schema${isTS ? '<IUser>' : ''}({\n email: {\n type: String,\n required: true,\n unique: true,\n lowercase: true,\n trim: true,\n },\n password: {\n type: String,\n required: true,\n minlength: 8,\n },\n name: {\n type: String,\n trim: true,\n },\n role: {\n type: String,\n enum: ['user', 'admin'],\n default: 'user',\n },\n status: {\n type: String,\n enum: ['active', 'inactive', 'suspended'],\n default: 'active',\n },\n emailVerified: {\n type: Boolean,\n default: false,\n },\n}, {\n timestamps: true,\n});\n\n// Hash password before saving\nuserSchema.pre('save', async function(next) {\n if (!this.isModified('password')) return next();\n\n try {\n const salt = await bcrypt.genSalt(10);\n this.password = await bcrypt.hash(this.password, salt);\n next();\n } catch (error${isTS ? ': any' : ''}) {\n next(error);\n }\n});\n\n// Compare password method\nuserSchema.methods.comparePassword = async function(candidatePassword${isTS ? ': string' : ''})${isTS ? ': Promise<boolean>' : ''} {\n return bcrypt.compare(candidatePassword, this.password);\n};\n\n${isTS ? \"export const User = mongoose.model<IUser>('User', userSchema);\" : \"const User = mongoose.model('User', userSchema);\\nmodule.exports = { User };\"}\n`;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\n\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\nexport function pluralize(str: string): string {\n if (str.endsWith('y')) {\n return str.slice(0, -1) + 'ies';\n }\n if (str.endsWith('s') || str.endsWith('x') || str.endsWith('ch') || str.endsWith('sh')) {\n return str + 'es';\n }\n return str + 's';\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function success(message: string): void {\n console.log(chalk.green('✓'), message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red('✗'), message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n}\n\nexport function getProjectRoot(): string {\n return process.cwd();\n}\n\nexport function getSourceDir(): string {\n return path.join(getProjectRoot(), 'src');\n}\n\nexport function getModulesDir(): string {\n return path.join(getSourceDir(), 'modules');\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport {\n toPascalCase,\n toCamelCase,\n toKebabCase,\n pluralize,\n fileExists,\n writeFile,\n success,\n error,\n info,\n getModulesDir,\n} from '../utils/helpers.js';\nimport { parseFields, type FieldDefinition } from '../utils/field-parser.js';\nimport { controllerTemplate } from '../templates/controller.js';\nimport { serviceTemplate } from '../templates/service.js';\nimport { repositoryTemplate } from '../templates/repository.js';\nimport { typesTemplate } from '../templates/types.js';\nimport { schemasTemplate } from '../templates/schemas.js';\nimport { routesTemplate } from '../templates/routes.js';\nimport { moduleIndexTemplate } from '../templates/module-index.js';\nimport { prismaModelTemplate } from '../templates/prisma-model.js';\nimport { dynamicTypesTemplate } from '../templates/dynamic-types.js';\nimport { dynamicSchemasTemplate, type ValidatorType } from '../templates/dynamic-schemas.js';\nimport { dynamicPrismaTemplate } from '../templates/dynamic-prisma.js';\n\nexport const generateCommand = new Command('generate')\n .alias('g')\n .description('Generate resources (module, controller, service, etc.)');\n\n// Generate full module\ngenerateCommand\n .command('module <name> [fields...]')\n .alias('m')\n .description(\n 'Generate a complete module with controller, service, repository, types, schemas, and routes'\n )\n .option('--no-routes', 'Skip routes generation')\n .option('--no-repository', 'Skip repository generation')\n .option('--prisma', 'Generate Prisma model suggestion')\n .option('--validator <type>', 'Validator type: zod, joi, yup', 'zod')\n .option('-i, --interactive', 'Interactive mode to define fields')\n .action(async (name: string, fieldsArgs: string[], options) => {\n let fields: FieldDefinition[] = [];\n\n // Parse fields from command line or interactive mode\n if (options.interactive) {\n fields = await promptForFields();\n } else if (fieldsArgs.length > 0) {\n fields = parseFields(fieldsArgs.join(' '));\n }\n\n const spinner = ora('Generating module...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n const tableName = pluralize(kebabName.replace(/-/g, '_'));\n const validatorType = (options.validator || 'zod') as ValidatorType;\n\n const moduleDir = path.join(getModulesDir(), kebabName);\n\n // Check if module already exists\n if (await fileExists(moduleDir)) {\n spinner.stop();\n error(`Module \"${kebabName}\" already exists`);\n return;\n }\n\n // Use dynamic templates if fields are provided\n const hasFields = fields.length > 0;\n\n const files = [\n {\n name: `${kebabName}.types.ts`,\n content: hasFields\n ? dynamicTypesTemplate(kebabName, pascalName, fields)\n : typesTemplate(kebabName, pascalName),\n },\n {\n name: `${kebabName}.schemas.ts`,\n content: hasFields\n ? dynamicSchemasTemplate(kebabName, pascalName, camelName, fields, validatorType)\n : schemasTemplate(kebabName, pascalName, camelName),\n },\n {\n name: `${kebabName}.service.ts`,\n content: serviceTemplate(kebabName, pascalName, camelName),\n },\n {\n name: `${kebabName}.controller.ts`,\n content: controllerTemplate(kebabName, pascalName, camelName),\n },\n { name: 'index.ts', content: moduleIndexTemplate(kebabName, pascalName, camelName) },\n ];\n\n if (options.repository !== false) {\n files.push({\n name: `${kebabName}.repository.ts`,\n content: repositoryTemplate(kebabName, pascalName, camelName, pluralName),\n });\n }\n\n if (options.routes !== false) {\n files.push({\n name: `${kebabName}.routes.ts`,\n content: routesTemplate(kebabName, pascalName, camelName, pluralName),\n });\n }\n\n // Write all files\n for (const file of files) {\n await writeFile(path.join(moduleDir, file.name), file.content);\n }\n\n spinner.succeed(`Module \"${pascalName}\" generated successfully!`);\n\n // Show Prisma model if requested or fields provided\n if (options.prisma || hasFields) {\n console.log('\\n' + '─'.repeat(50));\n info('Prisma model suggestion:');\n if (hasFields) {\n console.log(dynamicPrismaTemplate(pascalName, tableName, fields));\n } else {\n console.log(prismaModelTemplate(kebabName, pascalName, tableName));\n }\n }\n\n // Show fields summary if provided\n if (hasFields) {\n console.log('\\n📋 Fields defined:');\n fields.forEach((f) => {\n const opts = [];\n if (f.isOptional) opts.push('optional');\n if (f.isArray) opts.push('array');\n if (f.isUnique) opts.push('unique');\n const optsStr = opts.length > 0 ? ` (${opts.join(', ')})` : '';\n success(` ${f.name}: ${f.type}${optsStr}`);\n });\n }\n\n // Show next steps\n console.log('\\n📁 Files created:');\n files.forEach((f) => success(` src/modules/${kebabName}/${f.name}`));\n\n console.log('\\n📌 Next steps:');\n if (!hasFields) {\n info(' 1. Update the types in ' + `${kebabName}.types.ts`);\n info(' 2. Update the schemas in ' + `${kebabName}.schemas.ts`);\n info(' 3. Register the module in your app');\n } else {\n info(' 1. Review generated types and schemas');\n info(' 2. Register the module in your app');\n }\n if (options.prisma || hasFields) {\n info(` ${hasFields ? '3' : '4'}. Add the Prisma model to schema.prisma`);\n info(` ${hasFields ? '4' : '5'}. Run: npm run db:migrate`);\n }\n } catch (err) {\n spinner.fail('Failed to generate module');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate controller only\ngenerateCommand\n .command('controller <name>')\n .alias('c')\n .description('Generate a controller')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating controller...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.controller.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Controller \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, controllerTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Controller \"${pascalName}Controller\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.controller.ts`);\n } catch (err) {\n spinner.fail('Failed to generate controller');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate service only\ngenerateCommand\n .command('service <name>')\n .alias('s')\n .description('Generate a service')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating service...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.service.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Service \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, serviceTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Service \"${pascalName}Service\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.service.ts`);\n } catch (err) {\n spinner.fail('Failed to generate service');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate repository only\ngenerateCommand\n .command('repository <name>')\n .alias('r')\n .description('Generate a repository')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating repository...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.repository.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Repository \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, repositoryTemplate(kebabName, pascalName, camelName, pluralName));\n\n spinner.succeed(`Repository \"${pascalName}Repository\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.repository.ts`);\n } catch (err) {\n spinner.fail('Failed to generate repository');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate types only\ngenerateCommand\n .command('types <name>')\n .alias('t')\n .description('Generate types/interfaces')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating types...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.types.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Types file \"${kebabName}.types.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, typesTemplate(kebabName, pascalName));\n\n spinner.succeed(`Types for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.types.ts`);\n } catch (err) {\n spinner.fail('Failed to generate types');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate schemas/validators only\ngenerateCommand\n .command('schema <name>')\n .alias('v')\n .description('Generate validation schemas')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating schemas...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.schemas.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Schemas file \"${kebabName}.schemas.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, schemasTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Schemas for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.schemas.ts`);\n } catch (err) {\n spinner.fail('Failed to generate schemas');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate routes only\ngenerateCommand\n .command('routes <name>')\n .description('Generate routes')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating routes...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.routes.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Routes file \"${kebabName}.routes.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, routesTemplate(kebabName, pascalName, camelName, pluralName));\n\n spinner.succeed(`Routes for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.routes.ts`);\n } catch (err) {\n spinner.fail('Failed to generate routes');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Interactive field prompt helper\nasync function promptForFields(): Promise<FieldDefinition[]> {\n const fields: FieldDefinition[] = [];\n\n console.log('\\n📝 Define your model fields (press Enter with empty name to finish)\\n');\n\n const fieldTypes = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'text',\n 'email',\n 'url',\n 'uuid',\n 'int',\n 'float',\n 'decimal',\n 'json',\n ];\n\n let addMore = true;\n\n while (addMore) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Field name (empty to finish):',\n },\n ]);\n\n if (!answers.name) {\n addMore = false;\n continue;\n }\n\n const fieldDetails = await inquirer.prompt([\n {\n type: 'list',\n name: 'type',\n message: `Type for \"${answers.name}\":`,\n choices: fieldTypes,\n default: 'string',\n },\n {\n type: 'confirm',\n name: 'isOptional',\n message: 'Is optional?',\n default: false,\n },\n {\n type: 'confirm',\n name: 'isUnique',\n message: 'Is unique?',\n default: false,\n },\n {\n type: 'confirm',\n name: 'isArray',\n message: 'Is array?',\n default: false,\n },\n ]);\n\n fields.push({\n name: answers.name,\n type: fieldDetails.type,\n isOptional: fieldDetails.isOptional,\n isUnique: fieldDetails.isUnique,\n isArray: fieldDetails.isArray,\n });\n\n console.log(` ✓ Added: ${answers.name}: ${fieldDetails.type}\\n`);\n }\n\n return fields;\n}\n","export interface FieldDefinition {\n name: string;\n type: FieldType;\n isOptional: boolean;\n isArray: boolean;\n isUnique: boolean;\n defaultValue?: string;\n relation?: {\n model: string;\n type: 'one-to-one' | 'one-to-many' | 'many-to-one';\n };\n}\n\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'date'\n | 'datetime'\n | 'text'\n | 'json'\n | 'email'\n | 'url'\n | 'uuid'\n | 'int'\n | 'float'\n | 'decimal'\n | 'enum';\n\n// Map field types to TypeScript types\nexport const tsTypeMap: Record<FieldType, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n date: 'Date',\n datetime: 'Date',\n text: 'string',\n json: 'Record<string, unknown>',\n email: 'string',\n url: 'string',\n uuid: 'string',\n int: 'number',\n float: 'number',\n decimal: 'number',\n enum: 'string',\n};\n\n// Map field types to Prisma types\nexport const prismaTypeMap: Record<FieldType, string> = {\n string: 'String',\n number: 'Int',\n boolean: 'Boolean',\n date: 'DateTime',\n datetime: 'DateTime',\n text: 'String',\n json: 'Json',\n email: 'String',\n url: 'String',\n uuid: 'String',\n int: 'Int',\n float: 'Float',\n decimal: 'Decimal',\n enum: 'String',\n};\n\n// Map field types to Zod validators\nexport const zodTypeMap: Record<FieldType, string> = {\n string: 'z.string()',\n number: 'z.number()',\n boolean: 'z.boolean()',\n date: 'z.coerce.date()',\n datetime: 'z.coerce.date()',\n text: 'z.string()',\n json: 'z.record(z.unknown())',\n email: 'z.string().email()',\n url: 'z.string().url()',\n uuid: 'z.string().uuid()',\n int: 'z.number().int()',\n float: 'z.number()',\n decimal: 'z.number()',\n enum: 'z.string()',\n};\n\n// Map field types to Joi validators\nexport const joiTypeMap: Record<FieldType, string> = {\n string: 'Joi.string()',\n number: 'Joi.number()',\n boolean: 'Joi.boolean()',\n date: 'Joi.date()',\n datetime: 'Joi.date()',\n text: 'Joi.string()',\n json: 'Joi.object()',\n email: 'Joi.string().email()',\n url: 'Joi.string().uri()',\n uuid: 'Joi.string().uuid()',\n int: 'Joi.number().integer()',\n float: 'Joi.number()',\n decimal: 'Joi.number()',\n enum: 'Joi.string()',\n};\n\n// Map field types to Yup validators\nexport const yupTypeMap: Record<FieldType, string> = {\n string: 'yup.string()',\n number: 'yup.number()',\n boolean: 'yup.boolean()',\n date: 'yup.date()',\n datetime: 'yup.date()',\n text: 'yup.string()',\n json: 'yup.object()',\n email: 'yup.string().email()',\n url: 'yup.string().url()',\n uuid: 'yup.string().uuid()',\n int: 'yup.number().integer()',\n float: 'yup.number()',\n decimal: 'yup.number()',\n enum: 'yup.string()',\n};\n\n/**\n * Parse field definition string\n * Format: name:type[:modifiers]\n * Examples:\n * - title:string\n * - price:number\n * - email:email:unique\n * - description:text?\n * - tags:string[]\n * - isActive:boolean:default=true\n * - category:relation:Category\n */\nexport function parseField(fieldStr: string): FieldDefinition {\n const parts = fieldStr.split(':');\n let name = parts[0] || '';\n let typeStr = parts[1] || 'string';\n const modifiers = parts.slice(2);\n\n // Check for optional (?)\n const isOptional = name.endsWith('?') || typeStr.endsWith('?');\n name = name.replace('?', '');\n typeStr = typeStr.replace('?', '');\n\n // Check for array ([])\n const isArray = typeStr.endsWith('[]');\n typeStr = typeStr.replace('[]', '');\n\n // Validate type\n const validTypes: FieldType[] = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'text',\n 'json',\n 'email',\n 'url',\n 'uuid',\n 'int',\n 'float',\n 'decimal',\n 'enum',\n ];\n\n let type: FieldType = 'string';\n if (validTypes.includes(typeStr as FieldType)) {\n type = typeStr as FieldType;\n }\n\n // Parse modifiers\n let isUnique = false;\n let defaultValue: string | undefined;\n let relation: FieldDefinition['relation'];\n\n for (const mod of modifiers) {\n if (mod === 'unique') {\n isUnique = true;\n } else if (mod.startsWith('default=')) {\n defaultValue = mod.replace('default=', '');\n } else if (typeStr === 'relation') {\n relation = {\n model: mod,\n type: 'many-to-one',\n };\n type = 'string'; // Relations use string IDs\n }\n }\n\n return {\n name,\n type,\n isOptional,\n isArray,\n isUnique,\n defaultValue,\n relation,\n };\n}\n\n/**\n * Parse multiple fields from command line\n * Example: \"title:string price:number description:text?\"\n */\nexport function parseFields(fieldsStr: string): FieldDefinition[] {\n if (!fieldsStr) return [];\n\n return fieldsStr.split(/\\s+/).filter(Boolean).map(parseField);\n}\n\n/**\n * Generate TypeScript interface from fields\n */\nexport function generateTypeInterface(\n name: string,\n fields: FieldDefinition[],\n includeBase = true\n): string {\n const lines: string[] = [];\n\n if (includeBase) {\n lines.push(`import type { BaseEntity } from '../../types/index.js';`);\n lines.push('');\n lines.push(`export interface ${name} extends BaseEntity {`);\n } else {\n lines.push(`export interface ${name} {`);\n }\n\n for (const field of fields) {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n const optionalMark = field.isOptional ? '?' : '';\n lines.push(` ${field.name}${optionalMark}: ${tsType}${arrayMark};`);\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Zod schema from fields\n */\nexport function generateZodSchema(\n name: string,\n fields: FieldDefinition[],\n schemaType: 'create' | 'update' = 'create'\n): string {\n const lines: string[] = [];\n\n lines.push(`export const ${schemaType}${name}Schema = z.object({`);\n\n for (const field of fields) {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n if (field.isOptional || schemaType === 'update') {\n validator += '.optional()';\n }\n\n if (field.defaultValue && schemaType === 'create') {\n validator += `.default(${field.defaultValue})`;\n }\n\n lines.push(` ${field.name}: ${validator},`);\n }\n\n lines.push('});');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Prisma model from fields\n */\nexport function generatePrismaModel(\n modelName: string,\n tableName: string,\n fields: FieldDefinition[]\n): string {\n const lines: string[] = [];\n\n lines.push(`model ${modelName} {`);\n lines.push(' id String @id @default(uuid())');\n\n for (const field of fields) {\n const prismaType = prismaTypeMap[field.type];\n const optionalMark = field.isOptional ? '?' : '';\n const annotations: string[] = [];\n\n if (field.isUnique) {\n annotations.push('@unique');\n }\n\n if (field.defaultValue) {\n annotations.push(`@default(${field.defaultValue})`);\n }\n\n if (field.type === 'text') {\n annotations.push('@db.Text');\n }\n\n const annotationStr = annotations.length > 0 ? ' ' + annotations.join(' ') : '';\n lines.push(` ${field.name.padEnd(11)} ${prismaType}${optionalMark}${annotationStr}`);\n }\n\n lines.push('');\n lines.push(' createdAt DateTime @default(now())');\n lines.push(' updatedAt DateTime @updatedAt');\n lines.push('');\n\n // Add indexes for unique fields\n const uniqueFields = fields.filter((f) => f.isUnique);\n for (const field of uniqueFields) {\n lines.push(` @@index([${field.name}])`);\n }\n\n lines.push(` @@map(\"${tableName}\")`);\n lines.push('}');\n\n return lines.join('\\n');\n}\n","export function controllerTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { ${pascalName}Service } from './${name}.service.js';\nimport { create${pascalName}Schema, update${pascalName}Schema, ${camelName}QuerySchema } from './${name}.schemas.js';\nimport { success, created, noContent } from '../../utils/response.js';\nimport { parsePaginationParams } from '../../utils/pagination.js';\nimport { validateBody, validateQuery } from '../validation/validator.js';\n\nexport class ${pascalName}Controller {\n constructor(private ${camelName}Service: ${pascalName}Service) {}\n\n async list(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const query = validateQuery(${camelName}QuerySchema, request.query);\n const pagination = parsePaginationParams(query);\n const filters = {\n search: query.search,\n };\n\n const result = await this.${camelName}Service.findMany(pagination, filters);\n success(reply, result);\n }\n\n async getById(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const item = await this.${camelName}Service.findById(request.params.id);\n\n if (!item) {\n return reply.status(404).send({\n success: false,\n message: '${pascalName} not found',\n });\n }\n\n success(reply, item);\n }\n\n async create(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const data = validateBody(create${pascalName}Schema, request.body);\n const item = await this.${camelName}Service.create(data);\n created(reply, item);\n }\n\n async update(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const data = validateBody(update${pascalName}Schema, request.body);\n const item = await this.${camelName}Service.update(request.params.id, data);\n success(reply, item);\n }\n\n async delete(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n await this.${camelName}Service.delete(request.params.id);\n noContent(reply);\n }\n}\n\nexport function create${pascalName}Controller(${camelName}Service: ${pascalName}Service): ${pascalName}Controller {\n return new ${pascalName}Controller(${camelName}Service);\n}\n`;\n}\n","export function serviceTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { NotFoundError, ConflictError } from '../../utils/errors.js';\nimport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nimport type { ${pascalName}, Create${pascalName}Data, Update${pascalName}Data, ${pascalName}Filters } from './${name}.types.js';\nimport { logger } from '../../core/logger.js';\n\nexport class ${pascalName}Service {\n constructor(private repository: ${pascalName}Repository) {}\n\n async findById(id: string): Promise<${pascalName} | null> {\n return this.repository.findById(id);\n }\n\n async findMany(\n params: PaginationParams,\n filters?: ${pascalName}Filters\n ): Promise<PaginatedResult<${pascalName}>> {\n return this.repository.findMany(params, filters);\n }\n\n async create(data: Create${pascalName}Data): Promise<${pascalName}> {\n const item = await this.repository.create(data);\n logger.info({ ${camelName}Id: item.id }, '${pascalName} created');\n return item;\n }\n\n async update(id: string, data: Update${pascalName}Data): Promise<${pascalName}> {\n const existing = await this.repository.findById(id);\n if (!existing) {\n throw new NotFoundError('${pascalName}');\n }\n\n const updated = await this.repository.update(id, data);\n if (!updated) {\n throw new NotFoundError('${pascalName}');\n }\n\n logger.info({ ${camelName}Id: id }, '${pascalName} updated');\n return updated;\n }\n\n async delete(id: string): Promise<void> {\n const existing = await this.repository.findById(id);\n if (!existing) {\n throw new NotFoundError('${pascalName}');\n }\n\n await this.repository.delete(id);\n logger.info({ ${camelName}Id: id }, '${pascalName} deleted');\n }\n}\n\nexport function create${pascalName}Service(repository?: ${pascalName}Repository): ${pascalName}Service {\n return new ${pascalName}Service(repository || create${pascalName}Repository());\n}\n`;\n}\n","export function repositoryTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n pluralName: string\n): string {\n return `import { randomUUID } from 'crypto';\nimport type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { createPaginatedResult, getSkip } from '../../utils/pagination.js';\nimport type { ${pascalName}, Create${pascalName}Data, Update${pascalName}Data, ${pascalName}Filters } from './${name}.types.js';\n\n// In-memory storage (will be replaced by Prisma in production)\nconst ${pluralName} = new Map<string, ${pascalName}>();\n\nexport class ${pascalName}Repository {\n async findById(id: string): Promise<${pascalName} | null> {\n return ${pluralName}.get(id) || null;\n }\n\n async findMany(\n params: PaginationParams,\n filters?: ${pascalName}Filters\n ): Promise<PaginatedResult<${pascalName}>> {\n let items = Array.from(${pluralName}.values());\n\n // Apply filters\n if (filters?.search) {\n const search = filters.search.toLowerCase();\n items = items.filter((item) =>\n JSON.stringify(item).toLowerCase().includes(search)\n );\n }\n\n // Sort\n if (params.sortBy) {\n const sortKey = params.sortBy as keyof ${pascalName};\n items.sort((a, b) => {\n const aVal = a[sortKey];\n const bVal = b[sortKey];\n if (aVal === undefined || bVal === undefined) return 0;\n if (aVal < bVal) return params.sortOrder === 'desc' ? 1 : -1;\n if (aVal > bVal) return params.sortOrder === 'desc' ? -1 : 1;\n return 0;\n });\n }\n\n const total = items.length;\n const skip = getSkip(params);\n const data = items.slice(skip, skip + params.limit);\n\n return createPaginatedResult(data, total, params);\n }\n\n async create(data: Create${pascalName}Data): Promise<${pascalName}> {\n const now = new Date();\n const item: ${pascalName} = {\n id: randomUUID(),\n ...data,\n createdAt: now,\n updatedAt: now,\n };\n\n ${pluralName}.set(item.id, item);\n return item;\n }\n\n async update(id: string, data: Update${pascalName}Data): Promise<${pascalName} | null> {\n const item = ${pluralName}.get(id);\n if (!item) return null;\n\n const updated: ${pascalName} = {\n ...item,\n ...data,\n updatedAt: new Date(),\n };\n\n ${pluralName}.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return ${pluralName}.delete(id);\n }\n\n async count(filters?: ${pascalName}Filters): Promise<number> {\n if (!filters) return ${pluralName}.size;\n\n let count = 0;\n for (const item of ${pluralName}.values()) {\n if (filters.search) {\n const search = filters.search.toLowerCase();\n if (!JSON.stringify(item).toLowerCase().includes(search)) continue;\n }\n count++;\n }\n return count;\n }\n\n // Clear all (for testing)\n async clear(): Promise<void> {\n ${pluralName}.clear();\n }\n}\n\nexport function create${pascalName}Repository(): ${pascalName}Repository {\n return new ${pascalName}Repository();\n}\n`;\n}\n","export function typesTemplate(name: string, pascalName: string): string {\n return `import type { BaseEntity } from '../../types/index.js';\n\nexport interface ${pascalName} extends BaseEntity {\n // Add your ${pascalName} specific fields here\n name: string;\n description?: string;\n // status?: string;\n // metadata?: Record<string, unknown>;\n}\n\nexport interface Create${pascalName}Data {\n name: string;\n description?: string;\n}\n\nexport interface Update${pascalName}Data {\n name?: string;\n description?: string;\n}\n\nexport interface ${pascalName}Filters {\n search?: string;\n // Add more filters as needed\n}\n`;\n}\n","export function schemasTemplate(name: string, pascalName: string, camelName: string): string {\n return `import { z } from 'zod';\n\nexport const create${pascalName}Schema = z.object({\n name: z.string().min(1, 'Name is required').max(255),\n description: z.string().max(1000).optional(),\n});\n\nexport const update${pascalName}Schema = z.object({\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(1000).optional(),\n});\n\nexport const ${camelName}QuerySchema = z.object({\n page: z.string().transform(Number).optional(),\n limit: z.string().transform(Number).optional(),\n sortBy: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n search: z.string().optional(),\n});\n\nexport type Create${pascalName}Input = z.infer<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = z.infer<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = z.infer<typeof ${camelName}QuerySchema>;\n`;\n}\n","export function routesTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n pluralName: string\n): string {\n return `import type { FastifyInstance } from 'fastify';\nimport type { ${pascalName}Controller } from './${name}.controller.js';\nimport type { AuthService } from '../auth/auth.service.js';\nimport { createAuthMiddleware, createRoleMiddleware } from '../auth/auth.middleware.js';\n\nexport function register${pascalName}Routes(\n app: FastifyInstance,\n controller: ${pascalName}Controller,\n authService: AuthService\n): void {\n const authenticate = createAuthMiddleware(authService);\n const isAdmin = createRoleMiddleware(['admin', 'super_admin']);\n\n // Public routes (if any)\n // app.get('/${pluralName}/public', controller.publicList.bind(controller));\n\n // Protected routes\n app.get(\n '/${pluralName}',\n { preHandler: [authenticate] },\n controller.list.bind(controller)\n );\n\n app.get(\n '/${pluralName}/:id',\n { preHandler: [authenticate] },\n controller.getById.bind(controller)\n );\n\n app.post(\n '/${pluralName}',\n { preHandler: [authenticate] },\n controller.create.bind(controller)\n );\n\n app.patch(\n '/${pluralName}/:id',\n { preHandler: [authenticate] },\n controller.update.bind(controller)\n );\n\n app.delete(\n '/${pluralName}/:id',\n { preHandler: [authenticate, isAdmin] },\n controller.delete.bind(controller)\n );\n}\n`;\n}\n","export function moduleIndexTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { FastifyInstance } from 'fastify';\nimport { logger } from '../../core/logger.js';\nimport { ${pascalName}Service, create${pascalName}Service } from './${name}.service.js';\nimport { ${pascalName}Controller, create${pascalName}Controller } from './${name}.controller.js';\nimport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nimport { register${pascalName}Routes } from './${name}.routes.js';\nimport type { AuthService } from '../auth/auth.service.js';\n\nexport async function register${pascalName}Module(\n app: FastifyInstance,\n authService: AuthService\n): Promise<void> {\n // Create repository and service\n const repository = create${pascalName}Repository();\n const ${camelName}Service = create${pascalName}Service(repository);\n\n // Create controller\n const ${camelName}Controller = create${pascalName}Controller(${camelName}Service);\n\n // Register routes\n register${pascalName}Routes(app, ${camelName}Controller, authService);\n\n logger.info('${pascalName} module registered');\n}\n\nexport { ${pascalName}Service, create${pascalName}Service } from './${name}.service.js';\nexport { ${pascalName}Controller, create${pascalName}Controller } from './${name}.controller.js';\nexport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nexport * from './${name}.types.js';\nexport * from './${name}.schemas.js';\n`;\n}\n","export function prismaModelTemplate(name: string, pascalName: string, tableName: string): string {\n return `\n// Add this model to your prisma/schema.prisma file\n\nmodel ${pascalName} {\n id String @id @default(uuid())\n name String\n description String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([name])\n @@map(\"${tableName}\")\n}\n`;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { tsTypeMap } from '../utils/field-parser.js';\n\nexport function dynamicTypesTemplate(\n name: string,\n pascalName: string,\n fields: FieldDefinition[]\n): string {\n const fieldLines = fields.map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n const optionalMark = field.isOptional ? '?' : '';\n return ` ${field.name}${optionalMark}: ${tsType}${arrayMark};`;\n });\n\n const createFieldLines = fields\n .filter((f) => !f.isOptional)\n .map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}: ${tsType}${arrayMark};`;\n });\n\n const createOptionalLines = fields\n .filter((f) => f.isOptional)\n .map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}?: ${tsType}${arrayMark};`;\n });\n\n const updateFieldLines = fields.map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}?: ${tsType}${arrayMark};`;\n });\n\n return `import type { BaseEntity } from '../../types/index.js';\n\nexport interface ${pascalName} extends BaseEntity {\n${fieldLines.join('\\n')}\n}\n\nexport interface Create${pascalName}Data {\n${[...createFieldLines, ...createOptionalLines].join('\\n')}\n}\n\nexport interface Update${pascalName}Data {\n${updateFieldLines.join('\\n')}\n}\n\nexport interface ${pascalName}Filters {\n search?: string;\n${fields\n .filter((f) => ['string', 'enum', 'boolean'].includes(f.type))\n .map((f) => ` ${f.name}?: ${tsTypeMap[f.type]};`)\n .join('\\n')}\n}\n`;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { zodTypeMap, joiTypeMap, yupTypeMap } from '../utils/field-parser.js';\n\nexport type ValidatorType = 'zod' | 'joi' | 'yup';\n\nexport function dynamicSchemasTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[],\n validator: ValidatorType = 'zod'\n): string {\n switch (validator) {\n case 'joi':\n return generateJoiSchemas(pascalName, camelName, fields);\n case 'yup':\n return generateYupSchemas(pascalName, camelName, fields);\n default:\n return generateZodSchemas(pascalName, camelName, fields);\n }\n}\n\nfunction generateZodSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n if (field.isOptional) {\n validator += '.optional()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n // Add extra validations based on type\n if (field.type === 'string' && !field.isOptional) {\n validator = validator.replace('z.string()', 'z.string().min(1)');\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n validator += '.optional()';\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import { z } from 'zod';\n\nexport const create${pascalName}Schema = z.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = z.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = z.object({\n page: z.string().transform(Number).optional(),\n limit: z.string().transform(Number).optional(),\n sortBy: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n search: z.string().optional(),\n});\n\nexport type Create${pascalName}Input = z.infer<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = z.infer<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = z.infer<typeof ${camelName}QuerySchema>;\n`;\n}\n\nfunction generateJoiSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = joiTypeMap[field.type];\n\n if (field.isArray) {\n validator = `Joi.array().items(${validator})`;\n }\n\n if (!field.isOptional) {\n validator += '.required()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = joiTypeMap[field.type];\n\n if (field.isArray) {\n validator = `Joi.array().items(${validator})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import Joi from 'joi';\n\nexport const create${pascalName}Schema = Joi.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = Joi.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = Joi.object({\n page: Joi.number().integer().min(1),\n limit: Joi.number().integer().min(1).max(100),\n sortBy: Joi.string(),\n sortOrder: Joi.string().valid('asc', 'desc'),\n search: Joi.string(),\n});\n\nexport type Create${pascalName}Input = {\n${fields.map((f) => ` ${f.name}${f.isOptional ? '?' : ''}: ${getJsType(f)};`).join('\\n')}\n};\n\nexport type Update${pascalName}Input = Partial<Create${pascalName}Input>;\nexport type ${pascalName}QueryInput = {\n page?: number;\n limit?: number;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n search?: string;\n};\n`;\n}\n\nfunction generateYupSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = yupTypeMap[field.type];\n\n if (field.isArray) {\n validator = `yup.array().of(${validator})`;\n }\n\n if (!field.isOptional) {\n validator += '.required()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = yupTypeMap[field.type];\n\n if (field.isArray) {\n validator = `yup.array().of(${validator})`;\n }\n\n validator += '.optional()';\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import * as yup from 'yup';\n\nexport const create${pascalName}Schema = yup.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = yup.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = yup.object({\n page: yup.number().integer().min(1),\n limit: yup.number().integer().min(1).max(100),\n sortBy: yup.string(),\n sortOrder: yup.string().oneOf(['asc', 'desc']),\n search: yup.string(),\n});\n\nexport type Create${pascalName}Input = yup.InferType<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = yup.InferType<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = yup.InferType<typeof ${camelName}QuerySchema>;\n`;\n}\n\nfunction getJsType(field: FieldDefinition): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n date: 'Date',\n datetime: 'Date',\n text: 'string',\n json: 'Record<string, unknown>',\n email: 'string',\n url: 'string',\n uuid: 'string',\n int: 'number',\n float: 'number',\n decimal: 'number',\n enum: 'string',\n };\n\n const baseType = typeMap[field.type] || 'unknown';\n return field.isArray ? `${baseType}[]` : baseType;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { prismaTypeMap } from '../utils/field-parser.js';\n\nexport function dynamicPrismaTemplate(\n modelName: string,\n tableName: string,\n fields: FieldDefinition[]\n): string {\n const fieldLines: string[] = [];\n\n for (const field of fields) {\n const prismaType = prismaTypeMap[field.type];\n const optionalMark = field.isOptional ? '?' : '';\n const arrayMark = field.isArray ? '[]' : '';\n const annotations: string[] = [];\n\n if (field.isUnique) {\n annotations.push('@unique');\n }\n\n if (field.defaultValue !== undefined) {\n // Handle different default value types\n if (field.type === 'boolean') {\n annotations.push(`@default(${field.defaultValue})`);\n } else if (field.type === 'number' || field.type === 'int' || field.type === 'float') {\n annotations.push(`@default(${field.defaultValue})`);\n } else {\n annotations.push(`@default(\"${field.defaultValue}\")`);\n }\n }\n\n // Database-specific annotations\n if (field.type === 'text') {\n annotations.push('@db.Text');\n }\n\n if (field.type === 'decimal') {\n annotations.push('@db.Decimal(10, 2)');\n }\n\n const annotationStr = annotations.length > 0 ? ' ' + annotations.join(' ') : '';\n const typePart = `${prismaType}${optionalMark}${arrayMark}`;\n\n fieldLines.push(` ${field.name.padEnd(15)} ${typePart.padEnd(12)}${annotationStr}`);\n }\n\n // Generate indexes\n const indexLines: string[] = [];\n\n // Index for unique fields\n const uniqueFields = fields.filter((f) => f.isUnique);\n for (const field of uniqueFields) {\n indexLines.push(` @@index([${field.name}])`);\n }\n\n // Index for common search fields\n const searchableFields = fields.filter(\n (f) => ['string', 'email'].includes(f.type) && !f.isUnique\n );\n if (searchableFields.length > 0) {\n const firstSearchable = searchableFields[0];\n if (firstSearchable) {\n indexLines.push(` @@index([${firstSearchable.name}])`);\n }\n }\n\n return `\n// ==========================================\n// Add this model to your prisma/schema.prisma file\n// ==========================================\n\nmodel ${modelName} {\n id String @id @default(uuid())\n\n${fieldLines.join('\\n')}\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n${indexLines.join('\\n')}\n @@map(\"${tableName}\")\n}\n\n// ==========================================\n// After adding the model, run:\n// npm run db:migrate -- --name add_${tableName}\n// ==========================================\n`;\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport * as fs from 'fs/promises';\nimport {\n ensureDir,\n writeFile,\n fileExists,\n success,\n error,\n info,\n warn,\n getModulesDir,\n} from '../utils/helpers.js';\nimport { EnvManager } from '../utils/env-manager.js';\nimport { TemplateManager } from '../utils/template-manager.js';\nimport { InteractivePrompt } from '../utils/interactive-prompt.js';\n\n// Pre-built modules that can be added\nconst AVAILABLE_MODULES = {\n auth: {\n name: 'Authentication',\n description: 'JWT authentication with access/refresh tokens',\n files: [\n 'auth.service',\n 'auth.controller',\n 'auth.routes',\n 'auth.middleware',\n 'auth.schemas',\n 'auth.types',\n 'index',\n ],\n },\n users: {\n name: 'User Management',\n description: 'User CRUD with RBAC (roles & permissions)',\n files: [\n 'user.service',\n 'user.controller',\n 'user.repository',\n 'user.routes',\n 'user.schemas',\n 'user.types',\n 'index',\n ],\n },\n email: {\n name: 'Email Service',\n description: 'SMTP email with templates (Handlebars)',\n files: ['email.service', 'email.templates', 'email.types', 'index'],\n },\n audit: {\n name: 'Audit Logs',\n description: 'Activity logging and audit trail',\n files: ['audit.service', 'audit.types', 'index'],\n },\n cache: {\n name: 'Redis Cache',\n description: 'Redis caching with TTL & invalidation',\n files: ['cache.service', 'cache.types', 'index'],\n },\n upload: {\n name: 'File Upload',\n description: 'File upload with local/S3/Cloudinary storage',\n files: ['upload.service', 'upload.routes', 'upload.types', 'index'],\n },\n mfa: {\n name: 'MFA/TOTP',\n description: 'Two-factor authentication with QR codes',\n files: ['mfa.service', 'mfa.routes', 'totp.ts', 'types.ts', 'index'],\n },\n oauth: {\n name: 'OAuth',\n description: 'Social login (Google, GitHub, Facebook, Twitter, Apple)',\n files: ['oauth.service', 'oauth.routes', 'providers', 'types.ts', 'index'],\n },\n payment: {\n name: 'Payments',\n description: 'Payment processing (Stripe, PayPal, Mobile Money)',\n files: ['payment.service', 'payment.routes', 'providers', 'types.ts', 'index'],\n },\n notification: {\n name: 'Notifications',\n description: 'Email, SMS, Push notifications',\n files: ['notification.service', 'types.ts', 'index'],\n },\n 'rate-limit': {\n name: 'Rate Limiting',\n description: 'Advanced rate limiting with multiple algorithms',\n files: [\n 'rate-limit.service',\n 'rate-limit.middleware',\n 'rate-limit.routes',\n 'stores',\n 'types.ts',\n 'index',\n ],\n },\n webhook: {\n name: 'Webhooks',\n description: 'Outgoing webhooks with HMAC signatures & retry',\n files: ['webhook.service', 'webhook.routes', 'signature.ts', 'retry.ts', 'types.ts', 'index'],\n },\n queue: {\n name: 'Queue/Jobs',\n description: 'Background jobs with Bull/BullMQ & cron scheduling',\n files: ['queue.service', 'cron.ts', 'workers.ts', 'routes.ts', 'types.ts', 'index'],\n },\n websocket: {\n name: 'WebSockets',\n description: 'Real-time communication with Socket.io',\n files: ['websocket.service', 'features.ts', 'middlewares.ts', 'types.ts', 'index'],\n },\n search: {\n name: 'Search',\n description: 'Full-text search with Elasticsearch/Meilisearch',\n files: ['search.service', 'adapters', 'types.ts', 'index'],\n },\n i18n: {\n name: 'i18n/Localization',\n description: 'Multi-language support with 7+ locales',\n files: ['i18n.service', 'i18n.middleware', 'i18n.routes', 'types.ts', 'index'],\n },\n 'feature-flag': {\n name: 'Feature Flags',\n description: 'A/B testing & progressive rollout',\n files: ['feature-flag.service', 'feature-flag.routes', 'types.ts', 'index'],\n },\n analytics: {\n name: 'Analytics/Metrics',\n description: 'Prometheus metrics & event tracking',\n files: ['analytics.service', 'analytics.routes', 'types.ts', 'index'],\n },\n 'media-processing': {\n name: 'Media Processing',\n description: 'Image/video processing with FFmpeg',\n files: ['media-processing.service', 'media-processing.routes', 'types.ts', 'index'],\n },\n 'api-versioning': {\n name: 'API Versioning',\n description: 'Multiple API versions support',\n files: [\n 'versioning.service',\n 'versioning.middleware',\n 'versioning.routes',\n 'types.ts',\n 'index',\n ],\n },\n};\n\nexport const addModuleCommand = new Command('add')\n .description('Add a pre-built module to your project')\n .argument(\n '[module]',\n 'Module to add (auth, users, email, audit, upload, cache, notifications, settings)'\n )\n .option('-l, --list', 'List available modules')\n .option('-f, --force', 'Force overwrite existing module')\n .option('-u, --update', 'Update existing module (smart merge)')\n .option('--skip-existing', 'Skip if module already exists')\n .action(\n async (\n moduleName?: string,\n options?: { list?: boolean; force?: boolean; update?: boolean; skipExisting?: boolean }\n ) => {\n if (options?.list || !moduleName) {\n console.log(chalk.bold('\\n📦 Available Modules:\\n'));\n\n for (const [key, mod] of Object.entries(AVAILABLE_MODULES)) {\n console.log(` ${chalk.cyan(key.padEnd(15))} ${mod.name}`);\n console.log(` ${' '.repeat(15)} ${chalk.gray(mod.description)}\\n`);\n }\n\n console.log(chalk.bold('Usage:'));\n console.log(` ${chalk.yellow('servcraft add auth')} Add authentication module`);\n console.log(` ${chalk.yellow('servcraft add users')} Add user management module`);\n console.log(` ${chalk.yellow('servcraft add email')} Add email service module\\n`);\n return;\n }\n\n const module = AVAILABLE_MODULES[moduleName as keyof typeof AVAILABLE_MODULES];\n\n if (!module) {\n error(`Unknown module: ${moduleName}`);\n info('Run \"servcraft add --list\" to see available modules');\n return;\n }\n\n const spinner = ora(`Adding ${module.name} module...`).start();\n\n try {\n const moduleDir = path.join(getModulesDir(), moduleName);\n const templateManager = new TemplateManager(process.cwd());\n const moduleExists = await fileExists(moduleDir);\n\n // Handle existing module\n if (moduleExists) {\n spinner.stop();\n\n // Check flags\n if (options?.skipExisting) {\n info(`Module \"${moduleName}\" already exists, skipping...`);\n return;\n }\n\n // Check for modifications\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n const hasModifications = modifiedFiles.some((f) => f.isModified);\n\n let action: string;\n\n if (options?.force) {\n action = 'overwrite';\n } else if (options?.update) {\n action = 'update';\n } else {\n // Interactive prompt\n const choice = await InteractivePrompt.askModuleExists(moduleName, hasModifications);\n action = choice.action;\n }\n\n // Handle action\n if (action === 'skip') {\n info('Keeping existing module');\n return;\n }\n\n if (action === 'diff') {\n // Show diff and ask again\n await showDiffForModule(templateManager, moduleName, moduleDir);\n return;\n }\n\n if (action === 'backup-overwrite' || action === 'overwrite') {\n if (action === 'backup-overwrite') {\n const backupPath = await templateManager.createBackup(moduleName, moduleDir);\n InteractivePrompt.showBackupCreated(backupPath);\n }\n\n // Remove existing module\n await fs.rm(moduleDir, { recursive: true, force: true });\n await ensureDir(moduleDir);\n\n // Generate fresh module\n await generateModuleFiles(moduleName, moduleDir);\n\n // Save templates and manifest\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.saveTemplate(moduleName, files);\n await templateManager.saveManifest(moduleName, files);\n\n spinner.succeed(\n `${module.name} module ${action === 'backup-overwrite' ? 'backed up and ' : ''}overwritten!`\n );\n } else if (action === 'update') {\n // Smart merge\n await performSmartMerge(templateManager, moduleName, moduleDir, module.name);\n }\n } else {\n // Fresh installation\n await ensureDir(moduleDir);\n\n // Generate module files\n await generateModuleFiles(moduleName, moduleDir);\n\n // Save templates and manifest for future updates\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.saveTemplate(moduleName, files);\n await templateManager.saveManifest(moduleName, files);\n\n spinner.succeed(`${module.name} module added successfully!`);\n }\n\n if (!moduleExists) {\n console.log('\\n📁 Files created:');\n module.files.forEach((f) => success(` src/modules/${moduleName}/${f}.ts`));\n }\n\n // Update .env file with module-specific variables\n const envManager = new EnvManager(process.cwd());\n const envSections = EnvManager.getModuleEnvVariables(moduleName);\n\n if (envSections.length > 0) {\n const envSpinner = ora('Updating environment variables...').start();\n try {\n const result = await envManager.addVariables(envSections);\n\n envSpinner.succeed('Environment variables updated!');\n\n if (result.created) {\n info('\\n📝 Created new .env file');\n }\n\n if (result.added.length > 0) {\n console.log(chalk.bold('\\n✅ Added to .env:'));\n result.added.forEach((key) => success(` ${key}`));\n }\n\n if (result.skipped.length > 0) {\n console.log(chalk.bold('\\n⏭️ Already in .env (skipped):'));\n result.skipped.forEach((key) => info(` ${key}`));\n }\n\n // Show which variables need configuration\n const requiredVars = envSections\n .flatMap((section) => section.variables)\n .filter((v) => v.required && !v.value)\n .map((v) => v.key);\n\n if (requiredVars.length > 0) {\n console.log(chalk.bold('\\n⚠️ Required configuration:'));\n requiredVars.forEach((key) => warn(` ${key} - Please configure this variable`));\n }\n } catch (err) {\n envSpinner.fail('Failed to update environment variables');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n\n console.log('\\n📌 Next steps:');\n info(' 1. Configure environment variables in .env (if needed)');\n info(' 2. Register the module in your main app file');\n info(' 3. Run database migrations if needed');\n } catch (err) {\n spinner.fail('Failed to add module');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n );\n\nasync function generateAuthModule(dir: string): Promise<void> {\n // This would copy from templates or generate inline\n // For now, we'll create placeholder files\n const files = {\n 'auth.types.ts': `export interface JwtPayload {\n sub: string;\n email: string;\n role: string;\n type: 'access' | 'refresh';\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport interface AuthUser {\n id: string;\n email: string;\n role: string;\n}\n`,\n 'auth.schemas.ts': `import { z } from 'zod';\n\nexport const loginSchema = z.object({\n email: z.string().email(),\n password: z.string().min(1),\n});\n\nexport const registerSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().min(2).optional(),\n});\n\nexport const refreshTokenSchema = z.object({\n refreshToken: z.string().min(1),\n});\n`,\n 'index.ts': `export * from './auth.types.js';\nexport * from './auth.schemas.js';\n// Export services, controllers, etc.\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateUsersModule(dir: string): Promise<void> {\n const files = {\n 'user.types.ts': `export type UserStatus = 'active' | 'inactive' | 'suspended' | 'banned';\nexport type UserRole = 'user' | 'admin' | 'moderator' | 'super_admin';\n\nexport interface User {\n id: string;\n email: string;\n password: string;\n name?: string;\n role: UserRole;\n status: UserStatus;\n createdAt: Date;\n updatedAt: Date;\n}\n`,\n 'user.schemas.ts': `import { z } from 'zod';\n\nexport const createUserSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().min(2).optional(),\n role: z.enum(['user', 'admin', 'moderator']).optional(),\n});\n\nexport const updateUserSchema = z.object({\n email: z.string().email().optional(),\n name: z.string().min(2).optional(),\n role: z.enum(['user', 'admin', 'moderator', 'super_admin']).optional(),\n status: z.enum(['active', 'inactive', 'suspended', 'banned']).optional(),\n});\n`,\n 'index.ts': `export * from './user.types.js';\nexport * from './user.schemas.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateEmailModule(dir: string): Promise<void> {\n const files = {\n 'email.types.ts': `export interface EmailOptions {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n template?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n`,\n 'email.service.ts': `import nodemailer from 'nodemailer';\nimport type { EmailOptions, EmailResult } from './email.types.js';\n\nexport class EmailService {\n private transporter;\n\n constructor() {\n this.transporter = nodemailer.createTransport({\n host: process.env.SMTP_HOST,\n port: parseInt(process.env.SMTP_PORT || '587', 10),\n auth: {\n user: process.env.SMTP_USER,\n pass: process.env.SMTP_PASS,\n },\n });\n }\n\n async send(options: EmailOptions): Promise<EmailResult> {\n try {\n const result = await this.transporter.sendMail({\n from: process.env.SMTP_FROM,\n ...options,\n });\n return { success: true, messageId: result.messageId };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n}\n\nexport const emailService = new EmailService();\n`,\n 'index.ts': `export * from './email.types.js';\nexport { EmailService, emailService } from './email.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateAuditModule(dir: string): Promise<void> {\n const files = {\n 'audit.types.ts': `export interface AuditLogEntry {\n userId?: string;\n action: string;\n resource: string;\n resourceId?: string;\n oldValue?: Record<string, unknown>;\n newValue?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: Date;\n}\n`,\n 'audit.service.ts': `import type { AuditLogEntry } from './audit.types.js';\n\nconst logs: AuditLogEntry[] = [];\n\nexport class AuditService {\n async log(entry: Omit<AuditLogEntry, 'createdAt'>): Promise<void> {\n logs.push({ ...entry, createdAt: new Date() });\n console.log('[AUDIT]', entry.action, entry.resource);\n }\n\n async query(filters: Partial<AuditLogEntry>): Promise<AuditLogEntry[]> {\n return logs.filter((log) => {\n for (const [key, value] of Object.entries(filters)) {\n if (log[key as keyof AuditLogEntry] !== value) return false;\n }\n return true;\n });\n }\n}\n\nexport const auditService = new AuditService();\n`,\n 'index.ts': `export * from './audit.types.js';\nexport { AuditService, auditService } from './audit.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateUploadModule(dir: string): Promise<void> {\n const files = {\n 'upload.types.ts': `export interface UploadedFile {\n id: string;\n filename: string;\n originalName: string;\n mimetype: string;\n size: number;\n path: string;\n url: string;\n createdAt: Date;\n}\n\nexport interface UploadOptions {\n maxSize?: number;\n allowedTypes?: string[];\n destination?: string;\n}\n`,\n 'index.ts': `export * from './upload.types.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateCacheModule(dir: string): Promise<void> {\n const files = {\n 'cache.types.ts': `export interface CacheOptions {\n ttl?: number;\n prefix?: string;\n}\n`,\n 'cache.service.ts': `import type { CacheOptions } from './cache.types.js';\n\n// In-memory cache (replace with Redis in production)\nconst cache = new Map<string, { value: unknown; expiry: number }>();\n\nexport class CacheService {\n async get<T>(key: string): Promise<T | null> {\n const item = cache.get(key);\n if (!item) return null;\n if (Date.now() > item.expiry) {\n cache.delete(key);\n return null;\n }\n return item.value as T;\n }\n\n async set(key: string, value: unknown, ttl = 3600): Promise<void> {\n cache.set(key, { value, expiry: Date.now() + ttl * 1000 });\n }\n\n async del(key: string): Promise<void> {\n cache.delete(key);\n }\n\n async clear(): Promise<void> {\n cache.clear();\n }\n}\n\nexport const cacheService = new CacheService();\n`,\n 'index.ts': `export * from './cache.types.js';\nexport { CacheService, cacheService } from './cache.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateGenericModule(dir: string, name: string): Promise<void> {\n const files = {\n [`${name}.types.ts`]: `// ${name} types\nexport interface ${name.charAt(0).toUpperCase() + name.slice(1)}Data {\n // Define your types here\n}\n`,\n 'index.ts': `export * from './${name}.types.js';\n`,\n };\n\n for (const [fileName, content] of Object.entries(files)) {\n await writeFile(path.join(dir, fileName), content);\n }\n}\n\n/**\n * Helper: Generate module files - copies from existing src/modules if available\n */\nasync function generateModuleFiles(moduleName: string, moduleDir: string): Promise<void> {\n // Check if module exists in src/modules (our new modules)\n const sourceModuleDir = path.join(process.cwd(), 'src', 'modules', moduleName);\n\n if (await fileExists(sourceModuleDir)) {\n // Copy from existing module\n await copyModuleFromSource(sourceModuleDir, moduleDir);\n return;\n }\n\n // Fallback to old generation methods for basic modules\n switch (moduleName) {\n case 'auth':\n await generateAuthModule(moduleDir);\n break;\n case 'users':\n await generateUsersModule(moduleDir);\n break;\n case 'email':\n await generateEmailModule(moduleDir);\n break;\n case 'audit':\n await generateAuditModule(moduleDir);\n break;\n case 'upload':\n await generateUploadModule(moduleDir);\n break;\n case 'cache':\n await generateCacheModule(moduleDir);\n break;\n default:\n await generateGenericModule(moduleDir, moduleName);\n }\n}\n\n/**\n * Helper: Copy module from source directory\n */\nasync function copyModuleFromSource(sourceDir: string, targetDir: string): Promise<void> {\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n await fs.mkdir(targetPath, { recursive: true });\n await copyModuleFromSource(sourcePath, targetPath);\n } else {\n await fs.copyFile(sourcePath, targetPath);\n }\n }\n}\n\n/**\n * Helper: Get all module files as Record<filename, content>\n */\nasync function getModuleFiles(\n moduleName: string,\n moduleDir: string\n): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n const entries = await fs.readdir(moduleDir);\n\n for (const entry of entries) {\n const filePath = path.join(moduleDir, entry);\n const stat = await fs.stat(filePath);\n\n if (stat.isFile() && entry.endsWith('.ts')) {\n const content = await fs.readFile(filePath, 'utf-8');\n files[entry] = content;\n }\n }\n\n return files;\n}\n\n/**\n * Helper: Show diff for entire module\n */\nasync function showDiffForModule(\n templateManager: TemplateManager,\n moduleName: string,\n moduleDir: string\n): Promise<void> {\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n\n console.log(chalk.cyan(`\\n📊 Changes in module \"${moduleName}\":\\n`));\n\n for (const file of modifiedFiles) {\n if (file.isModified) {\n console.log(chalk.yellow(`\\n📄 ${file.fileName}:`));\n\n const currentPath = path.join(moduleDir, file.fileName);\n const currentContent = await fs.readFile(currentPath, 'utf-8');\n const originalContent = await templateManager.getTemplate(moduleName, file.fileName);\n\n if (originalContent) {\n const diff = templateManager.generateDiff(originalContent, currentContent);\n console.log(diff);\n }\n }\n }\n}\n\n/**\n * Helper: Perform smart merge\n */\nasync function performSmartMerge(\n templateManager: TemplateManager,\n moduleName: string,\n moduleDir: string,\n _displayName: string\n): Promise<void> {\n const spinner = ora('Analyzing files for merge...').start();\n\n // Get new template files\n const newFiles: Record<string, string> = {};\n const templateDir = path.join(templateManager['templatesDir'], moduleName);\n\n try {\n const entries = await fs.readdir(templateDir);\n for (const entry of entries) {\n const content = await fs.readFile(path.join(templateDir, entry), 'utf-8');\n newFiles[entry] = content;\n }\n } catch {\n spinner.fail('Could not find template files');\n return;\n }\n\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n spinner.stop();\n\n // Ask for batch action or individual\n const batchAction = await InteractivePrompt.askBatchAction();\n\n const stats = {\n merged: 0,\n kept: 0,\n overwritten: 0,\n conflicts: 0,\n };\n\n for (const fileInfo of modifiedFiles) {\n const fileName = fileInfo.fileName;\n const filePath = path.join(moduleDir, fileName);\n const newContent = newFiles[fileName];\n\n if (!newContent) {\n // File doesn't exist in new template, keep existing\n continue;\n }\n\n let fileAction: string;\n\n if (batchAction === 'merge-all') {\n fileAction = 'merge';\n } else if (batchAction === 'keep-all') {\n fileAction = 'keep';\n } else if (batchAction === 'overwrite-all') {\n fileAction = 'overwrite';\n } else {\n // Ask for each file\n const currentContent = await fs.readFile(filePath, 'utf-8');\n const yourLines = currentContent.split('\\n').length;\n const newLines = newContent.split('\\n').length;\n\n const choice = await InteractivePrompt.askFileAction(\n fileName,\n fileInfo.isModified,\n yourLines,\n newLines\n );\n fileAction = choice.action;\n\n if (fileAction === 'diff') {\n const originalContent = await templateManager.getTemplate(moduleName, fileName);\n if (originalContent) {\n const diff = templateManager.generateDiff(originalContent, currentContent);\n const proceed = await InteractivePrompt.showDiffAndAsk(diff);\n fileAction = proceed ? 'merge' : 'keep';\n }\n }\n }\n\n // Perform action\n if (fileAction === 'keep' || fileAction === 'skip') {\n stats.kept++;\n continue;\n }\n\n if (fileAction === 'overwrite') {\n await fs.writeFile(filePath, newContent, 'utf-8');\n stats.overwritten++;\n continue;\n }\n\n if (fileAction === 'merge') {\n const originalContent = await templateManager.getTemplate(moduleName, fileName);\n const currentContent = await fs.readFile(filePath, 'utf-8');\n\n if (originalContent) {\n const mergeResult = await templateManager.mergeFiles(\n originalContent,\n currentContent,\n newContent\n );\n\n await fs.writeFile(filePath, mergeResult.merged, 'utf-8');\n\n if (mergeResult.hasConflicts) {\n stats.conflicts++;\n InteractivePrompt.displayConflicts(mergeResult.conflicts);\n } else {\n stats.merged++;\n }\n } else {\n await fs.writeFile(filePath, newContent, 'utf-8');\n stats.overwritten++;\n }\n }\n }\n\n // Update manifest\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.updateManifest(moduleName, files);\n\n InteractivePrompt.showMergeSummary(stats);\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { existsSync } from 'fs';\n\nexport interface EnvVariable {\n key: string;\n value?: string;\n comment?: string;\n required?: boolean;\n}\n\nexport interface EnvSection {\n title: string;\n variables: EnvVariable[];\n}\n\n/**\n * Environment Manager\n * Manages .env file updates when adding modules\n */\nexport class EnvManager {\n private envPath: string;\n private envExamplePath: string;\n\n constructor(projectRoot: string) {\n this.envPath = path.join(projectRoot, '.env');\n this.envExamplePath = path.join(projectRoot, '.env.example');\n }\n\n /**\n * Add environment variables to .env file\n */\n async addVariables(sections: EnvSection[]): Promise<{\n added: string[];\n skipped: string[];\n created: boolean;\n }> {\n const added: string[] = [];\n const skipped: string[] = [];\n let created = false;\n\n // Read existing .env or create new one\n let envContent = '';\n if (existsSync(this.envPath)) {\n envContent = await fs.readFile(this.envPath, 'utf-8');\n } else {\n created = true;\n }\n\n // Parse existing variables\n const existingKeys = this.parseExistingKeys(envContent);\n\n // Build new content\n let newContent = envContent;\n if (newContent && !newContent.endsWith('\\n\\n')) {\n newContent += '\\n\\n';\n }\n\n for (const section of sections) {\n // Add section comment\n newContent += `# ${section.title}\\n`;\n\n for (const variable of section.variables) {\n // Skip if already exists\n if (existingKeys.has(variable.key)) {\n skipped.push(variable.key);\n continue;\n }\n\n // Add variable comment if provided\n if (variable.comment) {\n newContent += `# ${variable.comment}\\n`;\n }\n\n // Add variable\n const value = variable.value || '';\n const prefix = variable.required ? '' : '# ';\n newContent += `${prefix}${variable.key}=${value}\\n`;\n\n added.push(variable.key);\n }\n\n newContent += '\\n';\n }\n\n // Write to .env\n await fs.writeFile(this.envPath, newContent, 'utf-8');\n\n // Update .env.example if it exists\n if (existsSync(this.envExamplePath)) {\n await this.updateEnvExample(sections);\n }\n\n return { added, skipped, created };\n }\n\n /**\n * Update .env.example file\n */\n private async updateEnvExample(sections: EnvSection[]): Promise<void> {\n let exampleContent = '';\n if (existsSync(this.envExamplePath)) {\n exampleContent = await fs.readFile(this.envExamplePath, 'utf-8');\n }\n\n const existingKeys = this.parseExistingKeys(exampleContent);\n\n let newContent = exampleContent;\n if (newContent && !newContent.endsWith('\\n\\n')) {\n newContent += '\\n\\n';\n }\n\n for (const section of sections) {\n newContent += `# ${section.title}\\n`;\n\n for (const variable of section.variables) {\n if (existingKeys.has(variable.key)) {\n continue;\n }\n\n if (variable.comment) {\n newContent += `# ${variable.comment}\\n`;\n }\n\n // In .env.example, show placeholder values\n const placeholder = this.getPlaceholder(variable.key);\n newContent += `${variable.key}=${placeholder}\\n`;\n }\n\n newContent += '\\n';\n }\n\n await fs.writeFile(this.envExamplePath, newContent, 'utf-8');\n }\n\n /**\n * Parse existing environment variable keys\n */\n private parseExistingKeys(content: string): Set<string> {\n const keys = new Set<string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('#')) {\n continue;\n }\n\n // Extract key from KEY=value or # KEY=value\n const match = trimmed.match(/^#?\\s*([A-Z_][A-Z0-9_]*)\\s*=/);\n if (match && match[1]) {\n keys.add(match[1]);\n }\n }\n\n return keys;\n }\n\n /**\n * Get placeholder value for .env.example\n */\n private getPlaceholder(key: string): string {\n // Common patterns\n if (key.includes('SECRET') || key.includes('KEY') || key.includes('PASSWORD')) {\n return 'your-secret-key-here';\n }\n if (key.includes('HOST')) {\n return 'localhost';\n }\n if (key.includes('PORT')) {\n return '3000';\n }\n if (key.includes('URL')) {\n return 'http://localhost:3000';\n }\n if (key.includes('EMAIL')) {\n return 'user@example.com';\n }\n if (key.includes('REDIS')) {\n return 'redis://localhost:6379';\n }\n if (key.includes('DATABASE')) {\n return 'postgresql://user:pass@localhost:5432/db';\n }\n if (key.includes('NODE')) {\n return 'http://localhost:9200';\n }\n\n return '';\n }\n\n /**\n * Get environment variables for a specific module\n */\n static getModuleEnvVariables(moduleName: string): EnvSection[] {\n const moduleEnvMap: Record<string, EnvSection[]> = {\n 'rate-limit': [\n {\n title: 'Rate Limiting Configuration',\n variables: [\n {\n key: 'RATE_LIMIT_ENABLED',\n value: 'true',\n comment: 'Enable rate limiting',\n required: true,\n },\n {\n key: 'RATE_LIMIT_REDIS_URL',\n value: 'redis://localhost:6379',\n comment:\n 'Redis URL for distributed rate limiting (optional, uses in-memory if not set)',\n required: false,\n },\n ],\n },\n ],\n webhook: [\n {\n title: 'Webhook Configuration',\n variables: [\n {\n key: 'WEBHOOK_TIMEOUT',\n value: '10000',\n comment: 'Webhook request timeout in milliseconds',\n required: true,\n },\n {\n key: 'WEBHOOK_MAX_RETRIES',\n value: '5',\n comment: 'Maximum number of retry attempts',\n required: true,\n },\n {\n key: 'WEBHOOK_SIGNATURE_ENABLED',\n value: 'true',\n comment: 'Enable HMAC signature verification',\n required: true,\n },\n ],\n },\n ],\n queue: [\n {\n title: 'Queue/Jobs Configuration',\n variables: [\n {\n key: 'REDIS_HOST',\n value: 'localhost',\n comment: 'Redis host for Bull queue',\n required: true,\n },\n {\n key: 'REDIS_PORT',\n value: '6379',\n comment: 'Redis port',\n required: true,\n },\n {\n key: 'REDIS_PASSWORD',\n value: '',\n comment: 'Redis password (optional)',\n required: false,\n },\n {\n key: 'QUEUE_METRICS_ENABLED',\n value: 'true',\n comment: 'Enable queue metrics collection',\n required: true,\n },\n ],\n },\n ],\n websocket: [\n {\n title: 'WebSocket Configuration',\n variables: [\n {\n key: 'WEBSOCKET_PORT',\n value: '3001',\n comment: 'WebSocket server port',\n required: true,\n },\n {\n key: 'WEBSOCKET_CORS_ORIGIN',\n value: 'http://localhost:3000',\n comment: 'CORS origin for WebSocket',\n required: true,\n },\n {\n key: 'WEBSOCKET_REDIS_URL',\n value: 'redis://localhost:6379',\n comment: 'Redis URL for Socket.io adapter (optional, for multi-instance)',\n required: false,\n },\n ],\n },\n ],\n search: [\n {\n title: 'Search Configuration (Elasticsearch)',\n variables: [\n {\n key: 'SEARCH_ENGINE',\n value: 'memory',\n comment: 'Search engine: elasticsearch, meilisearch, or memory',\n required: true,\n },\n {\n key: 'ELASTICSEARCH_NODE',\n value: 'http://localhost:9200',\n comment: 'Elasticsearch node URL',\n required: false,\n },\n {\n key: 'ELASTICSEARCH_USERNAME',\n value: '',\n comment: 'Elasticsearch username (optional)',\n required: false,\n },\n {\n key: 'ELASTICSEARCH_PASSWORD',\n value: '',\n comment: 'Elasticsearch password (optional)',\n required: false,\n },\n ],\n },\n {\n title: 'Search Configuration (Meilisearch)',\n variables: [\n {\n key: 'MEILISEARCH_HOST',\n value: 'http://localhost:7700',\n comment: 'Meilisearch host URL',\n required: false,\n },\n {\n key: 'MEILISEARCH_API_KEY',\n value: '',\n comment: 'Meilisearch API key (optional)',\n required: false,\n },\n ],\n },\n ],\n i18n: [\n {\n title: 'i18n/Localization Configuration',\n variables: [\n {\n key: 'DEFAULT_LOCALE',\n value: 'en',\n comment: 'Default locale/language',\n required: true,\n },\n {\n key: 'SUPPORTED_LOCALES',\n value: 'en,fr,es,de,ar,zh,ja',\n comment: 'Comma-separated list of supported locales',\n required: true,\n },\n {\n key: 'TRANSLATIONS_DIR',\n value: './locales',\n comment: 'Directory for translation files',\n required: true,\n },\n {\n key: 'I18N_CACHE_ENABLED',\n value: 'true',\n comment: 'Enable translation caching',\n required: true,\n },\n ],\n },\n ],\n cache: [\n {\n title: 'Cache Configuration',\n variables: [\n {\n key: 'CACHE_PROVIDER',\n value: 'redis',\n comment: 'Cache provider: redis or memory',\n required: true,\n },\n {\n key: 'CACHE_REDIS_URL',\n value: 'redis://localhost:6379',\n comment: 'Redis URL for cache',\n required: false,\n },\n {\n key: 'CACHE_TTL',\n value: '3600',\n comment: 'Default cache TTL in seconds',\n required: true,\n },\n ],\n },\n ],\n mfa: [\n {\n title: 'MFA/TOTP Configuration',\n variables: [\n {\n key: 'MFA_ISSUER',\n value: 'MyApp',\n comment: 'MFA issuer name shown in authenticator apps',\n required: true,\n },\n {\n key: 'MFA_ALGORITHM',\n value: 'SHA1',\n comment: 'TOTP algorithm: SHA1, SHA256, or SHA512',\n required: true,\n },\n ],\n },\n ],\n oauth: [\n {\n title: 'OAuth Configuration',\n variables: [\n {\n key: 'OAUTH_GOOGLE_CLIENT_ID',\n value: '',\n comment: 'Google OAuth client ID',\n required: false,\n },\n {\n key: 'OAUTH_GOOGLE_CLIENT_SECRET',\n value: '',\n comment: 'Google OAuth client secret',\n required: false,\n },\n {\n key: 'OAUTH_GITHUB_CLIENT_ID',\n value: '',\n comment: 'GitHub OAuth client ID',\n required: false,\n },\n {\n key: 'OAUTH_GITHUB_CLIENT_SECRET',\n value: '',\n comment: 'GitHub OAuth client secret',\n required: false,\n },\n {\n key: 'OAUTH_REDIRECT_URL',\n value: 'http://localhost:3000/auth/callback',\n comment: 'OAuth callback URL',\n required: true,\n },\n ],\n },\n ],\n payment: [\n {\n title: 'Payment Configuration',\n variables: [\n {\n key: 'STRIPE_SECRET_KEY',\n value: '',\n comment: 'Stripe secret key',\n required: false,\n },\n {\n key: 'STRIPE_PUBLISHABLE_KEY',\n value: '',\n comment: 'Stripe publishable key',\n required: false,\n },\n {\n key: 'PAYPAL_CLIENT_ID',\n value: '',\n comment: 'PayPal client ID',\n required: false,\n },\n {\n key: 'PAYPAL_CLIENT_SECRET',\n value: '',\n comment: 'PayPal client secret',\n required: false,\n },\n {\n key: 'PAYPAL_MODE',\n value: 'sandbox',\n comment: 'PayPal mode: sandbox or live',\n required: false,\n },\n ],\n },\n ],\n 'feature-flag': [\n {\n title: 'Feature Flags Configuration',\n variables: [\n {\n key: 'FEATURE_FLAGS_ENABLED',\n value: 'true',\n comment: 'Enable feature flags',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_ENVIRONMENT',\n value: 'development',\n comment: 'Feature flags environment: development, staging, production, test',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_ANALYTICS',\n value: 'true',\n comment: 'Enable feature flag analytics',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_CACHE_TTL',\n value: '300',\n comment: 'Cache TTL in seconds',\n required: true,\n },\n ],\n },\n ],\n upload: [\n {\n title: 'File Upload Configuration',\n variables: [\n {\n key: 'UPLOAD_PROVIDER',\n value: 'local',\n comment: 'Upload provider: local, s3, cloudinary',\n required: true,\n },\n {\n key: 'UPLOAD_MAX_SIZE',\n value: '10485760',\n comment: 'Max upload size in bytes (10MB)',\n required: true,\n },\n {\n key: 'UPLOAD_DIR',\n value: './uploads',\n comment: 'Local upload directory',\n required: true,\n },\n {\n key: 'AWS_ACCESS_KEY_ID',\n value: '',\n comment: 'AWS access key for S3',\n required: false,\n },\n {\n key: 'AWS_SECRET_ACCESS_KEY',\n value: '',\n comment: 'AWS secret key for S3',\n required: false,\n },\n {\n key: 'AWS_S3_BUCKET',\n value: '',\n comment: 'S3 bucket name',\n required: false,\n },\n ],\n },\n ],\n notification: [\n {\n title: 'Notification Configuration',\n variables: [\n {\n key: 'NOTIFICATION_EMAIL_ENABLED',\n value: 'true',\n comment: 'Enable email notifications',\n required: true,\n },\n {\n key: 'NOTIFICATION_SMS_ENABLED',\n value: 'false',\n comment: 'Enable SMS notifications',\n required: false,\n },\n {\n key: 'NOTIFICATION_PUSH_ENABLED',\n value: 'false',\n comment: 'Enable push notifications',\n required: false,\n },\n {\n key: 'TWILIO_ACCOUNT_SID',\n value: '',\n comment: 'Twilio account SID for SMS',\n required: false,\n },\n {\n key: 'TWILIO_AUTH_TOKEN',\n value: '',\n comment: 'Twilio auth token',\n required: false,\n },\n ],\n },\n ],\n analytics: [\n {\n title: 'Analytics/Metrics Configuration',\n variables: [\n {\n key: 'ANALYTICS_ENABLED',\n value: 'true',\n comment: 'Enable analytics and metrics collection',\n required: true,\n },\n {\n key: 'ANALYTICS_PREFIX',\n value: 'app',\n comment: 'Metrics prefix',\n required: true,\n },\n {\n key: 'PROMETHEUS_ENABLED',\n value: 'true',\n comment: 'Enable Prometheus metrics endpoint',\n required: true,\n },\n {\n key: 'METRICS_FLUSH_INTERVAL',\n value: '60000',\n comment: 'Metrics flush interval in milliseconds',\n required: true,\n },\n ],\n },\n ],\n 'media-processing': [\n {\n title: 'Media Processing Configuration',\n variables: [\n {\n key: 'FFMPEG_PATH',\n value: 'ffmpeg',\n comment: 'Path to FFmpeg binary',\n required: true,\n },\n {\n key: 'FFPROBE_PATH',\n value: 'ffprobe',\n comment: 'Path to FFprobe binary',\n required: true,\n },\n {\n key: 'MEDIA_TEMP_DIR',\n value: './temp/media',\n comment: 'Temporary directory for media processing',\n required: true,\n },\n {\n key: 'MEDIA_MAX_CONCURRENT',\n value: '3',\n comment: 'Maximum concurrent processing jobs',\n required: true,\n },\n {\n key: 'MEDIA_GPU_ACCELERATION',\n value: 'false',\n comment: 'Enable GPU acceleration (requires NVIDIA GPU)',\n required: false,\n },\n ],\n },\n ],\n 'api-versioning': [\n {\n title: 'API Versioning Configuration',\n variables: [\n {\n key: 'API_VERSION_STRATEGY',\n value: 'url',\n comment: 'Versioning strategy: url, header, query, accept-header',\n required: true,\n },\n {\n key: 'API_DEFAULT_VERSION',\n value: 'v1',\n comment: 'Default API version',\n required: true,\n },\n {\n key: 'API_VERSION_HEADER',\n value: 'X-API-Version',\n comment: 'Header name for version (if strategy is header)',\n required: false,\n },\n {\n key: 'API_VERSION_STRICT',\n value: 'true',\n comment: 'Strict mode - reject unknown versions',\n required: true,\n },\n {\n key: 'API_DEPRECATION_WARNINGS',\n value: 'true',\n comment: 'Show deprecation warnings in headers',\n required: true,\n },\n ],\n },\n ],\n };\n\n return moduleEnvMap[moduleName] || [];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { createHash } from 'crypto';\nimport { existsSync } from 'fs';\n\nexport interface Template {\n /** Template name */\n name: string;\n /** Template content */\n content: string;\n /** Template hash for change detection */\n hash: string;\n /** Template version */\n version: string;\n}\n\nexport interface ModuleManifest {\n /** Module name */\n name: string;\n /** Module version */\n version: string;\n /** Files in this module */\n files: Record<string, { hash: string; path: string }>;\n /** Install date */\n installedAt: Date;\n /** Last update */\n updatedAt: Date;\n}\n\n/**\n * Template Manager\n * Manages module templates and tracks installed versions\n */\nexport class TemplateManager {\n private templatesDir: string;\n private manifestsDir: string;\n\n constructor(projectRoot: string) {\n this.templatesDir = path.join(projectRoot, '.servcraft', 'templates');\n this.manifestsDir = path.join(projectRoot, '.servcraft', 'manifests');\n }\n\n /**\n * Initialize template system\n */\n async initialize(): Promise<void> {\n await fs.mkdir(this.templatesDir, { recursive: true });\n await fs.mkdir(this.manifestsDir, { recursive: true });\n }\n\n /**\n * Save module template\n */\n async saveTemplate(moduleName: string, files: Record<string, string>): Promise<void> {\n await this.initialize();\n\n const moduleTemplateDir = path.join(this.templatesDir, moduleName);\n await fs.mkdir(moduleTemplateDir, { recursive: true });\n\n // Save each file\n for (const [fileName, content] of Object.entries(files)) {\n const filePath = path.join(moduleTemplateDir, fileName);\n await fs.writeFile(filePath, content, 'utf-8');\n }\n }\n\n /**\n * Get template content\n */\n async getTemplate(moduleName: string, fileName: string): Promise<string | null> {\n try {\n const filePath = path.join(this.templatesDir, moduleName, fileName);\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n }\n\n /**\n * Save module manifest\n */\n async saveManifest(moduleName: string, files: Record<string, string>): Promise<void> {\n await this.initialize();\n\n const fileHashes: Record<string, { hash: string; path: string }> = {};\n\n for (const [fileName, content] of Object.entries(files)) {\n fileHashes[fileName] = {\n hash: this.hashContent(content),\n path: `src/modules/${moduleName}/${fileName}`,\n };\n }\n\n const manifest: ModuleManifest = {\n name: moduleName,\n version: '1.0.0',\n files: fileHashes,\n installedAt: new Date(),\n updatedAt: new Date(),\n };\n\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n }\n\n /**\n * Get module manifest\n */\n async getManifest(moduleName: string): Promise<ModuleManifest | null> {\n try {\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n const content = await fs.readFile(manifestPath, 'utf-8');\n return JSON.parse(content) as ModuleManifest;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if file has been modified by user\n */\n async isFileModified(\n moduleName: string,\n fileName: string,\n currentContent: string\n ): Promise<boolean> {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest || !manifest.files[fileName]) {\n return false;\n }\n\n const originalHash = manifest.files[fileName].hash;\n const currentHash = this.hashContent(currentContent);\n\n return originalHash !== currentHash;\n }\n\n /**\n * Get all modified files in a module\n */\n async getModifiedFiles(\n moduleName: string,\n moduleDir: string\n ): Promise<\n Array<{ fileName: string; isModified: boolean; originalHash: string; currentHash: string }>\n > {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest) {\n return [];\n }\n\n const results = [];\n\n for (const [fileName, fileInfo] of Object.entries(manifest.files)) {\n const filePath = path.join(moduleDir, fileName);\n\n if (!existsSync(filePath)) {\n results.push({\n fileName,\n isModified: true,\n originalHash: fileInfo.hash,\n currentHash: '',\n });\n continue;\n }\n\n const currentContent = await fs.readFile(filePath, 'utf-8');\n const currentHash = this.hashContent(currentContent);\n\n results.push({\n fileName,\n isModified: fileInfo.hash !== currentHash,\n originalHash: fileInfo.hash,\n currentHash,\n });\n }\n\n return results;\n }\n\n /**\n * Create backup of module\n */\n async createBackup(moduleName: string, moduleDir: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);\n const backupDir = path.join(path.dirname(moduleDir), `${moduleName}.backup-${timestamp}`);\n\n await this.copyDirectory(moduleDir, backupDir);\n\n return backupDir;\n }\n\n /**\n * Copy directory recursively\n */\n private async copyDirectory(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await this.copyDirectory(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n }\n\n /**\n * Perform 3-way merge\n */\n async mergeFiles(\n original: string,\n modified: string,\n incoming: string\n ): Promise<{ merged: string; hasConflicts: boolean; conflicts: string[] }> {\n const conflicts: string[] = [];\n let hasConflicts = false;\n\n // Simple line-based merge\n const originalLines = original.split('\\n');\n const modifiedLines = modified.split('\\n');\n const incomingLines = incoming.split('\\n');\n\n const merged: string[] = [];\n\n // This is a simplified merge - in production, use a proper diff3 algorithm\n // For now, we'll use a basic strategy:\n // 1. If modified === original, use incoming (user hasn't changed it)\n // 2. If modified !== original, keep modified (user changed it)\n // 3. If both changed, mark as conflict\n\n const maxLength = Math.max(originalLines.length, modifiedLines.length, incomingLines.length);\n\n for (let i = 0; i < maxLength; i++) {\n const origLine = originalLines[i] || '';\n const modLine = modifiedLines[i] || '';\n const incLine = incomingLines[i] || '';\n\n if (modLine === origLine) {\n // User hasn't modified, use incoming\n merged.push(incLine);\n } else if (incLine === origLine) {\n // Template hasn't changed, keep user's modification\n merged.push(modLine);\n } else if (modLine === incLine) {\n // Both have same change, no conflict\n merged.push(modLine);\n } else {\n // Conflict: both modified differently\n hasConflicts = true;\n conflicts.push(`Line ${i + 1}: User and template both modified`);\n merged.push(`<<<<<<< YOUR VERSION`);\n merged.push(modLine);\n merged.push(`=======`);\n merged.push(incLine);\n merged.push(`>>>>>>> NEW VERSION`);\n }\n }\n\n return {\n merged: merged.join('\\n'),\n hasConflicts,\n conflicts,\n };\n }\n\n /**\n * Generate diff between two files\n */\n generateDiff(original: string, modified: string): string {\n const originalLines = original.split('\\n');\n const modifiedLines = modified.split('\\n');\n\n const diff: string[] = [];\n diff.push('--- Original');\n diff.push('+++ Modified');\n diff.push('');\n\n const maxLength = Math.max(originalLines.length, modifiedLines.length);\n\n for (let i = 0; i < maxLength; i++) {\n const origLine = originalLines[i];\n const modLine = modifiedLines[i];\n\n if (origLine !== modLine) {\n if (origLine !== undefined) {\n diff.push(`- ${origLine}`);\n }\n if (modLine !== undefined) {\n diff.push(`+ ${modLine}`);\n }\n }\n }\n\n return diff.join('\\n');\n }\n\n /**\n * Hash content for change detection\n */\n private hashContent(content: string): string {\n return createHash('md5').update(content).digest('hex');\n }\n\n /**\n * Check if module is installed\n */\n async isModuleInstalled(moduleName: string): Promise<boolean> {\n const manifest = await this.getManifest(moduleName);\n return manifest !== null;\n }\n\n /**\n * Update manifest after merge\n */\n async updateManifest(moduleName: string, files: Record<string, string>): Promise<void> {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest) {\n await this.saveManifest(moduleName, files);\n return;\n }\n\n const fileHashes: Record<string, { hash: string; path: string }> = {};\n\n for (const [fileName, content] of Object.entries(files)) {\n fileHashes[fileName] = {\n hash: this.hashContent(content),\n path: `src/modules/${moduleName}/${fileName}`,\n };\n }\n\n manifest.files = fileHashes;\n manifest.updatedAt = new Date();\n\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n }\n}\n","import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nexport interface MergeChoice {\n action: 'skip' | 'update' | 'overwrite' | 'diff' | 'backup-overwrite';\n}\n\nexport interface FileChoice {\n action: 'merge' | 'keep' | 'overwrite' | 'diff' | 'skip';\n}\n\n/**\n * Interactive prompt utilities\n */\nexport class InteractivePrompt {\n /**\n * Ask what to do when module already exists\n */\n static async askModuleExists(\n moduleName: string,\n hasModifications: boolean\n ): Promise<MergeChoice> {\n console.log(chalk.yellow(`\\n⚠️ Module \"${moduleName}\" already exists`));\n\n if (hasModifications) {\n console.log(chalk.yellow(' Some files have been modified by you.\\n'));\n }\n\n const { action } = await inquirer.prompt<{ action: MergeChoice['action'] }>([\n {\n type: 'list',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n {\n name: '✓ Skip (keep existing files, recommended if you made custom changes)',\n value: 'skip',\n },\n {\n name: '↻ Update (merge new features, preserve your customizations)',\n value: 'update',\n },\n {\n name: '⚠ Overwrite (replace all files, will lose your changes)',\n value: 'overwrite',\n },\n {\n name: '📋 Show diff (see what changed)',\n value: 'diff',\n },\n {\n name: '💾 Backup & overwrite (save backup then replace)',\n value: 'backup-overwrite',\n },\n ],\n default: 'skip',\n },\n ]);\n\n return { action };\n }\n\n /**\n * Ask what to do with a specific file\n */\n static async askFileAction(\n fileName: string,\n isModified: boolean,\n yourLines: number,\n newLines: number\n ): Promise<FileChoice> {\n console.log(chalk.cyan(`\\n📁 ${fileName}`));\n console.log(\n chalk.gray(` Your version: ${yourLines} lines${isModified ? ' (modified)' : ''}`)\n );\n console.log(chalk.gray(` New version: ${newLines} lines\\n`));\n\n const { action } = await inquirer.prompt<{ action: FileChoice['action'] }>([\n {\n type: 'list',\n name: 'action',\n message: 'Action for this file:',\n choices: [\n {\n name: '[M]erge - Smart merge, preserve your changes',\n value: 'merge',\n },\n {\n name: '[K]eep - Keep your version (skip update)',\n value: 'keep',\n },\n {\n name: '[O]verwrite - Use new version',\n value: 'overwrite',\n },\n {\n name: '[D]iff - Show differences',\n value: 'diff',\n },\n {\n name: '[S]kip - Skip this file',\n value: 'skip',\n },\n ],\n default: isModified ? 'merge' : 'overwrite',\n },\n ]);\n\n return { action };\n }\n\n /**\n * Confirm action\n */\n static async confirm(message: string, defaultValue = false): Promise<boolean> {\n const { confirmed } = await inquirer.prompt<{ confirmed: boolean }>([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n\n return confirmed;\n }\n\n /**\n * Display diff and ask to continue\n */\n static async showDiffAndAsk(diff: string): Promise<boolean> {\n console.log(chalk.cyan('\\n📊 Differences:\\n'));\n console.log(diff);\n\n return await this.confirm('\\nDo you want to proceed with this change?', true);\n }\n\n /**\n * Display merge conflicts\n */\n static displayConflicts(conflicts: string[]): void {\n console.log(chalk.red('\\n⚠️ Merge Conflicts Detected:\\n'));\n conflicts.forEach((conflict, i) => {\n console.log(chalk.yellow(` ${i + 1}. ${conflict}`));\n });\n console.log(chalk.gray('\\n Conflict markers have been added to the file:'));\n console.log(chalk.gray(' <<<<<<< YOUR VERSION'));\n console.log(chalk.gray(' ... your code ...'));\n console.log(chalk.gray(' ======='));\n console.log(chalk.gray(' ... new code ...'));\n console.log(chalk.gray(' >>>>>>> NEW VERSION\\n'));\n }\n\n /**\n * Show backup location\n */\n static showBackupCreated(backupPath: string): void {\n console.log(chalk.green(`\\n✓ Backup created: ${chalk.cyan(backupPath)}`));\n }\n\n /**\n * Show merge summary\n */\n static showMergeSummary(stats: {\n merged: number;\n kept: number;\n overwritten: number;\n conflicts: number;\n }): void {\n console.log(chalk.bold('\\n📊 Merge Summary:\\n'));\n if (stats.merged > 0) {\n console.log(chalk.green(` ✓ Merged: ${stats.merged} file(s)`));\n }\n if (stats.kept > 0) {\n console.log(chalk.blue(` → Kept: ${stats.kept} file(s)`));\n }\n if (stats.overwritten > 0) {\n console.log(chalk.yellow(` ⚠ Overwritten: ${stats.overwritten} file(s)`));\n }\n if (stats.conflicts > 0) {\n console.log(chalk.red(` ⚠ Conflicts: ${stats.conflicts} file(s)`));\n console.log(chalk.gray('\\n Please resolve conflicts manually before committing.\\n'));\n }\n }\n\n /**\n * Ask for batch action on all files\n */\n static async askBatchAction(): Promise<\n 'individual' | 'merge-all' | 'keep-all' | 'overwrite-all'\n > {\n const { action } = await inquirer.prompt<{\n action: 'individual' | 'merge-all' | 'keep-all' | 'overwrite-all';\n }>([\n {\n type: 'list',\n name: 'action',\n message: 'Multiple files found. Choose action:',\n choices: [\n {\n name: 'Ask for each file individually (recommended)',\n value: 'individual',\n },\n {\n name: 'Merge all files automatically',\n value: 'merge-all',\n },\n {\n name: 'Keep all existing files (skip update)',\n value: 'keep-all',\n },\n {\n name: 'Overwrite all files with new versions',\n value: 'overwrite-all',\n },\n ],\n default: 'individual',\n },\n ]);\n\n return action;\n }\n}\n","import { Command } from 'commander';\nimport { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/helpers.js';\n\nexport const dbCommand = new Command('db').description('Database management commands');\n\ndbCommand\n .command('migrate')\n .description('Run database migrations')\n .option('-n, --name <name>', 'Migration name')\n .action(async (options) => {\n const spinner = ora('Running migrations...').start();\n\n try {\n const cmd = options.name\n ? `npx prisma migrate dev --name ${options.name}`\n : 'npx prisma migrate dev';\n\n execSync(cmd, { stdio: 'inherit' });\n spinner.succeed('Migrations completed!');\n } catch (err) {\n spinner.fail('Migration failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('push')\n .description('Push schema changes to database (no migration)')\n .action(async () => {\n const spinner = ora('Pushing schema...').start();\n\n try {\n execSync('npx prisma db push', { stdio: 'inherit' });\n spinner.succeed('Schema pushed successfully!');\n } catch (err) {\n spinner.fail('Push failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('generate')\n .description('Generate Prisma client')\n .action(async () => {\n const spinner = ora('Generating Prisma client...').start();\n\n try {\n execSync('npx prisma generate', { stdio: 'inherit' });\n spinner.succeed('Prisma client generated!');\n } catch (err) {\n spinner.fail('Generation failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('studio')\n .description('Open Prisma Studio')\n .action(async () => {\n info('Opening Prisma Studio...');\n const studio = spawn('npx', ['prisma', 'studio'], {\n stdio: 'inherit',\n shell: true,\n });\n\n studio.on('close', (code) => {\n if (code !== 0) {\n error('Prisma Studio closed with error');\n }\n });\n });\n\ndbCommand\n .command('seed')\n .description('Run database seed')\n .action(async () => {\n const spinner = ora('Seeding database...').start();\n\n try {\n execSync('npx prisma db seed', { stdio: 'inherit' });\n spinner.succeed('Database seeded!');\n } catch (err) {\n spinner.fail('Seeding failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('reset')\n .description('Reset database (drop all data and re-run migrations)')\n .option('-f, --force', 'Skip confirmation')\n .action(async (options) => {\n if (!options.force) {\n console.log(chalk.yellow('\\n⚠️ WARNING: This will delete all data in your database!\\n'));\n\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question('Are you sure you want to continue? (y/N) ', resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n info('Operation cancelled');\n return;\n }\n }\n\n const spinner = ora('Resetting database...').start();\n\n try {\n execSync('npx prisma migrate reset --force', { stdio: 'inherit' });\n spinner.succeed('Database reset completed!');\n } catch (err) {\n spinner.fail('Reset failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('status')\n .description('Show migration status')\n .action(async () => {\n try {\n execSync('npx prisma migrate status', { stdio: 'inherit' });\n } catch {\n error('Failed to get migration status');\n }\n });\n"],"mappings":"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","names":["import_commander","import_path","import_promises","import_chalk","fs","path","chalk","path","chalk","inquirer","path","ora","fs","import_commander","import_path","import_ora","import_inquirer","ora","path","inquirer","import_commander","import_path","import_ora","import_chalk","fs","fs","path","fs","path","import_fs","import_inquirer","import_chalk","chalk","inquirer","chalk","module","ora","path","stat","import_commander","import_child_process","import_ora","import_chalk","ora","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tsup/assets/cjs_shims.js","../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/utils/helpers.ts","../../src/cli/commands/generate.ts","../../src/cli/utils/field-parser.ts","../../src/cli/templates/controller.ts","../../src/cli/templates/service.ts","../../src/cli/templates/repository.ts","../../src/cli/templates/types.ts","../../src/cli/templates/schemas.ts","../../src/cli/templates/routes.ts","../../src/cli/templates/module-index.ts","../../src/cli/templates/prisma-model.ts","../../src/cli/templates/dynamic-types.ts","../../src/cli/templates/dynamic-schemas.ts","../../src/cli/templates/dynamic-prisma.ts","../../src/cli/commands/add-module.ts","../../src/cli/utils/env-manager.ts","../../src/cli/utils/template-manager.ts","../../src/cli/utils/interactive-prompt.ts","../../src/cli/commands/db.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { generateCommand } from './commands/generate.js';\nimport { addModuleCommand } from './commands/add-module.js';\nimport { dbCommand } from './commands/db.js';\n\nconst program = new Command();\n\nprogram\n .name('servcraft')\n .description('Servcraft - A modular Node.js backend framework CLI')\n .version('0.1.0');\n\n// Initialize new project\nprogram.addCommand(initCommand);\n\n// Generate resources (controller, service, model, etc.)\nprogram.addCommand(generateCommand);\n\n// Add pre-built modules\nprogram.addCommand(addModuleCommand);\n\n// Database commands\nprogram.addCommand(dbCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { ensureDir, writeFile, error, warn } from '../utils/helpers.js';\n\ninterface InitOptions {\n name: string;\n language: 'typescript' | 'javascript';\n database: 'postgresql' | 'mysql' | 'sqlite' | 'mongodb' | 'none';\n orm: 'prisma' | 'mongoose' | 'none';\n validator: 'zod' | 'joi' | 'yup';\n features: string[];\n}\n\nexport const initCommand = new Command('init')\n .alias('new')\n .description('Initialize a new Servcraft project')\n .argument('[name]', 'Project name')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--ts, --typescript', 'Use TypeScript (default)')\n .option('--js, --javascript', 'Use JavaScript')\n .option('--db <database>', 'Database type (postgresql, mysql, sqlite, mongodb, none)')\n .action(\n async (\n name?: string,\n cmdOptions?: { yes?: boolean; typescript?: boolean; javascript?: boolean; db?: string }\n ) => {\n console.log(\n chalk.blue(`\n╔═══════════════════════════════════════════╗\n║ ║\n║ ${chalk.bold('🚀 Servcraft Project Generator')} ║\n║ ║\n╚═══════════════════════════════════════════╝\n`)\n );\n\n let options: InitOptions;\n\n if (cmdOptions?.yes) {\n const db = (cmdOptions.db as InitOptions['database']) || 'postgresql';\n options = {\n name: name || 'my-servcraft-app',\n language: cmdOptions.javascript ? 'javascript' : 'typescript',\n database: db,\n orm: db === 'mongodb' ? 'mongoose' : db === 'none' ? 'none' : 'prisma',\n validator: 'zod',\n features: ['auth', 'users', 'email'],\n };\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: name || 'my-servcraft-app',\n validate: (input: string) => {\n if (!/^[a-z0-9-_]+$/i.test(input)) {\n return 'Project name can only contain letters, numbers, hyphens, and underscores';\n }\n return true;\n },\n },\n {\n type: 'list',\n name: 'language',\n message: 'Select language:',\n choices: [\n { name: 'TypeScript (Recommended)', value: 'typescript' },\n { name: 'JavaScript', value: 'javascript' },\n ],\n default: 'typescript',\n },\n {\n type: 'list',\n name: 'database',\n message: 'Select database:',\n choices: [\n { name: 'PostgreSQL (Recommended for SQL)', value: 'postgresql' },\n { name: 'MySQL', value: 'mysql' },\n { name: 'SQLite (Development)', value: 'sqlite' },\n { name: 'MongoDB (NoSQL)', value: 'mongodb' },\n { name: 'None (Add later)', value: 'none' },\n ],\n default: 'postgresql',\n },\n {\n type: 'list',\n name: 'validator',\n message: 'Select validation library:',\n choices: [\n { name: 'Zod (Recommended - TypeScript-first)', value: 'zod' },\n { name: 'Joi (Battle-tested, feature-rich)', value: 'joi' },\n { name: 'Yup (Inspired by Joi, lighter)', value: 'yup' },\n ],\n default: 'zod',\n },\n {\n type: 'checkbox',\n name: 'features',\n message: 'Select features to include:',\n choices: [\n { name: 'Authentication (JWT)', value: 'auth', checked: true },\n { name: 'User Management', value: 'users', checked: true },\n { name: 'Email Service', value: 'email', checked: true },\n { name: 'Audit Logs', value: 'audit', checked: false },\n { name: 'File Upload', value: 'upload', checked: false },\n { name: 'Redis Cache', value: 'redis', checked: false },\n ],\n },\n ]);\n\n // Auto-determine ORM based on database choice\n const db = answers.database as InitOptions['database'];\n options = {\n ...answers,\n orm: db === 'mongodb' ? 'mongoose' : db === 'none' ? 'none' : 'prisma',\n } as InitOptions;\n }\n\n const projectDir = path.resolve(process.cwd(), options.name);\n const spinner = ora('Creating project...').start();\n\n try {\n // Check if directory exists\n try {\n await fs.access(projectDir);\n spinner.stop();\n error(`Directory \"${options.name}\" already exists`);\n return;\n } catch {\n // Directory doesn't exist, continue\n }\n\n // Create project directory\n await ensureDir(projectDir);\n\n spinner.text = 'Generating project files...';\n\n // Generate package.json\n const packageJson = generatePackageJson(options);\n await writeFile(\n path.join(projectDir, 'package.json'),\n JSON.stringify(packageJson, null, 2)\n );\n\n // Generate tsconfig or jsconfig\n if (options.language === 'typescript') {\n await writeFile(path.join(projectDir, 'tsconfig.json'), generateTsConfig());\n await writeFile(path.join(projectDir, 'tsup.config.ts'), generateTsupConfig());\n } else {\n await writeFile(path.join(projectDir, 'jsconfig.json'), generateJsConfig());\n }\n\n // Generate .env files\n await writeFile(path.join(projectDir, '.env.example'), generateEnvExample(options));\n await writeFile(path.join(projectDir, '.env'), generateEnvExample(options));\n\n // Generate .gitignore\n await writeFile(path.join(projectDir, '.gitignore'), generateGitignore());\n\n // Generate Docker files\n await writeFile(path.join(projectDir, 'Dockerfile'), generateDockerfile(options));\n await writeFile(\n path.join(projectDir, 'docker-compose.yml'),\n generateDockerCompose(options)\n );\n\n // Create directory structure\n const ext = options.language === 'typescript' ? 'ts' : 'js';\n const dirs = [\n 'src/core',\n 'src/config',\n 'src/modules',\n 'src/middleware',\n 'src/utils',\n 'src/types',\n 'tests/unit',\n 'tests/integration',\n ];\n\n if (options.orm === 'prisma') {\n dirs.push('prisma');\n }\n if (options.orm === 'mongoose') {\n dirs.push('src/database/models');\n }\n\n for (const dir of dirs) {\n await ensureDir(path.join(projectDir, dir));\n }\n\n // Generate main entry file\n await writeFile(path.join(projectDir, `src/index.${ext}`), generateEntryFile(options));\n\n // Generate core files\n await writeFile(\n path.join(projectDir, `src/core/server.${ext}`),\n generateServerFile(options)\n );\n await writeFile(\n path.join(projectDir, `src/core/logger.${ext}`),\n generateLoggerFile(options)\n );\n\n // Generate database files based on ORM choice\n if (options.orm === 'prisma') {\n await writeFile(\n path.join(projectDir, 'prisma/schema.prisma'),\n generatePrismaSchema(options)\n );\n } else if (options.orm === 'mongoose') {\n await writeFile(\n path.join(projectDir, `src/database/connection.${ext}`),\n generateMongooseConnection(options)\n );\n await writeFile(\n path.join(projectDir, `src/database/models/user.model.${ext}`),\n generateMongooseUserModel(options)\n );\n }\n\n spinner.succeed('Project files generated!');\n\n // Install dependencies\n const installSpinner = ora('Installing dependencies...').start();\n\n try {\n execSync('npm install', { cwd: projectDir, stdio: 'pipe' });\n installSpinner.succeed('Dependencies installed!');\n } catch {\n installSpinner.warn('Failed to install dependencies automatically');\n warn(' Run \"npm install\" manually in the project directory');\n }\n\n // Print success message\n console.log('\\n' + chalk.green('✨ Project created successfully!'));\n console.log('\\n' + chalk.bold('📁 Project structure:'));\n console.log(`\n ${options.name}/\n ├── src/\n │ ├── core/ # Core server, logger\n │ ├── config/ # Configuration\n │ ├── modules/ # Feature modules\n │ ├── middleware/ # Middlewares\n │ ├── utils/ # Utilities\n │ └── index.${ext} # Entry point\n ├── tests/ # Tests\n ├── prisma/ # Database schema\n ├── docker-compose.yml\n └── package.json\n`);\n\n console.log(chalk.bold('🚀 Get started:'));\n console.log(`\n ${chalk.cyan(`cd ${options.name}`)}\n ${options.database !== 'none' ? chalk.cyan('npm run db:push # Setup database') : ''}\n ${chalk.cyan('npm run dev # Start development server')}\n`);\n\n console.log(chalk.bold('📚 Available commands:'));\n console.log(`\n ${chalk.yellow('servcraft generate module <name>')} Generate a new module\n ${chalk.yellow('servcraft generate controller <name>')} Generate a controller\n ${chalk.yellow('servcraft generate service <name>')} Generate a service\n ${chalk.yellow('servcraft add auth')} Add authentication module\n`);\n } catch (err) {\n spinner.fail('Failed to create project');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n );\n\nfunction generatePackageJson(options: InitOptions): Record<string, unknown> {\n const isTS = options.language === 'typescript';\n\n const pkg: Record<string, unknown> = {\n name: options.name,\n version: '0.1.0',\n description: 'A Servcraft application',\n main: isTS ? 'dist/index.js' : 'src/index.js',\n type: 'module',\n scripts: {\n dev: isTS ? 'tsx watch src/index.ts' : 'node --watch src/index.js',\n build: isTS ? 'tsup' : 'echo \"No build needed for JS\"',\n start: isTS ? 'node dist/index.js' : 'node src/index.js',\n test: 'vitest',\n lint: isTS ? 'eslint src --ext .ts' : 'eslint src --ext .js',\n },\n dependencies: {\n fastify: '^4.28.1',\n '@fastify/cors': '^9.0.1',\n '@fastify/helmet': '^11.1.1',\n '@fastify/jwt': '^8.0.1',\n '@fastify/rate-limit': '^9.1.0',\n '@fastify/cookie': '^9.3.1',\n pino: '^9.5.0',\n 'pino-pretty': '^11.3.0',\n bcryptjs: '^2.4.3',\n dotenv: '^16.4.5',\n },\n devDependencies: {\n vitest: '^2.1.8',\n },\n };\n\n // Add validator library based on choice\n switch (options.validator) {\n case 'zod':\n (pkg.dependencies as Record<string, string>).zod = '^3.23.8';\n break;\n case 'joi':\n (pkg.dependencies as Record<string, string>).joi = '^17.13.3';\n break;\n case 'yup':\n (pkg.dependencies as Record<string, string>).yup = '^1.4.0';\n break;\n }\n\n if (isTS) {\n (pkg.devDependencies as Record<string, string>).typescript = '^5.7.2';\n (pkg.devDependencies as Record<string, string>).tsx = '^4.19.2';\n (pkg.devDependencies as Record<string, string>).tsup = '^8.3.5';\n (pkg.devDependencies as Record<string, string>)['@types/node'] = '^22.10.1';\n (pkg.devDependencies as Record<string, string>)['@types/bcryptjs'] = '^2.4.6';\n }\n\n if (options.orm === 'prisma') {\n (pkg.dependencies as Record<string, string>)['@prisma/client'] = '^5.22.0';\n (pkg.devDependencies as Record<string, string>).prisma = '^5.22.0';\n (pkg.scripts as Record<string, string>)['db:generate'] = 'prisma generate';\n (pkg.scripts as Record<string, string>)['db:migrate'] = 'prisma migrate dev';\n (pkg.scripts as Record<string, string>)['db:push'] = 'prisma db push';\n (pkg.scripts as Record<string, string>)['db:studio'] = 'prisma studio';\n }\n\n if (options.orm === 'mongoose') {\n (pkg.dependencies as Record<string, string>).mongoose = '^8.8.4';\n if (isTS) {\n (pkg.devDependencies as Record<string, string>)['@types/mongoose'] = '^5.11.97';\n }\n }\n\n if (options.features.includes('email')) {\n (pkg.dependencies as Record<string, string>).nodemailer = '^6.9.15';\n (pkg.dependencies as Record<string, string>).handlebars = '^4.7.8';\n if (isTS) {\n (pkg.devDependencies as Record<string, string>)['@types/nodemailer'] = '^6.4.17';\n }\n }\n\n if (options.features.includes('redis')) {\n (pkg.dependencies as Record<string, string>).ioredis = '^5.4.1';\n }\n\n return pkg;\n}\n\nfunction generateTsConfig(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n lib: ['ES2022'],\n outDir: './dist',\n rootDir: './src',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n declaration: true,\n sourceMap: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2\n );\n}\n\nfunction generateJsConfig(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n target: 'ES2022',\n checkJs: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules'],\n },\n null,\n 2\n );\n}\n\nfunction generateTsupConfig(): string {\n return `import { defineConfig } from 'tsup';\n\nexport default defineConfig({\n entry: ['src/index.ts'],\n format: ['esm'],\n dts: true,\n clean: true,\n sourcemap: true,\n target: 'node18',\n});\n`;\n}\n\nfunction generateEnvExample(options: InitOptions): string {\n let env = `# Server\nNODE_ENV=development\nPORT=3000\nHOST=0.0.0.0\n\n# JWT\nJWT_SECRET=your-super-secret-key-min-32-characters\nJWT_ACCESS_EXPIRES_IN=15m\nJWT_REFRESH_EXPIRES_IN=7d\n\n# Security\nCORS_ORIGIN=http://localhost:3000\nRATE_LIMIT_MAX=100\n\n# Logging\nLOG_LEVEL=info\n`;\n\n if (options.database === 'postgresql') {\n env += `\n# Database (PostgreSQL)\nDATABASE_PROVIDER=postgresql\nDATABASE_URL=\"postgresql://user:password@localhost:5432/mydb?schema=public\"\n`;\n } else if (options.database === 'mysql') {\n env += `\n# Database (MySQL)\nDATABASE_PROVIDER=mysql\nDATABASE_URL=\"mysql://user:password@localhost:3306/mydb\"\n`;\n } else if (options.database === 'sqlite') {\n env += `\n# Database (SQLite)\nDATABASE_PROVIDER=sqlite\nDATABASE_URL=\"file:./dev.db\"\n`;\n } else if (options.database === 'mongodb') {\n env += `\n# Database (MongoDB)\nMONGODB_URI=\"mongodb://localhost:27017/mydb\"\n`;\n }\n\n if (options.features.includes('email')) {\n env += `\n# Email\nSMTP_HOST=smtp.example.com\nSMTP_PORT=587\nSMTP_USER=\nSMTP_PASS=\nSMTP_FROM=\"App <noreply@example.com>\"\n`;\n }\n\n if (options.features.includes('redis')) {\n env += `\n# Redis\nREDIS_URL=redis://localhost:6379\n`;\n }\n\n return env;\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.env.local\n*.log\ncoverage/\n.DS_Store\n*.db\n`;\n}\n\nfunction generateDockerfile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY ${isTS ? 'dist' : 'src'} ./${isTS ? 'dist' : 'src'}\n${options.database !== 'none' && options.database !== 'mongodb' ? 'COPY prisma ./prisma\\nRUN npx prisma generate' : ''}\nEXPOSE 3000\nCMD [\"node\", \"${isTS ? 'dist' : 'src'}/index.js\"]\n`;\n}\n\nfunction generateDockerCompose(options: InitOptions): string {\n let compose = `version: '3.8'\n\nservices:\n app:\n build: .\n ports:\n - \"\\${PORT:-3000}:3000\"\n environment:\n - NODE_ENV=development\n`;\n\n if (options.database === 'postgresql') {\n compose += ` - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/mydb\n depends_on:\n - postgres\n\n postgres:\n image: postgres:16-alpine\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: mydb\n ports:\n - \"5432:5432\"\n volumes:\n - postgres-data:/var/lib/postgresql/data\n\nvolumes:\n postgres-data:\n`;\n } else if (options.database === 'mysql') {\n compose += ` - DATABASE_URL=mysql://root:root@mysql:3306/mydb\n depends_on:\n - mysql\n\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: mydb\n ports:\n - \"3306:3306\"\n volumes:\n - mysql-data:/var/lib/mysql\n\nvolumes:\n mysql-data:\n`;\n } else if (options.database === 'mongodb') {\n compose += ` - MONGODB_URI=mongodb://mongodb:27017/mydb\n depends_on:\n - mongodb\n\n mongodb:\n image: mongo:7\n environment:\n MONGO_INITDB_DATABASE: mydb\n ports:\n - \"27017:27017\"\n volumes:\n - mongodb-data:/data/db\n\nvolumes:\n mongodb-data:\n`;\n }\n\n if (options.features.includes('redis')) {\n compose += `\n redis:\n image: redis:7-alpine\n ports:\n - \"6379:6379\"\n`;\n }\n\n return compose;\n}\n\nfunction generatePrismaSchema(options: InitOptions): string {\n const provider = options.database === 'sqlite' ? 'sqlite' : options.database;\n\n return `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(uuid())\n email String @unique\n password String\n name String?\n role String @default(\"user\")\n status String @default(\"active\")\n emailVerified Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@map(\"users\")\n}\n`;\n}\n\nfunction generateEntryFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import 'dotenv/config';\\nimport { createServer } from './core/server.js';\\nimport { logger } from './core/logger.js';\" : \"require('dotenv').config();\\nconst { createServer } = require('./core/server.js');\\nconst { logger } = require('./core/logger.js');\"}\n\nasync function main()${isTS ? ': Promise<void>' : ''} {\n const server = createServer();\n\n try {\n await server.start();\n } catch (error) {\n logger.error({ err: error }, 'Failed to start server');\n process.exit(1);\n }\n}\n\nmain();\n`;\n}\n\nfunction generateServerFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${\n isTS\n ? `import Fastify from 'fastify';\nimport type { FastifyInstance } from 'fastify';\nimport { logger } from './logger.js';`\n : `const Fastify = require('fastify');\nconst { logger } = require('./logger.js');`\n }\n\n${isTS ? 'export function createServer(): { instance: FastifyInstance; start: () => Promise<void> }' : 'function createServer()'} {\n const app = Fastify({ logger });\n\n // Health check\n app.get('/health', async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n\n // Graceful shutdown\n const signals${isTS ? ': NodeJS.Signals[]' : ''} = ['SIGINT', 'SIGTERM'];\n signals.forEach((signal) => {\n process.on(signal, async () => {\n logger.info(\\`Received \\${signal}, shutting down...\\`);\n await app.close();\n process.exit(0);\n });\n });\n\n return {\n instance: app,\n start: async ()${isTS ? ': Promise<void>' : ''} => {\n const port = parseInt(process.env.PORT || '3000', 10);\n const host = process.env.HOST || '0.0.0.0';\n await app.listen({ port, host });\n logger.info(\\`Server listening on \\${host}:\\${port}\\`);\n },\n };\n}\n\n${isTS ? '' : 'module.exports = { createServer };'}\n`;\n}\n\nfunction generateLoggerFile(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import pino from 'pino';\\nimport type { Logger } from 'pino';\" : \"const pino = require('pino');\"}\n\n${isTS ? 'export const logger: Logger' : 'const logger'} = pino({\n level: process.env.LOG_LEVEL || 'info',\n transport: process.env.NODE_ENV !== 'production' ? {\n target: 'pino-pretty',\n options: { colorize: true },\n } : undefined,\n});\n\n${isTS ? '' : 'module.exports = { logger };'}\n`;\n}\n\nfunction generateMongooseConnection(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import mongoose from 'mongoose';\\nimport { logger } from '../core/logger.js';\" : \"const mongoose = require('mongoose');\\nconst { logger } = require('../core/logger.js');\"}\n\nconst MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/mydb';\n\n${isTS ? 'export async function connectDatabase(): Promise<typeof mongoose>' : 'async function connectDatabase()'} {\n try {\n const conn = await mongoose.connect(MONGODB_URI);\n logger.info(\\`MongoDB connected: \\${conn.connection.host}\\`);\n return conn;\n } catch (error) {\n logger.error({ err: error }, 'MongoDB connection failed');\n process.exit(1);\n }\n}\n\n${isTS ? 'export async function disconnectDatabase(): Promise<void>' : 'async function disconnectDatabase()'} {\n try {\n await mongoose.disconnect();\n logger.info('MongoDB disconnected');\n } catch (error) {\n logger.error({ err: error }, 'MongoDB disconnect failed');\n }\n}\n\n${isTS ? 'export { mongoose };' : 'module.exports = { connectDatabase, disconnectDatabase, mongoose };'}\n`;\n}\n\nfunction generateMongooseUserModel(options: InitOptions): string {\n const isTS = options.language === 'typescript';\n\n return `${isTS ? \"import mongoose, { Schema, Document } from 'mongoose';\\nimport bcrypt from 'bcryptjs';\" : \"const mongoose = require('mongoose');\\nconst bcrypt = require('bcryptjs');\\nconst { Schema } = mongoose;\"}\n\n${\n isTS\n ? `export interface IUser extends Document {\n email: string;\n password: string;\n name?: string;\n role: 'user' | 'admin';\n status: 'active' | 'inactive' | 'suspended';\n emailVerified: boolean;\n createdAt: Date;\n updatedAt: Date;\n comparePassword(candidatePassword: string): Promise<boolean>;\n}`\n : ''\n}\n\nconst userSchema = new Schema${isTS ? '<IUser>' : ''}({\n email: {\n type: String,\n required: true,\n unique: true,\n lowercase: true,\n trim: true,\n },\n password: {\n type: String,\n required: true,\n minlength: 8,\n },\n name: {\n type: String,\n trim: true,\n },\n role: {\n type: String,\n enum: ['user', 'admin'],\n default: 'user',\n },\n status: {\n type: String,\n enum: ['active', 'inactive', 'suspended'],\n default: 'active',\n },\n emailVerified: {\n type: Boolean,\n default: false,\n },\n}, {\n timestamps: true,\n});\n\n// Hash password before saving\nuserSchema.pre('save', async function(next) {\n if (!this.isModified('password')) return next();\n\n try {\n const salt = await bcrypt.genSalt(10);\n this.password = await bcrypt.hash(this.password, salt);\n next();\n } catch (error${isTS ? ': any' : ''}) {\n next(error);\n }\n});\n\n// Compare password method\nuserSchema.methods.comparePassword = async function(candidatePassword${isTS ? ': string' : ''})${isTS ? ': Promise<boolean>' : ''} {\n return bcrypt.compare(candidatePassword, this.password);\n};\n\n${isTS ? \"export const User = mongoose.model<IUser>('User', userSchema);\" : \"const User = mongoose.model('User', userSchema);\\nmodule.exports = { User };\"}\n`;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\n\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\nexport function pluralize(str: string): string {\n if (str.endsWith('y')) {\n return str.slice(0, -1) + 'ies';\n }\n if (str.endsWith('s') || str.endsWith('x') || str.endsWith('ch') || str.endsWith('sh')) {\n return str + 'es';\n }\n return str + 's';\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function success(message: string): void {\n console.log(chalk.green('✓'), message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red('✗'), message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n}\n\nexport function getProjectRoot(): string {\n return process.cwd();\n}\n\nexport function getSourceDir(): string {\n return path.join(getProjectRoot(), 'src');\n}\n\nexport function getModulesDir(): string {\n return path.join(getSourceDir(), 'modules');\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport {\n toPascalCase,\n toCamelCase,\n toKebabCase,\n pluralize,\n fileExists,\n writeFile,\n success,\n error,\n info,\n getModulesDir,\n} from '../utils/helpers.js';\nimport { parseFields, type FieldDefinition } from '../utils/field-parser.js';\nimport { controllerTemplate } from '../templates/controller.js';\nimport { serviceTemplate } from '../templates/service.js';\nimport { repositoryTemplate } from '../templates/repository.js';\nimport { typesTemplate } from '../templates/types.js';\nimport { schemasTemplate } from '../templates/schemas.js';\nimport { routesTemplate } from '../templates/routes.js';\nimport { moduleIndexTemplate } from '../templates/module-index.js';\nimport { prismaModelTemplate } from '../templates/prisma-model.js';\nimport { dynamicTypesTemplate } from '../templates/dynamic-types.js';\nimport { dynamicSchemasTemplate, type ValidatorType } from '../templates/dynamic-schemas.js';\nimport { dynamicPrismaTemplate } from '../templates/dynamic-prisma.js';\n\nexport const generateCommand = new Command('generate')\n .alias('g')\n .description('Generate resources (module, controller, service, etc.)');\n\n// Generate full module\ngenerateCommand\n .command('module <name> [fields...]')\n .alias('m')\n .description(\n 'Generate a complete module with controller, service, repository, types, schemas, and routes'\n )\n .option('--no-routes', 'Skip routes generation')\n .option('--no-repository', 'Skip repository generation')\n .option('--prisma', 'Generate Prisma model suggestion')\n .option('--validator <type>', 'Validator type: zod, joi, yup', 'zod')\n .option('-i, --interactive', 'Interactive mode to define fields')\n .action(async (name: string, fieldsArgs: string[], options) => {\n let fields: FieldDefinition[] = [];\n\n // Parse fields from command line or interactive mode\n if (options.interactive) {\n fields = await promptForFields();\n } else if (fieldsArgs.length > 0) {\n fields = parseFields(fieldsArgs.join(' '));\n }\n\n const spinner = ora('Generating module...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n const tableName = pluralize(kebabName.replace(/-/g, '_'));\n const validatorType = (options.validator || 'zod') as ValidatorType;\n\n const moduleDir = path.join(getModulesDir(), kebabName);\n\n // Check if module already exists\n if (await fileExists(moduleDir)) {\n spinner.stop();\n error(`Module \"${kebabName}\" already exists`);\n return;\n }\n\n // Use dynamic templates if fields are provided\n const hasFields = fields.length > 0;\n\n const files = [\n {\n name: `${kebabName}.types.ts`,\n content: hasFields\n ? dynamicTypesTemplate(kebabName, pascalName, fields)\n : typesTemplate(kebabName, pascalName),\n },\n {\n name: `${kebabName}.schemas.ts`,\n content: hasFields\n ? dynamicSchemasTemplate(kebabName, pascalName, camelName, fields, validatorType)\n : schemasTemplate(kebabName, pascalName, camelName),\n },\n {\n name: `${kebabName}.service.ts`,\n content: serviceTemplate(kebabName, pascalName, camelName),\n },\n {\n name: `${kebabName}.controller.ts`,\n content: controllerTemplate(kebabName, pascalName, camelName),\n },\n { name: 'index.ts', content: moduleIndexTemplate(kebabName, pascalName, camelName) },\n ];\n\n if (options.repository !== false) {\n files.push({\n name: `${kebabName}.repository.ts`,\n content: repositoryTemplate(kebabName, pascalName, camelName, pluralName),\n });\n }\n\n if (options.routes !== false) {\n files.push({\n name: `${kebabName}.routes.ts`,\n content: routesTemplate(kebabName, pascalName, camelName, pluralName),\n });\n }\n\n // Write all files\n for (const file of files) {\n await writeFile(path.join(moduleDir, file.name), file.content);\n }\n\n spinner.succeed(`Module \"${pascalName}\" generated successfully!`);\n\n // Show Prisma model if requested or fields provided\n if (options.prisma || hasFields) {\n console.log('\\n' + '─'.repeat(50));\n info('Prisma model suggestion:');\n if (hasFields) {\n console.log(dynamicPrismaTemplate(pascalName, tableName, fields));\n } else {\n console.log(prismaModelTemplate(kebabName, pascalName, tableName));\n }\n }\n\n // Show fields summary if provided\n if (hasFields) {\n console.log('\\n📋 Fields defined:');\n fields.forEach((f) => {\n const opts = [];\n if (f.isOptional) opts.push('optional');\n if (f.isArray) opts.push('array');\n if (f.isUnique) opts.push('unique');\n const optsStr = opts.length > 0 ? ` (${opts.join(', ')})` : '';\n success(` ${f.name}: ${f.type}${optsStr}`);\n });\n }\n\n // Show next steps\n console.log('\\n📁 Files created:');\n files.forEach((f) => success(` src/modules/${kebabName}/${f.name}`));\n\n console.log('\\n📌 Next steps:');\n if (!hasFields) {\n info(' 1. Update the types in ' + `${kebabName}.types.ts`);\n info(' 2. Update the schemas in ' + `${kebabName}.schemas.ts`);\n info(' 3. Register the module in your app');\n } else {\n info(' 1. Review generated types and schemas');\n info(' 2. Register the module in your app');\n }\n if (options.prisma || hasFields) {\n info(` ${hasFields ? '3' : '4'}. Add the Prisma model to schema.prisma`);\n info(` ${hasFields ? '4' : '5'}. Run: npm run db:migrate`);\n }\n } catch (err) {\n spinner.fail('Failed to generate module');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate controller only\ngenerateCommand\n .command('controller <name>')\n .alias('c')\n .description('Generate a controller')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating controller...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.controller.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Controller \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, controllerTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Controller \"${pascalName}Controller\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.controller.ts`);\n } catch (err) {\n spinner.fail('Failed to generate controller');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate service only\ngenerateCommand\n .command('service <name>')\n .alias('s')\n .description('Generate a service')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating service...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.service.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Service \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, serviceTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Service \"${pascalName}Service\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.service.ts`);\n } catch (err) {\n spinner.fail('Failed to generate service');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate repository only\ngenerateCommand\n .command('repository <name>')\n .alias('r')\n .description('Generate a repository')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating repository...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.repository.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Repository \"${kebabName}\" already exists`);\n return;\n }\n\n await writeFile(filePath, repositoryTemplate(kebabName, pascalName, camelName, pluralName));\n\n spinner.succeed(`Repository \"${pascalName}Repository\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.repository.ts`);\n } catch (err) {\n spinner.fail('Failed to generate repository');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate types only\ngenerateCommand\n .command('types <name>')\n .alias('t')\n .description('Generate types/interfaces')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating types...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.types.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Types file \"${kebabName}.types.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, typesTemplate(kebabName, pascalName));\n\n spinner.succeed(`Types for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.types.ts`);\n } catch (err) {\n spinner.fail('Failed to generate types');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate schemas/validators only\ngenerateCommand\n .command('schema <name>')\n .alias('v')\n .description('Generate validation schemas')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating schemas...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.schemas.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Schemas file \"${kebabName}.schemas.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, schemasTemplate(kebabName, pascalName, camelName));\n\n spinner.succeed(`Schemas for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.schemas.ts`);\n } catch (err) {\n spinner.fail('Failed to generate schemas');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Generate routes only\ngenerateCommand\n .command('routes <name>')\n .description('Generate routes')\n .option('-m, --module <module>', 'Target module name')\n .action(async (name: string, options) => {\n const spinner = ora('Generating routes...').start();\n\n try {\n const kebabName = toKebabCase(name);\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n const pluralName = pluralize(kebabName);\n\n const moduleName = options.module ? toKebabCase(options.module) : kebabName;\n const moduleDir = path.join(getModulesDir(), moduleName);\n const filePath = path.join(moduleDir, `${kebabName}.routes.ts`);\n\n if (await fileExists(filePath)) {\n spinner.stop();\n error(`Routes file \"${kebabName}.routes.ts\" already exists`);\n return;\n }\n\n await writeFile(filePath, routesTemplate(kebabName, pascalName, camelName, pluralName));\n\n spinner.succeed(`Routes for \"${pascalName}\" generated!`);\n success(` src/modules/${moduleName}/${kebabName}.routes.ts`);\n } catch (err) {\n spinner.fail('Failed to generate routes');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\n// Interactive field prompt helper\nasync function promptForFields(): Promise<FieldDefinition[]> {\n const fields: FieldDefinition[] = [];\n\n console.log('\\n📝 Define your model fields (press Enter with empty name to finish)\\n');\n\n const fieldTypes = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'text',\n 'email',\n 'url',\n 'uuid',\n 'int',\n 'float',\n 'decimal',\n 'json',\n ];\n\n let addMore = true;\n\n while (addMore) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Field name (empty to finish):',\n },\n ]);\n\n if (!answers.name) {\n addMore = false;\n continue;\n }\n\n const fieldDetails = await inquirer.prompt([\n {\n type: 'list',\n name: 'type',\n message: `Type for \"${answers.name}\":`,\n choices: fieldTypes,\n default: 'string',\n },\n {\n type: 'confirm',\n name: 'isOptional',\n message: 'Is optional?',\n default: false,\n },\n {\n type: 'confirm',\n name: 'isUnique',\n message: 'Is unique?',\n default: false,\n },\n {\n type: 'confirm',\n name: 'isArray',\n message: 'Is array?',\n default: false,\n },\n ]);\n\n fields.push({\n name: answers.name,\n type: fieldDetails.type,\n isOptional: fieldDetails.isOptional,\n isUnique: fieldDetails.isUnique,\n isArray: fieldDetails.isArray,\n });\n\n console.log(` ✓ Added: ${answers.name}: ${fieldDetails.type}\\n`);\n }\n\n return fields;\n}\n","export interface FieldDefinition {\n name: string;\n type: FieldType;\n isOptional: boolean;\n isArray: boolean;\n isUnique: boolean;\n defaultValue?: string;\n relation?: {\n model: string;\n type: 'one-to-one' | 'one-to-many' | 'many-to-one';\n };\n}\n\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'date'\n | 'datetime'\n | 'text'\n | 'json'\n | 'email'\n | 'url'\n | 'uuid'\n | 'int'\n | 'float'\n | 'decimal'\n | 'enum';\n\n// Map field types to TypeScript types\nexport const tsTypeMap: Record<FieldType, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n date: 'Date',\n datetime: 'Date',\n text: 'string',\n json: 'Record<string, unknown>',\n email: 'string',\n url: 'string',\n uuid: 'string',\n int: 'number',\n float: 'number',\n decimal: 'number',\n enum: 'string',\n};\n\n// Map field types to Prisma types\nexport const prismaTypeMap: Record<FieldType, string> = {\n string: 'String',\n number: 'Int',\n boolean: 'Boolean',\n date: 'DateTime',\n datetime: 'DateTime',\n text: 'String',\n json: 'Json',\n email: 'String',\n url: 'String',\n uuid: 'String',\n int: 'Int',\n float: 'Float',\n decimal: 'Decimal',\n enum: 'String',\n};\n\n// Map field types to Zod validators\nexport const zodTypeMap: Record<FieldType, string> = {\n string: 'z.string()',\n number: 'z.number()',\n boolean: 'z.boolean()',\n date: 'z.coerce.date()',\n datetime: 'z.coerce.date()',\n text: 'z.string()',\n json: 'z.record(z.unknown())',\n email: 'z.string().email()',\n url: 'z.string().url()',\n uuid: 'z.string().uuid()',\n int: 'z.number().int()',\n float: 'z.number()',\n decimal: 'z.number()',\n enum: 'z.string()',\n};\n\n// Map field types to Joi validators\nexport const joiTypeMap: Record<FieldType, string> = {\n string: 'Joi.string()',\n number: 'Joi.number()',\n boolean: 'Joi.boolean()',\n date: 'Joi.date()',\n datetime: 'Joi.date()',\n text: 'Joi.string()',\n json: 'Joi.object()',\n email: 'Joi.string().email()',\n url: 'Joi.string().uri()',\n uuid: 'Joi.string().uuid()',\n int: 'Joi.number().integer()',\n float: 'Joi.number()',\n decimal: 'Joi.number()',\n enum: 'Joi.string()',\n};\n\n// Map field types to Yup validators\nexport const yupTypeMap: Record<FieldType, string> = {\n string: 'yup.string()',\n number: 'yup.number()',\n boolean: 'yup.boolean()',\n date: 'yup.date()',\n datetime: 'yup.date()',\n text: 'yup.string()',\n json: 'yup.object()',\n email: 'yup.string().email()',\n url: 'yup.string().url()',\n uuid: 'yup.string().uuid()',\n int: 'yup.number().integer()',\n float: 'yup.number()',\n decimal: 'yup.number()',\n enum: 'yup.string()',\n};\n\n/**\n * Parse field definition string\n * Format: name:type[:modifiers]\n * Examples:\n * - title:string\n * - price:number\n * - email:email:unique\n * - description:text?\n * - tags:string[]\n * - isActive:boolean:default=true\n * - category:relation:Category\n */\nexport function parseField(fieldStr: string): FieldDefinition {\n const parts = fieldStr.split(':');\n let name = parts[0] || '';\n let typeStr = parts[1] || 'string';\n const modifiers = parts.slice(2);\n\n // Check for optional (?)\n const isOptional = name.endsWith('?') || typeStr.endsWith('?');\n name = name.replace('?', '');\n typeStr = typeStr.replace('?', '');\n\n // Check for array ([])\n const isArray = typeStr.endsWith('[]');\n typeStr = typeStr.replace('[]', '');\n\n // Validate type\n const validTypes: FieldType[] = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'text',\n 'json',\n 'email',\n 'url',\n 'uuid',\n 'int',\n 'float',\n 'decimal',\n 'enum',\n ];\n\n let type: FieldType = 'string';\n if (validTypes.includes(typeStr as FieldType)) {\n type = typeStr as FieldType;\n }\n\n // Parse modifiers\n let isUnique = false;\n let defaultValue: string | undefined;\n let relation: FieldDefinition['relation'];\n\n for (const mod of modifiers) {\n if (mod === 'unique') {\n isUnique = true;\n } else if (mod.startsWith('default=')) {\n defaultValue = mod.replace('default=', '');\n } else if (typeStr === 'relation') {\n relation = {\n model: mod,\n type: 'many-to-one',\n };\n type = 'string'; // Relations use string IDs\n }\n }\n\n return {\n name,\n type,\n isOptional,\n isArray,\n isUnique,\n defaultValue,\n relation,\n };\n}\n\n/**\n * Parse multiple fields from command line\n * Example: \"title:string price:number description:text?\"\n */\nexport function parseFields(fieldsStr: string): FieldDefinition[] {\n if (!fieldsStr) return [];\n\n return fieldsStr.split(/\\s+/).filter(Boolean).map(parseField);\n}\n\n/**\n * Generate TypeScript interface from fields\n */\nexport function generateTypeInterface(\n name: string,\n fields: FieldDefinition[],\n includeBase = true\n): string {\n const lines: string[] = [];\n\n if (includeBase) {\n lines.push(`import type { BaseEntity } from '../../types/index.js';`);\n lines.push('');\n lines.push(`export interface ${name} extends BaseEntity {`);\n } else {\n lines.push(`export interface ${name} {`);\n }\n\n for (const field of fields) {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n const optionalMark = field.isOptional ? '?' : '';\n lines.push(` ${field.name}${optionalMark}: ${tsType}${arrayMark};`);\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Zod schema from fields\n */\nexport function generateZodSchema(\n name: string,\n fields: FieldDefinition[],\n schemaType: 'create' | 'update' = 'create'\n): string {\n const lines: string[] = [];\n\n lines.push(`export const ${schemaType}${name}Schema = z.object({`);\n\n for (const field of fields) {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n if (field.isOptional || schemaType === 'update') {\n validator += '.optional()';\n }\n\n if (field.defaultValue && schemaType === 'create') {\n validator += `.default(${field.defaultValue})`;\n }\n\n lines.push(` ${field.name}: ${validator},`);\n }\n\n lines.push('});');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Prisma model from fields\n */\nexport function generatePrismaModel(\n modelName: string,\n tableName: string,\n fields: FieldDefinition[]\n): string {\n const lines: string[] = [];\n\n lines.push(`model ${modelName} {`);\n lines.push(' id String @id @default(uuid())');\n\n for (const field of fields) {\n const prismaType = prismaTypeMap[field.type];\n const optionalMark = field.isOptional ? '?' : '';\n const annotations: string[] = [];\n\n if (field.isUnique) {\n annotations.push('@unique');\n }\n\n if (field.defaultValue) {\n annotations.push(`@default(${field.defaultValue})`);\n }\n\n if (field.type === 'text') {\n annotations.push('@db.Text');\n }\n\n const annotationStr = annotations.length > 0 ? ' ' + annotations.join(' ') : '';\n lines.push(` ${field.name.padEnd(11)} ${prismaType}${optionalMark}${annotationStr}`);\n }\n\n lines.push('');\n lines.push(' createdAt DateTime @default(now())');\n lines.push(' updatedAt DateTime @updatedAt');\n lines.push('');\n\n // Add indexes for unique fields\n const uniqueFields = fields.filter((f) => f.isUnique);\n for (const field of uniqueFields) {\n lines.push(` @@index([${field.name}])`);\n }\n\n lines.push(` @@map(\"${tableName}\")`);\n lines.push('}');\n\n return lines.join('\\n');\n}\n","export function controllerTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { ${pascalName}Service } from './${name}.service.js';\nimport { create${pascalName}Schema, update${pascalName}Schema, ${camelName}QuerySchema } from './${name}.schemas.js';\nimport { success, created, noContent } from '../../utils/response.js';\nimport { parsePaginationParams } from '../../utils/pagination.js';\nimport { validateBody, validateQuery } from '../validation/validator.js';\n\nexport class ${pascalName}Controller {\n constructor(private ${camelName}Service: ${pascalName}Service) {}\n\n async list(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const query = validateQuery(${camelName}QuerySchema, request.query);\n const pagination = parsePaginationParams(query);\n const filters = {\n search: query.search,\n };\n\n const result = await this.${camelName}Service.findMany(pagination, filters);\n success(reply, result);\n }\n\n async getById(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const item = await this.${camelName}Service.findById(request.params.id);\n\n if (!item) {\n return reply.status(404).send({\n success: false,\n message: '${pascalName} not found',\n });\n }\n\n success(reply, item);\n }\n\n async create(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const data = validateBody(create${pascalName}Schema, request.body);\n const item = await this.${camelName}Service.create(data);\n created(reply, item);\n }\n\n async update(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const data = validateBody(update${pascalName}Schema, request.body);\n const item = await this.${camelName}Service.update(request.params.id, data);\n success(reply, item);\n }\n\n async delete(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n await this.${camelName}Service.delete(request.params.id);\n noContent(reply);\n }\n}\n\nexport function create${pascalName}Controller(${camelName}Service: ${pascalName}Service): ${pascalName}Controller {\n return new ${pascalName}Controller(${camelName}Service);\n}\n`;\n}\n","export function serviceTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { NotFoundError, ConflictError } from '../../utils/errors.js';\nimport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nimport type { ${pascalName}, Create${pascalName}Data, Update${pascalName}Data, ${pascalName}Filters } from './${name}.types.js';\nimport { logger } from '../../core/logger.js';\n\nexport class ${pascalName}Service {\n constructor(private repository: ${pascalName}Repository) {}\n\n async findById(id: string): Promise<${pascalName} | null> {\n return this.repository.findById(id);\n }\n\n async findMany(\n params: PaginationParams,\n filters?: ${pascalName}Filters\n ): Promise<PaginatedResult<${pascalName}>> {\n return this.repository.findMany(params, filters);\n }\n\n async create(data: Create${pascalName}Data): Promise<${pascalName}> {\n const item = await this.repository.create(data);\n logger.info({ ${camelName}Id: item.id }, '${pascalName} created');\n return item;\n }\n\n async update(id: string, data: Update${pascalName}Data): Promise<${pascalName}> {\n const existing = await this.repository.findById(id);\n if (!existing) {\n throw new NotFoundError('${pascalName}');\n }\n\n const updated = await this.repository.update(id, data);\n if (!updated) {\n throw new NotFoundError('${pascalName}');\n }\n\n logger.info({ ${camelName}Id: id }, '${pascalName} updated');\n return updated;\n }\n\n async delete(id: string): Promise<void> {\n const existing = await this.repository.findById(id);\n if (!existing) {\n throw new NotFoundError('${pascalName}');\n }\n\n await this.repository.delete(id);\n logger.info({ ${camelName}Id: id }, '${pascalName} deleted');\n }\n}\n\nexport function create${pascalName}Service(repository?: ${pascalName}Repository): ${pascalName}Service {\n return new ${pascalName}Service(repository || create${pascalName}Repository());\n}\n`;\n}\n","export function repositoryTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n pluralName: string\n): string {\n return `import { randomUUID } from 'crypto';\nimport type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { createPaginatedResult, getSkip } from '../../utils/pagination.js';\nimport type { ${pascalName}, Create${pascalName}Data, Update${pascalName}Data, ${pascalName}Filters } from './${name}.types.js';\n\n// In-memory storage (will be replaced by Prisma in production)\nconst ${pluralName} = new Map<string, ${pascalName}>();\n\nexport class ${pascalName}Repository {\n async findById(id: string): Promise<${pascalName} | null> {\n return ${pluralName}.get(id) || null;\n }\n\n async findMany(\n params: PaginationParams,\n filters?: ${pascalName}Filters\n ): Promise<PaginatedResult<${pascalName}>> {\n let items = Array.from(${pluralName}.values());\n\n // Apply filters\n if (filters?.search) {\n const search = filters.search.toLowerCase();\n items = items.filter((item) =>\n JSON.stringify(item).toLowerCase().includes(search)\n );\n }\n\n // Sort\n if (params.sortBy) {\n const sortKey = params.sortBy as keyof ${pascalName};\n items.sort((a, b) => {\n const aVal = a[sortKey];\n const bVal = b[sortKey];\n if (aVal === undefined || bVal === undefined) return 0;\n if (aVal < bVal) return params.sortOrder === 'desc' ? 1 : -1;\n if (aVal > bVal) return params.sortOrder === 'desc' ? -1 : 1;\n return 0;\n });\n }\n\n const total = items.length;\n const skip = getSkip(params);\n const data = items.slice(skip, skip + params.limit);\n\n return createPaginatedResult(data, total, params);\n }\n\n async create(data: Create${pascalName}Data): Promise<${pascalName}> {\n const now = new Date();\n const item: ${pascalName} = {\n id: randomUUID(),\n ...data,\n createdAt: now,\n updatedAt: now,\n };\n\n ${pluralName}.set(item.id, item);\n return item;\n }\n\n async update(id: string, data: Update${pascalName}Data): Promise<${pascalName} | null> {\n const item = ${pluralName}.get(id);\n if (!item) return null;\n\n const updated: ${pascalName} = {\n ...item,\n ...data,\n updatedAt: new Date(),\n };\n\n ${pluralName}.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return ${pluralName}.delete(id);\n }\n\n async count(filters?: ${pascalName}Filters): Promise<number> {\n if (!filters) return ${pluralName}.size;\n\n let count = 0;\n for (const item of ${pluralName}.values()) {\n if (filters.search) {\n const search = filters.search.toLowerCase();\n if (!JSON.stringify(item).toLowerCase().includes(search)) continue;\n }\n count++;\n }\n return count;\n }\n\n // Clear all (for testing)\n async clear(): Promise<void> {\n ${pluralName}.clear();\n }\n}\n\nexport function create${pascalName}Repository(): ${pascalName}Repository {\n return new ${pascalName}Repository();\n}\n`;\n}\n","export function typesTemplate(name: string, pascalName: string): string {\n return `import type { BaseEntity } from '../../types/index.js';\n\nexport interface ${pascalName} extends BaseEntity {\n // Add your ${pascalName} specific fields here\n name: string;\n description?: string;\n // status?: string;\n // metadata?: Record<string, unknown>;\n}\n\nexport interface Create${pascalName}Data {\n name: string;\n description?: string;\n}\n\nexport interface Update${pascalName}Data {\n name?: string;\n description?: string;\n}\n\nexport interface ${pascalName}Filters {\n search?: string;\n // Add more filters as needed\n}\n`;\n}\n","export function schemasTemplate(name: string, pascalName: string, camelName: string): string {\n return `import { z } from 'zod';\n\nexport const create${pascalName}Schema = z.object({\n name: z.string().min(1, 'Name is required').max(255),\n description: z.string().max(1000).optional(),\n});\n\nexport const update${pascalName}Schema = z.object({\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(1000).optional(),\n});\n\nexport const ${camelName}QuerySchema = z.object({\n page: z.string().transform(Number).optional(),\n limit: z.string().transform(Number).optional(),\n sortBy: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n search: z.string().optional(),\n});\n\nexport type Create${pascalName}Input = z.infer<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = z.infer<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = z.infer<typeof ${camelName}QuerySchema>;\n`;\n}\n","export function routesTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n pluralName: string\n): string {\n return `import type { FastifyInstance } from 'fastify';\nimport type { ${pascalName}Controller } from './${name}.controller.js';\nimport type { AuthService } from '../auth/auth.service.js';\nimport { createAuthMiddleware, createRoleMiddleware } from '../auth/auth.middleware.js';\n\nexport function register${pascalName}Routes(\n app: FastifyInstance,\n controller: ${pascalName}Controller,\n authService: AuthService\n): void {\n const authenticate = createAuthMiddleware(authService);\n const isAdmin = createRoleMiddleware(['admin', 'super_admin']);\n\n // Public routes (if any)\n // app.get('/${pluralName}/public', controller.publicList.bind(controller));\n\n // Protected routes\n app.get(\n '/${pluralName}',\n { preHandler: [authenticate] },\n controller.list.bind(controller)\n );\n\n app.get(\n '/${pluralName}/:id',\n { preHandler: [authenticate] },\n controller.getById.bind(controller)\n );\n\n app.post(\n '/${pluralName}',\n { preHandler: [authenticate] },\n controller.create.bind(controller)\n );\n\n app.patch(\n '/${pluralName}/:id',\n { preHandler: [authenticate] },\n controller.update.bind(controller)\n );\n\n app.delete(\n '/${pluralName}/:id',\n { preHandler: [authenticate, isAdmin] },\n controller.delete.bind(controller)\n );\n}\n`;\n}\n","export function moduleIndexTemplate(name: string, pascalName: string, camelName: string): string {\n return `import type { FastifyInstance } from 'fastify';\nimport { logger } from '../../core/logger.js';\nimport { ${pascalName}Service, create${pascalName}Service } from './${name}.service.js';\nimport { ${pascalName}Controller, create${pascalName}Controller } from './${name}.controller.js';\nimport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nimport { register${pascalName}Routes } from './${name}.routes.js';\nimport type { AuthService } from '../auth/auth.service.js';\n\nexport async function register${pascalName}Module(\n app: FastifyInstance,\n authService: AuthService\n): Promise<void> {\n // Create repository and service\n const repository = create${pascalName}Repository();\n const ${camelName}Service = create${pascalName}Service(repository);\n\n // Create controller\n const ${camelName}Controller = create${pascalName}Controller(${camelName}Service);\n\n // Register routes\n register${pascalName}Routes(app, ${camelName}Controller, authService);\n\n logger.info('${pascalName} module registered');\n}\n\nexport { ${pascalName}Service, create${pascalName}Service } from './${name}.service.js';\nexport { ${pascalName}Controller, create${pascalName}Controller } from './${name}.controller.js';\nexport { ${pascalName}Repository, create${pascalName}Repository } from './${name}.repository.js';\nexport * from './${name}.types.js';\nexport * from './${name}.schemas.js';\n`;\n}\n","export function prismaModelTemplate(name: string, pascalName: string, tableName: string): string {\n return `\n// Add this model to your prisma/schema.prisma file\n\nmodel ${pascalName} {\n id String @id @default(uuid())\n name String\n description String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([name])\n @@map(\"${tableName}\")\n}\n`;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { tsTypeMap } from '../utils/field-parser.js';\n\nexport function dynamicTypesTemplate(\n name: string,\n pascalName: string,\n fields: FieldDefinition[]\n): string {\n const fieldLines = fields.map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n const optionalMark = field.isOptional ? '?' : '';\n return ` ${field.name}${optionalMark}: ${tsType}${arrayMark};`;\n });\n\n const createFieldLines = fields\n .filter((f) => !f.isOptional)\n .map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}: ${tsType}${arrayMark};`;\n });\n\n const createOptionalLines = fields\n .filter((f) => f.isOptional)\n .map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}?: ${tsType}${arrayMark};`;\n });\n\n const updateFieldLines = fields.map((field) => {\n const tsType = tsTypeMap[field.type];\n const arrayMark = field.isArray ? '[]' : '';\n return ` ${field.name}?: ${tsType}${arrayMark};`;\n });\n\n return `import type { BaseEntity } from '../../types/index.js';\n\nexport interface ${pascalName} extends BaseEntity {\n${fieldLines.join('\\n')}\n}\n\nexport interface Create${pascalName}Data {\n${[...createFieldLines, ...createOptionalLines].join('\\n')}\n}\n\nexport interface Update${pascalName}Data {\n${updateFieldLines.join('\\n')}\n}\n\nexport interface ${pascalName}Filters {\n search?: string;\n${fields\n .filter((f) => ['string', 'enum', 'boolean'].includes(f.type))\n .map((f) => ` ${f.name}?: ${tsTypeMap[f.type]};`)\n .join('\\n')}\n}\n`;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { zodTypeMap, joiTypeMap, yupTypeMap } from '../utils/field-parser.js';\n\nexport type ValidatorType = 'zod' | 'joi' | 'yup';\n\nexport function dynamicSchemasTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[],\n validator: ValidatorType = 'zod'\n): string {\n switch (validator) {\n case 'joi':\n return generateJoiSchemas(pascalName, camelName, fields);\n case 'yup':\n return generateYupSchemas(pascalName, camelName, fields);\n default:\n return generateZodSchemas(pascalName, camelName, fields);\n }\n}\n\nfunction generateZodSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n if (field.isOptional) {\n validator += '.optional()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n // Add extra validations based on type\n if (field.type === 'string' && !field.isOptional) {\n validator = validator.replace('z.string()', 'z.string().min(1)');\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = zodTypeMap[field.type];\n\n if (field.isArray) {\n validator = `z.array(${validator})`;\n }\n\n validator += '.optional()';\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import { z } from 'zod';\n\nexport const create${pascalName}Schema = z.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = z.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = z.object({\n page: z.string().transform(Number).optional(),\n limit: z.string().transform(Number).optional(),\n sortBy: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n search: z.string().optional(),\n});\n\nexport type Create${pascalName}Input = z.infer<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = z.infer<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = z.infer<typeof ${camelName}QuerySchema>;\n`;\n}\n\nfunction generateJoiSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = joiTypeMap[field.type];\n\n if (field.isArray) {\n validator = `Joi.array().items(${validator})`;\n }\n\n if (!field.isOptional) {\n validator += '.required()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = joiTypeMap[field.type];\n\n if (field.isArray) {\n validator = `Joi.array().items(${validator})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import Joi from 'joi';\n\nexport const create${pascalName}Schema = Joi.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = Joi.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = Joi.object({\n page: Joi.number().integer().min(1),\n limit: Joi.number().integer().min(1).max(100),\n sortBy: Joi.string(),\n sortOrder: Joi.string().valid('asc', 'desc'),\n search: Joi.string(),\n});\n\nexport type Create${pascalName}Input = {\n${fields.map((f) => ` ${f.name}${f.isOptional ? '?' : ''}: ${getJsType(f)};`).join('\\n')}\n};\n\nexport type Update${pascalName}Input = Partial<Create${pascalName}Input>;\nexport type ${pascalName}QueryInput = {\n page?: number;\n limit?: number;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n search?: string;\n};\n`;\n}\n\nfunction generateYupSchemas(\n pascalName: string,\n camelName: string,\n fields: FieldDefinition[]\n): string {\n const createFields = fields.map((field) => {\n let validator = yupTypeMap[field.type];\n\n if (field.isArray) {\n validator = `yup.array().of(${validator})`;\n }\n\n if (!field.isOptional) {\n validator += '.required()';\n }\n\n if (field.defaultValue) {\n validator += `.default(${field.defaultValue})`;\n }\n\n return ` ${field.name}: ${validator},`;\n });\n\n const updateFields = fields.map((field) => {\n let validator = yupTypeMap[field.type];\n\n if (field.isArray) {\n validator = `yup.array().of(${validator})`;\n }\n\n validator += '.optional()';\n\n return ` ${field.name}: ${validator},`;\n });\n\n return `import * as yup from 'yup';\n\nexport const create${pascalName}Schema = yup.object({\n${createFields.join('\\n')}\n});\n\nexport const update${pascalName}Schema = yup.object({\n${updateFields.join('\\n')}\n});\n\nexport const ${camelName}QuerySchema = yup.object({\n page: yup.number().integer().min(1),\n limit: yup.number().integer().min(1).max(100),\n sortBy: yup.string(),\n sortOrder: yup.string().oneOf(['asc', 'desc']),\n search: yup.string(),\n});\n\nexport type Create${pascalName}Input = yup.InferType<typeof create${pascalName}Schema>;\nexport type Update${pascalName}Input = yup.InferType<typeof update${pascalName}Schema>;\nexport type ${pascalName}QueryInput = yup.InferType<typeof ${camelName}QuerySchema>;\n`;\n}\n\nfunction getJsType(field: FieldDefinition): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n date: 'Date',\n datetime: 'Date',\n text: 'string',\n json: 'Record<string, unknown>',\n email: 'string',\n url: 'string',\n uuid: 'string',\n int: 'number',\n float: 'number',\n decimal: 'number',\n enum: 'string',\n };\n\n const baseType = typeMap[field.type] || 'unknown';\n return field.isArray ? `${baseType}[]` : baseType;\n}\n","import type { FieldDefinition } from '../utils/field-parser.js';\nimport { prismaTypeMap } from '../utils/field-parser.js';\n\nexport function dynamicPrismaTemplate(\n modelName: string,\n tableName: string,\n fields: FieldDefinition[]\n): string {\n const fieldLines: string[] = [];\n\n for (const field of fields) {\n const prismaType = prismaTypeMap[field.type];\n const optionalMark = field.isOptional ? '?' : '';\n const arrayMark = field.isArray ? '[]' : '';\n const annotations: string[] = [];\n\n if (field.isUnique) {\n annotations.push('@unique');\n }\n\n if (field.defaultValue !== undefined) {\n // Handle different default value types\n if (field.type === 'boolean') {\n annotations.push(`@default(${field.defaultValue})`);\n } else if (field.type === 'number' || field.type === 'int' || field.type === 'float') {\n annotations.push(`@default(${field.defaultValue})`);\n } else {\n annotations.push(`@default(\"${field.defaultValue}\")`);\n }\n }\n\n // Database-specific annotations\n if (field.type === 'text') {\n annotations.push('@db.Text');\n }\n\n if (field.type === 'decimal') {\n annotations.push('@db.Decimal(10, 2)');\n }\n\n const annotationStr = annotations.length > 0 ? ' ' + annotations.join(' ') : '';\n const typePart = `${prismaType}${optionalMark}${arrayMark}`;\n\n fieldLines.push(` ${field.name.padEnd(15)} ${typePart.padEnd(12)}${annotationStr}`);\n }\n\n // Generate indexes\n const indexLines: string[] = [];\n\n // Index for unique fields\n const uniqueFields = fields.filter((f) => f.isUnique);\n for (const field of uniqueFields) {\n indexLines.push(` @@index([${field.name}])`);\n }\n\n // Index for common search fields\n const searchableFields = fields.filter(\n (f) => ['string', 'email'].includes(f.type) && !f.isUnique\n );\n if (searchableFields.length > 0) {\n const firstSearchable = searchableFields[0];\n if (firstSearchable) {\n indexLines.push(` @@index([${firstSearchable.name}])`);\n }\n }\n\n return `\n// ==========================================\n// Add this model to your prisma/schema.prisma file\n// ==========================================\n\nmodel ${modelName} {\n id String @id @default(uuid())\n\n${fieldLines.join('\\n')}\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n${indexLines.join('\\n')}\n @@map(\"${tableName}\")\n}\n\n// ==========================================\n// After adding the model, run:\n// npm run db:migrate -- --name add_${tableName}\n// ==========================================\n`;\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport * as fs from 'fs/promises';\nimport {\n ensureDir,\n writeFile,\n fileExists,\n success,\n error,\n info,\n warn,\n getModulesDir,\n} from '../utils/helpers.js';\nimport { EnvManager } from '../utils/env-manager.js';\nimport { TemplateManager } from '../utils/template-manager.js';\nimport { InteractivePrompt } from '../utils/interactive-prompt.js';\n\n// Pre-built modules that can be added\nconst AVAILABLE_MODULES = {\n auth: {\n name: 'Authentication',\n description: 'JWT authentication with access/refresh tokens',\n files: [\n 'auth.service',\n 'auth.controller',\n 'auth.routes',\n 'auth.middleware',\n 'auth.schemas',\n 'auth.types',\n 'index',\n ],\n },\n users: {\n name: 'User Management',\n description: 'User CRUD with RBAC (roles & permissions)',\n files: [\n 'user.service',\n 'user.controller',\n 'user.repository',\n 'user.routes',\n 'user.schemas',\n 'user.types',\n 'index',\n ],\n },\n email: {\n name: 'Email Service',\n description: 'SMTP email with templates (Handlebars)',\n files: ['email.service', 'email.templates', 'email.types', 'index'],\n },\n audit: {\n name: 'Audit Logs',\n description: 'Activity logging and audit trail',\n files: ['audit.service', 'audit.types', 'index'],\n },\n cache: {\n name: 'Redis Cache',\n description: 'Redis caching with TTL & invalidation',\n files: ['cache.service', 'cache.types', 'index'],\n },\n upload: {\n name: 'File Upload',\n description: 'File upload with local/S3/Cloudinary storage',\n files: ['upload.service', 'upload.routes', 'upload.types', 'index'],\n },\n mfa: {\n name: 'MFA/TOTP',\n description: 'Two-factor authentication with QR codes',\n files: ['mfa.service', 'mfa.routes', 'totp.ts', 'types.ts', 'index'],\n },\n oauth: {\n name: 'OAuth',\n description: 'Social login (Google, GitHub, Facebook, Twitter, Apple)',\n files: ['oauth.service', 'oauth.routes', 'providers', 'types.ts', 'index'],\n },\n payment: {\n name: 'Payments',\n description: 'Payment processing (Stripe, PayPal, Mobile Money)',\n files: ['payment.service', 'payment.routes', 'providers', 'types.ts', 'index'],\n },\n notification: {\n name: 'Notifications',\n description: 'Email, SMS, Push notifications',\n files: ['notification.service', 'types.ts', 'index'],\n },\n 'rate-limit': {\n name: 'Rate Limiting',\n description: 'Advanced rate limiting with multiple algorithms',\n files: [\n 'rate-limit.service',\n 'rate-limit.middleware',\n 'rate-limit.routes',\n 'stores',\n 'types.ts',\n 'index',\n ],\n },\n webhook: {\n name: 'Webhooks',\n description: 'Outgoing webhooks with HMAC signatures & retry',\n files: ['webhook.service', 'webhook.routes', 'signature.ts', 'retry.ts', 'types.ts', 'index'],\n },\n queue: {\n name: 'Queue/Jobs',\n description: 'Background jobs with Bull/BullMQ & cron scheduling',\n files: ['queue.service', 'cron.ts', 'workers.ts', 'routes.ts', 'types.ts', 'index'],\n },\n websocket: {\n name: 'WebSockets',\n description: 'Real-time communication with Socket.io',\n files: ['websocket.service', 'features.ts', 'middlewares.ts', 'types.ts', 'index'],\n },\n search: {\n name: 'Search',\n description: 'Full-text search with Elasticsearch/Meilisearch',\n files: ['search.service', 'adapters', 'types.ts', 'index'],\n },\n i18n: {\n name: 'i18n/Localization',\n description: 'Multi-language support with 7+ locales',\n files: ['i18n.service', 'i18n.middleware', 'i18n.routes', 'types.ts', 'index'],\n },\n 'feature-flag': {\n name: 'Feature Flags',\n description: 'A/B testing & progressive rollout',\n files: ['feature-flag.service', 'feature-flag.routes', 'types.ts', 'index'],\n },\n analytics: {\n name: 'Analytics/Metrics',\n description: 'Prometheus metrics & event tracking',\n files: ['analytics.service', 'analytics.routes', 'types.ts', 'index'],\n },\n 'media-processing': {\n name: 'Media Processing',\n description: 'Image/video processing with FFmpeg',\n files: ['media-processing.service', 'media-processing.routes', 'types.ts', 'index'],\n },\n 'api-versioning': {\n name: 'API Versioning',\n description: 'Multiple API versions support',\n files: [\n 'versioning.service',\n 'versioning.middleware',\n 'versioning.routes',\n 'types.ts',\n 'index',\n ],\n },\n};\n\nexport const addModuleCommand = new Command('add')\n .description('Add a pre-built module to your project')\n .argument(\n '[module]',\n 'Module to add (auth, users, email, audit, upload, cache, notifications, settings)'\n )\n .option('-l, --list', 'List available modules')\n .option('-f, --force', 'Force overwrite existing module')\n .option('-u, --update', 'Update existing module (smart merge)')\n .option('--skip-existing', 'Skip if module already exists')\n .action(\n async (\n moduleName?: string,\n options?: { list?: boolean; force?: boolean; update?: boolean; skipExisting?: boolean }\n ) => {\n if (options?.list || !moduleName) {\n console.log(chalk.bold('\\n📦 Available Modules:\\n'));\n\n for (const [key, mod] of Object.entries(AVAILABLE_MODULES)) {\n console.log(` ${chalk.cyan(key.padEnd(15))} ${mod.name}`);\n console.log(` ${' '.repeat(15)} ${chalk.gray(mod.description)}\\n`);\n }\n\n console.log(chalk.bold('Usage:'));\n console.log(` ${chalk.yellow('servcraft add auth')} Add authentication module`);\n console.log(` ${chalk.yellow('servcraft add users')} Add user management module`);\n console.log(` ${chalk.yellow('servcraft add email')} Add email service module\\n`);\n return;\n }\n\n const module = AVAILABLE_MODULES[moduleName as keyof typeof AVAILABLE_MODULES];\n\n if (!module) {\n error(`Unknown module: ${moduleName}`);\n info('Run \"servcraft add --list\" to see available modules');\n return;\n }\n\n const spinner = ora(`Adding ${module.name} module...`).start();\n\n try {\n const moduleDir = path.join(getModulesDir(), moduleName);\n const templateManager = new TemplateManager(process.cwd());\n const moduleExists = await fileExists(moduleDir);\n\n // Handle existing module\n if (moduleExists) {\n spinner.stop();\n\n // Check flags\n if (options?.skipExisting) {\n info(`Module \"${moduleName}\" already exists, skipping...`);\n return;\n }\n\n // Check for modifications\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n const hasModifications = modifiedFiles.some((f) => f.isModified);\n\n let action: string;\n\n if (options?.force) {\n action = 'overwrite';\n } else if (options?.update) {\n action = 'update';\n } else {\n // Interactive prompt\n const choice = await InteractivePrompt.askModuleExists(moduleName, hasModifications);\n action = choice.action;\n }\n\n // Handle action\n if (action === 'skip') {\n info('Keeping existing module');\n return;\n }\n\n if (action === 'diff') {\n // Show diff and ask again\n await showDiffForModule(templateManager, moduleName, moduleDir);\n return;\n }\n\n if (action === 'backup-overwrite' || action === 'overwrite') {\n if (action === 'backup-overwrite') {\n const backupPath = await templateManager.createBackup(moduleName, moduleDir);\n InteractivePrompt.showBackupCreated(backupPath);\n }\n\n // Remove existing module\n await fs.rm(moduleDir, { recursive: true, force: true });\n await ensureDir(moduleDir);\n\n // Generate fresh module\n await generateModuleFiles(moduleName, moduleDir);\n\n // Save templates and manifest\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.saveTemplate(moduleName, files);\n await templateManager.saveManifest(moduleName, files);\n\n spinner.succeed(\n `${module.name} module ${action === 'backup-overwrite' ? 'backed up and ' : ''}overwritten!`\n );\n } else if (action === 'update') {\n // Smart merge\n await performSmartMerge(templateManager, moduleName, moduleDir, module.name);\n }\n } else {\n // Fresh installation\n await ensureDir(moduleDir);\n\n // Generate module files\n await generateModuleFiles(moduleName, moduleDir);\n\n // Save templates and manifest for future updates\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.saveTemplate(moduleName, files);\n await templateManager.saveManifest(moduleName, files);\n\n spinner.succeed(`${module.name} module added successfully!`);\n }\n\n if (!moduleExists) {\n console.log('\\n📁 Files created:');\n module.files.forEach((f) => success(` src/modules/${moduleName}/${f}.ts`));\n }\n\n // Update .env file with module-specific variables\n const envManager = new EnvManager(process.cwd());\n const envSections = EnvManager.getModuleEnvVariables(moduleName);\n\n if (envSections.length > 0) {\n const envSpinner = ora('Updating environment variables...').start();\n try {\n const result = await envManager.addVariables(envSections);\n\n envSpinner.succeed('Environment variables updated!');\n\n if (result.created) {\n info('\\n📝 Created new .env file');\n }\n\n if (result.added.length > 0) {\n console.log(chalk.bold('\\n✅ Added to .env:'));\n result.added.forEach((key) => success(` ${key}`));\n }\n\n if (result.skipped.length > 0) {\n console.log(chalk.bold('\\n⏭️ Already in .env (skipped):'));\n result.skipped.forEach((key) => info(` ${key}`));\n }\n\n // Show which variables need configuration\n const requiredVars = envSections\n .flatMap((section) => section.variables)\n .filter((v) => v.required && !v.value)\n .map((v) => v.key);\n\n if (requiredVars.length > 0) {\n console.log(chalk.bold('\\n⚠️ Required configuration:'));\n requiredVars.forEach((key) => warn(` ${key} - Please configure this variable`));\n }\n } catch (err) {\n envSpinner.fail('Failed to update environment variables');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n\n console.log('\\n📌 Next steps:');\n info(' 1. Configure environment variables in .env (if needed)');\n info(' 2. Register the module in your main app file');\n info(' 3. Run database migrations if needed');\n } catch (err) {\n spinner.fail('Failed to add module');\n error(err instanceof Error ? err.message : String(err));\n }\n }\n );\n\nasync function generateAuthModule(dir: string): Promise<void> {\n // This would copy from templates or generate inline\n // For now, we'll create placeholder files\n const files = {\n 'auth.types.ts': `export interface JwtPayload {\n sub: string;\n email: string;\n role: string;\n type: 'access' | 'refresh';\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport interface AuthUser {\n id: string;\n email: string;\n role: string;\n}\n`,\n 'auth.schemas.ts': `import { z } from 'zod';\n\nexport const loginSchema = z.object({\n email: z.string().email(),\n password: z.string().min(1),\n});\n\nexport const registerSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().min(2).optional(),\n});\n\nexport const refreshTokenSchema = z.object({\n refreshToken: z.string().min(1),\n});\n`,\n 'index.ts': `export * from './auth.types.js';\nexport * from './auth.schemas.js';\n// Export services, controllers, etc.\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateUsersModule(dir: string): Promise<void> {\n const files = {\n 'user.types.ts': `export type UserStatus = 'active' | 'inactive' | 'suspended' | 'banned';\nexport type UserRole = 'user' | 'admin' | 'moderator' | 'super_admin';\n\nexport interface User {\n id: string;\n email: string;\n password: string;\n name?: string;\n role: UserRole;\n status: UserStatus;\n createdAt: Date;\n updatedAt: Date;\n}\n`,\n 'user.schemas.ts': `import { z } from 'zod';\n\nexport const createUserSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().min(2).optional(),\n role: z.enum(['user', 'admin', 'moderator']).optional(),\n});\n\nexport const updateUserSchema = z.object({\n email: z.string().email().optional(),\n name: z.string().min(2).optional(),\n role: z.enum(['user', 'admin', 'moderator', 'super_admin']).optional(),\n status: z.enum(['active', 'inactive', 'suspended', 'banned']).optional(),\n});\n`,\n 'index.ts': `export * from './user.types.js';\nexport * from './user.schemas.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateEmailModule(dir: string): Promise<void> {\n const files = {\n 'email.types.ts': `export interface EmailOptions {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n template?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface EmailResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n`,\n 'email.service.ts': `import nodemailer from 'nodemailer';\nimport type { EmailOptions, EmailResult } from './email.types.js';\n\nexport class EmailService {\n private transporter;\n\n constructor() {\n this.transporter = nodemailer.createTransport({\n host: process.env.SMTP_HOST,\n port: parseInt(process.env.SMTP_PORT || '587', 10),\n auth: {\n user: process.env.SMTP_USER,\n pass: process.env.SMTP_PASS,\n },\n });\n }\n\n async send(options: EmailOptions): Promise<EmailResult> {\n try {\n const result = await this.transporter.sendMail({\n from: process.env.SMTP_FROM,\n ...options,\n });\n return { success: true, messageId: result.messageId };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n}\n\nexport const emailService = new EmailService();\n`,\n 'index.ts': `export * from './email.types.js';\nexport { EmailService, emailService } from './email.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateAuditModule(dir: string): Promise<void> {\n const files = {\n 'audit.types.ts': `export interface AuditLogEntry {\n userId?: string;\n action: string;\n resource: string;\n resourceId?: string;\n oldValue?: Record<string, unknown>;\n newValue?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: Date;\n}\n`,\n 'audit.service.ts': `import type { AuditLogEntry } from './audit.types.js';\n\nconst logs: AuditLogEntry[] = [];\n\nexport class AuditService {\n async log(entry: Omit<AuditLogEntry, 'createdAt'>): Promise<void> {\n logs.push({ ...entry, createdAt: new Date() });\n console.log('[AUDIT]', entry.action, entry.resource);\n }\n\n async query(filters: Partial<AuditLogEntry>): Promise<AuditLogEntry[]> {\n return logs.filter((log) => {\n for (const [key, value] of Object.entries(filters)) {\n if (log[key as keyof AuditLogEntry] !== value) return false;\n }\n return true;\n });\n }\n}\n\nexport const auditService = new AuditService();\n`,\n 'index.ts': `export * from './audit.types.js';\nexport { AuditService, auditService } from './audit.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateUploadModule(dir: string): Promise<void> {\n const files = {\n 'upload.types.ts': `export interface UploadedFile {\n id: string;\n filename: string;\n originalName: string;\n mimetype: string;\n size: number;\n path: string;\n url: string;\n createdAt: Date;\n}\n\nexport interface UploadOptions {\n maxSize?: number;\n allowedTypes?: string[];\n destination?: string;\n}\n`,\n 'index.ts': `export * from './upload.types.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateCacheModule(dir: string): Promise<void> {\n const files = {\n 'cache.types.ts': `export interface CacheOptions {\n ttl?: number;\n prefix?: string;\n}\n`,\n 'cache.service.ts': `import type { CacheOptions } from './cache.types.js';\n\n// In-memory cache (replace with Redis in production)\nconst cache = new Map<string, { value: unknown; expiry: number }>();\n\nexport class CacheService {\n async get<T>(key: string): Promise<T | null> {\n const item = cache.get(key);\n if (!item) return null;\n if (Date.now() > item.expiry) {\n cache.delete(key);\n return null;\n }\n return item.value as T;\n }\n\n async set(key: string, value: unknown, ttl = 3600): Promise<void> {\n cache.set(key, { value, expiry: Date.now() + ttl * 1000 });\n }\n\n async del(key: string): Promise<void> {\n cache.delete(key);\n }\n\n async clear(): Promise<void> {\n cache.clear();\n }\n}\n\nexport const cacheService = new CacheService();\n`,\n 'index.ts': `export * from './cache.types.js';\nexport { CacheService, cacheService } from './cache.service.js';\n`,\n };\n\n for (const [name, content] of Object.entries(files)) {\n await writeFile(path.join(dir, name), content);\n }\n}\n\nasync function generateGenericModule(dir: string, name: string): Promise<void> {\n const files = {\n [`${name}.types.ts`]: `// ${name} types\nexport interface ${name.charAt(0).toUpperCase() + name.slice(1)}Data {\n // Define your types here\n}\n`,\n 'index.ts': `export * from './${name}.types.js';\n`,\n };\n\n for (const [fileName, content] of Object.entries(files)) {\n await writeFile(path.join(dir, fileName), content);\n }\n}\n\n/**\n * Helper: Get the servcraft package directory (works for both npm installed and local dev)\n */\nfunction getServercraftModulesDir(): string {\n // Try node_modules first (when installed as dependency)\n const nodeModulesPath = path.join(process.cwd(), 'node_modules', 'servcraft', 'src', 'modules');\n\n // Try global npm path\n const globalPath = path.join(\n process.env.npm_config_prefix || '/usr/local',\n 'lib',\n 'node_modules',\n 'servcraft',\n 'src',\n 'modules'\n );\n\n // For CLI execution, use import.meta.url to find package location\n const cliPath = path.resolve(\n path.dirname(new URL(import.meta.url).pathname),\n '..',\n '..',\n 'modules'\n );\n\n return nodeModulesPath; // Primary path - will check existence in generateModuleFiles\n}\n\n/**\n * Helper: Find servcraft modules source directory\n */\nasync function findServercraftModules(): Promise<string | null> {\n // Get the directory where the CLI script is located\n const scriptDir = path.dirname(new URL(import.meta.url).pathname);\n\n const possiblePaths = [\n // Local node_modules (when servcraft is a dependency)\n path.join(process.cwd(), 'node_modules', 'servcraft', 'src', 'modules'),\n // From dist/cli/index.js -> src/modules (npx or global install)\n path.resolve(scriptDir, '..', '..', 'src', 'modules'),\n // From src/cli/commands/add-module.ts -> src/modules (development)\n path.resolve(scriptDir, '..', '..', 'modules'),\n ];\n\n for (const p of possiblePaths) {\n try {\n const stats = await fs.stat(p);\n if (stats.isDirectory()) {\n return p;\n }\n } catch {\n // Path doesn't exist, try next\n }\n }\n return null;\n}\n\n/**\n * Helper: Generate module files - copies from servcraft package modules\n */\nasync function generateModuleFiles(moduleName: string, moduleDir: string): Promise<void> {\n // Map module names to their directory names in servcraft\n const moduleNameMap: Record<string, string> = {\n 'users': 'user',\n 'rate-limit': 'rate-limit',\n 'feature-flag': 'feature-flag',\n 'api-versioning': 'api-versioning',\n 'media-processing': 'media-processing',\n };\n\n const sourceDirName = moduleNameMap[moduleName] || moduleName;\n\n // Find servcraft modules directory\n const servercraftModulesDir = await findServercraftModules();\n\n if (servercraftModulesDir) {\n const sourceModuleDir = path.join(servercraftModulesDir, sourceDirName);\n\n if (await fileExists(sourceModuleDir)) {\n // Copy from servcraft package\n await copyModuleFromSource(sourceModuleDir, moduleDir);\n return;\n }\n }\n\n // Fallback to inline templates for basic modules\n switch (moduleName) {\n case 'auth':\n await generateAuthModule(moduleDir);\n break;\n case 'users':\n await generateUsersModule(moduleDir);\n break;\n case 'email':\n await generateEmailModule(moduleDir);\n break;\n case 'audit':\n await generateAuditModule(moduleDir);\n break;\n case 'upload':\n await generateUploadModule(moduleDir);\n break;\n case 'cache':\n await generateCacheModule(moduleDir);\n break;\n default:\n await generateGenericModule(moduleDir, moduleName);\n }\n}\n\n/**\n * Helper: Copy module from source directory\n */\nasync function copyModuleFromSource(sourceDir: string, targetDir: string): Promise<void> {\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n await fs.mkdir(targetPath, { recursive: true });\n await copyModuleFromSource(sourcePath, targetPath);\n } else {\n await fs.copyFile(sourcePath, targetPath);\n }\n }\n}\n\n/**\n * Helper: Get all module files as Record<filename, content>\n */\nasync function getModuleFiles(\n moduleName: string,\n moduleDir: string\n): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n const entries = await fs.readdir(moduleDir);\n\n for (const entry of entries) {\n const filePath = path.join(moduleDir, entry);\n const stat = await fs.stat(filePath);\n\n if (stat.isFile() && entry.endsWith('.ts')) {\n const content = await fs.readFile(filePath, 'utf-8');\n files[entry] = content;\n }\n }\n\n return files;\n}\n\n/**\n * Helper: Show diff for entire module\n */\nasync function showDiffForModule(\n templateManager: TemplateManager,\n moduleName: string,\n moduleDir: string\n): Promise<void> {\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n\n console.log(chalk.cyan(`\\n📊 Changes in module \"${moduleName}\":\\n`));\n\n for (const file of modifiedFiles) {\n if (file.isModified) {\n console.log(chalk.yellow(`\\n📄 ${file.fileName}:`));\n\n const currentPath = path.join(moduleDir, file.fileName);\n const currentContent = await fs.readFile(currentPath, 'utf-8');\n const originalContent = await templateManager.getTemplate(moduleName, file.fileName);\n\n if (originalContent) {\n const diff = templateManager.generateDiff(originalContent, currentContent);\n console.log(diff);\n }\n }\n }\n}\n\n/**\n * Helper: Perform smart merge\n */\nasync function performSmartMerge(\n templateManager: TemplateManager,\n moduleName: string,\n moduleDir: string,\n _displayName: string\n): Promise<void> {\n const spinner = ora('Analyzing files for merge...').start();\n\n // Get new template files\n const newFiles: Record<string, string> = {};\n const templateDir = path.join(templateManager['templatesDir'], moduleName);\n\n try {\n const entries = await fs.readdir(templateDir);\n for (const entry of entries) {\n const content = await fs.readFile(path.join(templateDir, entry), 'utf-8');\n newFiles[entry] = content;\n }\n } catch {\n spinner.fail('Could not find template files');\n return;\n }\n\n const modifiedFiles = await templateManager.getModifiedFiles(moduleName, moduleDir);\n spinner.stop();\n\n // Ask for batch action or individual\n const batchAction = await InteractivePrompt.askBatchAction();\n\n const stats = {\n merged: 0,\n kept: 0,\n overwritten: 0,\n conflicts: 0,\n };\n\n for (const fileInfo of modifiedFiles) {\n const fileName = fileInfo.fileName;\n const filePath = path.join(moduleDir, fileName);\n const newContent = newFiles[fileName];\n\n if (!newContent) {\n // File doesn't exist in new template, keep existing\n continue;\n }\n\n let fileAction: string;\n\n if (batchAction === 'merge-all') {\n fileAction = 'merge';\n } else if (batchAction === 'keep-all') {\n fileAction = 'keep';\n } else if (batchAction === 'overwrite-all') {\n fileAction = 'overwrite';\n } else {\n // Ask for each file\n const currentContent = await fs.readFile(filePath, 'utf-8');\n const yourLines = currentContent.split('\\n').length;\n const newLines = newContent.split('\\n').length;\n\n const choice = await InteractivePrompt.askFileAction(\n fileName,\n fileInfo.isModified,\n yourLines,\n newLines\n );\n fileAction = choice.action;\n\n if (fileAction === 'diff') {\n const originalContent = await templateManager.getTemplate(moduleName, fileName);\n if (originalContent) {\n const diff = templateManager.generateDiff(originalContent, currentContent);\n const proceed = await InteractivePrompt.showDiffAndAsk(diff);\n fileAction = proceed ? 'merge' : 'keep';\n }\n }\n }\n\n // Perform action\n if (fileAction === 'keep' || fileAction === 'skip') {\n stats.kept++;\n continue;\n }\n\n if (fileAction === 'overwrite') {\n await fs.writeFile(filePath, newContent, 'utf-8');\n stats.overwritten++;\n continue;\n }\n\n if (fileAction === 'merge') {\n const originalContent = await templateManager.getTemplate(moduleName, fileName);\n const currentContent = await fs.readFile(filePath, 'utf-8');\n\n if (originalContent) {\n const mergeResult = await templateManager.mergeFiles(\n originalContent,\n currentContent,\n newContent\n );\n\n await fs.writeFile(filePath, mergeResult.merged, 'utf-8');\n\n if (mergeResult.hasConflicts) {\n stats.conflicts++;\n InteractivePrompt.displayConflicts(mergeResult.conflicts);\n } else {\n stats.merged++;\n }\n } else {\n await fs.writeFile(filePath, newContent, 'utf-8');\n stats.overwritten++;\n }\n }\n }\n\n // Update manifest\n const files = await getModuleFiles(moduleName, moduleDir);\n await templateManager.updateManifest(moduleName, files);\n\n InteractivePrompt.showMergeSummary(stats);\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { existsSync } from 'fs';\n\nexport interface EnvVariable {\n key: string;\n value?: string;\n comment?: string;\n required?: boolean;\n}\n\nexport interface EnvSection {\n title: string;\n variables: EnvVariable[];\n}\n\n/**\n * Environment Manager\n * Manages .env file updates when adding modules\n */\nexport class EnvManager {\n private envPath: string;\n private envExamplePath: string;\n\n constructor(projectRoot: string) {\n this.envPath = path.join(projectRoot, '.env');\n this.envExamplePath = path.join(projectRoot, '.env.example');\n }\n\n /**\n * Add environment variables to .env file\n */\n async addVariables(sections: EnvSection[]): Promise<{\n added: string[];\n skipped: string[];\n created: boolean;\n }> {\n const added: string[] = [];\n const skipped: string[] = [];\n let created = false;\n\n // Read existing .env or create new one\n let envContent = '';\n if (existsSync(this.envPath)) {\n envContent = await fs.readFile(this.envPath, 'utf-8');\n } else {\n created = true;\n }\n\n // Parse existing variables\n const existingKeys = this.parseExistingKeys(envContent);\n\n // Build new content\n let newContent = envContent;\n if (newContent && !newContent.endsWith('\\n\\n')) {\n newContent += '\\n\\n';\n }\n\n for (const section of sections) {\n // Add section comment\n newContent += `# ${section.title}\\n`;\n\n for (const variable of section.variables) {\n // Skip if already exists\n if (existingKeys.has(variable.key)) {\n skipped.push(variable.key);\n continue;\n }\n\n // Add variable comment if provided\n if (variable.comment) {\n newContent += `# ${variable.comment}\\n`;\n }\n\n // Add variable\n const value = variable.value || '';\n const prefix = variable.required ? '' : '# ';\n newContent += `${prefix}${variable.key}=${value}\\n`;\n\n added.push(variable.key);\n }\n\n newContent += '\\n';\n }\n\n // Write to .env\n await fs.writeFile(this.envPath, newContent, 'utf-8');\n\n // Update .env.example if it exists\n if (existsSync(this.envExamplePath)) {\n await this.updateEnvExample(sections);\n }\n\n return { added, skipped, created };\n }\n\n /**\n * Update .env.example file\n */\n private async updateEnvExample(sections: EnvSection[]): Promise<void> {\n let exampleContent = '';\n if (existsSync(this.envExamplePath)) {\n exampleContent = await fs.readFile(this.envExamplePath, 'utf-8');\n }\n\n const existingKeys = this.parseExistingKeys(exampleContent);\n\n let newContent = exampleContent;\n if (newContent && !newContent.endsWith('\\n\\n')) {\n newContent += '\\n\\n';\n }\n\n for (const section of sections) {\n newContent += `# ${section.title}\\n`;\n\n for (const variable of section.variables) {\n if (existingKeys.has(variable.key)) {\n continue;\n }\n\n if (variable.comment) {\n newContent += `# ${variable.comment}\\n`;\n }\n\n // In .env.example, show placeholder values\n const placeholder = this.getPlaceholder(variable.key);\n newContent += `${variable.key}=${placeholder}\\n`;\n }\n\n newContent += '\\n';\n }\n\n await fs.writeFile(this.envExamplePath, newContent, 'utf-8');\n }\n\n /**\n * Parse existing environment variable keys\n */\n private parseExistingKeys(content: string): Set<string> {\n const keys = new Set<string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('#')) {\n continue;\n }\n\n // Extract key from KEY=value or # KEY=value\n const match = trimmed.match(/^#?\\s*([A-Z_][A-Z0-9_]*)\\s*=/);\n if (match && match[1]) {\n keys.add(match[1]);\n }\n }\n\n return keys;\n }\n\n /**\n * Get placeholder value for .env.example\n */\n private getPlaceholder(key: string): string {\n // Common patterns\n if (key.includes('SECRET') || key.includes('KEY') || key.includes('PASSWORD')) {\n return 'your-secret-key-here';\n }\n if (key.includes('HOST')) {\n return 'localhost';\n }\n if (key.includes('PORT')) {\n return '3000';\n }\n if (key.includes('URL')) {\n return 'http://localhost:3000';\n }\n if (key.includes('EMAIL')) {\n return 'user@example.com';\n }\n if (key.includes('REDIS')) {\n return 'redis://localhost:6379';\n }\n if (key.includes('DATABASE')) {\n return 'postgresql://user:pass@localhost:5432/db';\n }\n if (key.includes('NODE')) {\n return 'http://localhost:9200';\n }\n\n return '';\n }\n\n /**\n * Get environment variables for a specific module\n */\n static getModuleEnvVariables(moduleName: string): EnvSection[] {\n const moduleEnvMap: Record<string, EnvSection[]> = {\n 'rate-limit': [\n {\n title: 'Rate Limiting Configuration',\n variables: [\n {\n key: 'RATE_LIMIT_ENABLED',\n value: 'true',\n comment: 'Enable rate limiting',\n required: true,\n },\n {\n key: 'RATE_LIMIT_REDIS_URL',\n value: 'redis://localhost:6379',\n comment:\n 'Redis URL for distributed rate limiting (optional, uses in-memory if not set)',\n required: false,\n },\n ],\n },\n ],\n webhook: [\n {\n title: 'Webhook Configuration',\n variables: [\n {\n key: 'WEBHOOK_TIMEOUT',\n value: '10000',\n comment: 'Webhook request timeout in milliseconds',\n required: true,\n },\n {\n key: 'WEBHOOK_MAX_RETRIES',\n value: '5',\n comment: 'Maximum number of retry attempts',\n required: true,\n },\n {\n key: 'WEBHOOK_SIGNATURE_ENABLED',\n value: 'true',\n comment: 'Enable HMAC signature verification',\n required: true,\n },\n ],\n },\n ],\n queue: [\n {\n title: 'Queue/Jobs Configuration',\n variables: [\n {\n key: 'REDIS_HOST',\n value: 'localhost',\n comment: 'Redis host for Bull queue',\n required: true,\n },\n {\n key: 'REDIS_PORT',\n value: '6379',\n comment: 'Redis port',\n required: true,\n },\n {\n key: 'REDIS_PASSWORD',\n value: '',\n comment: 'Redis password (optional)',\n required: false,\n },\n {\n key: 'QUEUE_METRICS_ENABLED',\n value: 'true',\n comment: 'Enable queue metrics collection',\n required: true,\n },\n ],\n },\n ],\n websocket: [\n {\n title: 'WebSocket Configuration',\n variables: [\n {\n key: 'WEBSOCKET_PORT',\n value: '3001',\n comment: 'WebSocket server port',\n required: true,\n },\n {\n key: 'WEBSOCKET_CORS_ORIGIN',\n value: 'http://localhost:3000',\n comment: 'CORS origin for WebSocket',\n required: true,\n },\n {\n key: 'WEBSOCKET_REDIS_URL',\n value: 'redis://localhost:6379',\n comment: 'Redis URL for Socket.io adapter (optional, for multi-instance)',\n required: false,\n },\n ],\n },\n ],\n search: [\n {\n title: 'Search Configuration (Elasticsearch)',\n variables: [\n {\n key: 'SEARCH_ENGINE',\n value: 'memory',\n comment: 'Search engine: elasticsearch, meilisearch, or memory',\n required: true,\n },\n {\n key: 'ELASTICSEARCH_NODE',\n value: 'http://localhost:9200',\n comment: 'Elasticsearch node URL',\n required: false,\n },\n {\n key: 'ELASTICSEARCH_USERNAME',\n value: '',\n comment: 'Elasticsearch username (optional)',\n required: false,\n },\n {\n key: 'ELASTICSEARCH_PASSWORD',\n value: '',\n comment: 'Elasticsearch password (optional)',\n required: false,\n },\n ],\n },\n {\n title: 'Search Configuration (Meilisearch)',\n variables: [\n {\n key: 'MEILISEARCH_HOST',\n value: 'http://localhost:7700',\n comment: 'Meilisearch host URL',\n required: false,\n },\n {\n key: 'MEILISEARCH_API_KEY',\n value: '',\n comment: 'Meilisearch API key (optional)',\n required: false,\n },\n ],\n },\n ],\n i18n: [\n {\n title: 'i18n/Localization Configuration',\n variables: [\n {\n key: 'DEFAULT_LOCALE',\n value: 'en',\n comment: 'Default locale/language',\n required: true,\n },\n {\n key: 'SUPPORTED_LOCALES',\n value: 'en,fr,es,de,ar,zh,ja',\n comment: 'Comma-separated list of supported locales',\n required: true,\n },\n {\n key: 'TRANSLATIONS_DIR',\n value: './locales',\n comment: 'Directory for translation files',\n required: true,\n },\n {\n key: 'I18N_CACHE_ENABLED',\n value: 'true',\n comment: 'Enable translation caching',\n required: true,\n },\n ],\n },\n ],\n cache: [\n {\n title: 'Cache Configuration',\n variables: [\n {\n key: 'CACHE_PROVIDER',\n value: 'redis',\n comment: 'Cache provider: redis or memory',\n required: true,\n },\n {\n key: 'CACHE_REDIS_URL',\n value: 'redis://localhost:6379',\n comment: 'Redis URL for cache',\n required: false,\n },\n {\n key: 'CACHE_TTL',\n value: '3600',\n comment: 'Default cache TTL in seconds',\n required: true,\n },\n ],\n },\n ],\n mfa: [\n {\n title: 'MFA/TOTP Configuration',\n variables: [\n {\n key: 'MFA_ISSUER',\n value: 'MyApp',\n comment: 'MFA issuer name shown in authenticator apps',\n required: true,\n },\n {\n key: 'MFA_ALGORITHM',\n value: 'SHA1',\n comment: 'TOTP algorithm: SHA1, SHA256, or SHA512',\n required: true,\n },\n ],\n },\n ],\n oauth: [\n {\n title: 'OAuth Configuration',\n variables: [\n {\n key: 'OAUTH_GOOGLE_CLIENT_ID',\n value: '',\n comment: 'Google OAuth client ID',\n required: false,\n },\n {\n key: 'OAUTH_GOOGLE_CLIENT_SECRET',\n value: '',\n comment: 'Google OAuth client secret',\n required: false,\n },\n {\n key: 'OAUTH_GITHUB_CLIENT_ID',\n value: '',\n comment: 'GitHub OAuth client ID',\n required: false,\n },\n {\n key: 'OAUTH_GITHUB_CLIENT_SECRET',\n value: '',\n comment: 'GitHub OAuth client secret',\n required: false,\n },\n {\n key: 'OAUTH_REDIRECT_URL',\n value: 'http://localhost:3000/auth/callback',\n comment: 'OAuth callback URL',\n required: true,\n },\n ],\n },\n ],\n payment: [\n {\n title: 'Payment Configuration',\n variables: [\n {\n key: 'STRIPE_SECRET_KEY',\n value: '',\n comment: 'Stripe secret key',\n required: false,\n },\n {\n key: 'STRIPE_PUBLISHABLE_KEY',\n value: '',\n comment: 'Stripe publishable key',\n required: false,\n },\n {\n key: 'PAYPAL_CLIENT_ID',\n value: '',\n comment: 'PayPal client ID',\n required: false,\n },\n {\n key: 'PAYPAL_CLIENT_SECRET',\n value: '',\n comment: 'PayPal client secret',\n required: false,\n },\n {\n key: 'PAYPAL_MODE',\n value: 'sandbox',\n comment: 'PayPal mode: sandbox or live',\n required: false,\n },\n ],\n },\n ],\n 'feature-flag': [\n {\n title: 'Feature Flags Configuration',\n variables: [\n {\n key: 'FEATURE_FLAGS_ENABLED',\n value: 'true',\n comment: 'Enable feature flags',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_ENVIRONMENT',\n value: 'development',\n comment: 'Feature flags environment: development, staging, production, test',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_ANALYTICS',\n value: 'true',\n comment: 'Enable feature flag analytics',\n required: true,\n },\n {\n key: 'FEATURE_FLAGS_CACHE_TTL',\n value: '300',\n comment: 'Cache TTL in seconds',\n required: true,\n },\n ],\n },\n ],\n upload: [\n {\n title: 'File Upload Configuration',\n variables: [\n {\n key: 'UPLOAD_PROVIDER',\n value: 'local',\n comment: 'Upload provider: local, s3, cloudinary',\n required: true,\n },\n {\n key: 'UPLOAD_MAX_SIZE',\n value: '10485760',\n comment: 'Max upload size in bytes (10MB)',\n required: true,\n },\n {\n key: 'UPLOAD_DIR',\n value: './uploads',\n comment: 'Local upload directory',\n required: true,\n },\n {\n key: 'AWS_ACCESS_KEY_ID',\n value: '',\n comment: 'AWS access key for S3',\n required: false,\n },\n {\n key: 'AWS_SECRET_ACCESS_KEY',\n value: '',\n comment: 'AWS secret key for S3',\n required: false,\n },\n {\n key: 'AWS_S3_BUCKET',\n value: '',\n comment: 'S3 bucket name',\n required: false,\n },\n ],\n },\n ],\n notification: [\n {\n title: 'Notification Configuration',\n variables: [\n {\n key: 'NOTIFICATION_EMAIL_ENABLED',\n value: 'true',\n comment: 'Enable email notifications',\n required: true,\n },\n {\n key: 'NOTIFICATION_SMS_ENABLED',\n value: 'false',\n comment: 'Enable SMS notifications',\n required: false,\n },\n {\n key: 'NOTIFICATION_PUSH_ENABLED',\n value: 'false',\n comment: 'Enable push notifications',\n required: false,\n },\n {\n key: 'TWILIO_ACCOUNT_SID',\n value: '',\n comment: 'Twilio account SID for SMS',\n required: false,\n },\n {\n key: 'TWILIO_AUTH_TOKEN',\n value: '',\n comment: 'Twilio auth token',\n required: false,\n },\n ],\n },\n ],\n analytics: [\n {\n title: 'Analytics/Metrics Configuration',\n variables: [\n {\n key: 'ANALYTICS_ENABLED',\n value: 'true',\n comment: 'Enable analytics and metrics collection',\n required: true,\n },\n {\n key: 'ANALYTICS_PREFIX',\n value: 'app',\n comment: 'Metrics prefix',\n required: true,\n },\n {\n key: 'PROMETHEUS_ENABLED',\n value: 'true',\n comment: 'Enable Prometheus metrics endpoint',\n required: true,\n },\n {\n key: 'METRICS_FLUSH_INTERVAL',\n value: '60000',\n comment: 'Metrics flush interval in milliseconds',\n required: true,\n },\n ],\n },\n ],\n 'media-processing': [\n {\n title: 'Media Processing Configuration',\n variables: [\n {\n key: 'FFMPEG_PATH',\n value: 'ffmpeg',\n comment: 'Path to FFmpeg binary',\n required: true,\n },\n {\n key: 'FFPROBE_PATH',\n value: 'ffprobe',\n comment: 'Path to FFprobe binary',\n required: true,\n },\n {\n key: 'MEDIA_TEMP_DIR',\n value: './temp/media',\n comment: 'Temporary directory for media processing',\n required: true,\n },\n {\n key: 'MEDIA_MAX_CONCURRENT',\n value: '3',\n comment: 'Maximum concurrent processing jobs',\n required: true,\n },\n {\n key: 'MEDIA_GPU_ACCELERATION',\n value: 'false',\n comment: 'Enable GPU acceleration (requires NVIDIA GPU)',\n required: false,\n },\n ],\n },\n ],\n 'api-versioning': [\n {\n title: 'API Versioning Configuration',\n variables: [\n {\n key: 'API_VERSION_STRATEGY',\n value: 'url',\n comment: 'Versioning strategy: url, header, query, accept-header',\n required: true,\n },\n {\n key: 'API_DEFAULT_VERSION',\n value: 'v1',\n comment: 'Default API version',\n required: true,\n },\n {\n key: 'API_VERSION_HEADER',\n value: 'X-API-Version',\n comment: 'Header name for version (if strategy is header)',\n required: false,\n },\n {\n key: 'API_VERSION_STRICT',\n value: 'true',\n comment: 'Strict mode - reject unknown versions',\n required: true,\n },\n {\n key: 'API_DEPRECATION_WARNINGS',\n value: 'true',\n comment: 'Show deprecation warnings in headers',\n required: true,\n },\n ],\n },\n ],\n };\n\n return moduleEnvMap[moduleName] || [];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { createHash } from 'crypto';\nimport { existsSync } from 'fs';\n\nexport interface Template {\n /** Template name */\n name: string;\n /** Template content */\n content: string;\n /** Template hash for change detection */\n hash: string;\n /** Template version */\n version: string;\n}\n\nexport interface ModuleManifest {\n /** Module name */\n name: string;\n /** Module version */\n version: string;\n /** Files in this module */\n files: Record<string, { hash: string; path: string }>;\n /** Install date */\n installedAt: Date;\n /** Last update */\n updatedAt: Date;\n}\n\n/**\n * Template Manager\n * Manages module templates and tracks installed versions\n */\nexport class TemplateManager {\n private templatesDir: string;\n private manifestsDir: string;\n\n constructor(projectRoot: string) {\n this.templatesDir = path.join(projectRoot, '.servcraft', 'templates');\n this.manifestsDir = path.join(projectRoot, '.servcraft', 'manifests');\n }\n\n /**\n * Initialize template system\n */\n async initialize(): Promise<void> {\n await fs.mkdir(this.templatesDir, { recursive: true });\n await fs.mkdir(this.manifestsDir, { recursive: true });\n }\n\n /**\n * Save module template\n */\n async saveTemplate(moduleName: string, files: Record<string, string>): Promise<void> {\n await this.initialize();\n\n const moduleTemplateDir = path.join(this.templatesDir, moduleName);\n await fs.mkdir(moduleTemplateDir, { recursive: true });\n\n // Save each file\n for (const [fileName, content] of Object.entries(files)) {\n const filePath = path.join(moduleTemplateDir, fileName);\n await fs.writeFile(filePath, content, 'utf-8');\n }\n }\n\n /**\n * Get template content\n */\n async getTemplate(moduleName: string, fileName: string): Promise<string | null> {\n try {\n const filePath = path.join(this.templatesDir, moduleName, fileName);\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n }\n\n /**\n * Save module manifest\n */\n async saveManifest(moduleName: string, files: Record<string, string>): Promise<void> {\n await this.initialize();\n\n const fileHashes: Record<string, { hash: string; path: string }> = {};\n\n for (const [fileName, content] of Object.entries(files)) {\n fileHashes[fileName] = {\n hash: this.hashContent(content),\n path: `src/modules/${moduleName}/${fileName}`,\n };\n }\n\n const manifest: ModuleManifest = {\n name: moduleName,\n version: '1.0.0',\n files: fileHashes,\n installedAt: new Date(),\n updatedAt: new Date(),\n };\n\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n }\n\n /**\n * Get module manifest\n */\n async getManifest(moduleName: string): Promise<ModuleManifest | null> {\n try {\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n const content = await fs.readFile(manifestPath, 'utf-8');\n return JSON.parse(content) as ModuleManifest;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if file has been modified by user\n */\n async isFileModified(\n moduleName: string,\n fileName: string,\n currentContent: string\n ): Promise<boolean> {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest || !manifest.files[fileName]) {\n return false;\n }\n\n const originalHash = manifest.files[fileName].hash;\n const currentHash = this.hashContent(currentContent);\n\n return originalHash !== currentHash;\n }\n\n /**\n * Get all modified files in a module\n */\n async getModifiedFiles(\n moduleName: string,\n moduleDir: string\n ): Promise<\n Array<{ fileName: string; isModified: boolean; originalHash: string; currentHash: string }>\n > {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest) {\n return [];\n }\n\n const results = [];\n\n for (const [fileName, fileInfo] of Object.entries(manifest.files)) {\n const filePath = path.join(moduleDir, fileName);\n\n if (!existsSync(filePath)) {\n results.push({\n fileName,\n isModified: true,\n originalHash: fileInfo.hash,\n currentHash: '',\n });\n continue;\n }\n\n const currentContent = await fs.readFile(filePath, 'utf-8');\n const currentHash = this.hashContent(currentContent);\n\n results.push({\n fileName,\n isModified: fileInfo.hash !== currentHash,\n originalHash: fileInfo.hash,\n currentHash,\n });\n }\n\n return results;\n }\n\n /**\n * Create backup of module\n */\n async createBackup(moduleName: string, moduleDir: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);\n const backupDir = path.join(path.dirname(moduleDir), `${moduleName}.backup-${timestamp}`);\n\n await this.copyDirectory(moduleDir, backupDir);\n\n return backupDir;\n }\n\n /**\n * Copy directory recursively\n */\n private async copyDirectory(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await this.copyDirectory(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n }\n\n /**\n * Perform 3-way merge\n */\n async mergeFiles(\n original: string,\n modified: string,\n incoming: string\n ): Promise<{ merged: string; hasConflicts: boolean; conflicts: string[] }> {\n const conflicts: string[] = [];\n let hasConflicts = false;\n\n // Simple line-based merge\n const originalLines = original.split('\\n');\n const modifiedLines = modified.split('\\n');\n const incomingLines = incoming.split('\\n');\n\n const merged: string[] = [];\n\n // This is a simplified merge - in production, use a proper diff3 algorithm\n // For now, we'll use a basic strategy:\n // 1. If modified === original, use incoming (user hasn't changed it)\n // 2. If modified !== original, keep modified (user changed it)\n // 3. If both changed, mark as conflict\n\n const maxLength = Math.max(originalLines.length, modifiedLines.length, incomingLines.length);\n\n for (let i = 0; i < maxLength; i++) {\n const origLine = originalLines[i] || '';\n const modLine = modifiedLines[i] || '';\n const incLine = incomingLines[i] || '';\n\n if (modLine === origLine) {\n // User hasn't modified, use incoming\n merged.push(incLine);\n } else if (incLine === origLine) {\n // Template hasn't changed, keep user's modification\n merged.push(modLine);\n } else if (modLine === incLine) {\n // Both have same change, no conflict\n merged.push(modLine);\n } else {\n // Conflict: both modified differently\n hasConflicts = true;\n conflicts.push(`Line ${i + 1}: User and template both modified`);\n merged.push(`<<<<<<< YOUR VERSION`);\n merged.push(modLine);\n merged.push(`=======`);\n merged.push(incLine);\n merged.push(`>>>>>>> NEW VERSION`);\n }\n }\n\n return {\n merged: merged.join('\\n'),\n hasConflicts,\n conflicts,\n };\n }\n\n /**\n * Generate diff between two files\n */\n generateDiff(original: string, modified: string): string {\n const originalLines = original.split('\\n');\n const modifiedLines = modified.split('\\n');\n\n const diff: string[] = [];\n diff.push('--- Original');\n diff.push('+++ Modified');\n diff.push('');\n\n const maxLength = Math.max(originalLines.length, modifiedLines.length);\n\n for (let i = 0; i < maxLength; i++) {\n const origLine = originalLines[i];\n const modLine = modifiedLines[i];\n\n if (origLine !== modLine) {\n if (origLine !== undefined) {\n diff.push(`- ${origLine}`);\n }\n if (modLine !== undefined) {\n diff.push(`+ ${modLine}`);\n }\n }\n }\n\n return diff.join('\\n');\n }\n\n /**\n * Hash content for change detection\n */\n private hashContent(content: string): string {\n return createHash('md5').update(content).digest('hex');\n }\n\n /**\n * Check if module is installed\n */\n async isModuleInstalled(moduleName: string): Promise<boolean> {\n const manifest = await this.getManifest(moduleName);\n return manifest !== null;\n }\n\n /**\n * Update manifest after merge\n */\n async updateManifest(moduleName: string, files: Record<string, string>): Promise<void> {\n const manifest = await this.getManifest(moduleName);\n\n if (!manifest) {\n await this.saveManifest(moduleName, files);\n return;\n }\n\n const fileHashes: Record<string, { hash: string; path: string }> = {};\n\n for (const [fileName, content] of Object.entries(files)) {\n fileHashes[fileName] = {\n hash: this.hashContent(content),\n path: `src/modules/${moduleName}/${fileName}`,\n };\n }\n\n manifest.files = fileHashes;\n manifest.updatedAt = new Date();\n\n const manifestPath = path.join(this.manifestsDir, `${moduleName}.json`);\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n }\n}\n","import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nexport interface MergeChoice {\n action: 'skip' | 'update' | 'overwrite' | 'diff' | 'backup-overwrite';\n}\n\nexport interface FileChoice {\n action: 'merge' | 'keep' | 'overwrite' | 'diff' | 'skip';\n}\n\n/**\n * Interactive prompt utilities\n */\nexport class InteractivePrompt {\n /**\n * Ask what to do when module already exists\n */\n static async askModuleExists(\n moduleName: string,\n hasModifications: boolean\n ): Promise<MergeChoice> {\n console.log(chalk.yellow(`\\n⚠️ Module \"${moduleName}\" already exists`));\n\n if (hasModifications) {\n console.log(chalk.yellow(' Some files have been modified by you.\\n'));\n }\n\n const { action } = await inquirer.prompt<{ action: MergeChoice['action'] }>([\n {\n type: 'list',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n {\n name: '✓ Skip (keep existing files, recommended if you made custom changes)',\n value: 'skip',\n },\n {\n name: '↻ Update (merge new features, preserve your customizations)',\n value: 'update',\n },\n {\n name: '⚠ Overwrite (replace all files, will lose your changes)',\n value: 'overwrite',\n },\n {\n name: '📋 Show diff (see what changed)',\n value: 'diff',\n },\n {\n name: '💾 Backup & overwrite (save backup then replace)',\n value: 'backup-overwrite',\n },\n ],\n default: 'skip',\n },\n ]);\n\n return { action };\n }\n\n /**\n * Ask what to do with a specific file\n */\n static async askFileAction(\n fileName: string,\n isModified: boolean,\n yourLines: number,\n newLines: number\n ): Promise<FileChoice> {\n console.log(chalk.cyan(`\\n📁 ${fileName}`));\n console.log(\n chalk.gray(` Your version: ${yourLines} lines${isModified ? ' (modified)' : ''}`)\n );\n console.log(chalk.gray(` New version: ${newLines} lines\\n`));\n\n const { action } = await inquirer.prompt<{ action: FileChoice['action'] }>([\n {\n type: 'list',\n name: 'action',\n message: 'Action for this file:',\n choices: [\n {\n name: '[M]erge - Smart merge, preserve your changes',\n value: 'merge',\n },\n {\n name: '[K]eep - Keep your version (skip update)',\n value: 'keep',\n },\n {\n name: '[O]verwrite - Use new version',\n value: 'overwrite',\n },\n {\n name: '[D]iff - Show differences',\n value: 'diff',\n },\n {\n name: '[S]kip - Skip this file',\n value: 'skip',\n },\n ],\n default: isModified ? 'merge' : 'overwrite',\n },\n ]);\n\n return { action };\n }\n\n /**\n * Confirm action\n */\n static async confirm(message: string, defaultValue = false): Promise<boolean> {\n const { confirmed } = await inquirer.prompt<{ confirmed: boolean }>([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n\n return confirmed;\n }\n\n /**\n * Display diff and ask to continue\n */\n static async showDiffAndAsk(diff: string): Promise<boolean> {\n console.log(chalk.cyan('\\n📊 Differences:\\n'));\n console.log(diff);\n\n return await this.confirm('\\nDo you want to proceed with this change?', true);\n }\n\n /**\n * Display merge conflicts\n */\n static displayConflicts(conflicts: string[]): void {\n console.log(chalk.red('\\n⚠️ Merge Conflicts Detected:\\n'));\n conflicts.forEach((conflict, i) => {\n console.log(chalk.yellow(` ${i + 1}. ${conflict}`));\n });\n console.log(chalk.gray('\\n Conflict markers have been added to the file:'));\n console.log(chalk.gray(' <<<<<<< YOUR VERSION'));\n console.log(chalk.gray(' ... your code ...'));\n console.log(chalk.gray(' ======='));\n console.log(chalk.gray(' ... new code ...'));\n console.log(chalk.gray(' >>>>>>> NEW VERSION\\n'));\n }\n\n /**\n * Show backup location\n */\n static showBackupCreated(backupPath: string): void {\n console.log(chalk.green(`\\n✓ Backup created: ${chalk.cyan(backupPath)}`));\n }\n\n /**\n * Show merge summary\n */\n static showMergeSummary(stats: {\n merged: number;\n kept: number;\n overwritten: number;\n conflicts: number;\n }): void {\n console.log(chalk.bold('\\n📊 Merge Summary:\\n'));\n if (stats.merged > 0) {\n console.log(chalk.green(` ✓ Merged: ${stats.merged} file(s)`));\n }\n if (stats.kept > 0) {\n console.log(chalk.blue(` → Kept: ${stats.kept} file(s)`));\n }\n if (stats.overwritten > 0) {\n console.log(chalk.yellow(` ⚠ Overwritten: ${stats.overwritten} file(s)`));\n }\n if (stats.conflicts > 0) {\n console.log(chalk.red(` ⚠ Conflicts: ${stats.conflicts} file(s)`));\n console.log(chalk.gray('\\n Please resolve conflicts manually before committing.\\n'));\n }\n }\n\n /**\n * Ask for batch action on all files\n */\n static async askBatchAction(): Promise<\n 'individual' | 'merge-all' | 'keep-all' | 'overwrite-all'\n > {\n const { action } = await inquirer.prompt<{\n action: 'individual' | 'merge-all' | 'keep-all' | 'overwrite-all';\n }>([\n {\n type: 'list',\n name: 'action',\n message: 'Multiple files found. Choose action:',\n choices: [\n {\n name: 'Ask for each file individually (recommended)',\n value: 'individual',\n },\n {\n name: 'Merge all files automatically',\n value: 'merge-all',\n },\n {\n name: 'Keep all existing files (skip update)',\n value: 'keep-all',\n },\n {\n name: 'Overwrite all files with new versions',\n value: 'overwrite-all',\n },\n ],\n default: 'individual',\n },\n ]);\n\n return action;\n }\n}\n","import { Command } from 'commander';\nimport { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/helpers.js';\n\nexport const dbCommand = new Command('db').description('Database management commands');\n\ndbCommand\n .command('migrate')\n .description('Run database migrations')\n .option('-n, --name <name>', 'Migration name')\n .action(async (options) => {\n const spinner = ora('Running migrations...').start();\n\n try {\n const cmd = options.name\n ? `npx prisma migrate dev --name ${options.name}`\n : 'npx prisma migrate dev';\n\n execSync(cmd, { stdio: 'inherit' });\n spinner.succeed('Migrations completed!');\n } catch (err) {\n spinner.fail('Migration failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('push')\n .description('Push schema changes to database (no migration)')\n .action(async () => {\n const spinner = ora('Pushing schema...').start();\n\n try {\n execSync('npx prisma db push', { stdio: 'inherit' });\n spinner.succeed('Schema pushed successfully!');\n } catch (err) {\n spinner.fail('Push failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('generate')\n .description('Generate Prisma client')\n .action(async () => {\n const spinner = ora('Generating Prisma client...').start();\n\n try {\n execSync('npx prisma generate', { stdio: 'inherit' });\n spinner.succeed('Prisma client generated!');\n } catch (err) {\n spinner.fail('Generation failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('studio')\n .description('Open Prisma Studio')\n .action(async () => {\n info('Opening Prisma Studio...');\n const studio = spawn('npx', ['prisma', 'studio'], {\n stdio: 'inherit',\n shell: true,\n });\n\n studio.on('close', (code) => {\n if (code !== 0) {\n error('Prisma Studio closed with error');\n }\n });\n });\n\ndbCommand\n .command('seed')\n .description('Run database seed')\n .action(async () => {\n const spinner = ora('Seeding database...').start();\n\n try {\n execSync('npx prisma db seed', { stdio: 'inherit' });\n spinner.succeed('Database seeded!');\n } catch (err) {\n spinner.fail('Seeding failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('reset')\n .description('Reset database (drop all data and re-run migrations)')\n .option('-f, --force', 'Skip confirmation')\n .action(async (options) => {\n if (!options.force) {\n console.log(chalk.yellow('\\n⚠️ WARNING: This will delete all data in your database!\\n'));\n\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question('Are you sure you want to continue? (y/N) ', resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n info('Operation cancelled');\n return;\n }\n }\n\n const spinner = ora('Resetting database...').start();\n\n try {\n execSync('npx prisma migrate reset --force', { stdio: 'inherit' });\n spinner.succeed('Database reset completed!');\n } catch (err) {\n spinner.fail('Reset failed');\n error(err instanceof Error ? err.message : String(err));\n }\n });\n\ndbCommand\n .command('status')\n .description('Show migration status')\n .action(async () => {\n try {\n execSync('npx prisma migrate status', { stdio: 'inherit' });\n } catch {\n error('Failed to get migration status');\n }\n });\n"],"mappings":"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","names":["import_commander","import_path","import_promises","import_chalk","fs","path","chalk","path","chalk","inquirer","path","ora","fs","import_commander","import_path","import_ora","import_inquirer","ora","path","inquirer","import_commander","import_path","import_ora","import_chalk","fs","fs","path","fs","path","import_fs","import_inquirer","import_chalk","chalk","inquirer","chalk","module","ora","path","path","stat","chalk","ora","import_commander","import_child_process","import_ora","import_chalk","ora","chalk"]}
|