servcraft 0.1.0
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/.dockerignore +45 -0
- package/.env.example +46 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +4 -0
- package/.prettierrc +11 -0
- package/Dockerfile +76 -0
- package/Dockerfile.dev +31 -0
- package/README.md +232 -0
- package/commitlint.config.js +24 -0
- package/dist/cli/index.cjs +3968 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +3945 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +2458 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +828 -0
- package/dist/index.d.ts +828 -0
- package/dist/index.js +2332 -0
- package/dist/index.js.map +1 -0
- package/docker-compose.prod.yml +118 -0
- package/docker-compose.yml +147 -0
- package/eslint.config.js +27 -0
- package/npm-cache/_cacache/content-v2/sha512/1c/d0/03440d500a0487621aad1d6402978340698976602046db8e24fa03c01ee6c022c69b0582f969042d9442ee876ac35c038e960dd427d1e622fa24b8eb7dba +0 -0
- package/npm-cache/_cacache/content-v2/sha512/42/55/28b493ca491833e5aab0e9c3108d29ab3f36c248ca88f45d4630674fce9130959e56ae308797ac2b6328fa7f09a610b9550ed09cb971d039876d293fc69d +0 -0
- package/npm-cache/_cacache/content-v2/sha512/e0/12/f360dc9315ee5f17844a0c8c233ee6bf7c30837c4a02ea0d56c61c7f7ab21c0e958e50ed2c57c59f983c762b93056778c9009b2398ffc26def0183999b13 +0 -0
- package/npm-cache/_cacache/content-v2/sha512/ed/b0/fae1161902898f4c913c67d7f6cdf6be0665aec3b389b9c4f4f0a101ca1da59badf1b59c4e0030f5223023b8d63cfe501c46a32c20c895d4fb3f11ca2232 +0 -0
- package/npm-cache/_cacache/index-v5/58/94/c2cba79e0f16b4c10e95a87e32255741149e8222cc314a476aab67c39cc0 +5 -0
- package/npm-cache/_update-notifier-last-checked +0 -0
- package/package.json +112 -0
- package/prisma/schema.prisma +157 -0
- package/src/cli/commands/add-module.ts +422 -0
- package/src/cli/commands/db.ts +137 -0
- package/src/cli/commands/docs.ts +16 -0
- package/src/cli/commands/generate.ts +459 -0
- package/src/cli/commands/init.ts +640 -0
- package/src/cli/index.ts +32 -0
- package/src/cli/templates/controller.ts +67 -0
- package/src/cli/templates/dynamic-prisma.ts +89 -0
- package/src/cli/templates/dynamic-schemas.ts +232 -0
- package/src/cli/templates/dynamic-types.ts +60 -0
- package/src/cli/templates/module-index.ts +33 -0
- package/src/cli/templates/prisma-model.ts +17 -0
- package/src/cli/templates/repository.ts +104 -0
- package/src/cli/templates/routes.ts +70 -0
- package/src/cli/templates/schemas.ts +26 -0
- package/src/cli/templates/service.ts +58 -0
- package/src/cli/templates/types.ts +27 -0
- package/src/cli/utils/docs-generator.ts +47 -0
- package/src/cli/utils/field-parser.ts +315 -0
- package/src/cli/utils/helpers.ts +89 -0
- package/src/config/env.ts +80 -0
- package/src/config/index.ts +97 -0
- package/src/core/index.ts +5 -0
- package/src/core/logger.ts +43 -0
- package/src/core/server.ts +132 -0
- package/src/database/index.ts +7 -0
- package/src/database/prisma.ts +54 -0
- package/src/database/seed.ts +59 -0
- package/src/index.ts +63 -0
- package/src/middleware/error-handler.ts +73 -0
- package/src/middleware/index.ts +3 -0
- package/src/middleware/security.ts +116 -0
- package/src/modules/audit/audit.service.ts +192 -0
- package/src/modules/audit/index.ts +2 -0
- package/src/modules/audit/types.ts +37 -0
- package/src/modules/auth/auth.controller.ts +182 -0
- package/src/modules/auth/auth.middleware.ts +87 -0
- package/src/modules/auth/auth.routes.ts +123 -0
- package/src/modules/auth/auth.service.ts +142 -0
- package/src/modules/auth/index.ts +49 -0
- package/src/modules/auth/schemas.ts +52 -0
- package/src/modules/auth/types.ts +69 -0
- package/src/modules/email/email.service.ts +212 -0
- package/src/modules/email/index.ts +10 -0
- package/src/modules/email/templates.ts +213 -0
- package/src/modules/email/types.ts +57 -0
- package/src/modules/swagger/index.ts +3 -0
- package/src/modules/swagger/schema-builder.ts +263 -0
- package/src/modules/swagger/swagger.service.ts +169 -0
- package/src/modules/swagger/types.ts +68 -0
- package/src/modules/user/index.ts +30 -0
- package/src/modules/user/schemas.ts +49 -0
- package/src/modules/user/types.ts +78 -0
- package/src/modules/user/user.controller.ts +139 -0
- package/src/modules/user/user.repository.ts +156 -0
- package/src/modules/user/user.routes.ts +199 -0
- package/src/modules/user/user.service.ts +145 -0
- package/src/modules/validation/index.ts +18 -0
- package/src/modules/validation/validator.ts +104 -0
- package/src/types/common.ts +61 -0
- package/src/types/index.ts +10 -0
- package/src/utils/errors.ts +66 -0
- package/src/utils/index.ts +33 -0
- package/src/utils/pagination.ts +38 -0
- package/src/utils/response.ts +63 -0
- package/tests/integration/auth.test.ts +59 -0
- package/tests/setup.ts +17 -0
- package/tests/unit/modules/validation.test.ts +88 -0
- package/tests/unit/utils/errors.test.ts +113 -0
- package/tests/unit/utils/pagination.test.ts +82 -0
- package/tsconfig.json +33 -0
- package/tsup.config.ts +14 -0
- package/vitest.config.ts +34 -0
|
@@ -0,0 +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/utils/docs-generator.ts","../../src/core/server.ts","../../src/core/logger.ts","../../src/utils/errors.ts","../../src/config/env.ts","../../src/config/index.ts","../../src/middleware/error-handler.ts","../../src/middleware/security.ts","../../src/modules/swagger/swagger.service.ts","../../src/modules/auth/index.ts","../../src/modules/auth/auth.service.ts","../../src/modules/auth/schemas.ts","../../src/utils/response.ts","../../src/modules/validation/validator.ts","../../src/modules/auth/auth.controller.ts","../../src/modules/auth/auth.middleware.ts","../../src/modules/auth/auth.routes.ts","../../src/modules/user/user.repository.ts","../../src/utils/pagination.ts","../../src/modules/user/types.ts","../../src/modules/user/user.service.ts","../../src/modules/user/schemas.ts","../../src/modules/user/user.controller.ts","../../src/modules/user/user.routes.ts","../../src/modules/user/index.ts","../../src/cli/commands/add-module.ts","../../src/cli/commands/db.ts","../../src/cli/commands/docs.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';\nimport { docsCommand } from './commands/docs.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\n// Documentation commands\nprogram.addCommand(docsCommand);\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, success, error, info, warn } from '../utils/helpers.js';\n\ninterface InitOptions {\n name: string;\n language: 'typescript' | 'javascript';\n database: 'postgresql' | 'mysql' | 'sqlite' | 'mongodb' | '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(async (name?: string, cmdOptions?: { yes?: boolean; typescript?: boolean; javascript?: boolean; db?: string }) => {\n console.log(chalk.blue(`\n╔═══════════════════════════════════════════╗\n║ ║\n║ ${chalk.bold('🚀 Servcraft Project Generator')} ║\n║ ║\n╚═══════════════════════════════════════════╝\n`));\n\n let options: InitOptions;\n\n if (cmdOptions?.yes) {\n options = {\n name: name || 'my-servcraft-app',\n language: cmdOptions.javascript ? 'javascript' : 'typescript',\n database: (cmdOptions.db as InitOptions['database']) || 'postgresql',\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)', value: 'postgresql' },\n { name: 'MySQL', value: 'mysql' },\n { name: 'SQLite (Development)', value: 'sqlite' },\n { name: 'MongoDB', 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 options = answers 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(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2));\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(path.join(projectDir, 'docker-compose.yml'), generateDockerCompose(options));\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.database !== 'none' && options.database !== 'mongodb') {\n dirs.push('prisma');\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(\n path.join(projectDir, `src/index.${ext}`),\n generateEntryFile(options)\n );\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 Prisma schema if database is selected\n if (options.database !== 'none' && options.database !== 'mongodb') {\n await writeFile(\n path.join(projectDir, 'prisma/schema.prisma'),\n generatePrismaSchema(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\n } catch (err) {\n spinner.fail('Failed to create project');\n error(err instanceof Error ? err.message : String(err));\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.database !== 'none' && options.database !== 'mongodb') {\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.database === 'mongodb') {\n (pkg.dependencies as Record<string, string>).mongoose = '^8.8.4';\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 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 }, null, 2);\n}\n\nfunction generateJsConfig(): string {\n return JSON.stringify({\n compilerOptions: {\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n target: 'ES2022',\n checkJs: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules'],\n }, null, 2);\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 }\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 { createServer } from './core/server.js';\\nimport { logger } from './core/logger.js';\" : \"const { 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 `${isTS ? `import Fastify from 'fastify';\nimport type { FastifyInstance } from 'fastify';\nimport { logger } from './logger.js';` : `const Fastify = require('fastify');\nconst { logger } = require('./logger.js');`}\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","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 warn,\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';\nimport { generateDocs } from '../utils/docs-generator.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('Generate a complete module with controller, service, repository, types, schemas, and routes')\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 { name: `${kebabName}.service.ts`, content: serviceTemplate(kebabName, pascalName, camelName) },\n { name: `${kebabName}.controller.ts`, content: controllerTemplate(kebabName, pascalName, camelName) },\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, fields),\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\n const { generateDocsNow } = await inquirer.prompt<{ generateDocsNow: boolean }>([\n {\n type: 'confirm',\n name: 'generateDocsNow',\n message: 'Generate Swagger/OpenAPI documentation now?',\n default: true,\n },\n ]);\n\n if (generateDocsNow) {\n await generateDocs('openapi.json', true);\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', 'number', 'boolean', 'date', 'datetime',\n 'text', 'json', 'email', 'url', 'uuid', 'int', 'float', 'decimal', '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\n .split(/\\s+/)\n .filter(Boolean)\n .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(name: string, pascalName: string, camelName: string, pluralName: string): 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","import type { FieldDefinition } from '../utils/field-parser.js';\n\nexport function routesTemplate(\n name: string,\n pascalName: string,\n camelName: string,\n pluralName: string,\n fields: FieldDefinition[] = []\n): string {\n const serializedFields = JSON.stringify(fields, null, 2);\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';\nimport { generateRouteSchema } from '../swagger/schema-builder.js';\nimport type { FieldDefinition } from '../cli/utils/field-parser.js';\n\nconst ${camelName}Fields: FieldDefinition[] = ${serializedFields};\nconst ${camelName}Schemas = {\n list: generateRouteSchema('${pascalName}', ${camelName}Fields, 'list'),\n get: generateRouteSchema('${pascalName}', ${camelName}Fields, 'get'),\n create: generateRouteSchema('${pascalName}', ${camelName}Fields, 'create'),\n update: generateRouteSchema('${pascalName}', ${camelName}Fields, 'update'),\n delete: generateRouteSchema('${pascalName}', ${camelName}Fields, 'delete'),\n};\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], ...${camelName}Schemas.list },\n controller.list.bind(controller)\n );\n\n app.get(\n '/${pluralName}/:id',\n { preHandler: [authenticate], ...${camelName}Schemas.get },\n controller.getById.bind(controller)\n );\n\n app.post(\n '/${pluralName}',\n { preHandler: [authenticate], ...${camelName}Schemas.create },\n controller.create.bind(controller)\n );\n\n app.patch(\n '/${pluralName}/:id',\n { preHandler: [authenticate], ...${camelName}Schemas.update },\n controller.update.bind(controller)\n );\n\n app.delete(\n '/${pluralName}/:id',\n { preHandler: [authenticate, isAdmin], ...${camelName}Schemas.delete },\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 fs from 'fs/promises';\nimport path from 'path';\nimport ora from 'ora';\nimport { createServer } from '../../core/server.js';\nimport { registerErrorHandler, registerSecurity } from '../../middleware/index.js';\nimport { registerSwagger } from '../../modules/swagger/index.js';\nimport { registerAuthModule } from '../../modules/auth/index.js';\nimport { registerUserModule } from '../../modules/user/index.js';\nimport { config } from '../../config/index.js';\n\nexport async function generateDocs(outputPath = 'openapi.json', silent = false): Promise<string> {\n const spinner = silent ? null : ora('Generating OpenAPI documentation...').start();\n try {\n const server = createServer({\n port: config.server.port,\n host: config.server.host,\n });\n const app = server.instance;\n\n registerErrorHandler(app);\n await registerSecurity(app);\n await registerSwagger(app, {\n enabled: true,\n route: config.swagger.route,\n title: config.swagger.title,\n description: config.swagger.description,\n version: config.swagger.version,\n });\n const authService = await registerAuthModule(app);\n await registerUserModule(app, authService);\n\n await app.ready();\n const spec = app.swagger();\n\n const absoluteOutput = path.resolve(outputPath);\n await fs.mkdir(path.dirname(absoluteOutput), { recursive: true });\n await fs.writeFile(absoluteOutput, JSON.stringify(spec, null, 2), 'utf8');\n\n spinner?.succeed(`OpenAPI spec generated at ${absoluteOutput}`);\n\n await app.close();\n return absoluteOutput;\n } catch (error) {\n spinner?.fail('Failed to generate OpenAPI documentation');\n throw error;\n }\n}\n","import Fastify from 'fastify';\nimport type { FastifyInstance, FastifyServerOptions } from 'fastify';\nimport { logger, createLogger } from './logger.js';\nimport type { Logger } from './logger.js';\n\nexport interface ServerConfig {\n port: number;\n host: string;\n logger?: Logger;\n trustProxy?: boolean;\n bodyLimit?: number;\n requestTimeout?: number;\n}\n\nconst defaultConfig: ServerConfig = {\n port: parseInt(process.env.PORT || '3000', 10),\n host: process.env.HOST || '0.0.0.0',\n trustProxy: true,\n bodyLimit: 1048576, // 1MB\n requestTimeout: 30000, // 30s\n};\n\nexport class Server {\n private app: FastifyInstance;\n private config: ServerConfig;\n private logger: Logger;\n private isShuttingDown = false;\n\n constructor(config: Partial<ServerConfig> = {}) {\n this.config = { ...defaultConfig, ...config };\n this.logger = this.config.logger || logger;\n\n const fastifyOptions: FastifyServerOptions = {\n logger: this.logger,\n trustProxy: this.config.trustProxy,\n bodyLimit: this.config.bodyLimit,\n requestTimeout: this.config.requestTimeout,\n };\n\n this.app = Fastify(fastifyOptions);\n this.setupHealthCheck();\n this.setupGracefulShutdown();\n }\n\n get instance(): FastifyInstance {\n return this.app;\n }\n\n private setupHealthCheck(): void {\n this.app.get('/health', async (_request, reply) => {\n const healthcheck = {\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n version: process.env.npm_package_version || '0.1.0',\n };\n\n return reply.status(200).send(healthcheck);\n });\n\n this.app.get('/ready', async (_request, reply) => {\n if (this.isShuttingDown) {\n return reply.status(503).send({ status: 'shutting_down' });\n }\n return reply.status(200).send({ status: 'ready' });\n });\n }\n\n private setupGracefulShutdown(): void {\n const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGQUIT'];\n\n signals.forEach((signal) => {\n process.on(signal, async () => {\n this.logger.info(`Received ${signal}, starting graceful shutdown...`);\n await this.shutdown();\n });\n });\n\n process.on('uncaughtException', async (error) => {\n this.logger.error({ err: error }, 'Uncaught exception');\n await this.shutdown(1);\n });\n\n process.on('unhandledRejection', async (reason) => {\n this.logger.error({ err: reason }, 'Unhandled rejection');\n await this.shutdown(1);\n });\n }\n\n async shutdown(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n this.logger.info('Graceful shutdown initiated...');\n\n const shutdownTimeout = setTimeout(() => {\n this.logger.error('Graceful shutdown timeout, forcing exit');\n process.exit(1);\n }, 30000);\n\n try {\n await this.app.close();\n this.logger.info('Server closed successfully');\n clearTimeout(shutdownTimeout);\n process.exit(exitCode);\n } catch (error) {\n this.logger.error({ err: error }, 'Error during shutdown');\n clearTimeout(shutdownTimeout);\n process.exit(1);\n }\n }\n\n async start(): Promise<void> {\n try {\n await this.app.listen({\n port: this.config.port,\n host: this.config.host,\n });\n this.logger.info(`Server listening on ${this.config.host}:${this.config.port}`);\n } catch (error) {\n this.logger.error({ err: error }, 'Failed to start server');\n throw error;\n }\n }\n}\n\nexport function createServer(config: Partial<ServerConfig> = {}): Server {\n return new Server(config);\n}\n","import pino from 'pino';\nimport type { Logger } from 'pino';\n\nexport interface LoggerConfig {\n level: string;\n pretty: boolean;\n name?: string;\n}\n\nconst defaultConfig: LoggerConfig = {\n level: process.env.LOG_LEVEL || 'info',\n pretty: process.env.NODE_ENV !== 'production',\n name: 'servcraft',\n};\n\nexport function createLogger(config: Partial<LoggerConfig> = {}): Logger {\n const mergedConfig = { ...defaultConfig, ...config };\n\n const transport = mergedConfig.pretty\n ? {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n }\n : undefined;\n\n return pino({\n name: mergedConfig.name,\n level: mergedConfig.level,\n transport,\n formatters: {\n level: (label) => ({ level: label }),\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n });\n}\n\nexport const logger = createLogger();\n\nexport type { Logger };\n","export class AppError extends Error {\n public readonly statusCode: number;\n public readonly isOperational: boolean;\n public readonly errors?: Record<string, string[]>;\n\n constructor(\n message: string,\n statusCode = 500,\n isOperational = true,\n errors?: Record<string, string[]>\n ) {\n super(message);\n this.statusCode = statusCode;\n this.isOperational = isOperational;\n this.errors = errors;\n\n Object.setPrototypeOf(this, AppError.prototype);\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class NotFoundError extends AppError {\n constructor(resource = 'Resource') {\n super(`${resource} not found`, 404);\n }\n}\n\nexport class UnauthorizedError extends AppError {\n constructor(message = 'Unauthorized') {\n super(message, 401);\n }\n}\n\nexport class ForbiddenError extends AppError {\n constructor(message = 'Forbidden') {\n super(message, 403);\n }\n}\n\nexport class BadRequestError extends AppError {\n constructor(message = 'Bad request', errors?: Record<string, string[]>) {\n super(message, 400, true, errors);\n }\n}\n\nexport class ConflictError extends AppError {\n constructor(message = 'Resource already exists') {\n super(message, 409);\n }\n}\n\nexport class ValidationError extends AppError {\n constructor(errors: Record<string, string[]>) {\n super('Validation failed', 422, true, errors);\n }\n}\n\nexport class TooManyRequestsError extends AppError {\n constructor(message = 'Too many requests') {\n super(message, 429);\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n","import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { logger } from '../core/logger.js';\n\n// Load .env file\ndotenv.config();\n\nconst envSchema = z.object({\n // Server\n NODE_ENV: z.enum(['development', 'staging', 'production', 'test']).default('development'),\n PORT: z.string().transform(Number).default('3000'),\n HOST: z.string().default('0.0.0.0'),\n\n // Database\n DATABASE_URL: z.string().optional(),\n\n // JWT\n JWT_SECRET: z.string().min(32).optional(),\n JWT_ACCESS_EXPIRES_IN: z.string().default('15m'),\n JWT_REFRESH_EXPIRES_IN: z.string().default('7d'),\n\n // Security\n CORS_ORIGIN: z.string().default('*'),\n RATE_LIMIT_MAX: z.string().transform(Number).default('100'),\n RATE_LIMIT_WINDOW_MS: z.string().transform(Number).default('60000'),\n\n // Email\n SMTP_HOST: z.string().optional(),\n SMTP_PORT: z.string().transform(Number).optional(),\n SMTP_USER: z.string().optional(),\n SMTP_PASS: z.string().optional(),\n SMTP_FROM: z.string().optional(),\n\n // Redis (optional)\n REDIS_URL: z.string().optional(),\n\n // Swagger/OpenAPI\n SWAGGER_ENABLED: z\n .union([z.literal('true'), z.literal('false')])\n .default('true')\n .transform((val) => val === 'true'),\n SWAGGER_ROUTE: z.string().default('/docs'),\n SWAGGER_TITLE: z.string().default('Servcraft API'),\n SWAGGER_DESCRIPTION: z.string().default('API documentation'),\n SWAGGER_VERSION: z.string().default('1.0.0'),\n\n // Logging\n LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),\n});\n\nexport type Env = z.infer<typeof envSchema>;\n\nfunction validateEnv(): Env {\n const parsed = envSchema.safeParse(process.env);\n\n if (!parsed.success) {\n logger.error({ errors: parsed.error.flatten().fieldErrors }, 'Invalid environment variables');\n throw new Error('Invalid environment variables');\n }\n\n return parsed.data;\n}\n\nexport const env = validateEnv();\n\nexport function isDevelopment(): boolean {\n return env.NODE_ENV === 'development';\n}\n\nexport function isProduction(): boolean {\n return env.NODE_ENV === 'production';\n}\n\nexport function isTest(): boolean {\n return env.NODE_ENV === 'test';\n}\n\nexport function isStaging(): boolean {\n return env.NODE_ENV === 'staging';\n}\n","import { env, isDevelopment, isProduction, isTest, isStaging } from './env.js';\nimport type { Env } from './env.js';\n\nexport interface AppConfig {\n env: Env;\n server: {\n port: number;\n host: string;\n };\n jwt: {\n secret: string;\n accessExpiresIn: string;\n refreshExpiresIn: string;\n };\n security: {\n corsOrigin: string | string[];\n rateLimit: {\n max: number;\n windowMs: number;\n };\n };\n email: {\n host?: string;\n port?: number;\n user?: string;\n pass?: string;\n from?: string;\n };\n database: {\n url?: string;\n };\n redis: {\n url?: string;\n };\n swagger: {\n enabled: boolean;\n route: string;\n title: string;\n description: string;\n version: string;\n };\n}\n\nfunction parseCorsOrigin(origin: string): string | string[] {\n if (origin === '*') return '*';\n if (origin.includes(',')) {\n return origin.split(',').map((o) => o.trim());\n }\n return origin;\n}\n\nexport function createConfig(): AppConfig {\n return {\n env,\n server: {\n port: env.PORT,\n host: env.HOST,\n },\n jwt: {\n secret: env.JWT_SECRET || 'change-me-in-production-please-32chars',\n accessExpiresIn: env.JWT_ACCESS_EXPIRES_IN,\n refreshExpiresIn: env.JWT_REFRESH_EXPIRES_IN,\n },\n security: {\n corsOrigin: parseCorsOrigin(env.CORS_ORIGIN),\n rateLimit: {\n max: env.RATE_LIMIT_MAX,\n windowMs: env.RATE_LIMIT_WINDOW_MS,\n },\n },\n email: {\n host: env.SMTP_HOST,\n port: env.SMTP_PORT,\n user: env.SMTP_USER,\n pass: env.SMTP_PASS,\n from: env.SMTP_FROM,\n },\n database: {\n url: env.DATABASE_URL,\n },\n redis: {\n url: env.REDIS_URL,\n },\n swagger: {\n enabled: env.SWAGGER_ENABLED,\n route: env.SWAGGER_ROUTE,\n title: env.SWAGGER_TITLE,\n description: env.SWAGGER_DESCRIPTION,\n version: env.SWAGGER_VERSION,\n },\n };\n}\n\nexport const config = createConfig();\n\nexport { env, isDevelopment, isProduction, isTest, isStaging };\nexport type { Env };\n","import type { FastifyInstance, FastifyError, FastifyRequest, FastifyReply } from 'fastify';\nimport { isAppError } from '../utils/errors.js';\nimport { logger } from '../core/logger.js';\nimport { isProduction } from '../config/index.js';\n\nexport function registerErrorHandler(app: FastifyInstance): void {\n app.setErrorHandler(\n (error: FastifyError | Error, request: FastifyRequest, reply: FastifyReply) => {\n // Log the error\n logger.error(\n {\n err: error,\n requestId: request.id,\n method: request.method,\n url: request.url,\n },\n 'Request error'\n );\n\n // Handle AppError (our custom errors)\n if (isAppError(error)) {\n return reply.status(error.statusCode).send({\n success: false,\n message: error.message,\n errors: error.errors,\n ...(isProduction() ? {} : { stack: error.stack }),\n });\n }\n\n // Handle Fastify validation errors\n if ('validation' in error && error.validation) {\n const errors: Record<string, string[]> = {};\n for (const err of error.validation) {\n const field = err.instancePath?.replace('/', '') || 'body';\n if (!errors[field]) {\n errors[field] = [];\n }\n errors[field].push(err.message || 'Invalid value');\n }\n\n return reply.status(400).send({\n success: false,\n message: 'Validation failed',\n errors,\n });\n }\n\n // Handle Fastify errors with statusCode\n if ('statusCode' in error && typeof error.statusCode === 'number') {\n return reply.status(error.statusCode).send({\n success: false,\n message: error.message,\n ...(isProduction() ? {} : { stack: error.stack }),\n });\n }\n\n // Handle unknown errors\n return reply.status(500).send({\n success: false,\n message: isProduction() ? 'Internal server error' : error.message,\n ...(isProduction() ? {} : { stack: error.stack }),\n });\n }\n );\n\n // Handle 404\n app.setNotFoundHandler((request: FastifyRequest, reply: FastifyReply) => {\n return reply.status(404).send({\n success: false,\n message: `Route ${request.method} ${request.url} not found`,\n });\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport helmet from '@fastify/helmet';\nimport cors from '@fastify/cors';\nimport rateLimit from '@fastify/rate-limit';\nimport { config } from '../config/index.js';\nimport { logger } from '../core/logger.js';\n\nexport interface SecurityOptions {\n helmet?: boolean;\n cors?: boolean;\n rateLimit?: boolean;\n}\n\nconst defaultOptions: SecurityOptions = {\n helmet: true,\n cors: true,\n rateLimit: true,\n};\n\nexport async function registerSecurity(\n app: FastifyInstance,\n options: SecurityOptions = {}\n): Promise<void> {\n const opts = { ...defaultOptions, ...options };\n\n // Helmet - Security headers\n if (opts.helmet) {\n await app.register(helmet, {\n contentSecurityPolicy: {\n directives: {\n defaultSrc: [\"'self'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n scriptSrc: [\"'self'\"],\n imgSrc: [\"'self'\", 'data:', 'https:'],\n },\n },\n crossOriginEmbedderPolicy: false,\n });\n logger.debug('Helmet security headers enabled');\n }\n\n // CORS\n if (opts.cors) {\n await app.register(cors, {\n origin: config.security.corsOrigin,\n credentials: true,\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],\n exposedHeaders: ['X-Total-Count', 'X-Page', 'X-Limit'],\n maxAge: 86400, // 24 hours\n });\n logger.debug({ origin: config.security.corsOrigin }, 'CORS enabled');\n }\n\n // Rate Limiting\n if (opts.rateLimit) {\n await app.register(rateLimit, {\n max: config.security.rateLimit.max,\n timeWindow: config.security.rateLimit.windowMs,\n errorResponseBuilder: (_request, context) => ({\n success: false,\n message: 'Too many requests, please try again later',\n retryAfter: context.after,\n }),\n keyGenerator: (request) => {\n // Use X-Forwarded-For if behind proxy, otherwise use IP\n return (\n request.headers['x-forwarded-for']?.toString().split(',')[0] ||\n request.ip ||\n 'unknown'\n );\n },\n });\n logger.debug(\n {\n max: config.security.rateLimit.max,\n windowMs: config.security.rateLimit.windowMs,\n },\n 'Rate limiting enabled'\n );\n }\n}\n\n// Brute force protection for specific routes (login, etc.)\nexport async function registerBruteForceProtection(\n app: FastifyInstance,\n routePrefix: string,\n options: { max?: number; timeWindow?: number } = {}\n): Promise<void> {\n const { max = 5, timeWindow = 300000 } = options; // 5 attempts per 5 minutes\n\n await app.register(rateLimit, {\n max,\n timeWindow,\n keyGenerator: (request) => {\n const ip =\n request.headers['x-forwarded-for']?.toString().split(',')[0] ||\n request.ip ||\n 'unknown';\n return `brute:${routePrefix}:${ip}`;\n },\n errorResponseBuilder: () => ({\n success: false,\n message: 'Too many attempts. Please try again later.',\n }),\n onExceeded: (request) => {\n logger.warn(\n {\n ip: request.ip,\n route: routePrefix,\n },\n 'Brute force protection triggered'\n );\n },\n });\n}\n","import type { FastifyInstance } from 'fastify';\nimport swagger from '@fastify/swagger';\nimport swaggerUi from '@fastify/swagger-ui';\nimport { config } from '../../config/index.js';\nimport { logger } from '../../core/logger.js';\nimport type { SwaggerConfig } from './types.js';\n\nconst defaultConfig: SwaggerConfig = {\n enabled: true,\n route: '/docs',\n title: 'Servcraft API',\n description: 'API documentation generated by Servcraft',\n version: '1.0.0',\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Users', description: 'User management endpoints' },\n { name: 'Health', description: 'Health check endpoints' },\n ],\n};\n\nexport async function registerSwagger(\n app: FastifyInstance,\n customConfig?: Partial<SwaggerConfig>\n): Promise<void> {\n const swaggerConfig = { ...defaultConfig, ...customConfig };\n\n if (swaggerConfig.enabled === false) {\n logger.info('Swagger documentation disabled');\n return;\n }\n\n await app.register(swagger, {\n openapi: {\n openapi: '3.0.3',\n info: {\n title: swaggerConfig.title,\n description: swaggerConfig.description,\n version: swaggerConfig.version,\n contact: swaggerConfig.contact,\n license: swaggerConfig.license,\n },\n servers: swaggerConfig.servers || [\n {\n url: `http://localhost:${config.server.port}`,\n description: 'Development server',\n },\n ],\n tags: swaggerConfig.tags,\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: 'Enter your JWT token',\n },\n },\n },\n },\n });\n\n await app.register(swaggerUi, {\n routePrefix: swaggerConfig.route || '/docs',\n uiConfig: {\n docExpansion: 'list',\n deepLinking: true,\n displayRequestDuration: true,\n filter: true,\n showExtensions: true,\n showCommonExtensions: true,\n },\n staticCSP: true,\n transformStaticCSP: (header) => header,\n });\n\n logger.info('Swagger documentation registered at /docs');\n}\n\n// Helper to generate schema from Zod\nexport function zodToJsonSchema(zodSchema: unknown): Record<string, unknown> {\n // This is a simplified version - for full support use zod-to-json-schema package\n return {\n type: 'object',\n properties: {},\n };\n}\n\n// Common response schemas\nexport const commonResponses = {\n success: {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: true },\n data: { type: 'object' },\n },\n },\n error: {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: false },\n message: { type: 'string' },\n errors: {\n type: 'object',\n additionalProperties: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n },\n },\n unauthorized: {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: false },\n message: { type: 'string', example: 'Unauthorized' },\n },\n },\n notFound: {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: false },\n message: { type: 'string', example: 'Resource not found' },\n },\n },\n paginated: {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: true },\n data: {\n type: 'object',\n properties: {\n data: { type: 'array', items: { type: 'object' } },\n meta: {\n type: 'object',\n properties: {\n total: { type: 'number' },\n page: { type: 'number' },\n limit: { type: 'number' },\n totalPages: { type: 'number' },\n hasNextPage: { type: 'boolean' },\n hasPrevPage: { type: 'boolean' },\n },\n },\n },\n },\n },\n },\n};\n\n// Query parameters for pagination\nexport const paginationQuery = {\n type: 'object',\n properties: {\n page: { type: 'integer', minimum: 1, default: 1, description: 'Page number' },\n limit: { type: 'integer', minimum: 1, maximum: 100, default: 20, description: 'Items per page' },\n sortBy: { type: 'string', description: 'Field to sort by' },\n sortOrder: { type: 'string', enum: ['asc', 'desc'], default: 'asc', description: 'Sort order' },\n search: { type: 'string', description: 'Search query' },\n },\n};\n\n// ID parameter\nexport const idParam = {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'Resource ID' },\n },\n required: ['id'],\n};\n","import type { FastifyInstance } from 'fastify';\nimport jwt from '@fastify/jwt';\nimport cookie from '@fastify/cookie';\nimport { config } from '../../config/index.js';\nimport { logger } from '../../core/logger.js';\nimport { AuthService, createAuthService } from './auth.service.js';\nimport { AuthController, createAuthController } from './auth.controller.js';\nimport { registerAuthRoutes } from './auth.routes.js';\nimport { createUserService } from '../user/user.service.js';\n\nexport async function registerAuthModule(app: FastifyInstance): Promise<AuthService> {\n // Register JWT plugin\n await app.register(jwt, {\n secret: config.jwt.secret,\n sign: {\n algorithm: 'HS256',\n },\n });\n\n // Register cookie plugin for refresh tokens\n await app.register(cookie, {\n secret: config.jwt.secret,\n hook: 'onRequest',\n });\n\n // Create services\n const authService = createAuthService(app);\n const userService = createUserService();\n\n // Create controller\n const authController = createAuthController(authService, userService);\n\n // Register routes\n registerAuthRoutes(app, authController, authService);\n\n logger.info('Auth module registered');\n return authService;\n}\n\nexport { AuthService, createAuthService } from './auth.service.js';\nexport { AuthController, createAuthController } from './auth.controller.js';\nexport {\n createAuthMiddleware,\n createRoleMiddleware,\n createPermissionMiddleware,\n createOptionalAuthMiddleware,\n} from './auth.middleware.js';\nexport * from './types.js';\nexport * from './schemas.js';\n","import type { FastifyInstance } from 'fastify';\nimport bcrypt from 'bcryptjs';\nimport { config } from '../../config/index.js';\nimport { logger } from '../../core/logger.js';\nimport {\n UnauthorizedError,\n BadRequestError,\n ConflictError,\n NotFoundError,\n} from '../../utils/errors.js';\nimport type { TokenPair, JwtPayload, AuthUser } from './types.js';\nimport type { LoginInput, RegisterInput, ChangePasswordInput } from './schemas.js';\n\n// Token blacklist (in production, use Redis)\nconst tokenBlacklist = new Set<string>();\n\nexport class AuthService {\n private app: FastifyInstance;\n private readonly SALT_ROUNDS = 12;\n\n constructor(app: FastifyInstance) {\n this.app = app;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.SALT_ROUNDS);\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n }\n\n generateTokenPair(user: AuthUser): TokenPair {\n const accessPayload: Omit<JwtPayload, 'iat' | 'exp'> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n type: 'access',\n };\n\n const refreshPayload: Omit<JwtPayload, 'iat' | 'exp'> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n type: 'refresh',\n };\n\n const accessToken = this.app.jwt.sign(accessPayload, {\n expiresIn: config.jwt.accessExpiresIn,\n });\n\n const refreshToken = this.app.jwt.sign(refreshPayload, {\n expiresIn: config.jwt.refreshExpiresIn,\n });\n\n // Parse expiration time to seconds\n const expiresIn = this.parseExpiration(config.jwt.accessExpiresIn);\n\n return { accessToken, refreshToken, expiresIn };\n }\n\n private parseExpiration(expiration: string): number {\n const match = expiration.match(/^(\\d+)([smhd])$/);\n if (!match) return 900; // default 15 minutes\n\n const value = parseInt(match[1] || '0', 10);\n const unit = match[2];\n\n switch (unit) {\n case 's':\n return value;\n case 'm':\n return value * 60;\n case 'h':\n return value * 3600;\n case 'd':\n return value * 86400;\n default:\n return 900;\n }\n }\n\n async verifyAccessToken(token: string): Promise<JwtPayload> {\n try {\n if (this.isTokenBlacklisted(token)) {\n throw new UnauthorizedError('Token has been revoked');\n }\n\n const payload = this.app.jwt.verify<JwtPayload>(token);\n\n if (payload.type !== 'access') {\n throw new UnauthorizedError('Invalid token type');\n }\n\n return payload;\n } catch (error) {\n if (error instanceof UnauthorizedError) throw error;\n logger.debug({ err: error }, 'Token verification failed');\n throw new UnauthorizedError('Invalid or expired token');\n }\n }\n\n async verifyRefreshToken(token: string): Promise<JwtPayload> {\n try {\n if (this.isTokenBlacklisted(token)) {\n throw new UnauthorizedError('Token has been revoked');\n }\n\n const payload = this.app.jwt.verify<JwtPayload>(token);\n\n if (payload.type !== 'refresh') {\n throw new UnauthorizedError('Invalid token type');\n }\n\n return payload;\n } catch (error) {\n if (error instanceof UnauthorizedError) throw error;\n logger.debug({ err: error }, 'Refresh token verification failed');\n throw new UnauthorizedError('Invalid or expired refresh token');\n }\n }\n\n blacklistToken(token: string): void {\n tokenBlacklist.add(token);\n logger.debug('Token blacklisted');\n }\n\n isTokenBlacklisted(token: string): boolean {\n return tokenBlacklist.has(token);\n }\n\n // Clear expired tokens from blacklist periodically\n cleanupBlacklist(): void {\n // In production, this should be handled by Redis TTL\n tokenBlacklist.clear();\n logger.debug('Token blacklist cleared');\n }\n}\n\nexport function createAuthService(app: FastifyInstance): AuthService {\n return new AuthService(app);\n}\n","import { z } from 'zod';\n\nexport const loginSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z.string().min(1, 'Password is required'),\n});\n\nexport const registerSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number'),\n name: z.string().min(2, 'Name must be at least 2 characters').optional(),\n});\n\nexport const refreshTokenSchema = z.object({\n refreshToken: z.string().min(1, 'Refresh token is required'),\n});\n\nexport const passwordResetRequestSchema = z.object({\n email: z.string().email('Invalid email address'),\n});\n\nexport const passwordResetConfirmSchema = z.object({\n token: z.string().min(1, 'Token is required'),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number'),\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: z.string().min(1, 'Current password is required'),\n newPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number'),\n});\n\nexport type LoginInput = z.infer<typeof loginSchema>;\nexport type RegisterInput = z.infer<typeof registerSchema>;\nexport type RefreshTokenInput = z.infer<typeof refreshTokenSchema>;\nexport type PasswordResetRequestInput = z.infer<typeof passwordResetRequestSchema>;\nexport type PasswordResetConfirmInput = z.infer<typeof passwordResetConfirmSchema>;\nexport type ChangePasswordInput = z.infer<typeof changePasswordSchema>;\n","import type { FastifyReply } from 'fastify';\nimport type { ApiResponse } from '../types/index.js';\n\nexport function success<T>(reply: FastifyReply, data: T, statusCode = 200): FastifyReply {\n const response: ApiResponse<T> = {\n success: true,\n data,\n };\n return reply.status(statusCode).send(response);\n}\n\nexport function created<T>(reply: FastifyReply, data: T): FastifyReply {\n return success(reply, data, 201);\n}\n\nexport function noContent(reply: FastifyReply): FastifyReply {\n return reply.status(204).send();\n}\n\nexport function error(\n reply: FastifyReply,\n message: string,\n statusCode = 400,\n errors?: Record<string, string[]>\n): FastifyReply {\n const response: ApiResponse = {\n success: false,\n message,\n errors,\n };\n return reply.status(statusCode).send(response);\n}\n\nexport function notFound(reply: FastifyReply, message = 'Resource not found'): FastifyReply {\n return error(reply, message, 404);\n}\n\nexport function unauthorized(reply: FastifyReply, message = 'Unauthorized'): FastifyReply {\n return error(reply, message, 401);\n}\n\nexport function forbidden(reply: FastifyReply, message = 'Forbidden'): FastifyReply {\n return error(reply, message, 403);\n}\n\nexport function badRequest(\n reply: FastifyReply,\n message = 'Bad request',\n errors?: Record<string, string[]>\n): FastifyReply {\n return error(reply, message, 400, errors);\n}\n\nexport function conflict(reply: FastifyReply, message = 'Resource already exists'): FastifyReply {\n return error(reply, message, 409);\n}\n\nexport function internalError(\n reply: FastifyReply,\n message = 'Internal server error'\n): FastifyReply {\n return error(reply, message, 500);\n}\n","import { z } from 'zod';\nimport type { ZodError, ZodTypeAny } from 'zod';\nimport { ValidationError } from '../../utils/errors.js';\n\nexport function validateBody<T extends ZodTypeAny>(schema: T, data: unknown): z.infer<T> {\n const result = schema.safeParse(data);\n\n if (!result.success) {\n throw new ValidationError(formatZodErrors(result.error));\n }\n\n return result.data;\n}\n\nexport function validateQuery<T extends ZodTypeAny>(schema: T, data: unknown): z.infer<T> {\n const result = schema.safeParse(data);\n\n if (!result.success) {\n throw new ValidationError(formatZodErrors(result.error));\n }\n\n return result.data;\n}\n\nexport function validateParams<T extends ZodTypeAny>(schema: T, data: unknown): z.infer<T> {\n const result = schema.safeParse(data);\n\n if (!result.success) {\n throw new ValidationError(formatZodErrors(result.error));\n }\n\n return result.data;\n}\n\nexport function validate<T extends ZodTypeAny>(schema: T, data: unknown): z.infer<T> {\n return validateBody(schema, data);\n}\n\nfunction formatZodErrors(error: ZodError): Record<string, string[]> {\n const errors: Record<string, string[]> = {};\n\n for (const issue of error.issues) {\n const path = issue.path.join('.') || 'root';\n if (!errors[path]) {\n errors[path] = [];\n }\n errors[path].push(issue.message);\n }\n\n return errors;\n}\n\n// Common validation schemas\nexport const idParamSchema = z.object({\n id: z.string().uuid('Invalid ID format'),\n});\n\nexport const paginationSchema = z.object({\n page: z.string().transform(Number).optional().default('1'),\n limit: z.string().transform(Number).optional().default('20'),\n sortBy: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional().default('asc'),\n});\n\nexport const searchSchema = z.object({\n q: z.string().min(1, 'Search query is required').optional(),\n search: z.string().min(1).optional(),\n});\n\n// Email validation\nexport const emailSchema = z.string().email('Invalid email address');\n\n// Password validation with strength requirements\nexport const passwordSchema = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number')\n .regex(/[^A-Za-z0-9]/, 'Password must contain at least one special character');\n\n// URL validation\nexport const urlSchema = z.string().url('Invalid URL format');\n\n// Phone validation (basic international format)\nexport const phoneSchema = z.string().regex(\n /^\\+?[1-9]\\d{1,14}$/,\n 'Invalid phone number format'\n);\n\n// Date validation\nexport const dateSchema = z.coerce.date();\nexport const futureDateSchema = z.coerce.date().refine(\n (date) => date > new Date(),\n 'Date must be in the future'\n);\nexport const pastDateSchema = z.coerce.date().refine(\n (date) => date < new Date(),\n 'Date must be in the past'\n);\n\n// Type exports\nexport type IdParam = z.infer<typeof idParamSchema>;\nexport type PaginationInput = z.infer<typeof paginationSchema>;\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { AuthService } from './auth.service.js';\nimport type { UserService } from '../user/user.service.js';\nimport {\n loginSchema,\n registerSchema,\n refreshTokenSchema,\n changePasswordSchema,\n} from './schemas.js';\nimport { success, created } from '../../utils/response.js';\nimport { BadRequestError, UnauthorizedError } from '../../utils/errors.js';\nimport { validateBody } from '../validation/validator.js';\nimport type { AuthenticatedRequest } from './types.js';\n\nexport class AuthController {\n constructor(\n private authService: AuthService,\n private userService: UserService\n ) {}\n\n async register(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const data = validateBody(registerSchema, request.body);\n\n // Check if user already exists\n const existingUser = await this.userService.findByEmail(data.email);\n if (existingUser) {\n throw new BadRequestError('Email already registered');\n }\n\n // Hash password and create user\n const hashedPassword = await this.authService.hashPassword(data.password);\n const user = await this.userService.create({\n email: data.email,\n password: hashedPassword,\n name: data.name,\n });\n\n // Generate tokens\n const tokens = this.authService.generateTokenPair({\n id: user.id,\n email: user.email,\n role: user.role,\n });\n\n created(reply, {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n role: user.role,\n },\n ...tokens,\n });\n }\n\n async login(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const data = validateBody(loginSchema, request.body);\n\n // Find user\n const user = await this.userService.findByEmail(data.email);\n if (!user) {\n throw new UnauthorizedError('Invalid credentials');\n }\n\n // Check if user is active\n if (user.status !== 'active') {\n throw new UnauthorizedError('Account is not active');\n }\n\n // Verify password\n const isValidPassword = await this.authService.verifyPassword(data.password, user.password);\n if (!isValidPassword) {\n throw new UnauthorizedError('Invalid credentials');\n }\n\n // Update last login\n await this.userService.updateLastLogin(user.id);\n\n // Generate tokens\n const tokens = this.authService.generateTokenPair({\n id: user.id,\n email: user.email,\n role: user.role,\n });\n\n success(reply, {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n role: user.role,\n },\n ...tokens,\n });\n }\n\n async refresh(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const data = validateBody(refreshTokenSchema, request.body);\n\n // Verify refresh token\n const payload = await this.authService.verifyRefreshToken(data.refreshToken);\n\n // Get fresh user data\n const user = await this.userService.findById(payload.sub);\n if (!user || user.status !== 'active') {\n throw new UnauthorizedError('User not found or inactive');\n }\n\n // Blacklist old refresh token (token rotation)\n this.authService.blacklistToken(data.refreshToken);\n\n // Generate new tokens\n const tokens = this.authService.generateTokenPair({\n id: user.id,\n email: user.email,\n role: user.role,\n });\n\n success(reply, tokens);\n }\n\n async logout(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const authHeader = request.headers.authorization;\n if (authHeader?.startsWith('Bearer ')) {\n const token = authHeader.substring(7);\n this.authService.blacklistToken(token);\n }\n\n success(reply, { message: 'Logged out successfully' });\n }\n\n async me(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n const user = await this.userService.findById(authRequest.user.id);\n\n if (!user) {\n throw new UnauthorizedError('User not found');\n }\n\n success(reply, {\n id: user.id,\n email: user.email,\n name: user.name,\n role: user.role,\n status: user.status,\n createdAt: user.createdAt,\n });\n }\n\n async changePassword(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n const data = validateBody(changePasswordSchema, request.body);\n\n // Get current user\n const user = await this.userService.findById(authRequest.user.id);\n if (!user) {\n throw new UnauthorizedError('User not found');\n }\n\n // Verify current password\n const isValidPassword = await this.authService.verifyPassword(\n data.currentPassword,\n user.password\n );\n if (!isValidPassword) {\n throw new BadRequestError('Current password is incorrect');\n }\n\n // Hash and update password\n const hashedPassword = await this.authService.hashPassword(data.newPassword);\n await this.userService.updatePassword(user.id, hashedPassword);\n\n success(reply, { message: 'Password changed successfully' });\n }\n}\n\nexport function createAuthController(\n authService: AuthService,\n userService: UserService\n): AuthController {\n return new AuthController(authService, userService);\n}\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport { UnauthorizedError, ForbiddenError } from '../../utils/errors.js';\nimport type { AuthService } from './auth.service.js';\nimport type { AuthUser } from './types.js';\n\nexport function createAuthMiddleware(authService: AuthService) {\n return async function authenticate(\n request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const authHeader = request.headers.authorization;\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n throw new UnauthorizedError('Missing or invalid authorization header');\n }\n\n const token = authHeader.substring(7);\n const payload = await authService.verifyAccessToken(token);\n\n request.user = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n };\n };\n}\n\nexport function createRoleMiddleware(allowedRoles: string[]) {\n return async function authorize(\n request: FastifyRequest,\n _reply: FastifyReply\n ): Promise<void> {\n const user = request.user as AuthUser | undefined;\n\n if (!user) {\n throw new UnauthorizedError('Authentication required');\n }\n\n if (!allowedRoles.includes(user.role)) {\n throw new ForbiddenError('Insufficient permissions');\n }\n };\n}\n\nexport function createPermissionMiddleware(requiredPermissions: string[]) {\n return async function checkPermissions(\n request: FastifyRequest,\n _reply: FastifyReply\n ): Promise<void> {\n const user = request.user as AuthUser | undefined;\n\n if (!user) {\n throw new UnauthorizedError('Authentication required');\n }\n\n // This would check against a permissions system\n // For now, we'll implement a basic role-based check\n // In a full implementation, you'd query the user's permissions from the database\n };\n}\n\n// Optional authentication - doesn't throw if no token\nexport function createOptionalAuthMiddleware(authService: AuthService) {\n return async function optionalAuthenticate(\n request: FastifyRequest,\n _reply: FastifyReply\n ): Promise<void> {\n const authHeader = request.headers.authorization;\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return;\n }\n\n try {\n const token = authHeader.substring(7);\n const payload = await authService.verifyAccessToken(token);\n\n request.user = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n };\n } catch {\n // Silently ignore auth errors for optional auth\n }\n };\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { AuthController } from './auth.controller.js';\nimport type { AuthService } from './auth.service.js';\nimport { createAuthMiddleware } from './auth.middleware.js';\nimport { commonResponses } from '../swagger/index.js';\n\nconst credentialsBody = {\n type: 'object',\n required: ['email', 'password'],\n properties: {\n email: { type: 'string', format: 'email' },\n password: { type: 'string', minLength: 8 },\n },\n};\n\nconst changePasswordBody = {\n type: 'object',\n required: ['currentPassword', 'newPassword'],\n properties: {\n currentPassword: { type: 'string', minLength: 8 },\n newPassword: { type: 'string', minLength: 8 },\n },\n};\n\nexport function registerAuthRoutes(\n app: FastifyInstance,\n controller: AuthController,\n authService: AuthService\n): void {\n const authenticate = createAuthMiddleware(authService);\n\n // Public routes\n app.post('/auth/register', {\n schema: {\n tags: ['Auth'],\n summary: 'Register a new user',\n body: credentialsBody,\n response: {\n 201: commonResponses.success,\n 400: commonResponses.error,\n 409: commonResponses.error,\n },\n },\n handler: controller.register.bind(controller),\n });\n\n app.post('/auth/login', {\n schema: {\n tags: ['Auth'],\n summary: 'Login and obtain tokens',\n body: credentialsBody,\n response: {\n 200: commonResponses.success,\n 400: commonResponses.error,\n 401: commonResponses.unauthorized,\n },\n },\n handler: controller.login.bind(controller),\n });\n\n app.post('/auth/refresh', {\n schema: {\n tags: ['Auth'],\n summary: 'Refresh access token',\n body: {\n type: 'object',\n required: ['refreshToken'],\n properties: {\n refreshToken: { type: 'string' },\n },\n },\n response: {\n 200: commonResponses.success,\n 401: commonResponses.unauthorized,\n },\n },\n handler: controller.refresh.bind(controller),\n });\n\n // Protected routes\n app.post('/auth/logout', {\n preHandler: [authenticate],\n schema: {\n tags: ['Auth'],\n summary: 'Logout current user',\n security: [{ bearerAuth: [] }],\n response: {\n 200: commonResponses.success,\n 401: commonResponses.unauthorized,\n },\n },\n handler: controller.logout.bind(controller),\n });\n app.get('/auth/me', {\n preHandler: [authenticate],\n schema: {\n tags: ['Auth'],\n summary: 'Get current user profile',\n security: [{ bearerAuth: [] }],\n response: {\n 200: commonResponses.success,\n 401: commonResponses.unauthorized,\n },\n },\n handler: controller.me.bind(controller),\n });\n\n app.post('/auth/change-password', {\n preHandler: [authenticate],\n schema: {\n tags: ['Auth'],\n summary: 'Change current user password',\n security: [{ bearerAuth: [] }],\n body: changePasswordBody,\n response: {\n 200: commonResponses.success,\n 400: commonResponses.error,\n 401: commonResponses.unauthorized,\n },\n },\n handler: controller.changePassword.bind(controller),\n });\n}\n","import { randomUUID } from 'crypto';\nimport type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { createPaginatedResult, getSkip } from '../../utils/pagination.js';\nimport type { User, CreateUserData, UpdateUserData, UserFilters } from './types.js';\n\n// In-memory storage for development (will be replaced by Prisma)\nconst users = new Map<string, User>();\n\nexport class UserRepository {\n async findById(id: string): Promise<User | null> {\n return users.get(id) || null;\n }\n\n async findByEmail(email: string): Promise<User | null> {\n for (const user of users.values()) {\n if (user.email.toLowerCase() === email.toLowerCase()) {\n return user;\n }\n }\n return null;\n }\n\n async findMany(\n params: PaginationParams,\n filters?: UserFilters\n ): Promise<PaginatedResult<User>> {\n let filteredUsers = Array.from(users.values());\n\n // Apply filters\n if (filters) {\n if (filters.status) {\n filteredUsers = filteredUsers.filter((u) => u.status === filters.status);\n }\n if (filters.role) {\n filteredUsers = filteredUsers.filter((u) => u.role === filters.role);\n }\n if (filters.emailVerified !== undefined) {\n filteredUsers = filteredUsers.filter((u) => u.emailVerified === filters.emailVerified);\n }\n if (filters.search) {\n const search = filters.search.toLowerCase();\n filteredUsers = filteredUsers.filter(\n (u) =>\n u.email.toLowerCase().includes(search) ||\n u.name?.toLowerCase().includes(search)\n );\n }\n }\n\n // Sort\n if (params.sortBy) {\n const sortKey = params.sortBy as keyof User;\n filteredUsers.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 = filteredUsers.length;\n const skip = getSkip(params);\n const data = filteredUsers.slice(skip, skip + params.limit);\n\n return createPaginatedResult(data, total, params);\n }\n\n async create(data: CreateUserData): Promise<User> {\n const now = new Date();\n const user: User = {\n id: randomUUID(),\n email: data.email,\n password: data.password,\n name: data.name,\n role: data.role || 'user',\n status: 'active',\n emailVerified: false,\n createdAt: now,\n updatedAt: now,\n };\n\n users.set(user.id, user);\n return user;\n }\n\n async update(id: string, data: UpdateUserData): Promise<User | null> {\n const user = users.get(id);\n if (!user) return null;\n\n const updatedUser: User = {\n ...user,\n ...data,\n updatedAt: new Date(),\n };\n\n users.set(id, updatedUser);\n return updatedUser;\n }\n\n async updatePassword(id: string, password: string): Promise<User | null> {\n const user = users.get(id);\n if (!user) return null;\n\n const updatedUser: User = {\n ...user,\n password,\n updatedAt: new Date(),\n };\n\n users.set(id, updatedUser);\n return updatedUser;\n }\n\n async updateLastLogin(id: string): Promise<User | null> {\n const user = users.get(id);\n if (!user) return null;\n\n const updatedUser: User = {\n ...user,\n lastLoginAt: new Date(),\n updatedAt: new Date(),\n };\n\n users.set(id, updatedUser);\n return updatedUser;\n }\n\n async delete(id: string): Promise<boolean> {\n return users.delete(id);\n }\n\n async count(filters?: UserFilters): Promise<number> {\n let count = 0;\n for (const user of users.values()) {\n if (filters) {\n if (filters.status && user.status !== filters.status) continue;\n if (filters.role && user.role !== filters.role) continue;\n if (filters.emailVerified !== undefined && user.emailVerified !== filters.emailVerified)\n continue;\n }\n count++;\n }\n return count;\n }\n\n // Helper to clear all users (for testing)\n async clear(): Promise<void> {\n users.clear();\n }\n}\n\nexport function createUserRepository(): UserRepository {\n return new UserRepository();\n}\n","import type { PaginationParams, PaginatedResult } from '../types/index.js';\n\nexport const DEFAULT_PAGE = 1;\nexport const DEFAULT_LIMIT = 20;\nexport const MAX_LIMIT = 100;\n\nexport function parsePaginationParams(query: Record<string, unknown>): PaginationParams {\n const page = Math.max(1, parseInt(String(query.page || DEFAULT_PAGE), 10));\n const limit = Math.min(MAX_LIMIT, Math.max(1, parseInt(String(query.limit || DEFAULT_LIMIT), 10)));\n const sortBy = typeof query.sortBy === 'string' ? query.sortBy : undefined;\n const sortOrder = query.sortOrder === 'desc' ? 'desc' : 'asc';\n\n return { page, limit, sortBy, sortOrder };\n}\n\nexport function createPaginatedResult<T>(\n data: T[],\n total: number,\n params: PaginationParams\n): PaginatedResult<T> {\n const totalPages = Math.ceil(total / params.limit);\n\n return {\n data,\n meta: {\n total,\n page: params.page,\n limit: params.limit,\n totalPages,\n hasNextPage: params.page < totalPages,\n hasPrevPage: params.page > 1,\n },\n };\n}\n\nexport function getSkip(params: PaginationParams): number {\n return (params.page - 1) * params.limit;\n}\n","import type { BaseEntity } from '../../types/index.js';\n\nexport type UserStatus = 'active' | 'inactive' | 'suspended' | 'banned';\n\nexport type UserRole = 'user' | 'admin' | 'moderator' | 'super_admin';\n\nexport interface User extends BaseEntity {\n email: string;\n password: string;\n name?: string;\n role: UserRole;\n status: UserStatus;\n emailVerified: boolean;\n lastLoginAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateUserData {\n email: string;\n password: string;\n name?: string;\n role?: UserRole;\n}\n\nexport interface UpdateUserData {\n email?: string;\n name?: string;\n role?: UserRole;\n status?: UserStatus;\n emailVerified?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UserFilters {\n status?: UserStatus;\n role?: UserRole;\n search?: string;\n emailVerified?: boolean;\n}\n\n// RBAC Types\nexport interface Permission {\n id: string;\n name: string;\n description?: string;\n resource: string;\n action: 'create' | 'read' | 'update' | 'delete' | 'manage';\n}\n\nexport interface Role {\n id: string;\n name: UserRole;\n description?: string;\n permissions: Permission[];\n}\n\n// Default permissions mapping\nexport const DEFAULT_ROLE_PERMISSIONS: Record<UserRole, string[]> = {\n user: ['profile:read', 'profile:update'],\n moderator: [\n 'profile:read',\n 'profile:update',\n 'users:read',\n 'content:read',\n 'content:update',\n 'content:delete',\n ],\n admin: [\n 'profile:read',\n 'profile:update',\n 'users:read',\n 'users:update',\n 'users:delete',\n 'content:manage',\n 'settings:read',\n ],\n super_admin: ['*:manage'], // All permissions\n};\n","import type { PaginatedResult, PaginationParams } from '../../types/index.js';\nimport { NotFoundError, ConflictError } from '../../utils/errors.js';\nimport { UserRepository, createUserRepository } from './user.repository.js';\nimport type { User, CreateUserData, UpdateUserData, UserFilters, UserRole } from './types.js';\nimport { DEFAULT_ROLE_PERMISSIONS } from './types.js';\nimport { logger } from '../../core/logger.js';\n\nexport class UserService {\n constructor(private repository: UserRepository) {}\n\n async findById(id: string): Promise<User | null> {\n return this.repository.findById(id);\n }\n\n async findByEmail(email: string): Promise<User | null> {\n return this.repository.findByEmail(email);\n }\n\n async findMany(\n params: PaginationParams,\n filters?: UserFilters\n ): Promise<PaginatedResult<Omit<User, 'password'>>> {\n const result = await this.repository.findMany(params, filters);\n\n // Remove passwords from results\n return {\n ...result,\n data: result.data.map(({ password, ...user }) => user) as Omit<User, 'password'>[],\n };\n }\n\n async create(data: CreateUserData): Promise<User> {\n // Check for existing user\n const existing = await this.repository.findByEmail(data.email);\n if (existing) {\n throw new ConflictError('User with this email already exists');\n }\n\n const user = await this.repository.create(data);\n logger.info({ userId: user.id, email: user.email }, 'User created');\n return user;\n }\n\n async update(id: string, data: UpdateUserData): Promise<User> {\n const user = await this.repository.findById(id);\n if (!user) {\n throw new NotFoundError('User');\n }\n\n // Check email uniqueness if changing email\n if (data.email && data.email !== user.email) {\n const existing = await this.repository.findByEmail(data.email);\n if (existing) {\n throw new ConflictError('Email already in use');\n }\n }\n\n const updatedUser = await this.repository.update(id, data);\n if (!updatedUser) {\n throw new NotFoundError('User');\n }\n\n logger.info({ userId: id }, 'User updated');\n return updatedUser;\n }\n\n async updatePassword(id: string, hashedPassword: string): Promise<User> {\n const user = await this.repository.updatePassword(id, hashedPassword);\n if (!user) {\n throw new NotFoundError('User');\n }\n logger.info({ userId: id }, 'User password updated');\n return user;\n }\n\n async updateLastLogin(id: string): Promise<User> {\n const user = await this.repository.updateLastLogin(id);\n if (!user) {\n throw new NotFoundError('User');\n }\n return user;\n }\n\n async delete(id: string): Promise<void> {\n const user = await this.repository.findById(id);\n if (!user) {\n throw new NotFoundError('User');\n }\n\n await this.repository.delete(id);\n logger.info({ userId: id }, 'User deleted');\n }\n\n async suspend(id: string): Promise<User> {\n return this.update(id, { status: 'suspended' });\n }\n\n async ban(id: string): Promise<User> {\n return this.update(id, { status: 'banned' });\n }\n\n async activate(id: string): Promise<User> {\n return this.update(id, { status: 'active' });\n }\n\n async verifyEmail(id: string): Promise<User> {\n return this.update(id, { emailVerified: true });\n }\n\n async changeRole(id: string, role: UserRole): Promise<User> {\n return this.update(id, { role });\n }\n\n // RBAC helpers\n hasPermission(role: UserRole, permission: string): boolean {\n const permissions = DEFAULT_ROLE_PERMISSIONS[role] || [];\n\n // Super admin has all permissions\n if (permissions.includes('*:manage')) {\n return true;\n }\n\n // Check exact match\n if (permissions.includes(permission)) {\n return true;\n }\n\n // Check wildcard match (e.g., \"content:manage\" matches \"content:read\")\n const [resource, action] = permission.split(':');\n const managePermission = `${resource}:manage`;\n if (permissions.includes(managePermission)) {\n return true;\n }\n\n return false;\n }\n\n getPermissions(role: UserRole): string[] {\n return DEFAULT_ROLE_PERMISSIONS[role] || [];\n }\n}\n\nexport function createUserService(repository?: UserRepository): UserService {\n return new UserService(repository || createUserRepository());\n}\n","import { z } from 'zod';\n\nexport const userStatusEnum = z.enum(['active', 'inactive', 'suspended', 'banned']);\nexport const userRoleEnum = z.enum(['user', 'admin', 'moderator', 'super_admin']);\n\nexport const createUserSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number'),\n name: z.string().min(2, 'Name must be at least 2 characters').optional(),\n role: userRoleEnum.optional().default('user'),\n});\n\nexport const updateUserSchema = z.object({\n email: z.string().email('Invalid email address').optional(),\n name: z.string().min(2, 'Name must be at least 2 characters').optional(),\n role: userRoleEnum.optional(),\n status: userStatusEnum.optional(),\n emailVerified: z.boolean().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const updateProfileSchema = z.object({\n name: z.string().min(2, 'Name must be at least 2 characters').optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const userQuerySchema = 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 status: userStatusEnum.optional(),\n role: userRoleEnum.optional(),\n search: z.string().optional(),\n emailVerified: z\n .string()\n .transform((val) => val === 'true')\n .optional(),\n});\n\nexport type CreateUserInput = z.infer<typeof createUserSchema>;\nexport type UpdateUserInput = z.infer<typeof updateUserSchema>;\nexport type UpdateProfileInput = z.infer<typeof updateProfileSchema>;\nexport type UserQueryInput = z.infer<typeof userQuerySchema>;\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { UserService } from './user.service.js';\nimport { updateUserSchema, updateProfileSchema, userQuerySchema } from './schemas.js';\nimport { success, noContent } from '../../utils/response.js';\nimport { parsePaginationParams } from '../../utils/pagination.js';\nimport { validateBody, validateQuery } from '../validation/validator.js';\nimport type { AuthenticatedRequest } from '../auth/types.js';\nimport { ForbiddenError } from '../../utils/errors.js';\n\nexport class UserController {\n constructor(private userService: UserService) {}\n\n async list(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const query = validateQuery(userQuerySchema, request.query);\n const pagination = parsePaginationParams(query);\n\n const filters = {\n status: query.status,\n role: query.role,\n search: query.search,\n emailVerified: query.emailVerified,\n };\n\n const result = await this.userService.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 user = await this.userService.findById(request.params.id);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n message: 'User not found',\n });\n }\n\n // Remove password from response\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n async update(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const data = validateBody(updateUserSchema, request.body);\n const user = await this.userService.update(request.params.id, data);\n\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n async delete(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n\n // Prevent self-deletion\n if (authRequest.user.id === request.params.id) {\n throw new ForbiddenError('Cannot delete your own account');\n }\n\n await this.userService.delete(request.params.id);\n noContent(reply);\n }\n\n async suspend(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n\n if (authRequest.user.id === request.params.id) {\n throw new ForbiddenError('Cannot suspend your own account');\n }\n\n const user = await this.userService.suspend(request.params.id);\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n async ban(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n\n if (authRequest.user.id === request.params.id) {\n throw new ForbiddenError('Cannot ban your own account');\n }\n\n const user = await this.userService.ban(request.params.id);\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n async activate(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n ): Promise<void> {\n const user = await this.userService.activate(request.params.id);\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n // Profile routes (for authenticated user)\n async getProfile(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n const user = await this.userService.findById(authRequest.user.id);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n message: 'User not found',\n });\n }\n\n const { password, ...userData } = user;\n success(reply, userData);\n }\n\n async updateProfile(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n const authRequest = request as AuthenticatedRequest;\n const data = validateBody(updateProfileSchema, request.body);\n\n const user = await this.userService.update(authRequest.user.id, data);\n const { password, ...userData } = user;\n success(reply, userData);\n }\n}\n\nexport function createUserController(userService: UserService): UserController {\n return new UserController(userService);\n}\n","import type { FastifyInstance } from 'fastify';\nimport type { UserController } from './user.controller.js';\nimport type { AuthService } from '../auth/auth.service.js';\nimport { createAuthMiddleware, createRoleMiddleware } from '../auth/auth.middleware.js';\nimport { commonResponses, paginationQuery, idParam } from '../swagger/index.js';\n\nconst userTag = 'Users';\nconst userResponse = {\n type: 'object',\n properties: {\n success: { type: 'boolean', example: true },\n data: { type: 'object' },\n },\n};\n\nexport function registerUserRoutes(\n app: FastifyInstance,\n controller: UserController,\n authService: AuthService\n): void {\n const authenticate = createAuthMiddleware(authService);\n const isAdmin = createRoleMiddleware(['admin', 'super_admin']);\n const isModerator = createRoleMiddleware(['moderator', 'admin', 'super_admin']);\n\n // Profile routes (authenticated users)\n app.get(\n '/profile',\n {\n preHandler: [authenticate],\n schema: {\n tags: [userTag],\n summary: 'Get current user profile',\n security: [{ bearerAuth: [] }],\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n },\n },\n },\n controller.getProfile.bind(controller)\n );\n app.patch(\n '/profile',\n {\n preHandler: [authenticate],\n schema: {\n tags: [userTag],\n summary: 'Update current user profile',\n security: [{ bearerAuth: [] }],\n body: { type: 'object' },\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 400: commonResponses.error,\n },\n },\n },\n controller.updateProfile.bind(controller)\n );\n\n // Admin routes\n app.get(\n '/users',\n {\n preHandler: [authenticate, isModerator],\n schema: {\n tags: [userTag],\n summary: 'List users',\n security: [{ bearerAuth: [] }],\n querystring: {\n ...paginationQuery,\n properties: {\n ...paginationQuery.properties,\n status: { type: 'string', enum: ['active', 'inactive', 'suspended', 'banned'] },\n role: { type: 'string', enum: ['user', 'admin', 'moderator', 'super_admin'] },\n search: { type: 'string' },\n emailVerified: { type: 'boolean' },\n },\n },\n response: {\n 200: commonResponses.paginated,\n 401: commonResponses.unauthorized,\n },\n },\n },\n controller.list.bind(controller)\n );\n app.get(\n '/users/:id',\n {\n preHandler: [authenticate, isModerator],\n schema: {\n tags: [userTag],\n summary: 'Get user by id',\n security: [{ bearerAuth: [] }],\n params: idParam,\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.getById.bind(controller)\n );\n app.patch(\n '/users/:id',\n {\n preHandler: [authenticate, isAdmin],\n schema: {\n tags: [userTag],\n summary: 'Update user',\n security: [{ bearerAuth: [] }],\n params: idParam,\n body: { type: 'object' },\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.update.bind(controller)\n );\n app.delete(\n '/users/:id',\n {\n preHandler: [authenticate, isAdmin],\n schema: {\n tags: [userTag],\n summary: 'Delete user',\n security: [{ bearerAuth: [] }],\n params: idParam,\n response: {\n 204: { description: 'User deleted' },\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.delete.bind(controller)\n );\n\n // User status management\n app.post(\n '/users/:id/suspend',\n {\n preHandler: [authenticate, isAdmin],\n schema: {\n tags: [userTag],\n summary: 'Suspend user',\n security: [{ bearerAuth: [] }],\n params: idParam,\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.suspend.bind(controller)\n );\n app.post(\n '/users/:id/ban',\n {\n preHandler: [authenticate, isAdmin],\n schema: {\n tags: [userTag],\n summary: 'Ban user',\n security: [{ bearerAuth: [] }],\n params: idParam,\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.ban.bind(controller)\n );\n app.post(\n '/users/:id/activate',\n {\n preHandler: [authenticate, isAdmin],\n schema: {\n tags: [userTag],\n summary: 'Activate user',\n security: [{ bearerAuth: [] }],\n params: idParam,\n response: {\n 200: userResponse,\n 401: commonResponses.unauthorized,\n 404: commonResponses.notFound,\n },\n },\n },\n controller.activate.bind(controller)\n );\n}\n","import type { FastifyInstance } from 'fastify';\nimport { logger } from '../../core/logger.js';\nimport { UserService, createUserService } from './user.service.js';\nimport { UserController, createUserController } from './user.controller.js';\nimport { UserRepository, createUserRepository } from './user.repository.js';\nimport { registerUserRoutes } from './user.routes.js';\nimport type { AuthService } from '../auth/auth.service.js';\n\nexport async function registerUserModule(\n app: FastifyInstance,\n authService: AuthService\n): Promise<void> {\n // Create repository and service\n const repository = createUserRepository();\n const userService = createUserService(repository);\n\n // Create controller\n const userController = createUserController(userService);\n\n // Register routes\n registerUserRoutes(app, userController, authService);\n\n logger.info('User module registered');\n}\n\nexport { UserService, createUserService } from './user.service.js';\nexport { UserController, createUserController } from './user.controller.js';\nexport { UserRepository, createUserRepository } from './user.repository.js';\nexport * from './types.js';\nexport * from './schemas.js';\n","import { Command } from 'commander';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { ensureDir, writeFile, fileExists, success, error, info, warn, getModulesDir, getSourceDir } from '../utils/helpers.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: ['auth.service', 'auth.controller', 'auth.routes', 'auth.middleware', 'auth.schemas', 'auth.types', 'index'],\n },\n users: {\n name: 'User Management',\n description: 'User CRUD with RBAC (roles & permissions)',\n files: ['user.service', 'user.controller', 'user.repository', 'user.routes', 'user.schemas', 'user.types', 'index'],\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 upload: {\n name: 'File Upload',\n description: 'File upload with local/S3 storage',\n files: ['upload.service', 'upload.controller', 'upload.routes', 'upload.types', 'index'],\n },\n cache: {\n name: 'Redis Cache',\n description: 'Redis caching service',\n files: ['cache.service', 'cache.types', 'index'],\n },\n notifications: {\n name: 'Notifications',\n description: 'In-app and push notifications',\n files: ['notification.service', 'notification.types', 'index'],\n },\n settings: {\n name: 'Settings',\n description: 'Application settings management',\n files: ['settings.service', 'settings.controller', 'settings.routes', 'settings.types', 'index'],\n },\n};\n\nexport const addModuleCommand = new Command('add')\n .description('Add a pre-built module to your project')\n .argument('[module]', 'Module to add (auth, users, email, audit, upload, cache, notifications, settings)')\n .option('-l, --list', 'List available modules')\n .action(async (moduleName?: string, options?: { list?: boolean }) => {\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\n // Check if module already exists\n if (await fileExists(moduleDir)) {\n spinner.stop();\n warn(`Module \"${moduleName}\" already exists`);\n return;\n }\n\n await ensureDir(moduleDir);\n\n // Generate module files based on type\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 spinner.succeed(`${module.name} module added successfully!`);\n\n console.log('\\n📁 Files created:');\n module.files.forEach((f) => success(` src/modules/${moduleName}/${f}.ts`));\n\n console.log('\\n📌 Next steps:');\n info(' 1. Register the module in your main app file');\n info(' 2. Configure any required environment variables');\n info(' 3. Run database migrations if needed');\n\n } catch (err) {\n spinner.fail('Failed to add module');\n error(err instanceof Error ? err.message : String(err));\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","import { Command } from 'commander';\nimport { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { success, error, info } from '../utils/helpers.js';\n\nexport const dbCommand = new Command('db')\n .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 (err) {\n error('Failed to get migration status');\n }\n });\n","import { Command } from 'commander';\nimport { generateDocs } from '../utils/docs-generator.js';\nimport { success, error } from '../utils/helpers.js';\n\nexport const docsCommand = new Command('docs')\n .description('Generate Swagger/OpenAPI documentation')\n .option('-o, --output <path>', 'Output file path', 'openapi.json')\n .action(async (options) => {\n try {\n const outputPath = await generateDocs(options.output);\n success(`Documentation written to ${outputPath}`);\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n });\n"],"mappings":"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","names":["Command","path","fs","chalk","chalk","path","fs","env","Command","path","ora","inquirer","fs","path","ora","config","defaultConfig","config","error","error","error","defaultConfig","error","z","success","z","error","path","z","success","z","success","ora","path","fs","error","Command","ora","path","inquirer","Command","path","ora","chalk","Command","chalk","ora","path","Command","execSync","ora","chalk","Command","ora","execSync","chalk","Command","Command","Command"]}
|