nest-authme 1.2.3 → 1.3.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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/analyzer/orm-detector.ts","../src/analyzer/project-detector.ts","../src/analyzer/index.ts","../src/config/utils.ts","../src/cli/prompts.ts","../src/generator/template-engine.ts","../src/generator/file-writer.ts","../src/config/config-builder.ts","../src/generator/generator.ts","../src/installer/ast-updater.ts","../src/installer/main-ts-updater.ts","../src/installer/package-updater.ts","../src/installer/dependency-installer.ts","../src/installer/index.ts","../src/gui/orchestrator.ts","../src/gui/server.ts","../src/gui/index.ts","../src/cli/ui.ts","../src/generator/index.ts","../src/index.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\r\n * ORM detector - detects TypeORM, Prisma, or Mongoose\r\n */\r\n\r\nimport { ORM } from '../types/index.js';\r\nimport type { PackageJson } from '../types/index.js';\r\n\r\n/**\r\n * Detect which ORM is being used in the project\r\n */\r\nexport async function detectORM(packageJson: PackageJson): Promise<ORM> {\r\n const dependencies = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Check for TypeORM\r\n if (dependencies['@nestjs/typeorm'] || dependencies['typeorm']) {\r\n return 'typeorm';\r\n }\r\n\r\n // Check for Prisma\r\n if (dependencies['@prisma/client'] || dependencies['prisma']) {\r\n return 'prisma';\r\n }\r\n\r\n // Check for Mongoose\r\n if (dependencies['@nestjs/mongoose'] || dependencies['mongoose']) {\r\n return 'mongoose';\r\n }\r\n\r\n return 'none';\r\n}\r\n\r\n/**\r\n * Detect database type from ORM dependencies\r\n */\r\nexport function detectDatabase(packageJson: PackageJson, orm: ORM): string | undefined {\r\n const dependencies = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (orm === 'typeorm') {\r\n if (dependencies['pg']) return 'postgres';\r\n if (dependencies['mysql2'] || dependencies['mysql']) return 'mysql';\r\n if (dependencies['sqlite3']) return 'sqlite';\r\n if (dependencies['mongodb']) return 'mongodb';\r\n }\r\n\r\n if (orm === 'prisma') {\r\n // Would need to read schema.prisma to determine database\r\n return undefined;\r\n }\r\n\r\n if (orm === 'mongoose') {\r\n return 'mongodb';\r\n }\r\n\r\n return undefined;\r\n}\r\n","/**\r\n * Project detector - validates NestJS projects and analyzes structure\r\n */\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { ProjectInfo, PackageJson, NestCliConfig } from '../types/index.js';\r\nimport { detectORM, detectDatabase } from './orm-detector.js';\r\n\r\nexport class ProjectDetector {\r\n constructor(private cwd: string) {}\r\n\r\n /**\r\n * Detect and validate a NestJS project\r\n */\r\n async detectProject(): Promise<ProjectInfo> {\r\n const errors: string[] = [];\r\n const root = this.cwd;\r\n\r\n // Check package.json\r\n const packageJsonPath = path.join(root, 'package.json');\r\n if (!await fs.pathExists(packageJsonPath)) {\r\n errors.push('package.json not found');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n const packageJson = await this.readPackageJson(packageJsonPath);\r\n if (!packageJson) {\r\n errors.push('Failed to read package.json');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Validate NestJS project\r\n const hasNestCore = packageJson.dependencies?.['@nestjs/core'];\r\n const hasNestCommon = packageJson.dependencies?.['@nestjs/common'];\r\n\r\n if (!hasNestCore || !hasNestCommon) {\r\n errors.push('Not a NestJS project (missing @nestjs/core or @nestjs/common)');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Read nest-cli.json for source root\r\n const nestCliConfigPath = path.join(root, 'nest-cli.json');\r\n const nestCliConfig = await this.readNestCliConfig(nestCliConfigPath);\r\n const sourceRoot = nestCliConfig?.sourceRoot || 'src';\r\n\r\n // Check app.module.ts\r\n const appModulePath = path.join(root, sourceRoot, 'app.module.ts');\r\n if (!await fs.pathExists(appModulePath)) {\r\n errors.push(`app.module.ts not found at ${sourceRoot}/app.module.ts`);\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Check main.ts\r\n const mainTsPath = path.join(root, sourceRoot, 'main.ts');\r\n\r\n // Detect ORM and database\r\n const orm = await detectORM(packageJson);\r\n const database = detectDatabase(packageJson, orm);\r\n\r\n // Check if auth module already exists\r\n const authModulePath = path.join(root, sourceRoot, 'auth');\r\n const authExists = await fs.pathExists(authModulePath);\r\n\r\n return {\r\n authExists,\r\n root,\r\n sourceRoot,\r\n appModulePath,\r\n mainTsPath,\r\n packageJsonPath,\r\n nestCliConfigPath,\r\n orm,\r\n database,\r\n nestVersion: packageJson.dependencies?.['@nestjs/core'],\r\n typescriptVersion: packageJson.devDependencies?.['typescript'],\r\n isValid: errors.length === 0,\r\n errors,\r\n };\r\n }\r\n\r\n /**\r\n * Read and parse package.json\r\n */\r\n private async readPackageJson(packageJsonPath: string): Promise<PackageJson | null> {\r\n try {\r\n const content = await fs.readFile(packageJsonPath, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Read and parse nest-cli.json\r\n */\r\n private async readNestCliConfig(nestCliConfigPath: string): Promise<NestCliConfig | null> {\r\n try {\r\n if (!await fs.pathExists(nestCliConfigPath)) {\r\n return null;\r\n }\r\n const content = await fs.readFile(nestCliConfigPath, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Create invalid project info object\r\n */\r\n private createInvalidProject(root: string, errors: string[]): ProjectInfo {\r\n return {\r\n root,\r\n sourceRoot: 'src',\r\n appModulePath: path.join(root, 'src', 'app.module.ts'),\r\n mainTsPath: path.join(root, 'src', 'main.ts'),\r\n packageJsonPath: path.join(root, 'package.json'),\r\n nestCliConfigPath: path.join(root, 'nest-cli.json'),\r\n orm: 'none',\r\n isValid: false,\r\n errors,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Detect project in current working directory\r\n */\r\nexport async function detectProject(cwd: string = process.cwd()): Promise<ProjectInfo> {\r\n const detector = new ProjectDetector(cwd);\r\n return detector.detectProject();\r\n}\r\n","/**\r\n * Export analyzer modules\r\n */\r\n\r\nexport * from './project-detector.js';\r\nexport * from './orm-detector.js';\r\n","/**\r\n * Configuration utilities\r\n */\r\n\r\nimport { randomBytes } from 'crypto';\r\n\r\n/**\r\n * Generate a cryptographically secure random secret\r\n */\r\nexport function generateSecret(length: number = 32): string {\r\n return randomBytes(length).toString('base64');\r\n}\r\n","/**\r\n * CLI prompts using Inquirer\r\n */\r\n\r\nimport inquirer from 'inquirer';\r\nimport { AuthConfig, ORM, Database } from '../types/index.js';\r\nimport { generateSecret } from '../config/utils.js';\r\n\r\nexport interface PromptAnswers {\r\n strategy: 'jwt';\r\n enableRBAC: boolean;\r\n roles: string[];\r\n refreshTokens: boolean;\r\n accessExpiration: string;\r\n refreshExpiration: string;\r\n enableRateLimiting: boolean;\r\n enableSwagger: boolean;\r\n generateTests: boolean;\r\n useUsername: boolean;\r\n enableEmailVerification: boolean;\r\n enableResetPassword: boolean;\r\n enableAccountLockout: boolean;\r\n enableEmailService: boolean;\r\n enableOAuth: boolean;\r\n oauthProviders: string[];\r\n useDetectedORM: boolean;\r\n database: string;\r\n autoInstall: boolean;\r\n}\r\n\r\n/**\r\n * Ask all configuration questions\r\n */\r\nexport async function promptConfig(detectedORM: ORM, detectedDB?: string): Promise<PromptAnswers> {\r\n const dbLabel = detectedDB\r\n ? ` with ${detectedDB.charAt(0).toUpperCase() + detectedDB.slice(1)}`\r\n : '';\r\n\r\n const answers = await inquirer.prompt([\r\n {\r\n type: 'list',\r\n name: 'strategy',\r\n message: 'Choose authentication strategy:',\r\n choices: [\r\n { name: 'JWT Authentication (Recommended)', value: 'jwt' },\r\n { name: 'OAuth 2.0 (Google, GitHub) [Coming soon]', value: 'oauth', disabled: true },\r\n { name: 'Session-based (Traditional) [Coming soon]', value: 'session', disabled: true },\r\n ],\r\n default: 'jwt',\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableRBAC',\r\n message: 'Enable Role-Based Access Control (RBAC)?',\r\n default: true,\r\n },\r\n {\r\n type: 'checkbox',\r\n name: 'roles',\r\n message: 'Select default roles:',\r\n choices: [\r\n { name: 'Admin', value: 'Admin', checked: true },\r\n { name: 'User', value: 'User', checked: true },\r\n { name: 'Moderator', value: 'Moderator', checked: false },\r\n { name: 'Guest', value: 'Guest', checked: false },\r\n ],\r\n when: (answers: any) => answers.enableRBAC,\r\n validate: (input: string[]) => {\r\n if (input.length === 0) {\r\n return 'Please select at least one role';\r\n }\r\n return true;\r\n },\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'refreshTokens',\r\n message: 'Enable Refresh Token rotation?',\r\n default: true,\r\n },\r\n {\r\n type: 'list',\r\n name: 'accessExpiration',\r\n message: 'JWT Access Token expiration:',\r\n choices: [\r\n { name: '15 minutes', value: '15m' },\r\n { name: '30 minutes', value: '30m' },\r\n { name: '1 hour (Recommended)', value: '1h' },\r\n { name: '4 hours', value: '4h' },\r\n { name: '1 day', value: '1d' },\r\n ],\r\n default: '1h',\r\n },\r\n {\r\n type: 'list',\r\n name: 'refreshExpiration',\r\n message: 'JWT Refresh Token expiration:',\r\n choices: [\r\n { name: '7 days (Recommended)', value: '7d' },\r\n { name: '30 days', value: '30d' },\r\n { name: '90 days', value: '90d' },\r\n { name: '1 year', value: '1y' },\r\n ],\r\n default: '7d',\r\n when: (answers: any) => answers.refreshTokens,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableRateLimiting',\r\n message: 'Enable rate limiting on auth endpoints? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableSwagger',\r\n message: 'Enable Swagger API documentation? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'generateTests',\r\n message: 'Generate unit tests? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'useUsername',\r\n message: 'Add username field to user?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableEmailVerification',\r\n message: 'Enable email verification?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableResetPassword',\r\n message: 'Enable forgot/reset password?',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableAccountLockout',\r\n message: 'Enable account lockout after failed login attempts?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableEmailService',\r\n message: 'Enable email service (Nodemailer) for sending emails?',\r\n default: false,\r\n when: (answers: any) => answers.enableEmailVerification || answers.enableResetPassword,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableOAuth',\r\n message: 'Enable OAuth2 social login (Google, GitHub)?',\r\n default: false,\r\n },\r\n {\r\n type: 'checkbox',\r\n name: 'oauthProviders',\r\n message: 'Select OAuth providers:',\r\n choices: [\r\n { name: 'Google', value: 'google', checked: true },\r\n { name: 'GitHub', value: 'github', checked: true },\r\n ],\r\n when: (answers: any) => answers.enableOAuth,\r\n validate: (input: string[]) => {\r\n if (input.length === 0) {\r\n return 'Please select at least one provider';\r\n }\r\n return true;\r\n },\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'useDetectedORM',\r\n message: `Detected ${detectedORM.toUpperCase()}${dbLabel}. Use it?`,\r\n default: true,\r\n when: () => detectedORM !== 'none',\r\n },\r\n {\r\n type: 'list',\r\n name: 'database',\r\n message: 'Select database:',\r\n choices: [\r\n { name: 'PostgreSQL (Recommended)', value: 'postgres' },\r\n { name: 'MySQL', value: 'mysql' },\r\n { name: 'SQLite (for testing)', value: 'sqlite' },\r\n { name: 'MongoDB', value: 'mongodb' },\r\n ],\r\n default: 'postgres',\r\n when: (answers: any) => detectedORM === 'none' || !answers.useDetectedORM,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'autoInstall',\r\n message: 'Auto-install dependencies after generation?',\r\n default: true,\r\n },\r\n ]);\r\n\r\n return answers;\r\n}\r\n\r\n/**\r\n * Get default answers (for --yes flag)\r\n */\r\nexport function getDefaultAnswers(_detectedORM: ORM, detectedDB?: string): PromptAnswers {\r\n return {\r\n strategy: 'jwt',\r\n enableRBAC: true,\r\n roles: ['Admin', 'User'],\r\n refreshTokens: true,\r\n accessExpiration: '1h',\r\n refreshExpiration: '7d',\r\n enableRateLimiting: true,\r\n enableSwagger: true,\r\n generateTests: true,\r\n useUsername: false,\r\n enableEmailVerification: false,\r\n enableResetPassword: true,\r\n enableAccountLockout: false,\r\n enableEmailService: false,\r\n enableOAuth: false,\r\n oauthProviders: [],\r\n useDetectedORM: true,\r\n database: detectedDB || 'postgres',\r\n autoInstall: true,\r\n };\r\n}\r\n\r\n/**\r\n * Build AuthConfig from prompt answers\r\n */\r\nexport function buildConfig(\r\n answers: PromptAnswers,\r\n projectName: string,\r\n sourceRoot: string,\r\n detectedORM: ORM,\r\n detectedDB?: string\r\n): AuthConfig {\r\n const config: AuthConfig = {\r\n projectName,\r\n sourceRoot,\r\n strategy: answers.strategy,\r\n rbac: {\r\n enabled: answers.enableRBAC,\r\n roles: answers.roles || [],\r\n },\r\n orm: answers.useDetectedORM !== false ? detectedORM : 'none',\r\n database: (answers.database || detectedDB || 'postgres') as Database,\r\n features: {\r\n refreshTokens: answers.refreshTokens,\r\n rateLimiting: answers.enableRateLimiting,\r\n swagger: answers.enableSwagger,\r\n unitTests: answers.generateTests,\r\n useUsername: answers.useUsername,\r\n emailVerification: answers.enableEmailVerification,\r\n resetPassword: answers.enableResetPassword,\r\n accountLockout: answers.enableAccountLockout,\r\n emailService: answers.enableEmailService,\r\n },\r\n jwt: {\r\n secret: generateSecret(),\r\n accessExpiration: answers.accessExpiration,\r\n refreshExpiration: answers.refreshExpiration || '7d',\r\n },\r\n oauth: answers.enableOAuth ? {\r\n google: (answers.oauthProviders || []).includes('google'),\r\n github: (answers.oauthProviders || []).includes('github'),\r\n } : undefined,\r\n autoInstall: answers.autoInstall,\r\n timestamp: new Date().toISOString(),\r\n generatorVersion: '1.3.0',\r\n };\r\n\r\n return config;\r\n}\r\n","/**\r\n * Handlebars template engine with helpers\r\n */\r\n\r\nimport Handlebars from 'handlebars';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\n\r\nexport class TemplateEngine {\r\n private handlebars: typeof Handlebars;\r\n private templateCache: Map<string, HandlebarsTemplateDelegate>;\r\n private templatesDir: string;\r\n\r\n constructor(templatesDir?: string) {\r\n this.handlebars = Handlebars.create();\r\n this.templateCache = new Map();\r\n this.templatesDir = templatesDir || path.join(__dirname, 'generator', 'templates');\r\n this.registerHelpers();\r\n }\r\n\r\n /**\r\n * Register Handlebars helpers\r\n */\r\n private registerHelpers(): void {\r\n // Conditional helpers\r\n this.handlebars.registerHelper('eq', (a, b) => a === b);\r\n this.handlebars.registerHelper('ne', (a, b) => a !== b);\r\n this.handlebars.registerHelper('or', (a, b) => a || b);\r\n this.handlebars.registerHelper('and', (a, b) => a && b);\r\n this.handlebars.registerHelper('includes', (arr, item) => arr?.includes(item));\r\n\r\n // String transformation helpers\r\n this.handlebars.registerHelper('capitalize', (str: string) => {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n });\r\n\r\n this.handlebars.registerHelper('lowercase', (str: string) => {\r\n if (!str) return '';\r\n return str.toLowerCase();\r\n });\r\n\r\n this.handlebars.registerHelper('uppercase', (str: string) => {\r\n if (!str) return '';\r\n return str.toUpperCase();\r\n });\r\n\r\n this.handlebars.registerHelper('camelCase', (str: string) => {\r\n if (!str) return '';\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n });\r\n\r\n this.handlebars.registerHelper('pascalCase', (str: string) => {\r\n if (!str) return '';\r\n const camel = str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n });\r\n }\r\n\r\n /**\r\n * Render a template with context\r\n */\r\n async render(templatePath: string, context: any): Promise<string> {\r\n const template = await this.loadTemplate(templatePath);\r\n return template(context);\r\n }\r\n\r\n /**\r\n * Load a template (with caching)\r\n */\r\n private async loadTemplate(templatePath: string): Promise<HandlebarsTemplateDelegate> {\r\n if (this.templateCache.has(templatePath)) {\r\n return this.templateCache.get(templatePath)!;\r\n }\r\n\r\n const fullPath = path.join(this.templatesDir, templatePath);\r\n\r\n if (!await fs.pathExists(fullPath)) {\r\n throw new Error(`Template not found: ${templatePath}`);\r\n }\r\n\r\n const source = await fs.readFile(fullPath, 'utf-8');\r\n const compiled = this.handlebars.compile(source);\r\n\r\n this.templateCache.set(templatePath, compiled);\r\n return compiled;\r\n }\r\n\r\n /**\r\n * Clear template cache\r\n */\r\n clearCache(): void {\r\n this.templateCache.clear();\r\n }\r\n}\r\n","/**\r\n * Safe file writer with backup and rollback\r\n */\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\n\r\nexport interface WriteOptions {\r\n overwrite?: boolean;\r\n backup?: boolean;\r\n}\r\n\r\nexport class FileWriter {\r\n private writtenFiles: string[] = [];\r\n private skippedFiles: string[] = [];\r\n private backups: Map<string, string> = new Map();\r\n\r\n /**\r\n * Write a file to disk\r\n */\r\n async writeFile(\r\n filePath: string,\r\n content: string,\r\n options: WriteOptions = {}\r\n ): Promise<void> {\r\n const { overwrite = false, backup = true } = options;\r\n\r\n // Check if file exists\r\n const exists = await fs.pathExists(filePath);\r\n if (exists && !overwrite) {\r\n this.skippedFiles.push(filePath);\r\n return; // Skip existing files instead of crashing\r\n }\r\n\r\n // Create backup if file exists\r\n if (exists && backup) {\r\n await this.createBackup(filePath);\r\n }\r\n\r\n // Ensure directory exists\r\n await fs.ensureDir(path.dirname(filePath));\r\n\r\n // Write file\r\n await fs.writeFile(filePath, content, 'utf-8');\r\n\r\n // Track written file\r\n this.writtenFiles.push(filePath);\r\n }\r\n\r\n /**\r\n * Create a backup of an existing file\r\n */\r\n private async createBackup(filePath: string): Promise<void> {\r\n const backupPath = `${filePath}.backup`;\r\n await fs.copy(filePath, backupPath);\r\n this.backups.set(filePath, backupPath);\r\n }\r\n\r\n /**\r\n * Rollback all written files\r\n */\r\n async rollback(): Promise<void> {\r\n // Restore backups\r\n for (const [originalPath, backupPath] of this.backups) {\r\n if (await fs.pathExists(backupPath)) {\r\n await fs.copy(backupPath, originalPath, { overwrite: true });\r\n await fs.remove(backupPath);\r\n }\r\n }\r\n\r\n // Remove newly created files\r\n for (const filePath of this.writtenFiles) {\r\n if (!this.backups.has(filePath) && await fs.pathExists(filePath)) {\r\n await fs.remove(filePath);\r\n }\r\n }\r\n\r\n this.writtenFiles = [];\r\n this.backups.clear();\r\n }\r\n\r\n /**\r\n * Clean up backups\r\n */\r\n async cleanupBackups(): Promise<void> {\r\n for (const backupPath of this.backups.values()) {\r\n if (await fs.pathExists(backupPath)) {\r\n await fs.remove(backupPath);\r\n }\r\n }\r\n this.backups.clear();\r\n }\r\n\r\n /**\r\n * Get list of written files\r\n */\r\n getWrittenFiles(): string[] {\r\n return [...this.writtenFiles];\r\n }\r\n\r\n /**\r\n * Get list of skipped files (already existed)\r\n */\r\n getSkippedFiles(): string[] {\r\n return [...this.skippedFiles];\r\n }\r\n}\r\n","/**\r\n * Build template context from configuration\r\n */\r\n\r\nimport { AuthConfig, TemplateContext } from '../types/index.js';\r\n\r\n/**\r\n * Build template context for rendering\r\n */\r\nexport function buildTemplateContext(config: AuthConfig): TemplateContext {\r\n return {\r\n ...config,\r\n // Add any additional computed properties here\r\n };\r\n}\r\n","/**\r\n * Main code generator orchestrator\r\n */\r\n\r\nimport * as path from 'path';\r\nimport { AuthConfig, ProjectInfo } from '../types/index.js';\r\nimport { TemplateEngine } from './template-engine.js';\r\nimport { FileWriter } from './file-writer.js';\r\nimport { buildTemplateContext } from '../config/config-builder.js';\r\n\r\nexport interface GenerationResult {\r\n filesCreated: string[];\r\n filesSkipped: string[];\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\nexport interface FileSpec {\r\n template: string;\r\n output: string;\r\n condition?: (config: AuthConfig) => boolean;\r\n}\r\n\r\nexport class Generator {\r\n private templateEngine: TemplateEngine;\r\n private fileWriter: FileWriter;\r\n\r\n constructor() {\r\n this.templateEngine = new TemplateEngine();\r\n this.fileWriter = new FileWriter();\r\n }\r\n\r\n /**\r\n * Generate all authentication files\r\n */\r\n async generate(\r\n config: AuthConfig,\r\n projectInfo: ProjectInfo,\r\n overwrite: boolean = false\r\n ): Promise<GenerationResult> {\r\n try {\r\n const context = buildTemplateContext(config);\r\n const plan = this.buildGenerationPlan(config);\r\n\r\n // Generate all files\r\n for (const fileSpec of plan) {\r\n // Check condition\r\n if (fileSpec.condition && !fileSpec.condition(config)) {\r\n continue;\r\n }\r\n\r\n // Render template\r\n const content = await this.templateEngine.render(\r\n fileSpec.template,\r\n context\r\n );\r\n\r\n // Write file\r\n const outputPath = path.join(projectInfo.root, fileSpec.output);\r\n await this.fileWriter.writeFile(outputPath, content, {\r\n overwrite,\r\n });\r\n }\r\n\r\n // Get list of created and skipped files\r\n const filesCreated = this.fileWriter.getWrittenFiles();\r\n const filesSkipped = this.fileWriter.getSkippedFiles();\r\n\r\n // Cleanup backups\r\n await this.fileWriter.cleanupBackups();\r\n\r\n return {\r\n filesCreated,\r\n filesSkipped,\r\n success: true,\r\n };\r\n } catch (error) {\r\n // Rollback on error\r\n await this.fileWriter.rollback();\r\n\r\n return {\r\n filesCreated: [],\r\n filesSkipped: [],\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Build file generation plan\r\n */\r\n public buildGenerationPlan(config: AuthConfig): FileSpec[] {\r\n const plan: FileSpec[] = [];\r\n\r\n // Core auth module files\r\n plan.push(\r\n { template: 'jwt/auth.module.ts.hbs', output: `${config.sourceRoot}/auth/auth.module.ts` },\r\n { template: 'jwt/auth.service.ts.hbs', output: `${config.sourceRoot}/auth/auth.service.ts` },\r\n { template: 'jwt/auth.controller.ts.hbs', output: `${config.sourceRoot}/auth/auth.controller.ts` }\r\n );\r\n\r\n // Strategies\r\n plan.push(\r\n { template: 'jwt/jwt.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/jwt.strategy.ts` },\r\n { template: 'jwt/local.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/local.strategy.ts` }\r\n );\r\n\r\n // Guards\r\n plan.push(\r\n { template: 'jwt/jwt-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/jwt-auth.guard.ts` },\r\n { template: 'jwt/local-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/local-auth.guard.ts` }\r\n );\r\n\r\n // OAuth strategies and guards (conditional)\r\n if (config.oauth?.google) {\r\n plan.push(\r\n { template: 'strategies/google.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/google.strategy.ts` },\r\n { template: 'guards/google-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/google-auth.guard.ts` },\r\n );\r\n }\r\n if (config.oauth?.github) {\r\n plan.push(\r\n { template: 'strategies/github.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/github.strategy.ts` },\r\n { template: 'guards/github-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/github-auth.guard.ts` },\r\n );\r\n }\r\n\r\n // RBAC (conditional)\r\n if (config.rbac.enabled) {\r\n plan.push(\r\n { template: 'rbac/roles.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/roles.guard.ts` },\r\n { template: 'rbac/role.enum.ts.hbs', output: `${config.sourceRoot}/auth/enums/role.enum.ts` },\r\n { template: 'decorators/roles.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/roles.decorator.ts` }\r\n );\r\n }\r\n\r\n // Decorators\r\n plan.push(\r\n { template: 'decorators/public.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/public.decorator.ts` },\r\n { template: 'decorators/current-user.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/current-user.decorator.ts` }\r\n );\r\n\r\n // DTOs\r\n plan.push(\r\n { template: 'dto/login.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/login.dto.ts` },\r\n { template: 'dto/register.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/register.dto.ts` },\r\n { template: 'dto/change-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/change-password.dto.ts` },\r\n { template: 'dto/auth-response.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/auth-response.dto.ts` },\r\n { template: 'dto/create-user.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/create-user.dto.ts` }\r\n );\r\n\r\n // Reset password DTOs (conditional)\r\n if (config.features.resetPassword) {\r\n plan.push(\r\n { template: 'dto/forgot-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/forgot-password.dto.ts` },\r\n { template: 'dto/reset-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/reset-password.dto.ts` }\r\n );\r\n }\r\n\r\n // Users module\r\n plan.push(\r\n { template: 'users/users.module.ts.hbs', output: `${config.sourceRoot}/users/users.module.ts` },\r\n { template: 'users/users.service.ts.hbs', output: `${config.sourceRoot}/users/users.service.ts` },\r\n { template: 'users/users.controller.ts.hbs', output: `${config.sourceRoot}/users/users.controller.ts` }\r\n );\r\n\r\n // Entities / ORM-specific files\r\n if (config.orm === 'typeorm') {\r\n plan.push(\r\n { template: 'entities/user.entity.typeorm.hbs', output: `${config.sourceRoot}/users/entities/user.entity.ts` }\r\n );\r\n\r\n if (config.features.refreshTokens) {\r\n plan.push({\r\n template: 'entities/refresh-token.entity.typeorm.hbs',\r\n output: `${config.sourceRoot}/users/entities/refresh-token.entity.ts`,\r\n });\r\n }\r\n } else if (config.orm === 'prisma') {\r\n plan.push(\r\n { template: 'prisma/prisma.service.ts.hbs', output: `${config.sourceRoot}/prisma/prisma.service.ts` },\r\n { template: 'prisma/prisma.module.ts.hbs', output: `${config.sourceRoot}/prisma/prisma.module.ts` },\r\n { template: 'prisma/schema.prisma.additions.hbs', output: 'prisma-schema-additions.prisma' },\r\n );\r\n }\r\n\r\n // Mail module (conditional)\r\n if (config.features.emailService) {\r\n plan.push(\r\n { template: 'mail/mail.module.ts.hbs', output: `${config.sourceRoot}/mail/mail.module.ts` },\r\n { template: 'mail/mail.service.ts.hbs', output: `${config.sourceRoot}/mail/mail.service.ts` },\r\n );\r\n }\r\n\r\n // Unit tests (conditional)\r\n if (config.features.unitTests) {\r\n plan.push(\r\n { template: 'tests/auth.service.spec.ts.hbs', output: `${config.sourceRoot}/auth/auth.service.spec.ts` },\r\n { template: 'tests/auth.controller.spec.ts.hbs', output: `${config.sourceRoot}/auth/auth.controller.spec.ts` },\r\n );\r\n }\r\n\r\n // Configuration files\r\n plan.push(\r\n { template: 'shared/env.template.hbs', output: '.env.example' },\r\n { template: 'shared/env.hbs', output: '.env' },\r\n { template: 'shared/README.auth.md.hbs', output: `${config.sourceRoot}/auth/README.md` },\r\n { template: 'shared/main.ts.snippet.hbs', output: 'main.ts.example' }\r\n );\r\n\r\n return plan;\r\n }\r\n}\r\n","/**\r\n * AST-based app.module.ts updater using ts-morph\r\n */\r\n\r\nimport { Project, SourceFile, Node, IndentationText } from 'ts-morph';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport class AppModuleUpdater {\r\n private project: Project;\r\n private sourceFile: SourceFile | undefined;\r\n private backupPath: string | null = null;\r\n\r\n constructor(private appModulePath: string) {\r\n this.project = new Project({\r\n skipAddingFilesFromTsConfig: true,\r\n manipulationSettings: {\r\n indentationText: IndentationText.TwoSpaces,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update app.module.ts with auth modules\r\n */\r\n async update(config?: AuthConfig): Promise<void> {\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Load source file\r\n this.sourceFile = this.project.addSourceFileAtPath(this.appModulePath);\r\n\r\n // Add imports\r\n this.addImports(config);\r\n\r\n // Add modules to @Module decorator\r\n this.addModulesToDecorator(config);\r\n\r\n // Format and save\r\n this.sourceFile.formatText();\r\n await this.sourceFile.save();\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Add necessary imports\r\n */\r\n private addImports(config?: AuthConfig): void {\r\n if (!this.sourceFile) {\r\n throw new Error('Source file not loaded');\r\n }\r\n\r\n // Add ConfigModule import\r\n this.addImport('@nestjs/config', ['ConfigModule']);\r\n\r\n // Add ORM-specific imports\r\n if (config && config.orm === 'typeorm') {\r\n this.addImport('@nestjs/typeorm', ['TypeOrmModule']);\r\n this.addImport('./users/entities/user.entity', ['User']);\r\n\r\n if (config.features.refreshTokens) {\r\n this.addImport('./users/entities/refresh-token.entity', ['RefreshToken']);\r\n }\r\n } else if (config && config.orm === 'prisma') {\r\n this.addImport('./prisma/prisma.module', ['PrismaModule']);\r\n }\r\n\r\n // Add MailModule import (if email service enabled)\r\n if (config && config.features.emailService) {\r\n this.addImport('./mail/mail.module', ['MailModule']);\r\n }\r\n\r\n // Add AuthModule import\r\n this.addImport('./auth/auth.module', ['AuthModule']);\r\n\r\n // Add UsersModule import\r\n this.addImport('./users/users.module', ['UsersModule']);\r\n }\r\n\r\n /**\r\n * Add an import statement if it doesn't exist\r\n */\r\n private addImport(moduleSpecifier: string, namedImports: string[]): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Check if import already exists\r\n const existingImport = this.sourceFile\r\n .getImportDeclarations()\r\n .find((imp) => imp.getModuleSpecifierValue() === moduleSpecifier);\r\n\r\n if (existingImport) {\r\n // Add missing named imports\r\n const existingNames = existingImport\r\n .getNamedImports()\r\n .map((ni) => ni.getName());\r\n\r\n const missingImports = namedImports.filter(\r\n (name) => !existingNames.includes(name)\r\n );\r\n\r\n if (missingImports.length > 0) {\r\n existingImport.addNamedImports(missingImports);\r\n }\r\n } else {\r\n // Add new import declaration\r\n this.sourceFile.addImportDeclaration({\r\n moduleSpecifier,\r\n namedImports,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add modules to @Module decorator imports array\r\n */\r\n private addModulesToDecorator(config?: AuthConfig): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Find AppModule class\r\n const appModuleClass = this.sourceFile.getClass('AppModule');\r\n if (!appModuleClass) {\r\n throw new Error('AppModule class not found');\r\n }\r\n\r\n // Find @Module decorator\r\n const moduleDecorator = appModuleClass.getDecorator('Module');\r\n if (!moduleDecorator) {\r\n throw new Error('@Module decorator not found');\r\n }\r\n\r\n // Get decorator arguments\r\n const decoratorArgs = moduleDecorator.getArguments()[0];\r\n if (!decoratorArgs || !Node.isObjectLiteralExpression(decoratorArgs)) {\r\n throw new Error('Invalid @Module decorator structure');\r\n }\r\n\r\n // Get or create imports property\r\n let importsProperty = decoratorArgs.getProperty('imports');\r\n\r\n if (!importsProperty) {\r\n // Create imports property if it doesn't exist\r\n decoratorArgs.addPropertyAssignment({\r\n name: 'imports',\r\n initializer: '[]',\r\n });\r\n importsProperty = decoratorArgs.getProperty('imports');\r\n }\r\n\r\n if (!importsProperty || !Node.isPropertyAssignment(importsProperty)) {\r\n throw new Error('Invalid imports property');\r\n }\r\n\r\n const importsArray = importsProperty.getInitializer();\r\n if (!Node.isArrayLiteralExpression(importsArray)) {\r\n throw new Error('imports is not an array');\r\n }\r\n\r\n // Get existing module names and their text\r\n const existingModules = this.getExistingModuleNames(importsArray);\r\n const existingElements = importsArray.getElements().map(e => e.getText());\r\n\r\n // Build a list of all elements (existing + new)\r\n const allElements: string[] = [...existingElements];\r\n\r\n // Add ConfigModule.forRoot() if not exists\r\n if (!existingModules.has('ConfigModule')) {\r\n allElements.push('ConfigModule.forRoot({ isGlobal: true })');\r\n }\r\n\r\n // Add ORM module if not already present\r\n if (config && config.orm === 'typeorm' && !existingModules.has('TypeOrmModule')) {\r\n const entities = config.features.refreshTokens\r\n ? '[User, RefreshToken]'\r\n : '[User]';\r\n\r\n allElements.push(this.buildTypeOrmConfig(config.database, entities));\r\n } else if (config && config.orm === 'prisma' && !existingModules.has('PrismaModule')) {\r\n allElements.push('PrismaModule');\r\n }\r\n\r\n // Add MailModule if not exists (email service)\r\n if (config && config.features.emailService && !existingModules.has('MailModule')) {\r\n allElements.push('MailModule');\r\n }\r\n\r\n // Add AuthModule if not exists\r\n if (!existingModules.has('AuthModule')) {\r\n allElements.push('AuthModule');\r\n }\r\n\r\n // Add UsersModule if not exists\r\n if (!existingModules.has('UsersModule')) {\r\n allElements.push('UsersModule');\r\n }\r\n\r\n // Build multi-line array string with each element on its own line\r\n const indent = ' '; // 4 spaces for array elements inside @Module({})\r\n const formattedElements = allElements.map(el => `${indent}${el}`).join(',\\n');\r\n const multiLineArray = `[\\n${formattedElements},\\n ]`;\r\n\r\n // Replace the entire initializer with the formatted multi-line version\r\n importsProperty.setInitializer(multiLineArray);\r\n }\r\n\r\n /**\r\n * Build TypeORM.forRoot() configuration string based on database type\r\n */\r\n private buildTypeOrmConfig(database: string, entities: string): string {\r\n switch (database) {\r\n case 'sqlite':\r\n return `TypeOrmModule.forRoot({\\n type: 'sqlite',\\n database: 'database.sqlite',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n case 'mysql':\r\n return `TypeOrmModule.forRoot({\\n type: 'mysql',\\n host: process.env.DATABASE_HOST || 'localhost',\\n port: parseInt(process.env.DATABASE_PORT || '3306'),\\n username: process.env.DATABASE_USER || 'root',\\n password: process.env.DATABASE_PASSWORD || '',\\n database: process.env.DATABASE_NAME || 'auth_db',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n case 'postgres':\r\n default:\r\n return `TypeOrmModule.forRoot({\\n type: 'postgres',\\n host: process.env.DATABASE_HOST || 'localhost',\\n port: parseInt(process.env.DATABASE_PORT || '5432'),\\n username: process.env.DATABASE_USER || 'postgres',\\n password: process.env.DATABASE_PASSWORD || 'postgres',\\n database: process.env.DATABASE_NAME || 'auth_db',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n }\r\n }\r\n\r\n /**\r\n * Get existing module names from imports array\r\n */\r\n private getExistingModuleNames(importsArray: Node): Set<string> {\r\n const moduleNames = new Set<string>();\r\n\r\n if (!Node.isArrayLiteralExpression(importsArray)) {\r\n return moduleNames;\r\n }\r\n\r\n for (const element of importsArray.getElements()) {\r\n const text = element.getText();\r\n\r\n // Extract module name (handle both \"ModuleName\" and \"ModuleName.forRoot(...)\")\r\n const match = text.match(/^(\\w+)/);\r\n if (match) {\r\n moduleNames.add(match[1]);\r\n }\r\n }\r\n\r\n return moduleNames;\r\n }\r\n\r\n /**\r\n * Create backup of app.module.ts\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.appModulePath}.backup`;\r\n await fs.copy(this.appModulePath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.appModulePath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * AST-based main.ts updater using ts-morph\r\n * Adds Global JWT Guard, ValidationPipe, and optionally Swagger to the NestJS bootstrap function\r\n */\r\n\r\nimport { Project, SourceFile, Node, IndentationText } from 'ts-morph';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport class MainTsUpdater {\r\n private project: Project;\r\n private sourceFile: SourceFile | undefined;\r\n private backupPath: string | null = null;\r\n\r\n constructor(private mainTsPath: string) {\r\n this.project = new Project({\r\n skipAddingFilesFromTsConfig: true,\r\n manipulationSettings: {\r\n indentationText: IndentationText.TwoSpaces,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update main.ts with global guards, validation pipe, and optionally Swagger\r\n */\r\n async update(config?: AuthConfig): Promise<void> {\r\n // Check if main.ts exists\r\n if (!await fs.pathExists(this.mainTsPath)) {\r\n throw new Error(`main.ts not found at ${this.mainTsPath}`);\r\n }\r\n\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Load source file\r\n this.sourceFile = this.project.addSourceFileAtPath(this.mainTsPath);\r\n\r\n // Add imports\r\n this.addImports(config);\r\n\r\n // Add global guards and pipes to bootstrap function\r\n this.addGlobalGuardsAndPipes(config);\r\n\r\n // Format and save\r\n this.sourceFile.formatText();\r\n await this.sourceFile.save();\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Add necessary imports\r\n */\r\n private addImports(config?: AuthConfig): void {\r\n if (!this.sourceFile) {\r\n throw new Error('Source file not loaded');\r\n }\r\n\r\n // Add Reflector to @nestjs/core import\r\n this.addImport('@nestjs/core', ['Reflector']);\r\n\r\n // Add ValidationPipe to @nestjs/common import\r\n this.addImport('@nestjs/common', ['ValidationPipe']);\r\n\r\n // Add JwtAuthGuard import\r\n this.addImport('./auth/guards/jwt-auth.guard', ['JwtAuthGuard']);\r\n\r\n // Add Swagger imports if enabled\r\n if (config?.features?.swagger) {\r\n this.addImport('@nestjs/swagger', ['SwaggerModule', 'DocumentBuilder']);\r\n }\r\n }\r\n\r\n /**\r\n * Add an import statement if it doesn't exist\r\n */\r\n private addImport(moduleSpecifier: string, namedImports: string[]): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Check if import already exists\r\n const existingImport = this.sourceFile\r\n .getImportDeclarations()\r\n .find((imp) => imp.getModuleSpecifierValue() === moduleSpecifier);\r\n\r\n if (existingImport) {\r\n // Add missing named imports\r\n const existingNames = existingImport\r\n .getNamedImports()\r\n .map((ni) => ni.getName());\r\n\r\n const missingImports = namedImports.filter(\r\n (name) => !existingNames.includes(name)\r\n );\r\n\r\n if (missingImports.length > 0) {\r\n existingImport.addNamedImports(missingImports);\r\n }\r\n } else {\r\n // Add new import declaration\r\n this.sourceFile.addImportDeclaration({\r\n moduleSpecifier,\r\n namedImports,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add global guards and validation pipe to bootstrap function\r\n */\r\n private addGlobalGuardsAndPipes(config?: AuthConfig): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Find the bootstrap function\r\n const bootstrapFunc = this.sourceFile.getFunction('bootstrap');\r\n if (!bootstrapFunc) {\r\n throw new Error('bootstrap function not found in main.ts');\r\n }\r\n\r\n const body = bootstrapFunc.getBody();\r\n if (!body || !Node.isBlock(body)) {\r\n throw new Error('bootstrap function has no body');\r\n }\r\n\r\n // Check if global guards are already added\r\n const bodyText = body.getText();\r\n if (bodyText.includes('useGlobalGuards') || bodyText.includes('JwtAuthGuard')) {\r\n return; // Already configured\r\n }\r\n\r\n // Find the app.listen statement to insert before it\r\n const statements = body.getStatements();\r\n let listenIndex = -1;\r\n\r\n for (let i = 0; i < statements.length; i++) {\r\n const text = statements[i].getText();\r\n if (text.includes('.listen(') || text.includes('.listen (')) {\r\n listenIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (listenIndex === -1) {\r\n // If no listen found, insert at the end\r\n listenIndex = statements.length;\r\n }\r\n\r\n // Build the code to insert\r\n const codeLines = [\r\n '',\r\n '// Enable global validation pipe',\r\n 'app.useGlobalPipes(',\r\n ' new ValidationPipe({',\r\n ' whitelist: true,',\r\n ' forbidNonWhitelisted: true,',\r\n ' transform: true,',\r\n ' }),',\r\n ');',\r\n '',\r\n '// Enable global JWT guard (all routes protected by default)',\r\n '// Use @Public() decorator on routes that should be accessible without auth',\r\n 'const reflector = app.get(Reflector);',\r\n 'app.useGlobalGuards(new JwtAuthGuard(reflector));',\r\n ];\r\n\r\n // Add Swagger setup if enabled\r\n if (config?.features?.swagger) {\r\n codeLines.push(\r\n '',\r\n '// Swagger API documentation',\r\n 'const swaggerConfig = new DocumentBuilder()',\r\n \" .setTitle('API Documentation')\",\r\n \" .setDescription('JWT Authentication API')\",\r\n \" .setVersion('1.0')\",\r\n ' .addBearerAuth()',\r\n ' .build();',\r\n 'const document = SwaggerModule.createDocument(app, swaggerConfig);',\r\n \"SwaggerModule.setup('api', app, document);\",\r\n );\r\n }\r\n\r\n codeLines.push('');\r\n\r\n const codeToInsert = codeLines.join('\\n');\r\n\r\n // Insert at the correct position\r\n body.insertStatements(listenIndex, codeToInsert);\r\n }\r\n\r\n /**\r\n * Create backup of main.ts\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.mainTsPath}.backup`;\r\n await fs.copy(this.mainTsPath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.mainTsPath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * Update package.json with new dependencies\r\n */\r\n\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport interface DependencyMap {\r\n dependencies: Record<string, string>;\r\n devDependencies: Record<string, string>;\r\n}\r\n\r\nexport class PackageUpdater {\r\n private backupPath: string | null = null;\r\n\r\n constructor(private packageJsonPath: string) {}\r\n\r\n /**\r\n * Update package.json with auth dependencies\r\n */\r\n async update(config: AuthConfig): Promise<void> {\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Read package.json\r\n const packageJson = await fs.readJSON(this.packageJsonPath);\r\n\r\n // Get dependencies to add\r\n const deps = this.getDependencies(config);\r\n\r\n // Merge dependencies\r\n packageJson.dependencies = {\r\n ...packageJson.dependencies,\r\n ...deps.dependencies,\r\n };\r\n\r\n packageJson.devDependencies = {\r\n ...packageJson.devDependencies,\r\n ...deps.devDependencies,\r\n };\r\n\r\n // Sort dependencies alphabetically\r\n packageJson.dependencies = this.sortObject(packageJson.dependencies);\r\n packageJson.devDependencies = this.sortObject(\r\n packageJson.devDependencies\r\n );\r\n\r\n // Write back with proper formatting\r\n await fs.writeJSON(this.packageJsonPath, packageJson, { spaces: 2 });\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get dependencies based on configuration\r\n */\r\n private getDependencies(config: AuthConfig): DependencyMap {\r\n const dependencies: Record<string, string> = {\r\n '@nestjs/jwt': '^11.0.0',\r\n '@nestjs/passport': '^11.0.0',\r\n '@nestjs/config': '^4.0.0',\r\n passport: '^0.7.0',\r\n 'passport-jwt': '^4.0.1',\r\n 'passport-local': '^1.0.0',\r\n bcrypt: '^5.1.1',\r\n 'class-validator': '^0.14.0',\r\n 'class-transformer': '^0.5.1',\r\n };\r\n\r\n const devDependencies: Record<string, string> = {\r\n '@types/passport-jwt': '^4.0.0',\r\n '@types/passport-local': '^1.0.36',\r\n '@types/bcrypt': '^5.0.2',\r\n };\r\n\r\n // Add TypeORM dependencies if needed\r\n if (config.orm === 'typeorm') {\r\n dependencies['@nestjs/typeorm'] = '^11.0.0';\r\n dependencies['typeorm'] = '^0.3.20';\r\n\r\n // Add database driver\r\n switch (config.database) {\r\n case 'postgres':\r\n dependencies['pg'] = '^8.11.3';\r\n break;\r\n case 'mysql':\r\n dependencies['mysql2'] = '^3.9.1';\r\n break;\r\n case 'sqlite':\r\n dependencies['sqlite3'] = '^5.1.7';\r\n break;\r\n case 'mongodb':\r\n dependencies['mongodb'] = '^6.3.0';\r\n break;\r\n }\r\n }\r\n\r\n // Add Prisma dependencies if needed\r\n if (config.orm === 'prisma') {\r\n dependencies['@prisma/client'] = '^6.0.0';\r\n devDependencies['prisma'] = '^6.0.0';\r\n }\r\n\r\n // Add rate limiting dependency\r\n if (config.features.rateLimiting) {\r\n dependencies['@nestjs/throttler'] = '^6.0.0';\r\n }\r\n\r\n // Add Swagger dependency\r\n if (config.features.swagger) {\r\n dependencies['@nestjs/swagger'] = '^11.0.0';\r\n }\r\n\r\n // Add OAuth dependencies\r\n if (config.oauth?.google) {\r\n dependencies['passport-google-oauth20'] = '^2.0.0';\r\n devDependencies['@types/passport-google-oauth20'] = '^2.0.14';\r\n }\r\n if (config.oauth?.github) {\r\n dependencies['passport-github2'] = '^0.1.12';\r\n devDependencies['@types/passport-github2'] = '^1.2.9';\r\n }\r\n\r\n // Add Nodemailer dependency\r\n if (config.features.emailService) {\r\n dependencies['nodemailer'] = '^6.9.0';\r\n devDependencies['@types/nodemailer'] = '^6.4.0';\r\n }\r\n\r\n return { dependencies, devDependencies };\r\n }\r\n\r\n /**\r\n * Sort object keys alphabetically\r\n */\r\n private sortObject(obj: Record<string, string>): Record<string, string> {\r\n return Object.keys(obj)\r\n .sort()\r\n .reduce((sorted, key) => {\r\n sorted[key] = obj[key];\r\n return sorted;\r\n }, {} as Record<string, string>);\r\n }\r\n\r\n /**\r\n * Create backup\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.packageJsonPath}.backup`;\r\n await fs.copy(this.packageJsonPath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.packageJsonPath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * Install dependencies using detected package manager\r\n */\r\n\r\nimport { execa } from 'execa';\r\nimport { detect } from 'detect-package-manager';\r\n\r\nexport class DependencyInstaller {\r\n /**\r\n * Install dependencies using the detected package manager\r\n */\r\n async install(cwd: string): Promise<void> {\r\n const packageManager = await this.detectPackageManager(cwd);\r\n\r\n console.log(`šŸ“¦ Installing dependencies with ${packageManager}...`);\r\n\r\n try {\r\n await execa(packageManager, ['install'], {\r\n cwd,\r\n stdio: 'inherit',\r\n });\r\n\r\n console.log('āœ… Dependencies installed successfully');\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to install dependencies with ${packageManager}: ${\r\n error instanceof Error ? error.message : 'Unknown error'\r\n }`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Install dependencies, capturing output (for GUI mode)\r\n */\r\n async installCapture(cwd: string): Promise<{ stdout: string; stderr: string }> {\r\n const packageManager = await this.detectPackageManager(cwd);\r\n\r\n try {\r\n const result = await execa(packageManager, ['install'], {\r\n cwd,\r\n stdio: 'pipe',\r\n });\r\n\r\n return { stdout: result.stdout, stderr: result.stderr };\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to install dependencies with ${packageManager}: ${\r\n error instanceof Error ? error.message : 'Unknown error'\r\n }`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Detect which package manager is being used\r\n */\r\n private async detectPackageManager(cwd: string): Promise<string> {\r\n try {\r\n return await detect({ cwd });\r\n } catch (error) {\r\n // Default to npm if detection fails\r\n return 'npm';\r\n }\r\n }\r\n}\r\n","/**\r\n * Export installer modules\r\n */\r\n\r\nexport * from './ast-updater.js';\r\nexport * from './main-ts-updater.js';\r\nexport * from './package-updater.js';\r\nexport * from './dependency-installer.js';\r\n","/**\r\n * GUI orchestrator - event-emitting generation pipeline\r\n */\r\n\r\nimport { EventEmitter } from 'events';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig, ProjectInfo } from '../types/index.js';\r\nimport { Generator } from '../generator/generator.js';\r\nimport { TemplateEngine } from '../generator/template-engine.js';\r\nimport { buildTemplateContext } from '../config/config-builder.js';\r\n\r\nexport interface ProgressEvent {\r\n step: string;\r\n label: string;\r\n status: 'started' | 'completed' | 'failed' | 'warning';\r\n detail?: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface GenerateRequest {\r\n config: AuthConfig;\r\n projectInfo: ProjectInfo;\r\n overwrite: boolean;\r\n}\r\n\r\nexport interface GenerateResult {\r\n success: boolean;\r\n filesCreated: string[];\r\n filesSkipped: string[];\r\n errors: string[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface PreviewFile {\r\n path: string;\r\n content: string;\r\n isNew: boolean;\r\n}\r\n\r\nexport interface PreviewResult {\r\n files: PreviewFile[];\r\n modifiedFiles: Array<{ path: string; description: string }>;\r\n totalFiles: number;\r\n}\r\n\r\nexport class GuiOrchestrator extends EventEmitter {\r\n constructor(_cwd: string) {\r\n super();\r\n }\r\n\r\n private emitProgress(step: string, label: string, status: ProgressEvent['status'], detail?: string): void {\r\n const event: ProgressEvent = { step, label, status, detail, timestamp: Date.now() };\r\n this.emit('progress', event);\r\n }\r\n\r\n /**\r\n * Preview which files would be generated (dry-run)\r\n */\r\n async preview(config: AuthConfig, projectInfo: ProjectInfo): Promise<PreviewResult> {\r\n const generator = new Generator();\r\n const templateEngine = new TemplateEngine();\r\n const context = buildTemplateContext(config);\r\n const plan = generator.buildGenerationPlan(config);\r\n\r\n const files: PreviewFile[] = [];\r\n\r\n for (const spec of plan) {\r\n const content = await templateEngine.render(spec.template, context);\r\n const fullPath = path.join(projectInfo.root, spec.output);\r\n const exists = await fs.pathExists(fullPath);\r\n\r\n files.push({\r\n path: spec.output,\r\n content,\r\n isNew: !exists,\r\n });\r\n }\r\n\r\n const modifiedFiles = [\r\n { path: `${config.sourceRoot}/app.module.ts`, description: 'Add ConfigModule, AuthModule, UsersModule imports' },\r\n { path: `${config.sourceRoot}/main.ts`, description: 'Add global JWT guard, ValidationPipe, Swagger setup' },\r\n { path: 'package.json', description: 'Add authentication dependencies' },\r\n ];\r\n\r\n return {\r\n files,\r\n modifiedFiles,\r\n totalFiles: files.length + modifiedFiles.length,\r\n };\r\n }\r\n\r\n /**\r\n * Run the full generation pipeline\r\n */\r\n async generate(request: GenerateRequest): Promise<GenerateResult> {\r\n const { config, projectInfo, overwrite } = request;\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Step 1: Generate files\r\n this.emitProgress('generate', 'Generating files from templates...', 'started');\r\n const generator = new Generator();\r\n const result = await generator.generate(config, projectInfo, overwrite);\r\n\r\n if (!result.success) {\r\n this.emitProgress('generate', 'File generation failed', 'failed', result.error);\r\n return { success: false, filesCreated: [], filesSkipped: [], errors: [result.error || 'Unknown error'], warnings };\r\n }\r\n this.emitProgress('generate', `Generated ${result.filesCreated.length} files`, 'completed');\r\n\r\n // Step 2: Update app.module.ts\r\n this.emitProgress('ast-app-module', 'Updating app.module.ts...', 'started');\r\n try {\r\n const { AppModuleUpdater } = await import('../installer/index.js');\r\n const astUpdater = new AppModuleUpdater(projectInfo.appModulePath);\r\n await astUpdater.update(config);\r\n await astUpdater.cleanupBackup();\r\n this.emitProgress('ast-app-module', 'Updated app.module.ts', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('ast-app-module', 'Failed to update app.module.ts', 'failed', msg);\r\n errors.push(msg);\r\n return { success: false, filesCreated: result.filesCreated, filesSkipped: result.filesSkipped, errors, warnings };\r\n }\r\n\r\n // Step 3: Update main.ts\r\n this.emitProgress('ast-main-ts', 'Updating main.ts...', 'started');\r\n try {\r\n const { MainTsUpdater } = await import('../installer/index.js');\r\n const mainUpdater = new MainTsUpdater(projectInfo.mainTsPath);\r\n await mainUpdater.update(config);\r\n await mainUpdater.cleanupBackup();\r\n this.emitProgress('ast-main-ts', 'Updated main.ts', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('ast-main-ts', 'Could not auto-update main.ts', 'warning', msg);\r\n warnings.push('Could not auto-update main.ts - see main.ts.example for manual setup');\r\n }\r\n\r\n // Step 4: Update package.json\r\n this.emitProgress('package-json', 'Updating package.json...', 'started');\r\n try {\r\n const { PackageUpdater } = await import('../installer/index.js');\r\n const pkgUpdater = new PackageUpdater(projectInfo.packageJsonPath);\r\n await pkgUpdater.update(config);\r\n await pkgUpdater.cleanupBackup();\r\n this.emitProgress('package-json', 'Updated package.json', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('package-json', 'Failed to update package.json', 'failed', msg);\r\n errors.push(msg);\r\n return { success: false, filesCreated: result.filesCreated, filesSkipped: result.filesSkipped, errors, warnings };\r\n }\r\n\r\n // Step 5: Install dependencies\r\n if (config.autoInstall) {\r\n this.emitProgress('install-deps', 'Installing dependencies...', 'started');\r\n try {\r\n const { DependencyInstaller } = await import('../installer/index.js');\r\n const installer = new DependencyInstaller();\r\n await installer.installCapture(projectInfo.root);\r\n this.emitProgress('install-deps', 'Dependencies installed', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('install-deps', 'Failed to install dependencies', 'warning', msg);\r\n warnings.push('Failed to install dependencies - run npm install manually');\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n filesCreated: result.filesCreated,\r\n filesSkipped: result.filesSkipped,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n}\r\n","/**\r\n * Local HTTP server for GUI mode\r\n */\r\n\r\nimport * as http from 'http';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { AddressInfo } from 'net';\r\nimport { detectProject } from '../analyzer/index.js';\r\nimport { buildConfig } from '../cli/prompts.js';\r\nimport { GuiOrchestrator, ProgressEvent } from './orchestrator.js';\r\n\r\nexport interface GuiServerOptions {\r\n cwd: string;\r\n port?: number;\r\n autoOpen?: boolean;\r\n}\r\n\r\nexport class GuiServer {\r\n private server: http.Server;\r\n private sseClients: Set<http.ServerResponse>;\r\n private orchestrator: GuiOrchestrator;\r\n private options: GuiServerOptions;\r\n private isGenerating: boolean = false;\r\n\r\n constructor(options: GuiServerOptions) {\r\n this.options = options;\r\n this.sseClients = new Set();\r\n this.orchestrator = new GuiOrchestrator(options.cwd);\r\n\r\n // Pipe orchestrator progress events to SSE\r\n this.orchestrator.on('progress', (event: ProgressEvent) => {\r\n this.broadcastEvent('progress', event);\r\n });\r\n\r\n this.server = http.createServer((req, res) => this.handleRequest(req, res));\r\n }\r\n\r\n async start(): Promise<{ port: number; url: string }> {\r\n const port = this.options.port || 0;\r\n\r\n return new Promise((resolve) => {\r\n this.server.listen(port, '127.0.0.1', async () => {\r\n const addr = this.server.address() as AddressInfo;\r\n const url = `http://localhost:${addr.port}`;\r\n\r\n console.log('\\n GUI mode started.');\r\n console.log(` Open in browser: ${url}`);\r\n console.log('\\n Press Ctrl+C to stop the server.\\n');\r\n\r\n if (this.options.autoOpen !== false) {\r\n try {\r\n const open = (await import('open')).default;\r\n await open(url);\r\n } catch {\r\n console.log(' Could not auto-open browser. Please open the URL manually.');\r\n }\r\n }\r\n\r\n resolve({ port: addr.port, url });\r\n });\r\n });\r\n }\r\n\r\n async shutdown(): Promise<void> {\r\n for (const client of this.sseClients) {\r\n client.end();\r\n }\r\n this.sseClients.clear();\r\n\r\n return new Promise((resolve) => {\r\n this.server.close(() => {\r\n console.log('\\n Server stopped.\\n');\r\n resolve();\r\n process.exit(0);\r\n });\r\n\r\n setTimeout(() => {\r\n process.exit(0);\r\n }, 5000);\r\n });\r\n }\r\n\r\n broadcastEvent(event: string, data: unknown): void {\r\n const payload = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\r\n for (const client of this.sseClients) {\r\n try {\r\n client.write(payload);\r\n } catch {\r\n this.sseClients.delete(client);\r\n }\r\n }\r\n }\r\n\r\n private handleRequest(req: http.IncomingMessage, res: http.ServerResponse): void {\r\n const url = new URL(req.url || '/', `http://localhost`);\r\n const pathname = url.pathname;\r\n\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\r\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\r\n\r\n if (req.method === 'OPTIONS') {\r\n res.writeHead(204);\r\n res.end();\r\n return;\r\n }\r\n\r\n if (req.method === 'GET' && pathname === '/') {\r\n return this.handleGetIndex(res);\r\n }\r\n if (req.method === 'GET' && pathname === '/api/project') {\r\n void this.handleGetProject(res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/preview') {\r\n void this.handlePostPreview(req, res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/generate') {\r\n void this.handlePostGenerate(req, res);\r\n return;\r\n }\r\n if (req.method === 'GET' && pathname === '/api/events') {\r\n this.handleGetEvents(req, res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/shutdown') {\r\n this.handlePostShutdown(res);\r\n return;\r\n }\r\n\r\n this.sendJson(res, 404, { error: 'Not found' });\r\n }\r\n\r\n private handleGetIndex(res: http.ServerResponse): void {\r\n // Try multiple locations: __dirname varies depending on how the code is loaded\r\n // - dist/gui/server.js (standalone): __dirname = dist/gui/ → gui.html is in same dir\r\n // - dist/cli.js (bundled by tsup): __dirname = dist/ → gui.html is in gui/ subfolder\r\n const candidates = [\r\n path.join(__dirname, 'gui.html'),\r\n path.join(__dirname, 'gui', 'gui.html'),\r\n path.join(__dirname, '..', 'dist', 'gui', 'gui.html'),\r\n path.join(__dirname, '..', 'src', 'gui', 'gui.html'),\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n try {\r\n const html = fs.readFileSync(candidate, 'utf-8');\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n return;\r\n } catch {\r\n // Try next candidate\r\n }\r\n }\r\n\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end('GUI HTML file not found. Please rebuild with: npm run build');\r\n }\r\n\r\n private async handleGetProject(res: http.ServerResponse): Promise<void> {\r\n try {\r\n const projectInfo = await detectProject(this.options.cwd);\r\n this.sendJson(res, 200, {\r\n isValid: projectInfo.isValid,\r\n errors: projectInfo.errors,\r\n nestVersion: projectInfo.nestVersion,\r\n orm: projectInfo.orm,\r\n database: projectInfo.database,\r\n sourceRoot: projectInfo.sourceRoot,\r\n authExists: projectInfo.authExists,\r\n root: projectInfo.root,\r\n });\r\n } catch (error) {\r\n this.sendJson(res, 500, { error: error instanceof Error ? error.message : 'Detection failed' });\r\n }\r\n }\r\n\r\n private async handlePostPreview(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\r\n try {\r\n const body = await this.parseBody(req) as { answers: any };\r\n const projectInfo = await detectProject(this.options.cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n this.sendJson(res, 400, { error: 'Invalid NestJS project', details: projectInfo.errors });\r\n return;\r\n }\r\n\r\n const config = buildConfig(\r\n body.answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n const preview = await this.orchestrator.preview(config, projectInfo);\r\n this.sendJson(res, 200, preview);\r\n } catch (error) {\r\n this.sendJson(res, 500, { error: error instanceof Error ? error.message : 'Preview failed' });\r\n }\r\n }\r\n\r\n private async handlePostGenerate(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\r\n if (this.isGenerating) {\r\n this.sendJson(res, 409, { error: 'Generation already in progress' });\r\n return;\r\n }\r\n\r\n try {\r\n const body = await this.parseBody(req) as { answers: any; overwrite?: boolean };\r\n const projectInfo = await detectProject(this.options.cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n this.sendJson(res, 400, { error: 'Invalid NestJS project', details: projectInfo.errors });\r\n return;\r\n }\r\n\r\n const config = buildConfig(\r\n body.answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n // Respond immediately\r\n this.sendJson(res, 202, { status: 'started', message: 'Generation in progress. Follow /api/events for updates.' });\r\n\r\n // Run generation asynchronously\r\n this.isGenerating = true;\r\n const result = await this.orchestrator.generate({\r\n config,\r\n projectInfo,\r\n overwrite: body.overwrite || !!projectInfo.authExists,\r\n });\r\n this.isGenerating = false;\r\n\r\n // Broadcast final result\r\n this.broadcastEvent('generation-complete', result);\r\n\r\n // Schedule shutdown after success\r\n if (result.success) {\r\n setTimeout(() => {\r\n this.broadcastEvent('server-shutdown', { message: 'Generation complete. Server shutting down.' });\r\n setTimeout(() => this.shutdown(), 2000);\r\n }, 5000);\r\n }\r\n } catch (error) {\r\n this.isGenerating = false;\r\n this.broadcastEvent('generation-complete', {\r\n success: false,\r\n filesCreated: [],\r\n filesSkipped: [],\r\n errors: [error instanceof Error ? error.message : 'Unknown error'],\r\n warnings: [],\r\n });\r\n }\r\n }\r\n\r\n private handleGetEvents(req: http.IncomingMessage, res: http.ServerResponse): void {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n 'X-Accel-Buffering': 'no',\r\n });\r\n\r\n res.write(`event: connected\\ndata: ${JSON.stringify({ timestamp: Date.now() })}\\n\\n`);\r\n\r\n this.sseClients.add(res);\r\n\r\n const heartbeat = setInterval(() => {\r\n try {\r\n res.write(`: heartbeat\\n\\n`);\r\n } catch {\r\n clearInterval(heartbeat);\r\n this.sseClients.delete(res);\r\n }\r\n }, 15000);\r\n\r\n req.on('close', () => {\r\n this.sseClients.delete(res);\r\n clearInterval(heartbeat);\r\n });\r\n }\r\n\r\n private handlePostShutdown(res: http.ServerResponse): void {\r\n this.sendJson(res, 200, { ok: true });\r\n setTimeout(() => this.shutdown(), 500);\r\n }\r\n\r\n private parseBody(req: http.IncomingMessage): Promise<unknown> {\r\n return new Promise((resolve, reject) => {\r\n const chunks: Buffer[] = [];\r\n let size = 0;\r\n const MAX_SIZE = 1024 * 1024; // 1MB\r\n\r\n req.on('data', (chunk: Buffer) => {\r\n size += chunk.length;\r\n if (size > MAX_SIZE) {\r\n reject(new Error('Request body too large'));\r\n req.destroy();\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on('end', () => {\r\n try {\r\n const body = Buffer.concat(chunks).toString('utf-8');\r\n resolve(body ? JSON.parse(body) : {});\r\n } catch {\r\n reject(new Error('Invalid JSON body'));\r\n }\r\n });\r\n\r\n req.on('error', reject);\r\n });\r\n }\r\n\r\n private sendJson(res: http.ServerResponse, status: number, data: unknown): void {\r\n res.writeHead(status, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(data));\r\n }\r\n}\r\n","export { GuiServer } from './server.js';\r\nexport type { GuiServerOptions } from './server.js';\r\nexport { GuiOrchestrator } from './orchestrator.js';\r\n","/**\r\n * CLI UI utilities - colors, spinners, banners\r\n */\r\n\r\nimport chalk from 'chalk';\r\nimport ora, { Ora } from 'ora';\r\nimport { readFileSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Get version from package.json\r\nfunction getVersion(): string {\r\n try {\r\n const packageJsonPath = join(__dirname, '../package.json');\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\r\n return packageJson.version;\r\n } catch (error) {\r\n return '1.0.0'; // Fallback version\r\n }\r\n}\r\n\r\n/**\r\n * ASCII art banner\r\n */\r\nexport function showBanner(): void {\r\n console.log(chalk.cyan(`\r\n _ _ _ __ __\r\n / \\\\ _ _| |_| |__ | \\\\/ | ___\r\n / _ \\\\| | | | __| '_ \\\\| |\\\\/| |/ _ \\\\\r\n / ___ \\\\ |_| | |_| | | | | | | __/\r\n /_/ \\\\_\\\\__,_|\\\\__|_| |_|_| |_|\\\\___|\r\n `));\r\n console.log(chalk.bold(`šŸ” AuthMe - NestJS Auth Generator v${getVersion()}`));\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show project analysis results\r\n */\r\nexport function showProjectInfo(info: {\r\n nestVersion?: string;\r\n orm: string;\r\n sourceRoot: string;\r\n}) {\r\n console.log(chalk.green('āœ“'), `Detected NestJS ${info.nestVersion || 'project'}`);\r\n if (info.orm !== 'none') {\r\n console.log(chalk.green('āœ“'), `Found ${info.orm.toUpperCase()}`);\r\n }\r\n console.log(chalk.green('āœ“'), `Source directory: ${info.sourceRoot}/`);\r\n console.log(chalk.green('āœ“'), 'No existing auth module found');\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show error message\r\n */\r\nexport function showError(message: string, errors?: string[]): void {\r\n console.log();\r\n console.log(chalk.red('āŒ Error:'), chalk.bold(message));\r\n if (errors && errors.length > 0) {\r\n console.log();\r\n errors.forEach((error) => {\r\n console.log(chalk.red(' •'), error);\r\n });\r\n }\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show help for creating a NestJS project\r\n */\r\nexport function showNestJSHelp(): void {\r\n console.log(chalk.yellow('To create a new NestJS project:'));\r\n console.log();\r\n console.log(chalk.cyan(' npm i -g @nestjs/cli'));\r\n console.log(chalk.cyan(' nest new my-project'));\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show success message\r\n */\r\nexport function showSuccess(stats: {\r\n filesCreated: number;\r\n dependenciesAdded: number;\r\n jwt: { accessExpiration: string; refreshExpiration?: string };\r\n orm?: string;\r\n swagger?: boolean;\r\n emailVerification?: boolean;\r\n resetPassword?: boolean;\r\n}): void {\r\n console.log();\r\n console.log(chalk.green.bold('šŸŽ‰ Success!'), 'Authentication module generated.');\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“ Files created:'));\r\n console.log(` • ${stats.filesCreated} new files in src/auth/ and src/users/`);\r\n console.log(` • Updated src/app.module.ts`);\r\n console.log(` • Updated package.json`);\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“¦ Dependencies added:'));\r\n console.log(` • @nestjs/jwt, @nestjs/passport, @nestjs/config`);\r\n console.log(` • passport, passport-jwt, passport-local`);\r\n console.log(` • bcrypt, class-validator, class-transformer`);\r\n if (stats.orm === 'prisma') {\r\n console.log(` • @prisma/client, prisma`);\r\n }\r\n if (stats.swagger) {\r\n console.log(` • @nestjs/swagger`);\r\n }\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ” JWT Configuration:'));\r\n console.log(` • Access token: ${stats.jwt.accessExpiration}`);\r\n if (stats.jwt.refreshExpiration) {\r\n console.log(` • Refresh token: ${stats.jwt.refreshExpiration}`);\r\n }\r\n console.log(` • Secret: Auto-generated (see .env)`);\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“‹ Next steps:'));\r\n console.log(chalk.cyan(' 1. Review .env file (auto-generated with secure secret)'));\r\n console.log(chalk.gray(' # .env.example is also provided as a git-safe reference'));\r\n console.log();\r\n\r\n if (stats.orm === 'prisma') {\r\n console.log(chalk.cyan(' 2. Add Prisma schema models (see prisma-schema-additions.prisma)'));\r\n console.log(chalk.gray(' # Copy the models into your prisma/schema.prisma'));\r\n console.log(chalk.gray(' npx prisma migrate dev --name add-auth-models'));\r\n console.log(chalk.gray(' npx prisma generate'));\r\n } else {\r\n console.log(chalk.cyan(' 2. Create database migration (if using TypeORM)'));\r\n console.log(chalk.gray(' npm run migration:generate -- src/migrations/CreateUserTable'));\r\n console.log(chalk.gray(' npm run migration:run'));\r\n }\r\n console.log();\r\n console.log(chalk.cyan(' 3. Start your NestJS app'));\r\n console.log(chalk.gray(' npm run start:dev'));\r\n console.log();\r\n console.log(chalk.cyan(' 4. Test authentication endpoints'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/register'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/login'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/change-password (requires JWT)'));\r\n if (stats.emailVerification) {\r\n console.log(chalk.gray(' GET http://localhost:3000/auth/verify-email?token=...'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/resend-verification'));\r\n }\r\n if (stats.resetPassword) {\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/forgot-password'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/reset-password'));\r\n }\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/refresh'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/logout (requires JWT)'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/logout-all (requires JWT)'));\r\n console.log(chalk.gray(' GET http://localhost:3000/users/profile (requires JWT)'));\r\n if (stats.swagger) {\r\n console.log();\r\n console.log(chalk.cyan(' 5. View Swagger API documentation'));\r\n console.log(chalk.gray(' http://localhost:3000/api'));\r\n }\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“– Full documentation:'), 'src/auth/README.md');\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ’” Tips:'));\r\n console.log(' • Use @Public() decorator for routes that don\\'t require auth');\r\n console.log(' • Use @Roles(\\'Admin\\') to restrict routes by role');\r\n console.log(' • Access current user with @CurrentUser() decorator');\r\n if (stats.swagger) {\r\n console.log(' • Visit /api for interactive Swagger documentation');\r\n }\r\n console.log();\r\n}\r\n\r\n/**\r\n * Create a spinner\r\n */\r\nexport function createSpinner(text: string): Ora {\r\n return ora({\r\n text,\r\n color: 'cyan',\r\n });\r\n}\r\n","/**\r\n * Export generator modules\r\n */\r\n\r\nexport * from './generator.js';\r\nexport * from './template-engine.js';\r\nexport * from './file-writer.js';\r\n","/**\r\n * Main CLI orchestrator\r\n */\r\n\r\nimport { detectProject } from './analyzer/index.js';\r\nimport { promptConfig, buildConfig, getDefaultAnswers } from './cli/prompts.js';\r\nimport {\r\n showBanner,\r\n showProjectInfo,\r\n showError,\r\n showNestJSHelp,\r\n showSuccess,\r\n createSpinner,\r\n} from './cli/ui.js';\r\n\r\nexport interface RunOptions {\r\n yes?: boolean;\r\n}\r\n\r\nexport async function run(cwd: string = process.cwd(), options: RunOptions = {}): Promise<void> {\r\n // Show banner\r\n showBanner();\r\n\r\n // Analyze project\r\n const spinner = createSpinner('Analyzing project...').start();\r\n\r\n const projectInfo = await detectProject(cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n spinner.fail('Project validation failed');\r\n showError('Not a valid NestJS project', projectInfo.errors);\r\n showNestJSHelp();\r\n process.exit(1);\r\n }\r\n\r\n spinner.succeed('Project analyzed');\r\n\r\n // Show detected info\r\n showProjectInfo({\r\n nestVersion: projectInfo.nestVersion,\r\n orm: projectInfo.orm,\r\n sourceRoot: projectInfo.sourceRoot,\r\n });\r\n\r\n // Check if auth module already exists\r\n if (projectInfo.authExists) {\r\n if (options.yes) {\r\n console.log('\\n auth/ directory already exists. Use interactive mode to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n const inquirer = (await import('inquirer')).default;\r\n const { overwrite } = await inquirer.prompt([{\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: 'auth/ directory already exists. Overwrite existing files?',\r\n default: false,\r\n }]);\r\n if (!overwrite) {\r\n console.log('\\nā­ļø Cancelled. Existing auth module unchanged.\\n');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Prompt for configuration (or use defaults with --yes)\r\n const answers = options.yes\r\n ? getDefaultAnswers(projectInfo.orm, projectInfo.database)\r\n : await promptConfig(projectInfo.orm, projectInfo.database);\r\n\r\n // Build configuration\r\n const config = buildConfig(\r\n answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n console.log();\r\n console.log('āš™ļø Generating authentication module...');\r\n console.log();\r\n\r\n // Generate files\r\n const { Generator } = await import('./generator/index.js');\r\n const generator = new Generator();\r\n\r\n const genSpinner = createSpinner('Generating files from templates...').start();\r\n\r\n const result = await generator.generate(config, projectInfo, !!projectInfo.authExists);\r\n\r\n if (!result.success) {\r\n genSpinner.fail('Generation failed');\r\n showError('Failed to generate files', [result.error || 'Unknown error']);\r\n process.exit(1);\r\n }\r\n\r\n genSpinner.succeed(`Generated ${result.filesCreated.length} files`);\r\n\r\n if (result.filesSkipped.length > 0) {\r\n console.log(` āš ļø Skipped ${result.filesSkipped.length} existing file(s)`);\r\n }\r\n\r\n // Update app.module.ts with AST\r\n const astSpinner = createSpinner('Updating app.module.ts...').start();\r\n\r\n try {\r\n const { AppModuleUpdater } = await import('./installer/index.js');\r\n const astUpdater = new AppModuleUpdater(projectInfo.appModulePath);\r\n await astUpdater.update(config);\r\n await astUpdater.cleanupBackup();\r\n astSpinner.succeed('Updated app.module.ts');\r\n } catch (error) {\r\n astSpinner.fail('Failed to update app.module.ts');\r\n showError(\r\n 'AST modification failed',\r\n [error instanceof Error ? error.message : 'Unknown error']\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Update main.ts with global guards\r\n const mainSpinner = createSpinner('Updating main.ts with global guards...').start();\r\n\r\n try {\r\n const { MainTsUpdater } = await import('./installer/index.js');\r\n const mainUpdater = new MainTsUpdater(projectInfo.mainTsPath);\r\n await mainUpdater.update(config);\r\n await mainUpdater.cleanupBackup();\r\n mainSpinner.succeed('Updated main.ts with global JWT guard');\r\n } catch (error) {\r\n mainSpinner.warn('Could not auto-update main.ts (see main.ts.example for manual setup)');\r\n }\r\n\r\n // Update package.json\r\n const pkgSpinner = createSpinner('Updating package.json...').start();\r\n\r\n try {\r\n const { PackageUpdater } = await import('./installer/index.js');\r\n const pkgUpdater = new PackageUpdater(projectInfo.packageJsonPath);\r\n await pkgUpdater.update(config);\r\n await pkgUpdater.cleanupBackup();\r\n pkgSpinner.succeed('Updated package.json');\r\n } catch (error) {\r\n pkgSpinner.fail('Failed to update package.json');\r\n showError(\r\n 'Package update failed',\r\n [error instanceof Error ? error.message : 'Unknown error']\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Install dependencies\r\n if (config.autoInstall) {\r\n const installSpinner = createSpinner('Installing dependencies...').start();\r\n\r\n try {\r\n const { DependencyInstaller } = await import('./installer/index.js');\r\n const installer = new DependencyInstaller();\r\n await installer.install(projectInfo.root);\r\n installSpinner.succeed('Dependencies installed');\r\n } catch (error) {\r\n installSpinner.fail('Failed to install dependencies');\r\n console.log(\r\n '\\nāš ļø Please run npm install manually to install dependencies\\n'\r\n );\r\n }\r\n }\r\n\r\n // Show success message\r\n showSuccess({\r\n filesCreated: result.filesCreated.length,\r\n dependenciesAdded: 8,\r\n jwt: {\r\n accessExpiration: config.jwt.accessExpiration,\r\n refreshExpiration: config.features.refreshTokens\r\n ? config.jwt.refreshExpiration\r\n : undefined,\r\n },\r\n orm: config.orm,\r\n swagger: config.features.swagger,\r\n emailVerification: config.features.emailVerification,\r\n resetPassword: config.features.resetPassword,\r\n });\r\n\r\n console.log('šŸ› Issues? https://github.com/Islamawad132/add-nest-auth/issues');\r\n console.log('⭐ Like it? https://www.npmjs.com/package/nest-authme');\r\n console.log();\r\n}\r\n","/**\r\n * CLI entry point\r\n */\r\n\r\nimport { Command } from 'commander';\r\n\r\n// Handle unhandled rejections\r\nprocess.on('unhandledRejection', (error) => {\r\n console.error('Unhandled rejection:', error);\r\n process.exit(1);\r\n});\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('nest-authme')\r\n .description('Add production-ready authentication to any NestJS project')\r\n .version('1.1.0')\r\n .option('-y, --yes', 'Skip all prompts and use sensible defaults')\r\n .option('-g, --gui', 'Launch web-based GUI mode')\r\n .option('--port <number>', 'Port for GUI server (default: auto)', parseInt)\r\n .action(async (options) => {\r\n try {\r\n // If --gui flag, launch GUI directly\r\n if (options.gui) {\r\n const { GuiServer } = await import('./gui/index.js');\r\n const server = new GuiServer({\r\n cwd: process.cwd(),\r\n port: options.port,\r\n autoOpen: true,\r\n });\r\n await server.start();\r\n\r\n process.on('SIGINT', () => {\r\n server.shutdown();\r\n });\r\n return;\r\n }\r\n\r\n // If --yes flag, run CLI directly\r\n if (options.yes) {\r\n const { run } = await import('./index.js');\r\n await run(process.cwd(), { yes: true });\r\n return;\r\n }\r\n\r\n // Interactive mode: ask user to choose CLI or GUI\r\n const inquirer = (await import('inquirer')).default;\r\n const { mode } = await inquirer.prompt([{\r\n type: 'list',\r\n name: 'mode',\r\n message: 'Choose your interface:',\r\n choices: [\r\n { name: 'CLI — Terminal-based prompts', value: 'cli' },\r\n { name: 'GUI — Web-based visual interface', value: 'gui' },\r\n ],\r\n default: 'cli',\r\n }]);\r\n\r\n if (mode === 'gui') {\r\n const { GuiServer } = await import('./gui/index.js');\r\n const server = new GuiServer({\r\n cwd: process.cwd(),\r\n port: options.port,\r\n autoOpen: true,\r\n });\r\n await server.start();\r\n\r\n process.on('SIGINT', () => {\r\n server.shutdown();\r\n });\r\n } else {\r\n const { run } = await import('./index.js');\r\n await run(process.cwd(), { yes: false });\r\n }\r\n } catch (error) {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram.parse();\r\n"],"mappings":"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","names":["inquirer","answers","path","fs","Handlebars","path","fs","path","fs","import_ts_morph","fs","fs","path","fs","AppModuleUpdater","MainTsUpdater","PackageUpdater","DependencyInstaller","path","fs","chalk","ora","init_generator","inquirer","Generator","AppModuleUpdater","MainTsUpdater","PackageUpdater","DependencyInstaller","GuiServer","run","inquirer"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/analyzer/orm-detector.ts","../src/analyzer/project-detector.ts","../src/analyzer/index.ts","../src/config/utils.ts","../src/cli/prompts.ts","../src/generator/template-engine.ts","../src/generator/file-writer.ts","../src/config/config-builder.ts","../src/generator/generator.ts","../src/installer/ast-updater.ts","../src/installer/main-ts-updater.ts","../src/installer/prisma-schema-updater.ts","../src/installer/package-updater.ts","../src/installer/dependency-installer.ts","../src/installer/index.ts","../src/gui/orchestrator.ts","../src/gui/server.ts","../src/gui/index.ts","../src/cli/ui.ts","../src/generator/index.ts","../src/index.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\r\n * ORM detector - detects TypeORM, Prisma, or Mongoose\r\n */\r\n\r\nimport { ORM } from '../types/index.js';\r\nimport type { PackageJson } from '../types/index.js';\r\n\r\n/**\r\n * Detect which ORM is being used in the project\r\n */\r\nexport async function detectORM(packageJson: PackageJson): Promise<ORM> {\r\n const dependencies = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Check for TypeORM\r\n if (dependencies['@nestjs/typeorm'] || dependencies['typeorm']) {\r\n return 'typeorm';\r\n }\r\n\r\n // Check for Prisma\r\n if (dependencies['@prisma/client'] || dependencies['prisma']) {\r\n return 'prisma';\r\n }\r\n\r\n // Check for Mongoose\r\n if (dependencies['@nestjs/mongoose'] || dependencies['mongoose']) {\r\n return 'mongoose';\r\n }\r\n\r\n return 'none';\r\n}\r\n\r\n/**\r\n * Detect database type from ORM dependencies\r\n */\r\nexport function detectDatabase(packageJson: PackageJson, orm: ORM): string | undefined {\r\n const dependencies = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (orm === 'typeorm') {\r\n if (dependencies['pg']) return 'postgres';\r\n if (dependencies['mysql2'] || dependencies['mysql']) return 'mysql';\r\n if (dependencies['sqlite3']) return 'sqlite';\r\n if (dependencies['mongodb']) return 'mongodb';\r\n }\r\n\r\n if (orm === 'prisma') {\r\n // Would need to read schema.prisma to determine database\r\n return undefined;\r\n }\r\n\r\n if (orm === 'mongoose') {\r\n return 'mongodb';\r\n }\r\n\r\n return undefined;\r\n}\r\n","/**\r\n * Project detector - validates NestJS projects and analyzes structure\r\n */\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { ProjectInfo, PackageJson, NestCliConfig } from '../types/index.js';\r\nimport { detectORM, detectDatabase } from './orm-detector.js';\r\n\r\nexport class ProjectDetector {\r\n constructor(private cwd: string) {}\r\n\r\n /**\r\n * Detect and validate a NestJS project\r\n */\r\n async detectProject(): Promise<ProjectInfo> {\r\n const errors: string[] = [];\r\n const root = this.cwd;\r\n\r\n // Check package.json\r\n const packageJsonPath = path.join(root, 'package.json');\r\n if (!await fs.pathExists(packageJsonPath)) {\r\n errors.push('package.json not found');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n const packageJson = await this.readPackageJson(packageJsonPath);\r\n if (!packageJson) {\r\n errors.push('Failed to read package.json');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Validate NestJS project\r\n const hasNestCore = packageJson.dependencies?.['@nestjs/core'];\r\n const hasNestCommon = packageJson.dependencies?.['@nestjs/common'];\r\n\r\n if (!hasNestCore || !hasNestCommon) {\r\n errors.push('Not a NestJS project (missing @nestjs/core or @nestjs/common)');\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Read nest-cli.json for source root\r\n const nestCliConfigPath = path.join(root, 'nest-cli.json');\r\n const nestCliConfig = await this.readNestCliConfig(nestCliConfigPath);\r\n const sourceRoot = nestCliConfig?.sourceRoot || 'src';\r\n\r\n // Check app.module.ts\r\n const appModulePath = path.join(root, sourceRoot, 'app.module.ts');\r\n if (!await fs.pathExists(appModulePath)) {\r\n errors.push(`app.module.ts not found at ${sourceRoot}/app.module.ts`);\r\n return this.createInvalidProject(root, errors);\r\n }\r\n\r\n // Check main.ts\r\n const mainTsPath = path.join(root, sourceRoot, 'main.ts');\r\n\r\n // Detect ORM and database\r\n const orm = await detectORM(packageJson);\r\n const database = detectDatabase(packageJson, orm);\r\n\r\n // Check if auth module already exists\r\n const authModulePath = path.join(root, sourceRoot, 'auth');\r\n const authExists = await fs.pathExists(authModulePath);\r\n\r\n return {\r\n authExists,\r\n root,\r\n sourceRoot,\r\n appModulePath,\r\n mainTsPath,\r\n packageJsonPath,\r\n nestCliConfigPath,\r\n orm,\r\n database,\r\n nestVersion: packageJson.dependencies?.['@nestjs/core'],\r\n typescriptVersion: packageJson.devDependencies?.['typescript'],\r\n isValid: errors.length === 0,\r\n errors,\r\n };\r\n }\r\n\r\n /**\r\n * Read and parse package.json\r\n */\r\n private async readPackageJson(packageJsonPath: string): Promise<PackageJson | null> {\r\n try {\r\n const content = await fs.readFile(packageJsonPath, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Read and parse nest-cli.json\r\n */\r\n private async readNestCliConfig(nestCliConfigPath: string): Promise<NestCliConfig | null> {\r\n try {\r\n if (!await fs.pathExists(nestCliConfigPath)) {\r\n return null;\r\n }\r\n const content = await fs.readFile(nestCliConfigPath, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Create invalid project info object\r\n */\r\n private createInvalidProject(root: string, errors: string[]): ProjectInfo {\r\n return {\r\n root,\r\n sourceRoot: 'src',\r\n appModulePath: path.join(root, 'src', 'app.module.ts'),\r\n mainTsPath: path.join(root, 'src', 'main.ts'),\r\n packageJsonPath: path.join(root, 'package.json'),\r\n nestCliConfigPath: path.join(root, 'nest-cli.json'),\r\n orm: 'none',\r\n isValid: false,\r\n errors,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Detect project in current working directory\r\n */\r\nexport async function detectProject(cwd: string = process.cwd()): Promise<ProjectInfo> {\r\n const detector = new ProjectDetector(cwd);\r\n return detector.detectProject();\r\n}\r\n","/**\r\n * Export analyzer modules\r\n */\r\n\r\nexport * from './project-detector.js';\r\nexport * from './orm-detector.js';\r\n","/**\r\n * Configuration utilities\r\n */\r\n\r\nimport { randomBytes } from 'crypto';\r\n\r\n/**\r\n * Generate a cryptographically secure random secret\r\n */\r\nexport function generateSecret(length: number = 32): string {\r\n return randomBytes(length).toString('base64');\r\n}\r\n","/**\r\n * CLI prompts using Inquirer\r\n */\r\n\r\nimport inquirer from 'inquirer';\r\nimport { AuthConfig, ORM, Database } from '../types/index.js';\r\nimport { generateSecret } from '../config/utils.js';\r\n\r\nexport interface PromptAnswers {\r\n strategy: 'jwt';\r\n enableRBAC: boolean;\r\n roles: string[];\r\n refreshTokens: boolean;\r\n accessExpiration: string;\r\n refreshExpiration: string;\r\n enableRateLimiting: boolean;\r\n enableSwagger: boolean;\r\n generateTests: boolean;\r\n useUsername: boolean;\r\n enableEmailVerification: boolean;\r\n enableResetPassword: boolean;\r\n enableAccountLockout: boolean;\r\n enableEmailService: boolean;\r\n enableOAuth: boolean;\r\n oauthProviders: string[];\r\n useDetectedORM: boolean;\r\n database: string;\r\n autoInstall: boolean;\r\n}\r\n\r\n/**\r\n * Ask all configuration questions\r\n */\r\nexport async function promptConfig(detectedORM: ORM, detectedDB?: string): Promise<PromptAnswers> {\r\n const dbLabel = detectedDB\r\n ? ` with ${detectedDB.charAt(0).toUpperCase() + detectedDB.slice(1)}`\r\n : '';\r\n\r\n const answers = await inquirer.prompt([\r\n {\r\n type: 'list',\r\n name: 'strategy',\r\n message: 'Choose authentication strategy:',\r\n choices: [\r\n { name: 'JWT Authentication (Recommended)', value: 'jwt' },\r\n { name: 'OAuth 2.0 (Google, GitHub) [Coming soon]', value: 'oauth', disabled: true },\r\n { name: 'Session-based (Traditional) [Coming soon]', value: 'session', disabled: true },\r\n ],\r\n default: 'jwt',\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableRBAC',\r\n message: 'Enable Role-Based Access Control (RBAC)?',\r\n default: true,\r\n },\r\n {\r\n type: 'checkbox',\r\n name: 'roles',\r\n message: 'Select default roles:',\r\n choices: [\r\n { name: 'Admin', value: 'Admin', checked: true },\r\n { name: 'User', value: 'User', checked: true },\r\n { name: 'Moderator', value: 'Moderator', checked: false },\r\n { name: 'Guest', value: 'Guest', checked: false },\r\n ],\r\n when: (answers: any) => answers.enableRBAC,\r\n validate: (input: string[]) => {\r\n if (input.length === 0) {\r\n return 'Please select at least one role';\r\n }\r\n return true;\r\n },\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'refreshTokens',\r\n message: 'Enable Refresh Token rotation?',\r\n default: true,\r\n },\r\n {\r\n type: 'list',\r\n name: 'accessExpiration',\r\n message: 'JWT Access Token expiration:',\r\n choices: [\r\n { name: '15 minutes', value: '15m' },\r\n { name: '30 minutes', value: '30m' },\r\n { name: '1 hour (Recommended)', value: '1h' },\r\n { name: '4 hours', value: '4h' },\r\n { name: '1 day', value: '1d' },\r\n ],\r\n default: '1h',\r\n },\r\n {\r\n type: 'list',\r\n name: 'refreshExpiration',\r\n message: 'JWT Refresh Token expiration:',\r\n choices: [\r\n { name: '7 days (Recommended)', value: '7d' },\r\n { name: '30 days', value: '30d' },\r\n { name: '90 days', value: '90d' },\r\n { name: '1 year', value: '1y' },\r\n ],\r\n default: '7d',\r\n when: (answers: any) => answers.refreshTokens,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableRateLimiting',\r\n message: 'Enable rate limiting on auth endpoints? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableSwagger',\r\n message: 'Enable Swagger API documentation? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'generateTests',\r\n message: 'Generate unit tests? (recommended)',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'useUsername',\r\n message: 'Add username field to user?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableEmailVerification',\r\n message: 'Enable email verification?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableResetPassword',\r\n message: 'Enable forgot/reset password?',\r\n default: true,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableAccountLockout',\r\n message: 'Enable account lockout after failed login attempts?',\r\n default: false,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableEmailService',\r\n message: 'Enable email service (Nodemailer) for sending emails?',\r\n default: false,\r\n when: (answers: any) => answers.enableEmailVerification || answers.enableResetPassword,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'enableOAuth',\r\n message: 'Enable OAuth2 social login (Google, GitHub)?',\r\n default: false,\r\n },\r\n {\r\n type: 'checkbox',\r\n name: 'oauthProviders',\r\n message: 'Select OAuth providers:',\r\n choices: [\r\n { name: 'Google', value: 'google', checked: true },\r\n { name: 'GitHub', value: 'github', checked: true },\r\n ],\r\n when: (answers: any) => answers.enableOAuth,\r\n validate: (input: string[]) => {\r\n if (input.length === 0) {\r\n return 'Please select at least one provider';\r\n }\r\n return true;\r\n },\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'useDetectedORM',\r\n message: `Detected ${detectedORM.toUpperCase()}${dbLabel}. Use it?`,\r\n default: true,\r\n when: () => detectedORM !== 'none',\r\n },\r\n {\r\n type: 'list',\r\n name: 'database',\r\n message: 'Select database:',\r\n choices: [\r\n { name: 'PostgreSQL (Recommended)', value: 'postgres' },\r\n { name: 'MySQL', value: 'mysql' },\r\n { name: 'SQLite (for testing)', value: 'sqlite' },\r\n { name: 'MongoDB', value: 'mongodb' },\r\n ],\r\n default: 'postgres',\r\n when: (answers: any) => detectedORM === 'none' || !answers.useDetectedORM,\r\n },\r\n {\r\n type: 'confirm',\r\n name: 'autoInstall',\r\n message: 'Auto-install dependencies after generation?',\r\n default: true,\r\n },\r\n ]);\r\n\r\n return answers;\r\n}\r\n\r\n/**\r\n * Get default answers (for --yes flag)\r\n */\r\nexport function getDefaultAnswers(_detectedORM: ORM, detectedDB?: string): PromptAnswers {\r\n return {\r\n strategy: 'jwt',\r\n enableRBAC: true,\r\n roles: ['Admin', 'User'],\r\n refreshTokens: true,\r\n accessExpiration: '1h',\r\n refreshExpiration: '7d',\r\n enableRateLimiting: true,\r\n enableSwagger: true,\r\n generateTests: true,\r\n useUsername: false,\r\n enableEmailVerification: false,\r\n enableResetPassword: true,\r\n enableAccountLockout: false,\r\n enableEmailService: false,\r\n enableOAuth: false,\r\n oauthProviders: [],\r\n useDetectedORM: true,\r\n database: detectedDB || 'postgres',\r\n autoInstall: true,\r\n };\r\n}\r\n\r\n/**\r\n * Build AuthConfig from prompt answers\r\n */\r\nexport function buildConfig(\r\n answers: PromptAnswers,\r\n projectName: string,\r\n sourceRoot: string,\r\n detectedORM: ORM,\r\n detectedDB?: string\r\n): AuthConfig {\r\n const config: AuthConfig = {\r\n projectName,\r\n sourceRoot,\r\n strategy: answers.strategy,\r\n rbac: {\r\n enabled: answers.enableRBAC,\r\n roles: answers.roles || [],\r\n },\r\n orm: answers.useDetectedORM !== false ? detectedORM : 'none',\r\n database: (answers.database || detectedDB || 'postgres') as Database,\r\n features: {\r\n refreshTokens: answers.refreshTokens,\r\n rateLimiting: answers.enableRateLimiting,\r\n swagger: answers.enableSwagger,\r\n unitTests: answers.generateTests,\r\n useUsername: answers.useUsername,\r\n emailVerification: answers.enableEmailVerification,\r\n resetPassword: answers.enableResetPassword,\r\n accountLockout: answers.enableAccountLockout,\r\n emailService: answers.enableEmailService,\r\n },\r\n jwt: {\r\n secret: generateSecret(),\r\n accessExpiration: answers.accessExpiration,\r\n refreshExpiration: answers.refreshExpiration || '7d',\r\n },\r\n oauth: answers.enableOAuth ? {\r\n google: (answers.oauthProviders || []).includes('google'),\r\n github: (answers.oauthProviders || []).includes('github'),\r\n } : undefined,\r\n autoInstall: answers.autoInstall,\r\n timestamp: new Date().toISOString(),\r\n generatorVersion: '1.3.0',\r\n };\r\n\r\n return config;\r\n}\r\n","/**\r\n * Handlebars template engine with helpers\r\n */\r\n\r\nimport Handlebars from 'handlebars';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\n\r\nexport class TemplateEngine {\r\n private handlebars: typeof Handlebars;\r\n private templateCache: Map<string, HandlebarsTemplateDelegate>;\r\n private templatesDir: string;\r\n\r\n constructor(templatesDir?: string) {\r\n this.handlebars = Handlebars.create();\r\n this.templateCache = new Map();\r\n this.templatesDir = templatesDir || path.join(__dirname, 'generator', 'templates');\r\n this.registerHelpers();\r\n }\r\n\r\n /**\r\n * Register Handlebars helpers\r\n */\r\n private registerHelpers(): void {\r\n // Conditional helpers\r\n this.handlebars.registerHelper('eq', (a, b) => a === b);\r\n this.handlebars.registerHelper('ne', (a, b) => a !== b);\r\n this.handlebars.registerHelper('or', (a, b) => a || b);\r\n this.handlebars.registerHelper('and', (a, b) => a && b);\r\n this.handlebars.registerHelper('includes', (arr, item) => arr?.includes(item));\r\n\r\n // String transformation helpers\r\n this.handlebars.registerHelper('capitalize', (str: string) => {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n });\r\n\r\n this.handlebars.registerHelper('lowercase', (str: string) => {\r\n if (!str) return '';\r\n return str.toLowerCase();\r\n });\r\n\r\n this.handlebars.registerHelper('uppercase', (str: string) => {\r\n if (!str) return '';\r\n return str.toUpperCase();\r\n });\r\n\r\n this.handlebars.registerHelper('camelCase', (str: string) => {\r\n if (!str) return '';\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n });\r\n\r\n this.handlebars.registerHelper('pascalCase', (str: string) => {\r\n if (!str) return '';\r\n const camel = str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n });\r\n }\r\n\r\n /**\r\n * Render a template with context\r\n */\r\n async render(templatePath: string, context: any): Promise<string> {\r\n const template = await this.loadTemplate(templatePath);\r\n return template(context);\r\n }\r\n\r\n /**\r\n * Load a template (with caching)\r\n */\r\n private async loadTemplate(templatePath: string): Promise<HandlebarsTemplateDelegate> {\r\n if (this.templateCache.has(templatePath)) {\r\n return this.templateCache.get(templatePath)!;\r\n }\r\n\r\n const fullPath = path.join(this.templatesDir, templatePath);\r\n\r\n if (!await fs.pathExists(fullPath)) {\r\n throw new Error(`Template not found: ${templatePath}`);\r\n }\r\n\r\n const source = await fs.readFile(fullPath, 'utf-8');\r\n const compiled = this.handlebars.compile(source);\r\n\r\n this.templateCache.set(templatePath, compiled);\r\n return compiled;\r\n }\r\n\r\n /**\r\n * Clear template cache\r\n */\r\n clearCache(): void {\r\n this.templateCache.clear();\r\n }\r\n}\r\n","/**\r\n * Safe file writer with backup and rollback\r\n */\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\n\r\nexport interface WriteOptions {\r\n overwrite?: boolean;\r\n backup?: boolean;\r\n}\r\n\r\nexport class FileWriter {\r\n private writtenFiles: string[] = [];\r\n private skippedFiles: string[] = [];\r\n private backups: Map<string, string> = new Map();\r\n\r\n /**\r\n * Write a file to disk\r\n */\r\n async writeFile(\r\n filePath: string,\r\n content: string,\r\n options: WriteOptions = {}\r\n ): Promise<void> {\r\n const { overwrite = false, backup = true } = options;\r\n\r\n // Check if file exists\r\n const exists = await fs.pathExists(filePath);\r\n if (exists && !overwrite) {\r\n this.skippedFiles.push(filePath);\r\n return; // Skip existing files instead of crashing\r\n }\r\n\r\n // Create backup if file exists\r\n if (exists && backup) {\r\n await this.createBackup(filePath);\r\n }\r\n\r\n // Ensure directory exists\r\n await fs.ensureDir(path.dirname(filePath));\r\n\r\n // Write file\r\n await fs.writeFile(filePath, content, 'utf-8');\r\n\r\n // Track written file\r\n this.writtenFiles.push(filePath);\r\n }\r\n\r\n /**\r\n * Create a backup of an existing file\r\n */\r\n private async createBackup(filePath: string): Promise<void> {\r\n const backupPath = `${filePath}.backup`;\r\n await fs.copy(filePath, backupPath);\r\n this.backups.set(filePath, backupPath);\r\n }\r\n\r\n /**\r\n * Rollback all written files\r\n */\r\n async rollback(): Promise<void> {\r\n // Restore backups\r\n for (const [originalPath, backupPath] of this.backups) {\r\n if (await fs.pathExists(backupPath)) {\r\n await fs.copy(backupPath, originalPath, { overwrite: true });\r\n await fs.remove(backupPath);\r\n }\r\n }\r\n\r\n // Remove newly created files\r\n for (const filePath of this.writtenFiles) {\r\n if (!this.backups.has(filePath) && await fs.pathExists(filePath)) {\r\n await fs.remove(filePath);\r\n }\r\n }\r\n\r\n this.writtenFiles = [];\r\n this.backups.clear();\r\n }\r\n\r\n /**\r\n * Clean up backups\r\n */\r\n async cleanupBackups(): Promise<void> {\r\n for (const backupPath of this.backups.values()) {\r\n if (await fs.pathExists(backupPath)) {\r\n await fs.remove(backupPath);\r\n }\r\n }\r\n this.backups.clear();\r\n }\r\n\r\n /**\r\n * Get list of written files\r\n */\r\n getWrittenFiles(): string[] {\r\n return [...this.writtenFiles];\r\n }\r\n\r\n /**\r\n * Get list of skipped files (already existed)\r\n */\r\n getSkippedFiles(): string[] {\r\n return [...this.skippedFiles];\r\n }\r\n}\r\n","/**\r\n * Build template context from configuration\r\n */\r\n\r\nimport { AuthConfig, TemplateContext } from '../types/index.js';\r\n\r\n/**\r\n * Build template context for rendering\r\n */\r\nexport function buildTemplateContext(config: AuthConfig): TemplateContext {\r\n return {\r\n ...config,\r\n // Add any additional computed properties here\r\n };\r\n}\r\n","/**\r\n * Main code generator orchestrator\r\n */\r\n\r\nimport * as path from 'path';\r\nimport { AuthConfig, ProjectInfo } from '../types/index.js';\r\nimport { TemplateEngine } from './template-engine.js';\r\nimport { FileWriter } from './file-writer.js';\r\nimport { buildTemplateContext } from '../config/config-builder.js';\r\n\r\nexport interface GenerationResult {\r\n filesCreated: string[];\r\n filesSkipped: string[];\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\nexport interface FileSpec {\r\n template: string;\r\n output: string;\r\n condition?: (config: AuthConfig) => boolean;\r\n}\r\n\r\nexport class Generator {\r\n private templateEngine: TemplateEngine;\r\n private fileWriter: FileWriter;\r\n\r\n constructor() {\r\n this.templateEngine = new TemplateEngine();\r\n this.fileWriter = new FileWriter();\r\n }\r\n\r\n /**\r\n * Generate all authentication files\r\n */\r\n async generate(\r\n config: AuthConfig,\r\n projectInfo: ProjectInfo,\r\n overwrite: boolean = false\r\n ): Promise<GenerationResult> {\r\n try {\r\n const context = buildTemplateContext(config);\r\n const plan = this.buildGenerationPlan(config);\r\n\r\n // Generate all files\r\n for (const fileSpec of plan) {\r\n // Check condition\r\n if (fileSpec.condition && !fileSpec.condition(config)) {\r\n continue;\r\n }\r\n\r\n // Render template\r\n const content = await this.templateEngine.render(\r\n fileSpec.template,\r\n context\r\n );\r\n\r\n // Write file\r\n const outputPath = path.join(projectInfo.root, fileSpec.output);\r\n await this.fileWriter.writeFile(outputPath, content, {\r\n overwrite,\r\n });\r\n }\r\n\r\n // Get list of created and skipped files\r\n const filesCreated = this.fileWriter.getWrittenFiles();\r\n const filesSkipped = this.fileWriter.getSkippedFiles();\r\n\r\n // Cleanup backups\r\n await this.fileWriter.cleanupBackups();\r\n\r\n return {\r\n filesCreated,\r\n filesSkipped,\r\n success: true,\r\n };\r\n } catch (error) {\r\n // Rollback on error\r\n await this.fileWriter.rollback();\r\n\r\n return {\r\n filesCreated: [],\r\n filesSkipped: [],\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Build file generation plan\r\n */\r\n public buildGenerationPlan(config: AuthConfig): FileSpec[] {\r\n const plan: FileSpec[] = [];\r\n\r\n // Core auth module files\r\n plan.push(\r\n { template: 'jwt/auth.module.ts.hbs', output: `${config.sourceRoot}/auth/auth.module.ts` },\r\n { template: 'jwt/auth.service.ts.hbs', output: `${config.sourceRoot}/auth/auth.service.ts` },\r\n { template: 'jwt/auth.controller.ts.hbs', output: `${config.sourceRoot}/auth/auth.controller.ts` }\r\n );\r\n\r\n // Strategies\r\n plan.push(\r\n { template: 'jwt/jwt.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/jwt.strategy.ts` },\r\n { template: 'jwt/local.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/local.strategy.ts` }\r\n );\r\n\r\n // Guards\r\n plan.push(\r\n { template: 'jwt/jwt-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/jwt-auth.guard.ts` },\r\n { template: 'jwt/local-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/local-auth.guard.ts` }\r\n );\r\n\r\n // OAuth strategies and guards (conditional)\r\n if (config.oauth?.google) {\r\n plan.push(\r\n { template: 'strategies/google.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/google.strategy.ts` },\r\n { template: 'guards/google-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/google-auth.guard.ts` },\r\n );\r\n }\r\n if (config.oauth?.github) {\r\n plan.push(\r\n { template: 'strategies/github.strategy.ts.hbs', output: `${config.sourceRoot}/auth/strategies/github.strategy.ts` },\r\n { template: 'guards/github-auth.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/github-auth.guard.ts` },\r\n );\r\n }\r\n\r\n // RBAC (conditional)\r\n if (config.rbac.enabled) {\r\n plan.push(\r\n { template: 'rbac/roles.guard.ts.hbs', output: `${config.sourceRoot}/auth/guards/roles.guard.ts` },\r\n { template: 'rbac/role.enum.ts.hbs', output: `${config.sourceRoot}/auth/enums/role.enum.ts` },\r\n { template: 'decorators/roles.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/roles.decorator.ts` }\r\n );\r\n }\r\n\r\n // Decorators\r\n plan.push(\r\n { template: 'decorators/public.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/public.decorator.ts` },\r\n { template: 'decorators/current-user.decorator.ts.hbs', output: `${config.sourceRoot}/auth/decorators/current-user.decorator.ts` }\r\n );\r\n\r\n // DTOs\r\n plan.push(\r\n { template: 'dto/login.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/login.dto.ts` },\r\n { template: 'dto/register.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/register.dto.ts` },\r\n { template: 'dto/change-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/change-password.dto.ts` },\r\n { template: 'dto/auth-response.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/auth-response.dto.ts` },\r\n { template: 'dto/create-user.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/create-user.dto.ts` }\r\n );\r\n\r\n // Reset password DTOs (conditional)\r\n if (config.features.resetPassword) {\r\n plan.push(\r\n { template: 'dto/forgot-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/forgot-password.dto.ts` },\r\n { template: 'dto/reset-password.dto.ts.hbs', output: `${config.sourceRoot}/auth/dto/reset-password.dto.ts` }\r\n );\r\n }\r\n\r\n // Users module\r\n plan.push(\r\n { template: 'users/users.module.ts.hbs', output: `${config.sourceRoot}/users/users.module.ts` },\r\n { template: 'users/users.service.ts.hbs', output: `${config.sourceRoot}/users/users.service.ts` },\r\n { template: 'users/users.controller.ts.hbs', output: `${config.sourceRoot}/users/users.controller.ts` }\r\n );\r\n\r\n // Entities / ORM-specific files\r\n if (config.orm === 'typeorm') {\r\n plan.push(\r\n { template: 'entities/user.entity.typeorm.hbs', output: `${config.sourceRoot}/users/entities/user.entity.ts` }\r\n );\r\n\r\n if (config.features.refreshTokens) {\r\n plan.push({\r\n template: 'entities/refresh-token.entity.typeorm.hbs',\r\n output: `${config.sourceRoot}/users/entities/refresh-token.entity.ts`,\r\n });\r\n }\r\n } else if (config.orm === 'prisma') {\r\n plan.push(\r\n { template: 'prisma/prisma.service.ts.hbs', output: `${config.sourceRoot}/prisma/prisma.service.ts` },\r\n { template: 'prisma/prisma.module.ts.hbs', output: `${config.sourceRoot}/prisma/prisma.module.ts` },\r\n );\r\n }\r\n\r\n // Mail module (conditional)\r\n if (config.features.emailService) {\r\n plan.push(\r\n { template: 'mail/mail.module.ts.hbs', output: `${config.sourceRoot}/mail/mail.module.ts` },\r\n { template: 'mail/mail.service.ts.hbs', output: `${config.sourceRoot}/mail/mail.service.ts` },\r\n );\r\n }\r\n\r\n // Unit tests (conditional)\r\n if (config.features.unitTests) {\r\n plan.push(\r\n { template: 'tests/auth.service.spec.ts.hbs', output: `${config.sourceRoot}/auth/auth.service.spec.ts` },\r\n { template: 'tests/auth.controller.spec.ts.hbs', output: `${config.sourceRoot}/auth/auth.controller.spec.ts` },\r\n );\r\n }\r\n\r\n // Configuration files\r\n plan.push(\r\n { template: 'shared/env.template.hbs', output: '.env.example' },\r\n { template: 'shared/env.hbs', output: '.env' },\r\n { template: 'shared/README.auth.md.hbs', output: `${config.sourceRoot}/auth/README.md` },\r\n { template: 'shared/main.ts.snippet.hbs', output: 'main.ts.example' }\r\n );\r\n\r\n return plan;\r\n }\r\n}\r\n","/**\r\n * AST-based app.module.ts updater using ts-morph\r\n */\r\n\r\nimport { Project, SourceFile, Node, IndentationText } from 'ts-morph';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport class AppModuleUpdater {\r\n private project: Project;\r\n private sourceFile: SourceFile | undefined;\r\n private backupPath: string | null = null;\r\n\r\n constructor(private appModulePath: string) {\r\n this.project = new Project({\r\n skipAddingFilesFromTsConfig: true,\r\n manipulationSettings: {\r\n indentationText: IndentationText.TwoSpaces,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update app.module.ts with auth modules\r\n */\r\n async update(config?: AuthConfig): Promise<void> {\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Load source file\r\n this.sourceFile = this.project.addSourceFileAtPath(this.appModulePath);\r\n\r\n // Add imports\r\n this.addImports(config);\r\n\r\n // Add modules to @Module decorator\r\n this.addModulesToDecorator(config);\r\n\r\n // Format and save\r\n this.sourceFile.formatText();\r\n await this.sourceFile.save();\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Add necessary imports\r\n */\r\n private addImports(config?: AuthConfig): void {\r\n if (!this.sourceFile) {\r\n throw new Error('Source file not loaded');\r\n }\r\n\r\n // Add ConfigModule import\r\n this.addImport('@nestjs/config', ['ConfigModule']);\r\n\r\n // Add ORM-specific imports\r\n if (config && config.orm === 'typeorm') {\r\n this.addImport('@nestjs/typeorm', ['TypeOrmModule']);\r\n this.addImport('./users/entities/user.entity', ['User']);\r\n\r\n if (config.features.refreshTokens) {\r\n this.addImport('./users/entities/refresh-token.entity', ['RefreshToken']);\r\n }\r\n } else if (config && config.orm === 'prisma') {\r\n this.addImport('./prisma/prisma.module', ['PrismaModule']);\r\n }\r\n\r\n // Add MailModule import (if email service enabled)\r\n if (config && config.features.emailService) {\r\n this.addImport('./mail/mail.module', ['MailModule']);\r\n }\r\n\r\n // Add AuthModule import\r\n this.addImport('./auth/auth.module', ['AuthModule']);\r\n\r\n // Add UsersModule import\r\n this.addImport('./users/users.module', ['UsersModule']);\r\n }\r\n\r\n /**\r\n * Add an import statement if it doesn't exist\r\n */\r\n private addImport(moduleSpecifier: string, namedImports: string[]): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Check if import already exists\r\n const existingImport = this.sourceFile\r\n .getImportDeclarations()\r\n .find((imp) => imp.getModuleSpecifierValue() === moduleSpecifier);\r\n\r\n if (existingImport) {\r\n // Add missing named imports\r\n const existingNames = existingImport\r\n .getNamedImports()\r\n .map((ni) => ni.getName());\r\n\r\n const missingImports = namedImports.filter(\r\n (name) => !existingNames.includes(name)\r\n );\r\n\r\n if (missingImports.length > 0) {\r\n existingImport.addNamedImports(missingImports);\r\n }\r\n } else {\r\n // Add new import declaration\r\n this.sourceFile.addImportDeclaration({\r\n moduleSpecifier,\r\n namedImports,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add modules to @Module decorator imports array\r\n */\r\n private addModulesToDecorator(config?: AuthConfig): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Find AppModule class\r\n const appModuleClass = this.sourceFile.getClass('AppModule');\r\n if (!appModuleClass) {\r\n throw new Error('AppModule class not found');\r\n }\r\n\r\n // Find @Module decorator\r\n const moduleDecorator = appModuleClass.getDecorator('Module');\r\n if (!moduleDecorator) {\r\n throw new Error('@Module decorator not found');\r\n }\r\n\r\n // Get decorator arguments\r\n const decoratorArgs = moduleDecorator.getArguments()[0];\r\n if (!decoratorArgs || !Node.isObjectLiteralExpression(decoratorArgs)) {\r\n throw new Error('Invalid @Module decorator structure');\r\n }\r\n\r\n // Get or create imports property\r\n let importsProperty = decoratorArgs.getProperty('imports');\r\n\r\n if (!importsProperty) {\r\n // Create imports property if it doesn't exist\r\n decoratorArgs.addPropertyAssignment({\r\n name: 'imports',\r\n initializer: '[]',\r\n });\r\n importsProperty = decoratorArgs.getProperty('imports');\r\n }\r\n\r\n if (!importsProperty || !Node.isPropertyAssignment(importsProperty)) {\r\n throw new Error('Invalid imports property');\r\n }\r\n\r\n const importsArray = importsProperty.getInitializer();\r\n if (!Node.isArrayLiteralExpression(importsArray)) {\r\n throw new Error('imports is not an array');\r\n }\r\n\r\n // Get existing module names and their text\r\n const existingModules = this.getExistingModuleNames(importsArray);\r\n const existingElements = importsArray.getElements().map(e => e.getText());\r\n\r\n // Build a list of all elements (existing + new)\r\n const allElements: string[] = [...existingElements];\r\n\r\n // Add ConfigModule.forRoot() if not exists\r\n if (!existingModules.has('ConfigModule')) {\r\n allElements.push('ConfigModule.forRoot({ isGlobal: true })');\r\n }\r\n\r\n // Add ORM module if not already present\r\n if (config && config.orm === 'typeorm' && !existingModules.has('TypeOrmModule')) {\r\n const entities = config.features.refreshTokens\r\n ? '[User, RefreshToken]'\r\n : '[User]';\r\n\r\n allElements.push(this.buildTypeOrmConfig(config.database, entities));\r\n } else if (config && config.orm === 'prisma' && !existingModules.has('PrismaModule')) {\r\n allElements.push('PrismaModule');\r\n }\r\n\r\n // Add MailModule if not exists (email service)\r\n if (config && config.features.emailService && !existingModules.has('MailModule')) {\r\n allElements.push('MailModule');\r\n }\r\n\r\n // Add AuthModule if not exists\r\n if (!existingModules.has('AuthModule')) {\r\n allElements.push('AuthModule');\r\n }\r\n\r\n // Add UsersModule if not exists\r\n if (!existingModules.has('UsersModule')) {\r\n allElements.push('UsersModule');\r\n }\r\n\r\n // Build multi-line array string with each element on its own line\r\n const indent = ' '; // 4 spaces for array elements inside @Module({})\r\n const formattedElements = allElements.map(el => `${indent}${el}`).join(',\\n');\r\n const multiLineArray = `[\\n${formattedElements},\\n ]`;\r\n\r\n // Replace the entire initializer with the formatted multi-line version\r\n importsProperty.setInitializer(multiLineArray);\r\n }\r\n\r\n /**\r\n * Build TypeORM.forRoot() configuration string based on database type\r\n */\r\n private buildTypeOrmConfig(database: string, entities: string): string {\r\n switch (database) {\r\n case 'sqlite':\r\n return `TypeOrmModule.forRoot({\\n type: 'sqlite',\\n database: 'database.sqlite',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n case 'mysql':\r\n return `TypeOrmModule.forRoot({\\n type: 'mysql',\\n host: process.env.DATABASE_HOST || 'localhost',\\n port: parseInt(process.env.DATABASE_PORT || '3306'),\\n username: process.env.DATABASE_USER || 'root',\\n password: process.env.DATABASE_PASSWORD || '',\\n database: process.env.DATABASE_NAME || 'auth_db',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n case 'postgres':\r\n default:\r\n return `TypeOrmModule.forRoot({\\n type: 'postgres',\\n host: process.env.DATABASE_HOST || 'localhost',\\n port: parseInt(process.env.DATABASE_PORT || '5432'),\\n username: process.env.DATABASE_USER || 'postgres',\\n password: process.env.DATABASE_PASSWORD || 'postgres',\\n database: process.env.DATABASE_NAME || 'auth_db',\\n entities: ${entities},\\n synchronize: true, // WARNING: disable in production!\\n })`;\r\n }\r\n }\r\n\r\n /**\r\n * Get existing module names from imports array\r\n */\r\n private getExistingModuleNames(importsArray: Node): Set<string> {\r\n const moduleNames = new Set<string>();\r\n\r\n if (!Node.isArrayLiteralExpression(importsArray)) {\r\n return moduleNames;\r\n }\r\n\r\n for (const element of importsArray.getElements()) {\r\n const text = element.getText();\r\n\r\n // Extract module name (handle both \"ModuleName\" and \"ModuleName.forRoot(...)\")\r\n const match = text.match(/^(\\w+)/);\r\n if (match) {\r\n moduleNames.add(match[1]);\r\n }\r\n }\r\n\r\n return moduleNames;\r\n }\r\n\r\n /**\r\n * Create backup of app.module.ts\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.appModulePath}.backup`;\r\n await fs.copy(this.appModulePath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.appModulePath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * AST-based main.ts updater using ts-morph\r\n * Adds Global JWT Guard, ValidationPipe, and optionally Swagger to the NestJS bootstrap function\r\n */\r\n\r\nimport { Project, SourceFile, Node, IndentationText } from 'ts-morph';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport class MainTsUpdater {\r\n private project: Project;\r\n private sourceFile: SourceFile | undefined;\r\n private backupPath: string | null = null;\r\n\r\n constructor(private mainTsPath: string) {\r\n this.project = new Project({\r\n skipAddingFilesFromTsConfig: true,\r\n manipulationSettings: {\r\n indentationText: IndentationText.TwoSpaces,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update main.ts with global guards, validation pipe, and optionally Swagger\r\n */\r\n async update(config?: AuthConfig): Promise<void> {\r\n // Check if main.ts exists\r\n if (!await fs.pathExists(this.mainTsPath)) {\r\n throw new Error(`main.ts not found at ${this.mainTsPath}`);\r\n }\r\n\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Load source file\r\n this.sourceFile = this.project.addSourceFileAtPath(this.mainTsPath);\r\n\r\n // Add imports\r\n this.addImports(config);\r\n\r\n // Add global guards and pipes to bootstrap function\r\n this.addGlobalGuardsAndPipes(config);\r\n\r\n // Format and save\r\n this.sourceFile.formatText();\r\n await this.sourceFile.save();\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Add necessary imports\r\n */\r\n private addImports(config?: AuthConfig): void {\r\n if (!this.sourceFile) {\r\n throw new Error('Source file not loaded');\r\n }\r\n\r\n // Add Reflector to @nestjs/core import\r\n this.addImport('@nestjs/core', ['Reflector']);\r\n\r\n // Add ValidationPipe to @nestjs/common import\r\n this.addImport('@nestjs/common', ['ValidationPipe']);\r\n\r\n // Add JwtAuthGuard import\r\n this.addImport('./auth/guards/jwt-auth.guard', ['JwtAuthGuard']);\r\n\r\n // Add Swagger imports if enabled\r\n if (config?.features?.swagger) {\r\n this.addImport('@nestjs/swagger', ['SwaggerModule', 'DocumentBuilder']);\r\n }\r\n }\r\n\r\n /**\r\n * Add an import statement if it doesn't exist\r\n */\r\n private addImport(moduleSpecifier: string, namedImports: string[]): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Check if import already exists\r\n const existingImport = this.sourceFile\r\n .getImportDeclarations()\r\n .find((imp) => imp.getModuleSpecifierValue() === moduleSpecifier);\r\n\r\n if (existingImport) {\r\n // Add missing named imports\r\n const existingNames = existingImport\r\n .getNamedImports()\r\n .map((ni) => ni.getName());\r\n\r\n const missingImports = namedImports.filter(\r\n (name) => !existingNames.includes(name)\r\n );\r\n\r\n if (missingImports.length > 0) {\r\n existingImport.addNamedImports(missingImports);\r\n }\r\n } else {\r\n // Add new import declaration\r\n this.sourceFile.addImportDeclaration({\r\n moduleSpecifier,\r\n namedImports,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add global guards and validation pipe to bootstrap function\r\n */\r\n private addGlobalGuardsAndPipes(config?: AuthConfig): void {\r\n if (!this.sourceFile) return;\r\n\r\n // Find the bootstrap function\r\n const bootstrapFunc = this.sourceFile.getFunction('bootstrap');\r\n if (!bootstrapFunc) {\r\n throw new Error('bootstrap function not found in main.ts');\r\n }\r\n\r\n const body = bootstrapFunc.getBody();\r\n if (!body || !Node.isBlock(body)) {\r\n throw new Error('bootstrap function has no body');\r\n }\r\n\r\n // Check if global guards are already added\r\n const bodyText = body.getText();\r\n if (bodyText.includes('useGlobalGuards') || bodyText.includes('JwtAuthGuard')) {\r\n return; // Already configured\r\n }\r\n\r\n // Find the app.listen statement to insert before it\r\n const statements = body.getStatements();\r\n let listenIndex = -1;\r\n\r\n for (let i = 0; i < statements.length; i++) {\r\n const text = statements[i].getText();\r\n if (text.includes('.listen(') || text.includes('.listen (')) {\r\n listenIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (listenIndex === -1) {\r\n // If no listen found, insert at the end\r\n listenIndex = statements.length;\r\n }\r\n\r\n // Build the code to insert\r\n const codeLines = [\r\n '',\r\n '// Enable global validation pipe',\r\n 'app.useGlobalPipes(',\r\n ' new ValidationPipe({',\r\n ' whitelist: true,',\r\n ' forbidNonWhitelisted: true,',\r\n ' transform: true,',\r\n ' }),',\r\n ');',\r\n '',\r\n '// Enable global JWT guard (all routes protected by default)',\r\n '// Use @Public() decorator on routes that should be accessible without auth',\r\n 'const reflector = app.get(Reflector);',\r\n 'app.useGlobalGuards(new JwtAuthGuard(reflector));',\r\n ];\r\n\r\n // Add Swagger setup if enabled\r\n if (config?.features?.swagger) {\r\n codeLines.push(\r\n '',\r\n '// Swagger API documentation',\r\n 'const swaggerConfig = new DocumentBuilder()',\r\n \" .setTitle('API Documentation')\",\r\n \" .setDescription('JWT Authentication API')\",\r\n \" .setVersion('1.0')\",\r\n ' .addBearerAuth()',\r\n ' .build();',\r\n 'const document = SwaggerModule.createDocument(app, swaggerConfig);',\r\n \"SwaggerModule.setup('api', app, document);\",\r\n );\r\n }\r\n\r\n codeLines.push('');\r\n\r\n const codeToInsert = codeLines.join('\\n');\r\n\r\n // Insert at the correct position\r\n body.insertStatements(listenIndex, codeToInsert);\r\n }\r\n\r\n /**\r\n * Create backup of main.ts\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.mainTsPath}.backup`;\r\n await fs.copy(this.mainTsPath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.mainTsPath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * Prisma schema updater - appends auth models to prisma/schema.prisma\r\n */\r\n\r\nimport * as fs from 'fs-extra';\r\nimport { execa } from 'execa';\r\nimport { AuthConfig } from '../types/index.js';\r\nimport { TemplateEngine } from '../generator/template-engine.js';\r\nimport { buildTemplateContext } from '../config/config-builder.js';\r\n\r\nexport interface PrismaUpdateResult {\r\n updated: boolean;\r\n message: string;\r\n skippedModels: string[];\r\n}\r\n\r\nexport class PrismaSchemaUpdater {\r\n private backupPath: string | null = null;\r\n\r\n constructor(private schemaPath: string) {}\r\n\r\n /**\r\n * Update prisma/schema.prisma with auth models\r\n */\r\n async update(config: AuthConfig): Promise<PrismaUpdateResult> {\r\n // 1. Check if schema.prisma exists\r\n const exists = await fs.pathExists(this.schemaPath);\r\n if (!exists) {\r\n return {\r\n updated: false,\r\n message: 'prisma/schema.prisma not found. Run \"npx prisma init\" first, then re-run nest-authme.',\r\n skippedModels: [],\r\n };\r\n }\r\n\r\n // 2. Read existing schema content\r\n const existingContent = await fs.readFile(this.schemaPath, 'utf-8');\r\n\r\n // 3. Check for existing models independently\r\n const skippedModels: string[] = [];\r\n const hasUser = /^\\s*model\\s+User\\s*\\{/m.test(existingContent);\r\n const hasRefreshToken = /^\\s*model\\s+RefreshToken\\s*\\{/m.test(existingContent);\r\n\r\n if (hasUser) {\r\n skippedModels.push('User');\r\n }\r\n if (hasRefreshToken && config.features.refreshTokens) {\r\n skippedModels.push('RefreshToken');\r\n }\r\n\r\n // If all needed models already exist, skip entirely\r\n const needsUser = !hasUser;\r\n const needsRefreshToken = config.features.refreshTokens && !hasRefreshToken;\r\n\r\n if (!needsUser && !needsRefreshToken) {\r\n return {\r\n updated: false,\r\n message: `Models already exist in schema.prisma: ${skippedModels.join(', ')}. Please check that your existing models have all required auth fields.`,\r\n skippedModels,\r\n };\r\n }\r\n\r\n // 4. Render the models template\r\n const templateEngine = new TemplateEngine();\r\n const context = buildTemplateContext(config);\r\n let modelsContent = await templateEngine.render('prisma/schema.prisma.models.hbs', context);\r\n\r\n // 5. Strip models that already exist\r\n if (hasUser) {\r\n // Remove the User model block from rendered content\r\n modelsContent = modelsContent.replace(/model\\s+User\\s*\\{[^}]*\\}\\n?/s, '');\r\n }\r\n if (hasRefreshToken) {\r\n // Remove the RefreshToken model block from rendered content\r\n modelsContent = modelsContent.replace(/model\\s+RefreshToken\\s*\\{[^}]*\\}\\n?/s, '');\r\n }\r\n\r\n // Clean up extra blank lines\r\n modelsContent = modelsContent.replace(/\\n{3,}/g, '\\n\\n').trim();\r\n\r\n if (!modelsContent) {\r\n return {\r\n updated: false,\r\n message: 'No new models to add.',\r\n skippedModels,\r\n };\r\n }\r\n\r\n // 6. Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // 7. Append models with separator comment\r\n const separator = '\\n\\n// === Auth models (added by nest-authme) ===\\n\\n';\r\n const updatedContent = existingContent.trimEnd() + separator + modelsContent + '\\n';\r\n\r\n await fs.writeFile(this.schemaPath, updatedContent, 'utf-8');\r\n\r\n // 8. Try to run prisma format for consistent indentation (non-fatal)\r\n await this.tryPrismaFormat();\r\n\r\n const addedModels: string[] = [];\r\n if (needsUser) addedModels.push('User');\r\n if (needsRefreshToken) addedModels.push('RefreshToken');\r\n\r\n let message = `Added ${addedModels.join(', ')} model(s) to prisma/schema.prisma`;\r\n if (skippedModels.length > 0) {\r\n message += `. Skipped existing: ${skippedModels.join(', ')} (check for missing auth fields)`;\r\n }\r\n\r\n return {\r\n updated: true,\r\n message,\r\n skippedModels,\r\n };\r\n } catch (error) {\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Try to run prisma format for consistent indentation\r\n */\r\n private async tryPrismaFormat(): Promise<void> {\r\n try {\r\n await execa('npx', ['prisma', 'format'], {\r\n cwd: this.schemaPath.replace(/[/\\\\]prisma[/\\\\]schema\\.prisma$/, ''),\r\n timeout: 15000,\r\n });\r\n } catch {\r\n // Non-fatal - formatting is optional\r\n }\r\n }\r\n\r\n /**\r\n * Create backup of schema.prisma\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.schemaPath}.backup`;\r\n await fs.copy(this.schemaPath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup on failure\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.schemaPath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup after success\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * Update package.json with new dependencies\r\n */\r\n\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig } from '../types/index.js';\r\n\r\nexport interface DependencyMap {\r\n dependencies: Record<string, string>;\r\n devDependencies: Record<string, string>;\r\n}\r\n\r\nexport class PackageUpdater {\r\n private backupPath: string | null = null;\r\n\r\n constructor(private packageJsonPath: string) {}\r\n\r\n /**\r\n * Update package.json with auth dependencies\r\n */\r\n async update(config: AuthConfig): Promise<void> {\r\n // Create backup\r\n await this.createBackup();\r\n\r\n try {\r\n // Read package.json\r\n const packageJson = await fs.readJSON(this.packageJsonPath);\r\n\r\n // Get dependencies to add\r\n const deps = this.getDependencies(config);\r\n\r\n // Merge dependencies\r\n packageJson.dependencies = {\r\n ...packageJson.dependencies,\r\n ...deps.dependencies,\r\n };\r\n\r\n packageJson.devDependencies = {\r\n ...packageJson.devDependencies,\r\n ...deps.devDependencies,\r\n };\r\n\r\n // Sort dependencies alphabetically\r\n packageJson.dependencies = this.sortObject(packageJson.dependencies);\r\n packageJson.devDependencies = this.sortObject(\r\n packageJson.devDependencies\r\n );\r\n\r\n // Write back with proper formatting\r\n await fs.writeJSON(this.packageJsonPath, packageJson, { spaces: 2 });\r\n } catch (error) {\r\n // Restore backup on error\r\n await this.restoreBackup();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get dependencies based on configuration\r\n */\r\n private getDependencies(config: AuthConfig): DependencyMap {\r\n const dependencies: Record<string, string> = {\r\n '@nestjs/jwt': '^11.0.0',\r\n '@nestjs/passport': '^11.0.0',\r\n '@nestjs/config': '^4.0.0',\r\n passport: '^0.7.0',\r\n 'passport-jwt': '^4.0.1',\r\n 'passport-local': '^1.0.0',\r\n bcrypt: '^5.1.1',\r\n 'class-validator': '^0.14.0',\r\n 'class-transformer': '^0.5.1',\r\n };\r\n\r\n const devDependencies: Record<string, string> = {\r\n '@types/passport-jwt': '^4.0.0',\r\n '@types/passport-local': '^1.0.36',\r\n '@types/bcrypt': '^5.0.2',\r\n };\r\n\r\n // Add TypeORM dependencies if needed\r\n if (config.orm === 'typeorm') {\r\n dependencies['@nestjs/typeorm'] = '^11.0.0';\r\n dependencies['typeorm'] = '^0.3.20';\r\n\r\n // Add database driver\r\n switch (config.database) {\r\n case 'postgres':\r\n dependencies['pg'] = '^8.11.3';\r\n break;\r\n case 'mysql':\r\n dependencies['mysql2'] = '^3.9.1';\r\n break;\r\n case 'sqlite':\r\n dependencies['sqlite3'] = '^5.1.7';\r\n break;\r\n case 'mongodb':\r\n dependencies['mongodb'] = '^6.3.0';\r\n break;\r\n }\r\n }\r\n\r\n // Add Prisma dependencies if needed\r\n if (config.orm === 'prisma') {\r\n dependencies['@prisma/client'] = '^6.0.0';\r\n devDependencies['prisma'] = '^6.0.0';\r\n }\r\n\r\n // Add rate limiting dependency\r\n if (config.features.rateLimiting) {\r\n dependencies['@nestjs/throttler'] = '^6.0.0';\r\n }\r\n\r\n // Add Swagger dependency\r\n if (config.features.swagger) {\r\n dependencies['@nestjs/swagger'] = '^11.0.0';\r\n }\r\n\r\n // Add OAuth dependencies\r\n if (config.oauth?.google) {\r\n dependencies['passport-google-oauth20'] = '^2.0.0';\r\n devDependencies['@types/passport-google-oauth20'] = '^2.0.14';\r\n }\r\n if (config.oauth?.github) {\r\n dependencies['passport-github2'] = '^0.1.12';\r\n devDependencies['@types/passport-github2'] = '^1.2.9';\r\n }\r\n\r\n // Add Nodemailer dependency\r\n if (config.features.emailService) {\r\n dependencies['nodemailer'] = '^6.9.0';\r\n devDependencies['@types/nodemailer'] = '^6.4.0';\r\n }\r\n\r\n return { dependencies, devDependencies };\r\n }\r\n\r\n /**\r\n * Sort object keys alphabetically\r\n */\r\n private sortObject(obj: Record<string, string>): Record<string, string> {\r\n return Object.keys(obj)\r\n .sort()\r\n .reduce((sorted, key) => {\r\n sorted[key] = obj[key];\r\n return sorted;\r\n }, {} as Record<string, string>);\r\n }\r\n\r\n /**\r\n * Create backup\r\n */\r\n private async createBackup(): Promise<void> {\r\n this.backupPath = `${this.packageJsonPath}.backup`;\r\n await fs.copy(this.packageJsonPath, this.backupPath);\r\n }\r\n\r\n /**\r\n * Restore backup\r\n */\r\n private async restoreBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.copy(this.backupPath, this.packageJsonPath, { overwrite: true });\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up backup\r\n */\r\n async cleanupBackup(): Promise<void> {\r\n if (this.backupPath && (await fs.pathExists(this.backupPath))) {\r\n await fs.remove(this.backupPath);\r\n }\r\n }\r\n}\r\n","/**\r\n * Install dependencies using detected package manager\r\n */\r\n\r\nimport { execa } from 'execa';\r\nimport { detect } from 'detect-package-manager';\r\n\r\nexport class DependencyInstaller {\r\n /**\r\n * Install dependencies using the detected package manager\r\n */\r\n async install(cwd: string): Promise<void> {\r\n const packageManager = await this.detectPackageManager(cwd);\r\n\r\n console.log(`šŸ“¦ Installing dependencies with ${packageManager}...`);\r\n\r\n try {\r\n await execa(packageManager, ['install'], {\r\n cwd,\r\n stdio: 'inherit',\r\n });\r\n\r\n console.log('āœ… Dependencies installed successfully');\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to install dependencies with ${packageManager}: ${\r\n error instanceof Error ? error.message : 'Unknown error'\r\n }`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Install dependencies, capturing output (for GUI mode)\r\n */\r\n async installCapture(cwd: string): Promise<{ stdout: string; stderr: string }> {\r\n const packageManager = await this.detectPackageManager(cwd);\r\n\r\n try {\r\n const result = await execa(packageManager, ['install'], {\r\n cwd,\r\n stdio: 'pipe',\r\n });\r\n\r\n return { stdout: result.stdout, stderr: result.stderr };\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to install dependencies with ${packageManager}: ${\r\n error instanceof Error ? error.message : 'Unknown error'\r\n }`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Detect which package manager is being used\r\n */\r\n private async detectPackageManager(cwd: string): Promise<string> {\r\n try {\r\n return await detect({ cwd });\r\n } catch (error) {\r\n // Default to npm if detection fails\r\n return 'npm';\r\n }\r\n }\r\n}\r\n","/**\r\n * Export installer modules\r\n */\r\n\r\nexport * from './ast-updater.js';\r\nexport * from './main-ts-updater.js';\r\nexport * from './prisma-schema-updater.js';\r\nexport * from './package-updater.js';\r\nexport * from './dependency-installer.js';\r\n","/**\r\n * GUI orchestrator - event-emitting generation pipeline\r\n */\r\n\r\nimport { EventEmitter } from 'events';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { AuthConfig, ProjectInfo } from '../types/index.js';\r\nimport { Generator } from '../generator/generator.js';\r\nimport { TemplateEngine } from '../generator/template-engine.js';\r\nimport { buildTemplateContext } from '../config/config-builder.js';\r\n\r\nexport interface ProgressEvent {\r\n step: string;\r\n label: string;\r\n status: 'started' | 'completed' | 'failed' | 'warning';\r\n detail?: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface GenerateRequest {\r\n config: AuthConfig;\r\n projectInfo: ProjectInfo;\r\n overwrite: boolean;\r\n}\r\n\r\nexport interface GenerateResult {\r\n success: boolean;\r\n filesCreated: string[];\r\n filesSkipped: string[];\r\n errors: string[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface PreviewFile {\r\n path: string;\r\n content: string;\r\n isNew: boolean;\r\n}\r\n\r\nexport interface PreviewResult {\r\n files: PreviewFile[];\r\n modifiedFiles: Array<{ path: string; description: string }>;\r\n totalFiles: number;\r\n}\r\n\r\nexport class GuiOrchestrator extends EventEmitter {\r\n constructor(_cwd: string) {\r\n super();\r\n }\r\n\r\n private emitProgress(step: string, label: string, status: ProgressEvent['status'], detail?: string): void {\r\n const event: ProgressEvent = { step, label, status, detail, timestamp: Date.now() };\r\n this.emit('progress', event);\r\n }\r\n\r\n /**\r\n * Preview which files would be generated (dry-run)\r\n */\r\n async preview(config: AuthConfig, projectInfo: ProjectInfo): Promise<PreviewResult> {\r\n const generator = new Generator();\r\n const templateEngine = new TemplateEngine();\r\n const context = buildTemplateContext(config);\r\n const plan = generator.buildGenerationPlan(config);\r\n\r\n const files: PreviewFile[] = [];\r\n\r\n for (const spec of plan) {\r\n const content = await templateEngine.render(spec.template, context);\r\n const fullPath = path.join(projectInfo.root, spec.output);\r\n const exists = await fs.pathExists(fullPath);\r\n\r\n files.push({\r\n path: spec.output,\r\n content,\r\n isNew: !exists,\r\n });\r\n }\r\n\r\n const modifiedFiles = [\r\n { path: `${config.sourceRoot}/app.module.ts`, description: 'Add ConfigModule, AuthModule, UsersModule imports' },\r\n { path: `${config.sourceRoot}/main.ts`, description: 'Add global JWT guard, ValidationPipe, Swagger setup' },\r\n { path: 'package.json', description: 'Add authentication dependencies' },\r\n ];\r\n\r\n if (config.orm === 'prisma') {\r\n modifiedFiles.push({\r\n path: 'prisma/schema.prisma',\r\n description: 'Append User and RefreshToken models',\r\n });\r\n }\r\n\r\n return {\r\n files,\r\n modifiedFiles,\r\n totalFiles: files.length + modifiedFiles.length,\r\n };\r\n }\r\n\r\n /**\r\n * Run the full generation pipeline\r\n */\r\n async generate(request: GenerateRequest): Promise<GenerateResult> {\r\n const { config, projectInfo, overwrite } = request;\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Step 1: Generate files\r\n this.emitProgress('generate', 'Generating files from templates...', 'started');\r\n const generator = new Generator();\r\n const result = await generator.generate(config, projectInfo, overwrite);\r\n\r\n if (!result.success) {\r\n this.emitProgress('generate', 'File generation failed', 'failed', result.error);\r\n return { success: false, filesCreated: [], filesSkipped: [], errors: [result.error || 'Unknown error'], warnings };\r\n }\r\n this.emitProgress('generate', `Generated ${result.filesCreated.length} files`, 'completed');\r\n\r\n // Step 2: Update app.module.ts\r\n this.emitProgress('ast-app-module', 'Updating app.module.ts...', 'started');\r\n try {\r\n const { AppModuleUpdater } = await import('../installer/index.js');\r\n const astUpdater = new AppModuleUpdater(projectInfo.appModulePath);\r\n await astUpdater.update(config);\r\n await astUpdater.cleanupBackup();\r\n this.emitProgress('ast-app-module', 'Updated app.module.ts', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('ast-app-module', 'Failed to update app.module.ts', 'failed', msg);\r\n errors.push(msg);\r\n return { success: false, filesCreated: result.filesCreated, filesSkipped: result.filesSkipped, errors, warnings };\r\n }\r\n\r\n // Step 2.5: Update prisma/schema.prisma (if Prisma)\r\n if (config.orm === 'prisma') {\r\n this.emitProgress('prisma-schema', 'Updating prisma/schema.prisma...', 'started');\r\n try {\r\n const { PrismaSchemaUpdater } = await import('../installer/index.js');\r\n const schemaPath = path.join(projectInfo.root, 'prisma', 'schema.prisma');\r\n const prismaUpdater = new PrismaSchemaUpdater(schemaPath);\r\n const prismaResult = await prismaUpdater.update(config);\r\n\r\n if (prismaResult.updated) {\r\n await prismaUpdater.cleanupBackup();\r\n this.emitProgress('prisma-schema', prismaResult.message, 'completed');\r\n } else {\r\n this.emitProgress('prisma-schema', prismaResult.message, 'warning');\r\n warnings.push(prismaResult.message);\r\n }\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('prisma-schema', 'Could not update prisma/schema.prisma', 'warning', msg);\r\n warnings.push('Could not update prisma/schema.prisma - add models manually');\r\n }\r\n }\r\n\r\n // Step 3: Update main.ts\r\n this.emitProgress('ast-main-ts', 'Updating main.ts...', 'started');\r\n try {\r\n const { MainTsUpdater } = await import('../installer/index.js');\r\n const mainUpdater = new MainTsUpdater(projectInfo.mainTsPath);\r\n await mainUpdater.update(config);\r\n await mainUpdater.cleanupBackup();\r\n this.emitProgress('ast-main-ts', 'Updated main.ts', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('ast-main-ts', 'Could not auto-update main.ts', 'warning', msg);\r\n warnings.push('Could not auto-update main.ts - see main.ts.example for manual setup');\r\n }\r\n\r\n // Step 4: Update package.json\r\n this.emitProgress('package-json', 'Updating package.json...', 'started');\r\n try {\r\n const { PackageUpdater } = await import('../installer/index.js');\r\n const pkgUpdater = new PackageUpdater(projectInfo.packageJsonPath);\r\n await pkgUpdater.update(config);\r\n await pkgUpdater.cleanupBackup();\r\n this.emitProgress('package-json', 'Updated package.json', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('package-json', 'Failed to update package.json', 'failed', msg);\r\n errors.push(msg);\r\n return { success: false, filesCreated: result.filesCreated, filesSkipped: result.filesSkipped, errors, warnings };\r\n }\r\n\r\n // Step 5: Install dependencies\r\n if (config.autoInstall) {\r\n this.emitProgress('install-deps', 'Installing dependencies...', 'started');\r\n try {\r\n const { DependencyInstaller } = await import('../installer/index.js');\r\n const installer = new DependencyInstaller();\r\n await installer.installCapture(projectInfo.root);\r\n this.emitProgress('install-deps', 'Dependencies installed', 'completed');\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n this.emitProgress('install-deps', 'Failed to install dependencies', 'warning', msg);\r\n warnings.push('Failed to install dependencies - run npm install manually');\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n filesCreated: result.filesCreated,\r\n filesSkipped: result.filesSkipped,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n}\r\n","/**\r\n * Local HTTP server for GUI mode\r\n */\r\n\r\nimport * as http from 'http';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs-extra';\r\nimport { AddressInfo } from 'net';\r\nimport { detectProject } from '../analyzer/index.js';\r\nimport { buildConfig } from '../cli/prompts.js';\r\nimport { GuiOrchestrator, ProgressEvent } from './orchestrator.js';\r\n\r\nexport interface GuiServerOptions {\r\n cwd: string;\r\n port?: number;\r\n autoOpen?: boolean;\r\n}\r\n\r\nexport class GuiServer {\r\n private server: http.Server;\r\n private sseClients: Set<http.ServerResponse>;\r\n private orchestrator: GuiOrchestrator;\r\n private options: GuiServerOptions;\r\n private isGenerating: boolean = false;\r\n\r\n constructor(options: GuiServerOptions) {\r\n this.options = options;\r\n this.sseClients = new Set();\r\n this.orchestrator = new GuiOrchestrator(options.cwd);\r\n\r\n // Pipe orchestrator progress events to SSE\r\n this.orchestrator.on('progress', (event: ProgressEvent) => {\r\n this.broadcastEvent('progress', event);\r\n });\r\n\r\n this.server = http.createServer((req, res) => this.handleRequest(req, res));\r\n }\r\n\r\n async start(): Promise<{ port: number; url: string }> {\r\n const port = this.options.port || 0;\r\n\r\n return new Promise((resolve) => {\r\n this.server.listen(port, '127.0.0.1', async () => {\r\n const addr = this.server.address() as AddressInfo;\r\n const url = `http://localhost:${addr.port}`;\r\n\r\n console.log('\\n GUI mode started.');\r\n console.log(` Open in browser: ${url}`);\r\n console.log('\\n Press Ctrl+C to stop the server.\\n');\r\n\r\n if (this.options.autoOpen !== false) {\r\n try {\r\n const open = (await import('open')).default;\r\n await open(url);\r\n } catch {\r\n console.log(' Could not auto-open browser. Please open the URL manually.');\r\n }\r\n }\r\n\r\n resolve({ port: addr.port, url });\r\n });\r\n });\r\n }\r\n\r\n async shutdown(): Promise<void> {\r\n for (const client of this.sseClients) {\r\n client.end();\r\n }\r\n this.sseClients.clear();\r\n\r\n return new Promise((resolve) => {\r\n this.server.close(() => {\r\n console.log('\\n Server stopped.\\n');\r\n resolve();\r\n process.exit(0);\r\n });\r\n\r\n setTimeout(() => {\r\n process.exit(0);\r\n }, 5000);\r\n });\r\n }\r\n\r\n broadcastEvent(event: string, data: unknown): void {\r\n const payload = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\r\n for (const client of this.sseClients) {\r\n try {\r\n client.write(payload);\r\n } catch {\r\n this.sseClients.delete(client);\r\n }\r\n }\r\n }\r\n\r\n private handleRequest(req: http.IncomingMessage, res: http.ServerResponse): void {\r\n const url = new URL(req.url || '/', `http://localhost`);\r\n const pathname = url.pathname;\r\n\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\r\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\r\n\r\n if (req.method === 'OPTIONS') {\r\n res.writeHead(204);\r\n res.end();\r\n return;\r\n }\r\n\r\n if (req.method === 'GET' && pathname === '/') {\r\n return this.handleGetIndex(res);\r\n }\r\n if (req.method === 'GET' && pathname === '/api/project') {\r\n void this.handleGetProject(res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/preview') {\r\n void this.handlePostPreview(req, res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/generate') {\r\n void this.handlePostGenerate(req, res);\r\n return;\r\n }\r\n if (req.method === 'GET' && pathname === '/api/events') {\r\n this.handleGetEvents(req, res);\r\n return;\r\n }\r\n if (req.method === 'POST' && pathname === '/api/shutdown') {\r\n this.handlePostShutdown(res);\r\n return;\r\n }\r\n\r\n this.sendJson(res, 404, { error: 'Not found' });\r\n }\r\n\r\n private handleGetIndex(res: http.ServerResponse): void {\r\n // Try multiple locations: __dirname varies depending on how the code is loaded\r\n // - dist/gui/server.js (standalone): __dirname = dist/gui/ → gui.html is in same dir\r\n // - dist/cli.js (bundled by tsup): __dirname = dist/ → gui.html is in gui/ subfolder\r\n const candidates = [\r\n path.join(__dirname, 'gui.html'),\r\n path.join(__dirname, 'gui', 'gui.html'),\r\n path.join(__dirname, '..', 'dist', 'gui', 'gui.html'),\r\n path.join(__dirname, '..', 'src', 'gui', 'gui.html'),\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n try {\r\n const html = fs.readFileSync(candidate, 'utf-8');\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n return;\r\n } catch {\r\n // Try next candidate\r\n }\r\n }\r\n\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end('GUI HTML file not found. Please rebuild with: npm run build');\r\n }\r\n\r\n private async handleGetProject(res: http.ServerResponse): Promise<void> {\r\n try {\r\n const projectInfo = await detectProject(this.options.cwd);\r\n this.sendJson(res, 200, {\r\n isValid: projectInfo.isValid,\r\n errors: projectInfo.errors,\r\n nestVersion: projectInfo.nestVersion,\r\n orm: projectInfo.orm,\r\n database: projectInfo.database,\r\n sourceRoot: projectInfo.sourceRoot,\r\n authExists: projectInfo.authExists,\r\n root: projectInfo.root,\r\n });\r\n } catch (error) {\r\n this.sendJson(res, 500, { error: error instanceof Error ? error.message : 'Detection failed' });\r\n }\r\n }\r\n\r\n private async handlePostPreview(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\r\n try {\r\n const body = await this.parseBody(req) as { answers: any };\r\n const projectInfo = await detectProject(this.options.cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n this.sendJson(res, 400, { error: 'Invalid NestJS project', details: projectInfo.errors });\r\n return;\r\n }\r\n\r\n const config = buildConfig(\r\n body.answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n const preview = await this.orchestrator.preview(config, projectInfo);\r\n this.sendJson(res, 200, preview);\r\n } catch (error) {\r\n this.sendJson(res, 500, { error: error instanceof Error ? error.message : 'Preview failed' });\r\n }\r\n }\r\n\r\n private async handlePostGenerate(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\r\n if (this.isGenerating) {\r\n this.sendJson(res, 409, { error: 'Generation already in progress' });\r\n return;\r\n }\r\n\r\n try {\r\n const body = await this.parseBody(req) as { answers: any; overwrite?: boolean };\r\n const projectInfo = await detectProject(this.options.cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n this.sendJson(res, 400, { error: 'Invalid NestJS project', details: projectInfo.errors });\r\n return;\r\n }\r\n\r\n const config = buildConfig(\r\n body.answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n // Respond immediately\r\n this.sendJson(res, 202, { status: 'started', message: 'Generation in progress. Follow /api/events for updates.' });\r\n\r\n // Run generation asynchronously\r\n this.isGenerating = true;\r\n const result = await this.orchestrator.generate({\r\n config,\r\n projectInfo,\r\n overwrite: body.overwrite || !!projectInfo.authExists,\r\n });\r\n this.isGenerating = false;\r\n\r\n // Broadcast final result\r\n this.broadcastEvent('generation-complete', result);\r\n\r\n // Schedule shutdown after success\r\n if (result.success) {\r\n setTimeout(() => {\r\n this.broadcastEvent('server-shutdown', { message: 'Generation complete. Server shutting down.' });\r\n setTimeout(() => this.shutdown(), 2000);\r\n }, 5000);\r\n }\r\n } catch (error) {\r\n this.isGenerating = false;\r\n this.broadcastEvent('generation-complete', {\r\n success: false,\r\n filesCreated: [],\r\n filesSkipped: [],\r\n errors: [error instanceof Error ? error.message : 'Unknown error'],\r\n warnings: [],\r\n });\r\n }\r\n }\r\n\r\n private handleGetEvents(req: http.IncomingMessage, res: http.ServerResponse): void {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n 'X-Accel-Buffering': 'no',\r\n });\r\n\r\n res.write(`event: connected\\ndata: ${JSON.stringify({ timestamp: Date.now() })}\\n\\n`);\r\n\r\n this.sseClients.add(res);\r\n\r\n const heartbeat = setInterval(() => {\r\n try {\r\n res.write(`: heartbeat\\n\\n`);\r\n } catch {\r\n clearInterval(heartbeat);\r\n this.sseClients.delete(res);\r\n }\r\n }, 15000);\r\n\r\n req.on('close', () => {\r\n this.sseClients.delete(res);\r\n clearInterval(heartbeat);\r\n });\r\n }\r\n\r\n private handlePostShutdown(res: http.ServerResponse): void {\r\n this.sendJson(res, 200, { ok: true });\r\n setTimeout(() => this.shutdown(), 500);\r\n }\r\n\r\n private parseBody(req: http.IncomingMessage): Promise<unknown> {\r\n return new Promise((resolve, reject) => {\r\n const chunks: Buffer[] = [];\r\n let size = 0;\r\n const MAX_SIZE = 1024 * 1024; // 1MB\r\n\r\n req.on('data', (chunk: Buffer) => {\r\n size += chunk.length;\r\n if (size > MAX_SIZE) {\r\n reject(new Error('Request body too large'));\r\n req.destroy();\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on('end', () => {\r\n try {\r\n const body = Buffer.concat(chunks).toString('utf-8');\r\n resolve(body ? JSON.parse(body) : {});\r\n } catch {\r\n reject(new Error('Invalid JSON body'));\r\n }\r\n });\r\n\r\n req.on('error', reject);\r\n });\r\n }\r\n\r\n private sendJson(res: http.ServerResponse, status: number, data: unknown): void {\r\n res.writeHead(status, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(data));\r\n }\r\n}\r\n","export { GuiServer } from './server.js';\r\nexport type { GuiServerOptions } from './server.js';\r\nexport { GuiOrchestrator } from './orchestrator.js';\r\n","/**\r\n * CLI UI utilities - colors, spinners, banners\r\n */\r\n\r\nimport chalk from 'chalk';\r\nimport ora, { Ora } from 'ora';\r\nimport { readFileSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Get version from package.json\r\nfunction getVersion(): string {\r\n try {\r\n const packageJsonPath = join(__dirname, '../package.json');\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\r\n return packageJson.version;\r\n } catch (error) {\r\n return '1.0.0'; // Fallback version\r\n }\r\n}\r\n\r\n/**\r\n * ASCII art banner\r\n */\r\nexport function showBanner(): void {\r\n console.log(chalk.cyan(`\r\n _ _ _ __ __\r\n / \\\\ _ _| |_| |__ | \\\\/ | ___\r\n / _ \\\\| | | | __| '_ \\\\| |\\\\/| |/ _ \\\\\r\n / ___ \\\\ |_| | |_| | | | | | | __/\r\n /_/ \\\\_\\\\__,_|\\\\__|_| |_|_| |_|\\\\___|\r\n `));\r\n console.log(chalk.bold(`šŸ” AuthMe - NestJS Auth Generator v${getVersion()}`));\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show project analysis results\r\n */\r\nexport function showProjectInfo(info: {\r\n nestVersion?: string;\r\n orm: string;\r\n sourceRoot: string;\r\n}) {\r\n console.log(chalk.green('āœ“'), `Detected NestJS ${info.nestVersion || 'project'}`);\r\n if (info.orm !== 'none') {\r\n console.log(chalk.green('āœ“'), `Found ${info.orm.toUpperCase()}`);\r\n }\r\n console.log(chalk.green('āœ“'), `Source directory: ${info.sourceRoot}/`);\r\n console.log(chalk.green('āœ“'), 'No existing auth module found');\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show error message\r\n */\r\nexport function showError(message: string, errors?: string[]): void {\r\n console.log();\r\n console.log(chalk.red('āŒ Error:'), chalk.bold(message));\r\n if (errors && errors.length > 0) {\r\n console.log();\r\n errors.forEach((error) => {\r\n console.log(chalk.red(' •'), error);\r\n });\r\n }\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show help for creating a NestJS project\r\n */\r\nexport function showNestJSHelp(): void {\r\n console.log(chalk.yellow('To create a new NestJS project:'));\r\n console.log();\r\n console.log(chalk.cyan(' npm i -g @nestjs/cli'));\r\n console.log(chalk.cyan(' nest new my-project'));\r\n console.log();\r\n}\r\n\r\n/**\r\n * Show success message\r\n */\r\nexport function showSuccess(stats: {\r\n filesCreated: number;\r\n dependenciesAdded: number;\r\n jwt: { accessExpiration: string; refreshExpiration?: string };\r\n orm?: string;\r\n swagger?: boolean;\r\n emailVerification?: boolean;\r\n resetPassword?: boolean;\r\n prismaSchemaUpdated?: boolean;\r\n}): void {\r\n console.log();\r\n console.log(chalk.green.bold('šŸŽ‰ Success!'), 'Authentication module generated.');\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“ Files created:'));\r\n console.log(` • ${stats.filesCreated} new files in src/auth/ and src/users/`);\r\n console.log(` • Updated src/app.module.ts`);\r\n console.log(` • Updated package.json`);\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“¦ Dependencies added:'));\r\n console.log(` • @nestjs/jwt, @nestjs/passport, @nestjs/config`);\r\n console.log(` • passport, passport-jwt, passport-local`);\r\n console.log(` • bcrypt, class-validator, class-transformer`);\r\n if (stats.orm === 'prisma') {\r\n console.log(` • @prisma/client, prisma`);\r\n }\r\n if (stats.swagger) {\r\n console.log(` • @nestjs/swagger`);\r\n }\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ” JWT Configuration:'));\r\n console.log(` • Access token: ${stats.jwt.accessExpiration}`);\r\n if (stats.jwt.refreshExpiration) {\r\n console.log(` • Refresh token: ${stats.jwt.refreshExpiration}`);\r\n }\r\n console.log(` • Secret: Auto-generated (see .env)`);\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“‹ Next steps:'));\r\n console.log(chalk.cyan(' 1. Review .env file (auto-generated with secure secret)'));\r\n console.log(chalk.gray(' # .env.example is also provided as a git-safe reference'));\r\n console.log();\r\n\r\n if (stats.orm === 'prisma') {\r\n if (stats.prismaSchemaUpdated) {\r\n console.log(chalk.cyan(' 2. Run Prisma migration'));\r\n console.log(chalk.gray(' npx prisma migrate dev --name add-auth-models'));\r\n console.log(chalk.gray(' npx prisma generate'));\r\n } else {\r\n console.log(chalk.cyan(' 2. Add Prisma schema models manually'));\r\n console.log(chalk.gray(' # Check src/auth/README.md for the model definitions'));\r\n console.log(chalk.gray(' npx prisma migrate dev --name add-auth-models'));\r\n console.log(chalk.gray(' npx prisma generate'));\r\n }\r\n } else {\r\n console.log(chalk.cyan(' 2. Create database migration (if using TypeORM)'));\r\n console.log(chalk.gray(' npm run migration:generate -- src/migrations/CreateUserTable'));\r\n console.log(chalk.gray(' npm run migration:run'));\r\n }\r\n console.log();\r\n console.log(chalk.cyan(' 3. Start your NestJS app'));\r\n console.log(chalk.gray(' npm run start:dev'));\r\n console.log();\r\n console.log(chalk.cyan(' 4. Test authentication endpoints'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/register'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/login'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/change-password (requires JWT)'));\r\n if (stats.emailVerification) {\r\n console.log(chalk.gray(' GET http://localhost:3000/auth/verify-email?token=...'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/resend-verification'));\r\n }\r\n if (stats.resetPassword) {\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/forgot-password'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/reset-password'));\r\n }\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/refresh'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/logout (requires JWT)'));\r\n console.log(chalk.gray(' POST http://localhost:3000/auth/logout-all (requires JWT)'));\r\n console.log(chalk.gray(' GET http://localhost:3000/users/profile (requires JWT)'));\r\n if (stats.swagger) {\r\n console.log();\r\n console.log(chalk.cyan(' 5. View Swagger API documentation'));\r\n console.log(chalk.gray(' http://localhost:3000/api'));\r\n }\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ“– Full documentation:'), 'src/auth/README.md');\r\n console.log();\r\n\r\n console.log(chalk.bold('šŸ’” Tips:'));\r\n console.log(' • Use @Public() decorator for routes that don\\'t require auth');\r\n console.log(' • Use @Roles(\\'Admin\\') to restrict routes by role');\r\n console.log(' • Access current user with @CurrentUser() decorator');\r\n if (stats.swagger) {\r\n console.log(' • Visit /api for interactive Swagger documentation');\r\n }\r\n console.log();\r\n}\r\n\r\n/**\r\n * Create a spinner\r\n */\r\nexport function createSpinner(text: string): Ora {\r\n return ora({\r\n text,\r\n color: 'cyan',\r\n });\r\n}\r\n","/**\r\n * Export generator modules\r\n */\r\n\r\nexport * from './generator.js';\r\nexport * from './template-engine.js';\r\nexport * from './file-writer.js';\r\n","/**\r\n * Main CLI orchestrator\r\n */\r\n\r\nimport * as path from 'path';\r\nimport { detectProject } from './analyzer/index.js';\r\nimport { promptConfig, buildConfig, getDefaultAnswers } from './cli/prompts.js';\r\nimport {\r\n showBanner,\r\n showProjectInfo,\r\n showError,\r\n showNestJSHelp,\r\n showSuccess,\r\n createSpinner,\r\n} from './cli/ui.js';\r\n\r\nexport interface RunOptions {\r\n yes?: boolean;\r\n}\r\n\r\nexport async function run(cwd: string = process.cwd(), options: RunOptions = {}): Promise<void> {\r\n // Show banner\r\n showBanner();\r\n\r\n // Analyze project\r\n const spinner = createSpinner('Analyzing project...').start();\r\n\r\n const projectInfo = await detectProject(cwd);\r\n\r\n if (!projectInfo.isValid) {\r\n spinner.fail('Project validation failed');\r\n showError('Not a valid NestJS project', projectInfo.errors);\r\n showNestJSHelp();\r\n process.exit(1);\r\n }\r\n\r\n spinner.succeed('Project analyzed');\r\n\r\n // Show detected info\r\n showProjectInfo({\r\n nestVersion: projectInfo.nestVersion,\r\n orm: projectInfo.orm,\r\n sourceRoot: projectInfo.sourceRoot,\r\n });\r\n\r\n // Check if auth module already exists\r\n if (projectInfo.authExists) {\r\n if (options.yes) {\r\n console.log('\\n auth/ directory already exists. Use interactive mode to overwrite.\\n');\r\n process.exit(0);\r\n }\r\n const inquirer = (await import('inquirer')).default;\r\n const { overwrite } = await inquirer.prompt([{\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: 'auth/ directory already exists. Overwrite existing files?',\r\n default: false,\r\n }]);\r\n if (!overwrite) {\r\n console.log('\\nā­ļø Cancelled. Existing auth module unchanged.\\n');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Prompt for configuration (or use defaults with --yes)\r\n const answers = options.yes\r\n ? getDefaultAnswers(projectInfo.orm, projectInfo.database)\r\n : await promptConfig(projectInfo.orm, projectInfo.database);\r\n\r\n // Build configuration\r\n const config = buildConfig(\r\n answers,\r\n projectInfo.root.split(/[/\\\\]/).pop() || 'project',\r\n projectInfo.sourceRoot,\r\n projectInfo.orm,\r\n projectInfo.database\r\n );\r\n\r\n console.log();\r\n console.log('āš™ļø Generating authentication module...');\r\n console.log();\r\n\r\n // Generate files\r\n const { Generator } = await import('./generator/index.js');\r\n const generator = new Generator();\r\n\r\n const genSpinner = createSpinner('Generating files from templates...').start();\r\n\r\n const result = await generator.generate(config, projectInfo, !!projectInfo.authExists);\r\n\r\n if (!result.success) {\r\n genSpinner.fail('Generation failed');\r\n showError('Failed to generate files', [result.error || 'Unknown error']);\r\n process.exit(1);\r\n }\r\n\r\n genSpinner.succeed(`Generated ${result.filesCreated.length} files`);\r\n\r\n if (result.filesSkipped.length > 0) {\r\n console.log(` āš ļø Skipped ${result.filesSkipped.length} existing file(s)`);\r\n }\r\n\r\n // Update app.module.ts with AST\r\n const astSpinner = createSpinner('Updating app.module.ts...').start();\r\n\r\n try {\r\n const { AppModuleUpdater } = await import('./installer/index.js');\r\n const astUpdater = new AppModuleUpdater(projectInfo.appModulePath);\r\n await astUpdater.update(config);\r\n await astUpdater.cleanupBackup();\r\n astSpinner.succeed('Updated app.module.ts');\r\n } catch (error) {\r\n astSpinner.fail('Failed to update app.module.ts');\r\n showError(\r\n 'AST modification failed',\r\n [error instanceof Error ? error.message : 'Unknown error']\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Update prisma/schema.prisma (if Prisma ORM)\r\n let prismaSchemaUpdated = false;\r\n if (config.orm === 'prisma') {\r\n const prismaSpinner = createSpinner('Updating prisma/schema.prisma...').start();\r\n\r\n try {\r\n const { PrismaSchemaUpdater } = await import('./installer/index.js');\r\n const schemaPath = path.join(projectInfo.root, 'prisma', 'schema.prisma');\r\n const prismaUpdater = new PrismaSchemaUpdater(schemaPath);\r\n const prismaResult = await prismaUpdater.update(config);\r\n\r\n if (prismaResult.updated) {\r\n await prismaUpdater.cleanupBackup();\r\n prismaSpinner.succeed(prismaResult.message);\r\n prismaSchemaUpdated = true;\r\n } else {\r\n prismaSpinner.warn(prismaResult.message);\r\n }\r\n } catch (error) {\r\n prismaSpinner.warn(\r\n `Could not update prisma/schema.prisma: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n\r\n // Update main.ts with global guards\r\n const mainSpinner = createSpinner('Updating main.ts with global guards...').start();\r\n\r\n try {\r\n const { MainTsUpdater } = await import('./installer/index.js');\r\n const mainUpdater = new MainTsUpdater(projectInfo.mainTsPath);\r\n await mainUpdater.update(config);\r\n await mainUpdater.cleanupBackup();\r\n mainSpinner.succeed('Updated main.ts with global JWT guard');\r\n } catch (error) {\r\n mainSpinner.warn('Could not auto-update main.ts (see main.ts.example for manual setup)');\r\n }\r\n\r\n // Update package.json\r\n const pkgSpinner = createSpinner('Updating package.json...').start();\r\n\r\n try {\r\n const { PackageUpdater } = await import('./installer/index.js');\r\n const pkgUpdater = new PackageUpdater(projectInfo.packageJsonPath);\r\n await pkgUpdater.update(config);\r\n await pkgUpdater.cleanupBackup();\r\n pkgSpinner.succeed('Updated package.json');\r\n } catch (error) {\r\n pkgSpinner.fail('Failed to update package.json');\r\n showError(\r\n 'Package update failed',\r\n [error instanceof Error ? error.message : 'Unknown error']\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Install dependencies\r\n if (config.autoInstall) {\r\n const installSpinner = createSpinner('Installing dependencies...').start();\r\n\r\n try {\r\n const { DependencyInstaller } = await import('./installer/index.js');\r\n const installer = new DependencyInstaller();\r\n await installer.install(projectInfo.root);\r\n installSpinner.succeed('Dependencies installed');\r\n } catch (error) {\r\n installSpinner.fail('Failed to install dependencies');\r\n console.log(\r\n '\\nāš ļø Please run npm install manually to install dependencies\\n'\r\n );\r\n }\r\n }\r\n\r\n // Show success message\r\n showSuccess({\r\n filesCreated: result.filesCreated.length,\r\n dependenciesAdded: 8,\r\n jwt: {\r\n accessExpiration: config.jwt.accessExpiration,\r\n refreshExpiration: config.features.refreshTokens\r\n ? config.jwt.refreshExpiration\r\n : undefined,\r\n },\r\n orm: config.orm,\r\n swagger: config.features.swagger,\r\n emailVerification: config.features.emailVerification,\r\n resetPassword: config.features.resetPassword,\r\n prismaSchemaUpdated,\r\n });\r\n\r\n console.log('šŸ› Issues? https://github.com/Islamawad132/add-nest-auth/issues');\r\n console.log('⭐ Like it? https://www.npmjs.com/package/nest-authme');\r\n console.log();\r\n}\r\n","/**\r\n * CLI entry point\r\n */\r\n\r\nimport { Command } from 'commander';\r\n\r\n// Handle unhandled rejections\r\nprocess.on('unhandledRejection', (error) => {\r\n console.error('Unhandled rejection:', error);\r\n process.exit(1);\r\n});\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('nest-authme')\r\n .description('Add production-ready authentication to any NestJS project')\r\n .version('1.1.0')\r\n .option('-y, --yes', 'Skip all prompts and use sensible defaults')\r\n .option('-g, --gui', 'Launch web-based GUI mode')\r\n .option('--port <number>', 'Port for GUI server (default: auto)', parseInt)\r\n .action(async (options) => {\r\n try {\r\n // If --gui flag, launch GUI directly\r\n if (options.gui) {\r\n const { GuiServer } = await import('./gui/index.js');\r\n const server = new GuiServer({\r\n cwd: process.cwd(),\r\n port: options.port,\r\n autoOpen: true,\r\n });\r\n await server.start();\r\n\r\n process.on('SIGINT', () => {\r\n server.shutdown();\r\n });\r\n return;\r\n }\r\n\r\n // If --yes flag, run CLI directly\r\n if (options.yes) {\r\n const { run } = await import('./index.js');\r\n await run(process.cwd(), { yes: true });\r\n return;\r\n }\r\n\r\n // Interactive mode: ask user to choose CLI or GUI\r\n const inquirer = (await import('inquirer')).default;\r\n const { mode } = await inquirer.prompt([{\r\n type: 'list',\r\n name: 'mode',\r\n message: 'Choose your interface:',\r\n choices: [\r\n { name: 'CLI — Terminal-based prompts', value: 'cli' },\r\n { name: 'GUI — Web-based visual interface', value: 'gui' },\r\n ],\r\n default: 'cli',\r\n }]);\r\n\r\n if (mode === 'gui') {\r\n const { GuiServer } = await import('./gui/index.js');\r\n const server = new GuiServer({\r\n cwd: process.cwd(),\r\n port: options.port,\r\n autoOpen: true,\r\n });\r\n await server.start();\r\n\r\n process.on('SIGINT', () => {\r\n server.shutdown();\r\n });\r\n } else {\r\n const { run } = await import('./index.js');\r\n await run(process.cwd(), { yes: false });\r\n }\r\n } catch (error) {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n }\r\n });\r\n\r\nprogram.parse();\r\n"],"mappings":"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","names":["inquirer","answers","path","fs","Handlebars","path","fs","path","fs","import_ts_morph","fs","fs","fs","import_execa","path","fs","AppModuleUpdater","PrismaSchemaUpdater","MainTsUpdater","PackageUpdater","DependencyInstaller","path","fs","chalk","ora","init_generator","inquirer","Generator","AppModuleUpdater","PrismaSchemaUpdater","MainTsUpdater","PackageUpdater","DependencyInstaller","path","GuiServer","run","inquirer"]}