larats 1.0.0 β†’ 1.0.2

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/detector.ts","../src/scanner.ts","../src/generator/markdown.ts","../src/generator/scaffolder.ts","../src/templates/laravel.ts","../src/templates/typescript.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { detectProjectType, type ProjectInfo } from './detector.js';\nimport { scanProject } from './scanner.js';\nimport { generateArchitectureMarkdown } from './generator/markdown.js';\nimport { scaffoldModule, type ScaffoldResult } from './generator/scaffolder.js';\n\nconst VERSION = '1.0.0';\n\nfunction showHelp() {\n console.log(`\n${pc.bold(pc.cyan('LaraTS CLI'))} ${pc.gray(`v${VERSION}`)}\n${pc.gray('Smart Architecture Visualizer & Contextual Module Scaffolder')}\n\n${pc.bold('USAGE:')}\n ${pc.cyan('$')} npx larats [command] [options]\n ${pc.cyan('$')} larats [command] [options]\n\n${pc.bold('COMMANDS:')}\n ${pc.green('scan')} Scan repository & generate ARCHITECTURE.md\n ${pc.green('scaffold')}, ${pc.green('make')} [name] Scaffold a new module or feature with clean boilerplate\n ${pc.green('info')} Show detected project type & architectural flavor\n ${pc.green('help')} Display this help message\n\n${pc.bold('OPTIONS:')}\n ${pc.yellow('-o, --output')} <file> Output markdown path for scan (default: ARCHITECTURE.md)\n ${pc.yellow('-m, --modular')} Enforce modular directory structure\n ${pc.yellow('-s, --standard')} Enforce standard/layered directory structure\n ${pc.yellow('--dry-run')} Simulate generation without writing files\n ${pc.yellow('-f, --force')} Overwrite files if they already exist\n ${pc.yellow('-v, --version')} Display CLI version\n ${pc.yellow('-h, --help')} Display this help message\n\n${pc.bold('EXAMPLES:')}\n ${pc.cyan('$')} larats\n ${pc.cyan('$')} larats scan\n ${pc.cyan('$')} larats scan --output docs/ARCHITECTURE.md\n ${pc.cyan('$')} larats scaffold Payment\n ${pc.cyan('$')} larats make Order --modular\n`);\n}\n\n/**\n * Handle cancellation gracefully\n */\nfunction handleCancel(): never {\n p.cancel(pc.yellow('Operation cancelled. See you next time! πŸ‘‹'));\n process.exit(0);\n}\n\n/**\n * Execute scan workflow\n */\nasync function runScan(projectInfo: ProjectInfo, outputPath: string = 'ARCHITECTURE.md') {\n const spinner = p.spinner();\n spinner.start('Scanning codebase structure & components (strict ignore list active)...');\n\n try {\n const scanResult = await scanProject(projectInfo);\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms`));\n\n const markdown = generateArchitectureMarkdown(scanResult);\n const destination = path.resolve(projectInfo.rootPath, outputPath);\n\n // Ensure output directory exists if custom path\n const parentDir = path.dirname(destination);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(destination, markdown, 'utf-8');\n\n // Display summary\n p.note(\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Components Identified:')} ${Object.keys(scanResult.components).length}\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Documentation:')} Saved to ${pc.cyan(path.relative(projectInfo.rootPath, destination) || outputPath)}`,\n pc.green('Architecture Map Generated! πŸ—ΊοΈ')\n );\n\n p.outro(pc.cyan(`Open ${outputPath} to view your project structure & Mermaid diagram!`));\n } catch (err: any) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(err.message || String(err));\n }\n}\n\n/**\n * Execute scaffold workflow\n */\nasync function runScaffold(\n projectInfo: ProjectInfo,\n moduleNameArg?: string,\n cliOptions: { modular?: boolean; standard?: boolean; force?: boolean; dryRun?: boolean } = {}\n) {\n let moduleName = moduleNameArg;\n\n if (!moduleName) {\n const input = await p.text({\n message: 'What is the name of the new module or feature?',\n placeholder: 'e.g. Payment, Order, UserProfile',\n validate(val) {\n if (!val || !val.trim()) return 'Module name cannot be empty.';\n if (!/^[a-zA-Z0-9_-]+$/.test(val.trim())) return 'Use only alphanumeric characters, dashes, or underscores.';\n },\n });\n\n if (p.isCancel(input)) handleCancel();\n moduleName = input.trim();\n }\n\n // Component selection based on project type\n let selectedComponents: string[] = [];\n\n if (projectInfo.type === 'laravel') {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'model', label: 'Eloquent Model', hint: 'Includes table name, fillables, and casts' },\n { value: 'controller', label: 'Resourceful Controller', hint: 'Includes standard CRUD methods & DI service' },\n { value: 'service', label: 'Service Class', hint: 'Encapsulated business logic operations' },\n { value: 'action', label: 'Single Action Class', hint: 'Invokable single-responsibility class' },\n { value: 'request', label: 'Form Request', hint: 'Request validation rules & authorization' },\n { value: 'migration', label: 'Database Migration', hint: 'Schema definition with timestamps' },\n ],\n initialValues: ['model', 'controller', 'service', 'request', 'migration'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n } else {\n // TypeScript or fallback\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'controller', label: 'Controller', hint: 'Express request handlers & response orchestration' },\n { value: 'service', label: 'Service', hint: 'Application logic & repository coordination' },\n { value: 'repository', label: 'Repository', hint: 'Data persistence abstraction & queries' },\n { value: 'route', label: 'Router & Routes', hint: 'Express router mapping endpoints to controller' },\n { value: 'dto', label: 'DTOs & Interfaces', hint: 'Typed interfaces for entities and payloads' },\n ],\n initialValues: ['controller', 'service', 'repository', 'route', 'dto'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Determine modular vs standard structure\n let isModular = true;\n if (cliOptions.modular) {\n isModular = true;\n } else if (cliOptions.standard) {\n isModular = false;\n } else {\n const defaultModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n\n const structurePrompt = await p.select({\n message: 'Choose folder architecture structure:',\n options: projectInfo.type === 'laravel'\n ? [\n {\n value: 'modular',\n label: 'Modular Domain Structure',\n hint: `app/Modules/${moduleName}/[Models, Controllers, Services]`,\n },\n {\n value: 'standard',\n label: 'Standard Laravel Structure',\n hint: `app/Models, app/Http/Controllers, app/Services`,\n },\n ]\n : [\n {\n value: 'modular',\n label: 'Modular Feature Structure',\n hint: `src/modules/${moduleName.toLowerCase()}/...`,\n },\n {\n value: 'standard',\n label: 'Layered Folder Structure',\n hint: `src/controllers, src/services, src/routes...`,\n },\n ],\n initialValue: defaultModular ? 'modular' : 'standard',\n });\n\n if (p.isCancel(structurePrompt)) handleCancel();\n isModular = structurePrompt === 'modular';\n }\n\n const spinner = p.spinner();\n spinner.start(`Generating boilerplate files for ${pc.cyan(moduleName)}...`);\n\n const result: ScaffoldResult = await scaffoldModule(projectInfo, {\n moduleName,\n components: selectedComponents,\n isModular,\n dryRun: cliOptions.dryRun,\n forceOverwrite: cliOptions.force,\n });\n\n spinner.stop('Generation finished!');\n\n // Report files status\n const fileLines = result.files.map((f) => {\n if (f.status === 'created') {\n return ` ${pc.green('βœ”')} ${f.relativeFilePath} ${pc.gray('(created)')}`;\n } else if (f.status === 'skipped') {\n return ` ${pc.yellow('⚠')} ${f.relativeFilePath} ${pc.yellow(`(skipped - ${f.reason})`)}`;\n } else {\n return ` ${pc.red('βœ–')} ${f.relativeFilePath} ${pc.red(`(error - ${f.reason})`)}`;\n }\n });\n\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Summary:')} ${pc.green(`${result.createdCount} created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Module Scaffolding: ${moduleName}`)\n );\n\n if (result.skippedCount > 0 && !cliOptions.force) {\n p.log.warn(pc.yellow('Anti-Overwrite Protection prevented modifying existing files. Use --force to overwrite if intended.'));\n }\n\n p.outro(pc.green(`✨ Successfully scaffolded ${moduleName} module!`));\n}\n\n/**\n * Display quick project info\n */\nfunction showProjectInfo(projectInfo: ProjectInfo) {\n let details = `${pc.bold('Project Name:')} ${projectInfo.name}\\n` +\n `${pc.bold('Project Type:')} ${projectInfo.type.toUpperCase()}\\n` +\n `${pc.bold('Flavor / Stack:')} ${projectInfo.summary}\\n` +\n `${pc.bold('Working Path:')} ${projectInfo.rootPath}`;\n\n if (projectInfo.type === 'laravel' && projectInfo.laravel) {\n details += `\\n${pc.bold('Filament Admin:')} ${projectInfo.laravel.hasFilament ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Livewire:')} ${projectInfo.laravel.hasLivewire ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Inertia.js:')} ${projectInfo.laravel.hasInertia ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular App:')} ${projectInfo.laravel.isModular ? pc.green('Yes') : 'No'}`;\n } else if (projectInfo.type === 'typescript' && projectInfo.typescript) {\n details += `\\n${pc.bold('Framework:')} ${projectInfo.typescript.framework}` +\n `\\n${pc.bold('Prisma ORM:')} ${projectInfo.typescript.hasPrisma ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Monorepo:')} ${projectInfo.typescript.isMonorepo ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular Src:')} ${projectInfo.typescript.isModular ? pc.green('Yes') : 'No'}`;\n }\n\n p.note(details, pc.cyan('Detected Project Architecture'));\n}\n\n/**\n * CLI Main Entrypoint\n */\nasync function main() {\n const args = process.argv.slice(2);\n\n // Flags check\n if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {\n showHelp();\n return;\n }\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(`larats v${VERSION}`);\n return;\n }\n\n // Parse simple CLI flags\n let outputPath = 'ARCHITECTURE.md';\n const outputIdx = args.findIndex((a) => a === '--output' || a === '-o');\n if (outputIdx !== -1 && args[outputIdx + 1]) {\n outputPath = args[outputIdx + 1];\n }\n\n const isModularFlag = args.includes('--modular') || args.includes('-m');\n const isStandardFlag = args.includes('--standard') || args.includes('-s');\n const isForceFlag = args.includes('--force') || args.includes('-f');\n const isDryRunFlag = args.includes('--dry-run');\n\n const command = args[0] && !args[0].startsWith('-') ? args[0] : null;\n\n // Auto-detect project type in current working directory\n const projectInfo = await detectProjectType(process.cwd());\n\n // Non-interactive command routing\n if (command === 'scan') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Scanning Architecture`);\n p.log.info(`Detected: ${pc.green(projectInfo.summary)}`);\n await runScan(projectInfo, outputPath);\n return;\n }\n\n if (command === 'scaffold' || command === 'make') {\n const moduleName = args[1] && !args[1].startsWith('-') ? args[1] : undefined;\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Module Scaffolder`);\n p.log.info(`Target Project: ${pc.green(projectInfo.summary)}`);\n await runScaffold(projectInfo, moduleName, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n return;\n }\n\n if (command === 'info') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)}`);\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done.'));\n return;\n }\n\n // Interactive Menu Mode\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.bold('Smart Architecture Visualizer & Scaffolder')} ${pc.gray(`v${VERSION}`)}`);\n\n p.log.info(`Working Directory: ${pc.gray(process.cwd())}`);\n p.log.info(`Detected Architecture: ${pc.bold(pc.green(projectInfo.summary))}`);\n\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n {\n value: 'scan',\n label: 'πŸ” Scan Architecture & Generate ARCHITECTURE.md',\n hint: 'Creates component stats, directory tree & Mermaid flowchart',\n },\n {\n value: 'scaffold',\n label: 'πŸ—οΈ Scaffold New Feature / Module',\n hint: 'Interactively generate boilerplate components with safety checks',\n },\n {\n value: 'info',\n label: 'πŸ“Š Inspect Detected Architecture Details',\n hint: 'View detected frameworks, ORMs, and configurations',\n },\n {\n value: 'exit',\n label: 'πŸšͺ Exit',\n },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n handleCancel();\n }\n\n if (action === 'scan') {\n await runScan(projectInfo, outputPath);\n } else if (action === 'scaffold') {\n await runScaffold(projectInfo, undefined, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'info') {\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done!'));\n }\n}\n\nmain().catch((err) => {\n p.log.error(pc.red(`Fatal error: ${err.message || String(err)}`));\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type ProjectType = 'laravel' | 'typescript' | 'unknown';\n\nexport interface LaravelDetails {\n version?: string;\n hasFilament: boolean;\n hasLivewire: boolean;\n hasInertia: boolean;\n hasSanctum: boolean;\n isModular: boolean;\n modulesDir?: string;\n}\n\nexport interface TypeScriptDetails {\n framework: 'express' | 'nest' | 'fastify' | 'hono' | 'react' | 'next' | 'vue' | 'node-vanilla' | 'unknown';\n hasPrisma: boolean;\n hasTypeORM: boolean;\n hasDrizzle: boolean;\n isMonorepo: boolean;\n isModular: boolean;\n srcDir: string;\n}\n\nexport interface ProjectInfo {\n type: ProjectType;\n name: string;\n rootPath: string;\n laravel?: LaravelDetails;\n typescript?: TypeScriptDetails;\n summary: string;\n}\n\n/**\n * Safely parse a JSON file without throwing errors.\n */\nfunction readJsonSafe<T = any>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect the project type and architectural characteristics of the target directory.\n */\nexport async function detectProjectType(targetDir: string = process.cwd()): Promise<ProjectInfo> {\n const resolvedDir = path.resolve(targetDir);\n const dirName = path.basename(resolvedDir);\n\n const hasArtisan = fs.existsSync(path.join(resolvedDir, 'artisan'));\n const composerPath = path.join(resolvedDir, 'composer.json');\n const hasComposer = fs.existsSync(composerPath);\n\n const tsconfigPath = path.join(resolvedDir, 'tsconfig.json');\n const hasTsConfig = fs.existsSync(tsconfigPath);\n const packageJsonPath = path.join(resolvedDir, 'package.json');\n const hasPackageJson = fs.existsSync(packageJsonPath);\n\n // 1. Check for Laravel Project\n if (hasArtisan && hasComposer) {\n const composerData = readJsonSafe<{\n name?: string;\n require?: Record<string, string>;\n 'require-dev'?: Record<string, string>;\n }>(composerPath);\n\n const allDeps = {\n ...(composerData?.require || {}),\n ...(composerData?.['require-dev'] || {}),\n };\n\n const hasFilament = Object.keys(allDeps).some((dep) => dep.startsWith('filament/'));\n const hasLivewire = 'livewire/livewire' in allDeps;\n const hasInertia = 'inertiajs/inertia-laravel' in allDeps;\n const hasSanctum = 'laravel/sanctum' in allDeps;\n\n const rawVersion = allDeps['laravel/framework'] || '';\n const cleanVersion = rawVersion.replace(/[\\^~><=]/g, '').trim();\n\n // Check for modular architecture\n const appModulesDir = path.join(resolvedDir, 'app', 'Modules');\n const rootModulesDir = path.join(resolvedDir, 'modules');\n const isModular = fs.existsSync(appModulesDir) || fs.existsSync(rootModulesDir);\n const modulesDir = fs.existsSync(appModulesDir)\n ? 'app/Modules'\n : fs.existsSync(rootModulesDir)\n ? 'modules'\n : undefined;\n\n const extras: string[] = [];\n if (hasFilament) extras.push('Filament');\n if (hasLivewire) extras.push('Livewire');\n if (hasInertia) extras.push('Inertia');\n if (isModular) extras.push('Modular Architecture');\n\n const summary = `Laravel ${cleanVersion || ''}${extras.length > 0 ? ` (${extras.join(', ')})` : ''}`.trim();\n\n return {\n type: 'laravel',\n name: composerData?.name?.split('/')[1] || dirName,\n rootPath: resolvedDir,\n laravel: {\n version: cleanVersion || undefined,\n hasFilament,\n hasLivewire,\n hasInertia,\n hasSanctum,\n isModular,\n modulesDir,\n },\n summary,\n };\n }\n\n // 2. Check for TypeScript Project\n if (hasTsConfig && hasPackageJson) {\n const pkg = readJsonSafe<{\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: any;\n }>(packageJsonPath);\n\n const allDeps = {\n ...(pkg?.dependencies || {}),\n ...(pkg?.devDependencies || {}),\n };\n\n let framework: TypeScriptDetails['framework'] = 'unknown';\n if ('@nestjs/core' in allDeps) framework = 'nest';\n else if ('next' in allDeps) framework = 'next';\n else if ('express' in allDeps) framework = 'express';\n else if ('fastify' in allDeps) framework = 'fastify';\n else if ('hono' in allDeps) framework = 'hono';\n else if ('react' in allDeps) framework = 'react';\n else if ('vue' in allDeps) framework = 'vue';\n else framework = 'node-vanilla';\n\n const hasPrisma = 'prisma' in allDeps || '@prisma/client' in allDeps || fs.existsSync(path.join(resolvedDir, 'prisma'));\n const hasTypeORM = 'typeorm' in allDeps;\n const hasDrizzle = 'drizzle-orm' in allDeps;\n\n const isMonorepo =\n Boolean(pkg?.workspaces) ||\n fs.existsSync(path.join(resolvedDir, 'pnpm-workspace.yaml')) ||\n fs.existsSync(path.join(resolvedDir, 'turbo.json')) ||\n fs.existsSync(path.join(resolvedDir, 'lerna.json'));\n\n const hasSrc = fs.existsSync(path.join(resolvedDir, 'src'));\n const srcDir = hasSrc ? 'src' : '.';\n const isModular =\n fs.existsSync(path.join(resolvedDir, srcDir, 'modules')) ||\n fs.existsSync(path.join(resolvedDir, 'modules'));\n\n const extras: string[] = [framework !== 'node-vanilla' ? framework : 'TypeScript'];\n if (hasPrisma) extras.push('Prisma');\n if (hasTypeORM) extras.push('TypeORM');\n if (hasDrizzle) extras.push('Drizzle');\n if (isMonorepo) extras.push('Monorepo');\n if (isModular) extras.push('Modular');\n\n const summary = `TypeScript (${extras.join(', ')})`;\n\n return {\n type: 'typescript',\n name: pkg?.name || dirName,\n rootPath: resolvedDir,\n typescript: {\n framework,\n hasPrisma,\n hasTypeORM,\n hasDrizzle,\n isMonorepo,\n isModular,\n srcDir,\n },\n summary,\n };\n }\n\n // 3. Fallback / Unknown Project\n let fallbackName = dirName;\n if (hasPackageJson) {\n const pkg = readJsonSafe<{ name?: string }>(packageJsonPath);\n if (pkg?.name) fallbackName = pkg.name;\n }\n\n return {\n type: 'unknown',\n name: fallbackName,\n rootPath: resolvedDir,\n summary: 'Generic / Unknown Project',\n };\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport fg from 'fast-glob';\nimport type { ProjectInfo } from './detector.js';\n\nexport const SAFE_IGNORE_LIST = [\n // Dependencies & package management\n '**/node_modules/**',\n '**/vendor/**',\n '**/.pnpm/**',\n '**/.yarn/**',\n // Version control\n '**/.git/**',\n '**/.svn/**',\n '**/.hg/**',\n // Storage, cache & build outputs\n '**/storage/**',\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/.turbo/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/.temp/**',\n '**/tmp/**',\n // IDEs & OS files\n '**/.idea/**',\n '**/.vscode/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n // Secrets & environment configurations\n '**/.env*',\n '**/*.pem',\n '**/*.key',\n '**/*.pfx',\n '**/*.cert',\n '**/*.crt',\n '**/*.secret',\n '**/*.id_rsa',\n '**/*.pub',\n // Logs & Lock files\n '**/*.log',\n '**/*.lock',\n '**/package-lock.json',\n '**/yarn.lock',\n '**/pnpm-lock.yaml',\n '**/composer.lock',\n];\n\nexport interface ComponentGroup {\n name: string;\n count: number;\n files: string[];\n description: string;\n}\n\nexport interface ScanResult {\n projectInfo: ProjectInfo;\n totalFilesScanned: number;\n components: Record<string, ComponentGroup>;\n modules: string[];\n directoryTree: string;\n scanDurationMs: number;\n}\n\n/**\n * Build a clean ASCII directory tree representation from a list of relative file paths.\n */\nexport function buildCleanDirectoryTree(files: string[], maxDepth: number = 3): string {\n interface TreeNode {\n name: string;\n isDir: boolean;\n children: Map<string, TreeNode>;\n }\n\n const root: TreeNode = { name: '', isDir: true, children: new Map() };\n\n // Populate tree\n for (const file of files) {\n const parts = file.split(/[/\\\\]/);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n isDir: !isLast,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n }\n }\n\n const lines: string[] = [];\n\n function renderNode(node: TreeNode, prefix: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = Array.from(node.children.values()).sort((a, b) => {\n // Directories first, then files\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n // If at maxDepth and has children, show summary\n if (currentDepth === maxDepth && entries.length > 0) {\n lines.push(`${prefix}└── ... (${entries.length} items hidden)`);\n return;\n }\n\n // Limit files shown per directory if too many\n const maxEntriesPerDir = 8;\n const displayedEntries = entries.slice(0, maxEntriesPerDir);\n const hiddenCount = entries.length - displayedEntries.length;\n\n displayedEntries.forEach((child, index) => {\n const isLast = index === displayedEntries.length - 1 && hiddenCount === 0;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${prefix}${pointer}${displayName}`);\n\n if (child.isDir) {\n const nextPrefix = prefix + (isLast ? ' ' : 'β”‚ ');\n renderNode(child, nextPrefix, currentDepth + 1);\n }\n });\n\n if (hiddenCount > 0) {\n lines.push(`${prefix}└── ... (${hiddenCount} more files/folders)`);\n }\n }\n\n // Render children of root\n const topLevel = Array.from(root.children.values()).sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n topLevel.forEach((child, index) => {\n const isLast = index === topLevel.length - 1;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${pointer}${displayName}`);\n if (child.isDir) {\n const nextPrefix = isLast ? ' ' : 'β”‚ ';\n renderNode(child, nextPrefix, 1);\n }\n });\n\n return lines.join('\\n');\n}\n\n/**\n * Scan project safely using fast-glob and categorize architectural components.\n */\nexport async function scanProject(projectInfo: ProjectInfo): Promise<ScanResult> {\n const startTime = Date.now();\n const root = projectInfo.rootPath;\n\n // Scan all relevant files in repo while respecting SAFE_IGNORE_LIST\n const allFiles = await fg('**/*', {\n cwd: root,\n ignore: SAFE_IGNORE_LIST,\n dot: false,\n onlyFiles: true,\n });\n\n const normalizedFiles = allFiles.map((f) => f.replace(/\\\\/g, '/'));\n const components: Record<string, ComponentGroup> = {};\n const modulesSet = new Set<string>();\n\n if (projectInfo.type === 'laravel') {\n // 1. Models\n const models = normalizedFiles.filter((f) => /^app\\/(Models\\/.*|.*Model)\\.php$/i.test(f));\n components['Models'] = {\n name: 'Eloquent Models',\n count: models.length,\n files: models,\n description: 'Database entity mappings and business logic models',\n };\n\n // 2. Controllers\n const controllers = normalizedFiles.filter((f) => /^app\\/Http\\/Controllers\\/.*\\.php$/i.test(f));\n components['Controllers'] = {\n name: 'HTTP Controllers',\n count: controllers.length,\n files: controllers,\n description: 'Request handling and response orchestration',\n };\n\n // 3. Services\n const services = normalizedFiles.filter((f) => /^app\\/(Services|Domain\\/.*\\/Services)\\/.*\\.php$/i.test(f));\n components['Services'] = {\n name: 'Service Classes',\n count: services.length,\n files: services,\n description: 'Encapsulated business logic and external integrations',\n };\n\n // 4. Actions\n const actions = normalizedFiles.filter((f) => /^app\\/(Actions|Domain\\/.*\\/Actions)\\/.*\\.php$/i.test(f));\n components['Actions'] = {\n name: 'Action Classes',\n count: actions.length,\n files: actions,\n description: 'Single-responsibility invokable operations',\n };\n\n // 5. Form Requests\n const requests = normalizedFiles.filter((f) => /^app\\/Http\\/Requests\\/.*\\.php$/i.test(f));\n components['Form Requests'] = {\n name: 'Form Requests',\n count: requests.length,\n files: requests,\n description: 'Input validation and authorization rules',\n };\n\n // 6. Filament Resources\n const filament = normalizedFiles.filter((f) => /^app\\/Filament\\/.*\\.php$/i.test(f));\n if (filament.length > 0 || projectInfo.laravel?.hasFilament) {\n components['Filament Resources'] = {\n name: 'Filament Admin Resources',\n count: filament.length,\n files: filament,\n description: 'Admin panel CRUD pages, widgets, and schemas',\n };\n }\n\n // 7. Routes\n const routes = normalizedFiles.filter((f) => /^routes\\/.*\\.php$/i.test(f));\n components['Routes'] = {\n name: 'Routing Definitions',\n count: routes.length,\n files: routes,\n description: 'Web, API, and console endpoint routes',\n };\n\n // 8. Database Migrations\n const migrations = normalizedFiles.filter((f) => /^database\\/migrations\\/.*\\.php$/i.test(f));\n components['Migrations'] = {\n name: 'Database Migrations',\n count: migrations.length,\n files: migrations,\n description: 'Schema version control and table definitions',\n };\n\n // Detect Laravel Modules\n const moduleFiles = normalizedFiles.filter((f) => /^app\\/Modules\\/([^/]+)/i.test(f) || /^modules\\/([^/]+)/i.test(f));\n for (const mf of moduleFiles) {\n const match = mf.match(/^(?:app\\/Modules|modules)\\/([^/]+)/i);\n if (match && match[1]) modulesSet.add(match[1]);\n }\n } else if (projectInfo.type === 'typescript') {\n // 1. Controllers\n const controllers = normalizedFiles.filter((f) => /(?:^src\\/.*(?:\\.|\\/)controller\\.(?:ts|js)$)/i.test(f));\n components['Controllers'] = {\n name: 'Controllers',\n count: controllers.length,\n files: controllers,\n description: 'HTTP request handlers and response dispatchers',\n };\n\n // 2. Services\n const services = normalizedFiles.filter((f) => /(?:^src\\/.*(?:\\.|\\/)service\\.(?:ts|js)$)/i.test(f));\n components['Services'] = {\n name: 'Services',\n count: services.length,\n files: services,\n description: 'Core domain logic and application workflows',\n };\n\n // 3. Repositories / Data Access\n const repositories = normalizedFiles.filter((f) => /(?:^src\\/.*(?:\\.|\\/)repository\\.(?:ts|js)$)/i.test(f));\n components['Repositories'] = {\n name: 'Repositories',\n count: repositories.length,\n files: repositories,\n description: 'Data access abstraction and database queries',\n };\n\n // 4. Routes\n const routes = normalizedFiles.filter((f) => /(?:^src\\/.*(?:\\.|\\/)routes?\\.(?:ts|js)$)/i.test(f));\n components['Routes'] = {\n name: 'Routes',\n count: routes.length,\n files: routes,\n description: 'API endpoint mappings and router handlers',\n };\n\n // 5. DTOs & Validation Schemas\n const dtos = normalizedFiles.filter((f) => /(?:^src\\/.*(?:\\.|\\/)(?:dto|schema)\\.(?:ts|js)$)/i.test(f));\n components['DTOs & Schemas'] = {\n name: 'DTOs & Schemas',\n count: dtos.length,\n files: dtos,\n description: 'Data transfer objects and request validation schemas',\n };\n\n // 6. Models / Prisma / Entities\n const models = normalizedFiles.filter((f) =>\n /(?:^src\\/.*(?:\\.|\\/)(?:model|entity)\\.(?:ts|js)$|^prisma\\/schema\\.prisma$)/i.test(f)\n );\n components['Models & Entities'] = {\n name: 'Models & Entities',\n count: models.length,\n files: models,\n description: 'Database schema definitions and entity declarations',\n };\n\n // 7. Frontend Components (if React/Vue/Next/Vite)\n const componentsFiles = normalizedFiles.filter((f) => /^src\\/(?:components|ui)\\/.*\\.(?:tsx|jsx|vue|ts|js)$/i.test(f));\n if (componentsFiles.length > 0) {\n components['UI Components'] = {\n name: 'UI Components',\n count: componentsFiles.length,\n files: componentsFiles,\n description: 'Reusable user interface views and components',\n };\n }\n\n // Detect TypeScript Modules\n const moduleFiles = normalizedFiles.filter((f) => /^src\\/modules\\/([^/]+)/i.test(f));\n for (const mf of moduleFiles) {\n const match = mf.match(/^src\\/modules\\/([^/]+)/i);\n if (match && match[1]) modulesSet.add(match[1]);\n }\n } else {\n // Generic project component classification\n const srcFiles = normalizedFiles.filter((f) => /^src\\//i.test(f));\n const testFiles = normalizedFiles.filter((f) => /(?:test|spec)\\.[a-z]+$/i.test(f));\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n\n // Generate clean directory tree\n const directoryTree = buildCleanDirectoryTree(normalizedFiles, 3);\n const scanDurationMs = Date.now() - startTime;\n\n return {\n projectInfo,\n totalFilesScanned: normalizedFiles.length,\n components,\n modules: Array.from(modulesSet).sort(),\n directoryTree,\n scanDurationMs,\n };\n}\n\n","import type { ScanResult } from '../scanner.js';\n\n/**\n * Generate a Mermaid.js diagram representing the architecture layers and flow.\n */\nexport function generateMermaidDiagram(scanResult: ScanResult): string {\n const { projectInfo, components, modules } = scanResult;\n\n if (projectInfo.type === 'laravel') {\n const hasFilament = projectInfo.laravel?.hasFilament || (components['Filament Resources']?.count ?? 0) > 0;\n const hasActions = (components['Actions']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph Layer1 [\"1. Client & Entrypoints\"]\n Client[\"Client / Browser / API Consumer\"]:::client\n Routes[\"HTTP Routes<br/>(routes/web.php, routes/api.php)\"]:::routing\n end\n\n subgraph Layer2 [\"2. Request Pipeline & Security\"]\n Middleware[\"Middleware Pipeline<br/>(Auth, CSRF, Rate Limiting)\"]:::routing\n FormRequests[\"Form Requests<br/>(Validation & Authorization)\"]:::routing\n end\n\n subgraph Layer3 [\"3. Controllers & Presentation\"]\n Controllers[\"HTTP Controllers<br/>(app/Http/Controllers)\"]:::controller\n`;\n\n if (hasFilament) {\n diagram += ` Filament[\"Filament Admin Panel<br/>(app/Filament/Resources)\"]:::controller\\n`;\n }\n\n diagram += ` end\n\n subgraph Layer4 [\"4. Domain & Business Logic\"]\n`;\n\n if (hasServices || !hasActions) {\n diagram += ` Services[\"Service Layer<br/>(app/Services)\"]:::service\\n`;\n }\n if (hasActions) {\n diagram += ` Actions[\"Action Classes<br/>(app/Actions)\"]:::service\\n`;\n }\n\n diagram += ` end\n\n subgraph Layer5 [\"5. Data Persistence & Storage\"]\n Models[\"Eloquent Models<br/>(app/Models)\"]:::data\n Database[(\"Database<br/>(MySQL / Postgres / SQLite)\")]:::db\n Migrations[\"Database Migrations<br/>(database/migrations)\"]:::data\n end\n\n Client --> Routes\n Routes --> Middleware\n Middleware --> FormRequests\n FormRequests --> Controllers\n`;\n\n if (hasServices && hasActions) {\n diagram += ` Controllers --> Services\\n Controllers --> Actions\\n Services --> Models\\n Actions --> Models\\n`;\n } else if (hasActions) {\n diagram += ` Controllers --> Actions\\n Actions --> Models\\n`;\n } else {\n diagram += ` Controllers --> Services\\n Services --> Models\\n`;\n }\n\n if (hasFilament) {\n diagram += ` Client --> Filament\\n Filament --> Models\\n`;\n }\n\n diagram += ` Models --> Database\\n Migrations -.-> Database\\n`;\n\n // If modular Laravel\n if (modules.length > 0) {\n diagram += `\\n subgraph ModulesLayer [\"πŸ“¦ Detected Modules (${modules.length})\"]\\n`;\n modules.slice(0, 6).forEach((mod, idx) => {\n diagram += ` Mod_${idx}[\"${mod} Module\"]:::service\\n`;\n });\n if (modules.length > 6) {\n diagram += ` Mod_More[\"...and ${modules.length - 6} more modules\"]:::service\\n`;\n }\n diagram += ` end\\n`;\n }\n\n return diagram;\n }\n\n if (projectInfo.type === 'typescript') {\n const fw = projectInfo.typescript?.framework || 'Express';\n const orm = projectInfo.typescript?.hasPrisma ? 'Prisma' : projectInfo.typescript?.hasTypeORM ? 'TypeORM' : 'ORM';\n\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph Layer1 [\"1. Client & API Gateway\"]\n Client[\"Frontend / API Client\"]:::client\n Router[\"Router & Endpoints<br/>(${fw} Routes)\"]:::routing\n end\n\n subgraph Layer2 [\"2. Validation & Guards\"]\n Middleware[\"Auth & Error Middleware\"]:::routing\n DTOs[\"DTOs & Schemas<br/>(Input Validation)\"]:::routing\n end\n\n subgraph Layer3 [\"3. Controllers\"]\n Controllers[\"Controllers<br/>(Request Handling)\"]:::controller\n end\n\n subgraph Layer4 [\"4. Application Services\"]\n Services[\"Domain Services<br/>(Business Logic)\"]:::service\n end\n\n subgraph Layer5 [\"5. Data Layer & Storage\"]\n Repositories[\"Repositories / ${orm}<br/>(Data Access Layer)\"]:::data\n Database[(\"Database<br/>(SQL / NoSQL)\")]:::db\n end\n\n Client --> Router\n Router --> Middleware\n Middleware --> DTOs\n DTOs --> Controllers\n Controllers --> Services\n Services --> Repositories\n Repositories --> Database\n`;\n\n if (modules.length > 0) {\n diagram += `\\n subgraph ModulesLayer [\"πŸ“¦ Detected Feature Modules (${modules.length})\"]\\n`;\n modules.slice(0, 6).forEach((mod, idx) => {\n diagram += ` Mod_${idx}[\"${mod} Module\"]:::service\\n`;\n });\n if (modules.length > 6) {\n diagram += ` Mod_More[\"...and ${modules.length - 6} more modules\"]:::service\\n`;\n }\n diagram += ` end\\n`;\n }\n\n return diagram;\n }\n\n // Generic diagram\n return `flowchart TD\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef core fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef test fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n\n subgraph App [\"Application Architecture\"]\n Entry[\"Entrypoint / CLI\"]:::client\n Source[\"Source Core Logic (src/)\"]:::core\n Tests[\"Test Suites\"]:::test\n end\n\n Entry --> Source\n Tests -.-> Source\n`;\n}\n\n/**\n * Generate full ARCHITECTURE.md markdown content.\n */\nexport function generateArchitectureMarkdown(scanResult: ScanResult): string {\n const { projectInfo, totalFilesScanned, components, modules, directoryTree, scanDurationMs } = scanResult;\n const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19) + ' UTC';\n\n const mermaid = generateMermaidDiagram(scanResult);\n\n // Component statistics rows\n const componentRows = Object.entries(components)\n .map(([key, comp]) => {\n const sampleFiles = comp.files.slice(0, 3).map((f) => `\\`${f}\\``).join(', ');\n const moreSuffix = comp.files.length > 3 ? ` *(+${comp.files.length - 3} more)*` : '';\n return `| **${comp.name}** | \\`${comp.count}\\` | ${comp.description} | ${sampleFiles || '-'} ${moreSuffix} |`;\n })\n .join('\\n');\n\n // Modules section if present\n let modulesSection = '';\n if (modules.length > 0) {\n modulesSection = `\n## πŸ“¦ Detected Modules & Domains (${modules.length})\n\nThis project organizes features into modular domains:\n\n${modules.map((m) => `- **\\`${m}\\`**`).join('\\n')}\n`;\n }\n\n return `# πŸ›οΈ Architecture Overview: ${projectInfo.name}\n\n> Auto-generated by **[LaraTS CLI](https://github.com/SidiqFatuh187/Larats)** on \\`${timestamp}\\`. \n> **100% Local & Safe:** Generated entirely in offline mode via local filesystem metadata analysis. Zero data transmitted.\n\n---\n\n## πŸ“Œ Project Summary\n\n| Attribute | Details |\n| :--- | :--- |\n| **Project Name** | \\`${projectInfo.name}\\` |\n| **Project Type** | **${projectInfo.type.toUpperCase()}** |\n| **Detected Stack** | \\`${projectInfo.summary}\\` |\n| **Scanned Files** | \\`${totalFilesScanned}\\` files indexed (safe ignore filter applied) |\n| **Scan Duration** | \\`${scanDurationMs} ms\\` |\n\n---\n\n## πŸ“Š Architectural Components Statistics\n\n| Component Layer | Count | Description | Sample Files |\n| :--- | :---: | :--- | :--- |\n${componentRows || '| *No architectural components identified* | `0` | - | - |'}\n${modulesSection}\n---\n\n## πŸ—ΊοΈ Visual Architecture Flowchart\n\nVisual representation of the project layers and request lifecycle rendered with [Mermaid.js](https://mermaid.js.org/):\n\n\\`\\`\\`mermaid\n${mermaid}\n\\`\\`\\`\n\n---\n\n## 🌲 Directory Structure Tree\n\nClean, high-level directory tree showing key folders (ignoring build artifacts, vendor files, and sensitive keys):\n\n\\`\\`\\`text\n${directoryTree || '(Empty directory structure)'}\n\\`\\`\\`\n\n---\n\n## πŸ”’ Security & Privacy Notice\n\nThis architectural map was produced with strict privacy rules:\n- **Zero Network Transmission:** Executed locally without telemetry or outbound communication.\n- **Safe Exclusion Filter:** Ignored \\`node_modules\\`, \\`vendor\\`, \\`.env*\\`, key files, credentials, and cache folders.\n- **Metadata Only:** Scanned file names and relative paths only; no secrets or private business contents were extracted.\n\n*Generated with ❀️ by LaraTS CLI.*\n`;\n}\n\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectInfo } from '../detector.js';\nimport {\n getNaming,\n laravelModelTemplate,\n laravelControllerTemplate,\n laravelServiceTemplate,\n laravelActionTemplate,\n laravelRequestTemplate,\n laravelMigrationTemplate,\n} from '../templates/laravel.js';\nimport {\n tsControllerTemplate,\n tsServiceTemplate,\n tsRepositoryTemplate,\n tsRoutesTemplate,\n tsDtoTemplate,\n} from '../templates/typescript.js';\n\nexport interface ScaffoldOptions {\n moduleName: string;\n components: string[];\n isModular?: boolean;\n dryRun?: boolean;\n forceOverwrite?: boolean;\n}\n\nexport interface ScaffoldFileResult {\n filePath: string;\n relativeFilePath: string;\n status: 'created' | 'skipped' | 'error';\n reason?: string;\n}\n\nexport interface ScaffoldResult {\n moduleName: string;\n targetDir: string;\n files: ScaffoldFileResult[];\n createdCount: number;\n skippedCount: number;\n errorCount: number;\n}\n\n/**\n * Format timestamp for Laravel migration file name (e.g. 2026_10_24_114000)\n */\nfunction getMigrationTimestamp(): string {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `${YYYY}_${MM}_${DD}_${hh}${mm}${ss}`;\n}\n\n/**\n * Scaffold components for Laravel or TypeScript projects safely without overwriting existing code.\n */\nexport async function scaffoldModule(\n projectInfo: ProjectInfo,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const root = projectInfo.rootPath;\n const names = getNaming(options.moduleName);\n const filesToGenerate: { relativePath: string; content: string }[] = [];\n\n const isModular =\n options.isModular ??\n (projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true);\n\n if (projectInfo.type === 'laravel') {\n const selected = new Set(options.components);\n\n if (isModular) {\n const baseDir = `app/Modules/${names.pascal}`;\n const baseNamespace = `App\\\\Modules\\\\${names.pascal}`;\n\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, `${baseNamespace}\\\\Models`),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names, {\n namespace: `${baseNamespace}\\\\Controllers`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n serviceNamespace: `${baseNamespace}\\\\Services`,\n requestNamespace: `${baseNamespace}\\\\Requests`,\n }),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names, {\n namespace: `${baseNamespace}\\\\Services`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names, {\n namespace: `${baseNamespace}\\\\Actions`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names, `${baseNamespace}\\\\Requests`),\n });\n }\n if (selected.has('migration')) {\n const timestamp = getMigrationTimestamp();\n filesToGenerate.push({\n relativePath: `database/migrations/${timestamp}_create_${names.pluralSnake}_table.php`,\n content: laravelMigrationTemplate(names),\n });\n }\n } else {\n // Standard Laravel Structure\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `app/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, 'App\\\\Models'),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `app/Http/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `app/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `app/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `app/Http/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names),\n });\n }\n if (selected.has('migration')) {\n const timestamp = getMigrationTimestamp();\n filesToGenerate.push({\n relativePath: `database/migrations/${timestamp}_create_${names.pluralSnake}_table.php`,\n content: laravelMigrationTemplate(names),\n });\n }\n }\n } else {\n // TypeScript (or fallback)\n const selected = new Set(options.components);\n const srcDir = projectInfo.typescript?.srcDir || 'src';\n\n if (isModular) {\n const moduleFolder = `${srcDir}/modules/${names.kebab}`;\n\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, true),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, true),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, true),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, true),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n\n // Add barrel index.ts export if multiple components generated in module\n if (filesToGenerate.length > 1) {\n const exports: string[] = [];\n if (selected.has('controller')) exports.push(`export * from './${names.kebab}.controller.js';`);\n if (selected.has('service')) exports.push(`export * from './${names.kebab}.service.js';`);\n if (selected.has('repository')) exports.push(`export * from './${names.kebab}.repository.js';`);\n if (selected.has('route')) exports.push(`export * from './${names.kebab}.routes.js';`);\n if (selected.has('dto')) exports.push(`export * from './${names.kebab}.dto.js';`);\n\n filesToGenerate.push({\n relativePath: `${moduleFolder}/index.ts`,\n content: `${exports.join('\\n')}\\n`,\n });\n }\n } else {\n // Layered structure\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/controllers/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, false),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/services/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, false),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/repositories/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, false),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/routes/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, false),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/dtos/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n }\n }\n\n // Execute file writing with strict Anti-Overwrite Protection\n const results: ScaffoldFileResult[] = [];\n let createdCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n for (const item of filesToGenerate) {\n const fullPath = path.resolve(root, item.relativePath);\n\n // 1. Anti-Overwrite Protection check\n if (fs.existsSync(fullPath) && !options.forceOverwrite) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists (overwrite protected)',\n });\n skippedCount++;\n continue;\n }\n\n if (options.dryRun) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Dry run simulated',\n });\n createdCount++;\n continue;\n }\n\n try {\n // Ensure directory exists\n const parentDir = path.dirname(fullPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(fullPath, item.content, 'utf-8');\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n });\n createdCount++;\n } catch (err: any) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n }\n }\n\n return {\n moduleName: names.pascal,\n targetDir: root,\n files: results,\n createdCount,\n skippedCount,\n errorCount,\n };\n}\n\n","export interface NamingVariations {\n pascal: string; // e.g. PaymentOrder\n camel: string; // e.g. paymentOrder\n kebab: string; // e.g. payment-order\n snake: string; // e.g. payment_order\n pluralSnake: string;// e.g. payment_orders\n pluralPascal: string;// e.g. PaymentOrders\n}\n\nexport function getNaming(input: string): NamingVariations {\n // Clean string and split on camelCase/PascalCase boundaries and separators\n const words = input\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n words.push('SampleModule');\n }\n\n const pascal = words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1);\n\n const snake = words.map((w) => w.toLowerCase()).join('_');\n\n const kebab = words.map((w) => w.toLowerCase()).join('-');\n\n // Basic pluralization\n const pluralSuffix = snake.endsWith('s') || snake.endsWith('ch') || snake.endsWith('sh') ? 'es' : 's';\n const pluralSnake = snake + pluralSuffix;\n const pluralPascal = pascal + pluralSuffix;\n\n return { pascal, camel, kebab, snake, pluralSnake, pluralPascal };\n}\n\nexport function laravelModelTemplate(names: NamingVariations, namespace: string = 'App\\\\Models'): string {\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass ${names.pascal} extends Model\n{\n use HasFactory;\n\n /**\n * The table associated with the model.\n *\n * @var string\n */\n protected $table = '${names.pluralSnake}';\n\n /**\n * The attributes that are mass assignable.\n *\n * @var list<string>\n */\n protected $fillable = [\n 'name',\n 'status',\n 'metadata',\n ];\n\n /**\n * Get the attributes that should be cast.\n *\n * @return array<string, string>\n */\n protected function casts(): array\n {\n return [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];\n }\n}\n`;\n}\n\nexport function laravelControllerTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n serviceNamespace?: string;\n requestNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Http\\\\Controllers';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n const serviceNamespace = options.serviceNamespace || 'App\\\\Services';\n const requestNamespace = options.requestNamespace || 'App\\\\Http\\\\Requests';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\nuse ${serviceNamespace}\\\\${names.pascal}Service;\nuse ${requestNamespace}\\\\${names.pascal}Request;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\n\nclass ${names.pascal}Controller extends Controller\n{\n public function __construct(\n protected ${names.pascal}Service $${names.camel}Service\n ) {}\n\n /**\n * Display a listing of ${names.pascal} resources.\n */\n public function index(Request $request): JsonResponse\n {\n $items = $this->${names.camel}Service->getAll($request->all());\n\n return response()->json([\n 'status' => 'success',\n 'data' => $items,\n ]);\n }\n\n /**\n * Display the specified ${names.pascal} resource.\n */\n public function show(int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->getById($id);\n\n return response()->json([\n 'status' => 'success',\n 'data' => $item,\n ]);\n }\n\n /**\n * Store a newly created ${names.pascal} in storage.\n */\n public function store(${names.pascal}Request $request): JsonResponse\n {\n $item = $this->${names.camel}Service->create($request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} created successfully.',\n 'data' => $item,\n ], 201);\n }\n\n /**\n * Update the specified ${names.pascal} in storage.\n */\n public function update(${names.pascal}Request $request, int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->update($id, $request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} updated successfully.',\n 'data' => $item,\n ]);\n }\n\n /**\n * Remove the specified ${names.pascal} from storage.\n */\n public function destroy(int $id): JsonResponse\n {\n $this->${names.camel}Service->delete($id);\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} deleted successfully.',\n ]);\n }\n}\n`;\n}\n\nexport function laravelServiceTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Services';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\nuse Illuminate\\Database\\Eloquent\\Collection;\n\nclass ${names.pascal}Service\n{\n /**\n * Retrieve all ${names.pluralPascal}.\n */\n public function getAll(array $filters = []): Collection\n {\n return ${names.pascal}::query()\n ->latest()\n ->get();\n }\n\n /**\n * Find ${names.pascal} by primary key.\n */\n public function getById(int $id): ${names.pascal}\n {\n return ${names.pascal}::findOrFail($id);\n }\n\n /**\n * Create a new ${names.pascal}.\n */\n public function create(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n\n /**\n * Update an existing ${names.pascal}.\n */\n public function update(int $id, array $data): ${names.pascal}\n {\n $item = $this->getById($id);\n $item->update($data);\n\n return $item;\n }\n\n /**\n * Delete a ${names.pascal}.\n */\n public function delete(int $id): bool\n {\n $item = $this->getById($id);\n\n return (bool) $item->delete();\n }\n}\n`;\n}\n\nexport function laravelActionTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Actions';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\n\nclass Create${names.pascal}Action\n{\n /**\n * Execute the ${names.pascal} creation workflow.\n */\n public function execute(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n}\n`;\n}\n\nexport function laravelRequestTemplate(names: NamingVariations, namespace: string = 'App\\\\Http\\\\Requests'): string {\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass ${names.pascal}Request extends FormRequest\n{\n /**\n * Determine if the user is authorized to make this request.\n */\n public function authorize(): bool\n {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request.\n *\n * @return array<string, list<string>>\n */\n public function rules(): array\n {\n return [\n 'name' => ['required', 'string', 'max:255'],\n 'status' => ['nullable', 'string', 'in:draft,active,archived'],\n 'metadata' => ['nullable', 'array'],\n ];\n }\n\n /**\n * Get custom error messages for validation rules.\n *\n * @return array<string, string>\n */\n public function messages(): array\n {\n return [\n 'name.required' => 'The ${names.camel} name field is required.',\n ];\n }\n}\n`;\n}\n\nexport function laravelMigrationTemplate(names: NamingVariations): string {\n return `<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n /**\n * Run the migrations.\n */\n public function up(): void\n {\n Schema::create('${names.pluralSnake}', function (Blueprint $table) {\n $table->id();\n $table->string('name');\n $table->string('status')->default('draft');\n $table->json('metadata')->nullable();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n public function down(): void\n {\n Schema::dropIfExists('${names.pluralSnake}');\n }\n};\n`;\n}\n","import type { NamingVariations } from './laravel.js';\n\nexport function tsControllerTemplate(names: NamingVariations, isModular: boolean = true): string {\n const serviceImport = isModular ? `./${names.kebab}.service.js` : `../services/${names.kebab}.service.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import type { Request, Response, NextFunction } from 'express';\nimport { ${names.pascal}Service } from '${serviceImport}';\nimport type { Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Controller {\n constructor(private readonly ${names.camel}Service: ${names.pascal}Service = new ${names.pascal}Service()) {}\n\n /**\n * GET /api/${names.kebab}\n */\n getAll = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const items = await this.${names.camel}Service.findAll(req.query);\n res.status(200).json({ status: 'success', data: items });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * GET /api/${names.kebab}/:id\n */\n getById = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const item = await this.${names.camel}Service.findById(id);\n if (!item) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', data: item });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * POST /api/${names.kebab}\n */\n create = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const payload: Create${names.pascal}Dto = req.body;\n const created = await this.${names.camel}Service.create(payload);\n res.status(201).json({ status: 'success', data: created });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * PUT /api/${names.kebab}/:id\n */\n update = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const payload: Update${names.pascal}Dto = req.body;\n const updated = await this.${names.camel}Service.update(id, payload);\n res.status(200).json({ status: 'success', data: updated });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * DELETE /api/${names.kebab}/:id\n */\n delete = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n await this.${names.camel}Service.delete(id);\n res.status(200).json({ status: 'success', message: '${names.pascal} deleted successfully' });\n } catch (error) {\n next(error);\n }\n };\n}\n`;\n}\n\nexport function tsServiceTemplate(names: NamingVariations, isModular: boolean = true): string {\n const repoImport = isModular ? `./${names.kebab}.repository.js` : `../repositories/${names.kebab}.repository.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { ${names.pascal}Repository } from '${repoImport}';\nimport type { ${names.pascal}Entity, Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Service {\n constructor(private readonly ${names.camel}Repository: ${names.pascal}Repository = new ${names.pascal}Repository()) {}\n\n async findAll(query: Record<string, any> = {}): Promise<${names.pascal}Entity[]> {\n return this.${names.camel}Repository.findAll(query);\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.${names.camel}Repository.findById(id);\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.create(data);\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.update(id, data);\n }\n\n async delete(id: string): Promise<boolean> {\n return this.${names.camel}Repository.delete(id);\n }\n}\n`;\n}\n\nexport function tsRepositoryTemplate(names: NamingVariations, isModular: boolean = true): string {\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import type { ${names.pascal}Entity, Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport interface I${names.pascal}Repository {\n findAll(query?: Record<string, any>): Promise<${names.pascal}Entity[]>;\n findById(id: string): Promise<${names.pascal}Entity | null>;\n create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity>;\n update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity>;\n delete(id: string): Promise<boolean>;\n}\n\nexport class ${names.pascal}Repository implements I${names.pascal}Repository {\n // In-memory store fallback. Replace with Prisma / TypeORM / Drizzle client calls.\n private storage: Map<string, ${names.pascal}Entity> = new Map();\n\n async findAll(_query?: Record<string, any>): Promise<${names.pascal}Entity[]> {\n return Array.from(this.storage.values());\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.storage.get(id) || null;\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const id = (Math.random() * 100000).toFixed(0);\n const newRecord: ${names.pascal}Entity = {\n id,\n ...data,\n status: data.status || 'draft',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.storage.set(id, newRecord);\n return newRecord;\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const existing = await this.findById(id);\n if (!existing) {\n throw new Error(\\`${names.pascal} with id \\${id} not found\\`);\n }\n const updated: ${names.pascal}Entity = {\n ...existing,\n ...data,\n updatedAt: new Date(),\n };\n this.storage.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return this.storage.delete(id);\n }\n}\n`;\n}\n\nexport function tsRoutesTemplate(names: NamingVariations, isModular: boolean = true): string {\n const controllerImport = isModular ? `./${names.kebab}.controller.js` : `../controllers/${names.kebab}.controller.js`;\n\n return `import { Router } from 'express';\nimport { ${names.pascal}Controller } from '${controllerImport}';\n\nconst router = Router();\nconst controller = new ${names.pascal}Controller();\n\n/**\n * Route declarations for ${names.pascal}\n */\nrouter.get('/', controller.getAll);\nrouter.get('/:id', controller.getById);\nrouter.post('/', controller.create);\nrouter.put('/:id', controller.update);\nrouter.delete('/:id', controller.delete);\n\nexport const ${names.camel}Routes = router;\nexport default router;\n`;\n}\n\nexport function tsDtoTemplate(names: NamingVariations): string {\n return `export interface ${names.pascal}Entity {\n id: string;\n name: string;\n status: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Create${names.pascal}Dto {\n name: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Update${names.pascal}Dto {\n name?: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n`;\n}\n\n"],"mappings":"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","names":["fs","path","fs","path","path","fs","spinner","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/detector.ts","../src/scanner.ts","../src/generator/markdown.ts","../src/generator/scaffolder.ts","../src/templates/laravel.ts","../src/templates/typescript.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { detectProjectType, type ProjectInfo } from './detector.js';\nimport { scanProject } from './scanner.js';\nimport { generateArchitectureMarkdown } from './generator/markdown.js';\nimport { scaffoldModule, validateModuleName, type ScaffoldResult } from './generator/scaffolder.js';\nimport { getNaming } from './templates/laravel.js';\n\ndeclare const __VERSION__: string | undefined;\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '1.0.1';\n\nfunction showHelp() {\n console.log(`\n${pc.bold(pc.cyan('LaraTS CLI'))} ${pc.gray(`v${VERSION}`)}\n${pc.gray('Smart Architecture Visualizer & Contextual Module Scaffolder')}\n\n${pc.bold('USAGE:')}\n ${pc.cyan('$')} npx larats [command] [options]\n ${pc.cyan('$')} larats [command] [options]\n\n${pc.bold('COMMANDS:')}\n ${pc.green('scan')} Scan repository & generate ARCHITECTURE.md\n ${pc.green('scaffold')}, ${pc.green('make')} [name] Scaffold a new module or feature with clean boilerplate\n ${pc.green('info')} Show detected project type & architectural flavor\n ${pc.green('help')} Display this help message\n\n${pc.bold('OPTIONS:')}\n ${pc.yellow('-o, --output')} <file> Output markdown path for scan (default: ARCHITECTURE.md)\n ${pc.yellow('-m, --modular')} Enforce modular directory structure\n ${pc.yellow('-s, --standard')} Enforce standard/layered directory structure\n ${pc.yellow('--dry-run')} Simulate generation without writing files\n ${pc.yellow('-f, --force')} Overwrite files if they already exist\n ${pc.yellow('-v, --version')} Display CLI version\n ${pc.yellow('-h, --help')} Display this help message\n\n${pc.bold('EXAMPLES:')}\n ${pc.cyan('$')} larats\n ${pc.cyan('$')} larats scan\n ${pc.cyan('$')} larats scan --output docs/ARCHITECTURE.md\n ${pc.cyan('$')} larats scaffold Payment\n ${pc.cyan('$')} larats make Order --modular\n`);\n}\n\n/**\n * Handle cancellation gracefully\n */\nfunction handleCancel(): never {\n p.cancel(pc.yellow('Operation cancelled. See you next time! πŸ‘‹'));\n process.exit(0);\n}\n\n/**\n * Execute scan workflow\n */\nasync function runScan(\n projectInfo: ProjectInfo,\n outputPath: string = 'ARCHITECTURE.md',\n options: { force?: boolean; dryRun?: boolean } = {}\n) {\n const spinner = p.spinner();\n spinner.start('Scanning codebase structure & components (strict ignore list active)...');\n\n try {\n const destination = path.resolve(projectInfo.rootPath, outputPath);\n\n // Defense: Ensure output path is inside project root\n const rel = path.relative(projectInfo.rootPath, destination);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(`Refusing to write output: \"${outputPath}\" resolves outside project root directory.`);\n process.exitCode = 1;\n return;\n }\n\n // Defense: Refuse to overwrite files that are not generated by LaraTS unless --force\n if (fs.existsSync(destination) && !options.force) {\n const existingContent = fs.readFileSync(destination, 'utf-8');\n const isLaraTsFile =\n existingContent.includes('Auto-generated by **[LaraTS CLI]') ||\n existingContent.includes('Auto-generated by **[ArchMind CLI]') ||\n existingContent.includes('LaraTS CLI') ||\n existingContent.includes('<!-- larats-generated -->');\n\n if (!isLaraTsFile) {\n spinner.stop(pc.red('Scan refused'));\n p.log.error(\n `Destination file \"${outputPath}\" already exists and does not appear to be generated by LaraTS.\\n` +\n `To protect user files from accidental overwrites, use --force to overwrite.`\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const scanResult = await scanProject(projectInfo);\n const nonZeroLayers = Object.values(scanResult.components).filter((c) => c.count > 0).length;\n const totalComponents = Object.values(scanResult.components).reduce((sum, c) => sum + c.count, 0);\n\n if (options.dryRun) {\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms (dry run)`));\n p.note(\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Simulated Output:')} Would write ARCHITECTURE.md to ${pc.cyan(outputPath)} (dry run: no files written)`,\n pc.green('Architecture Map (Dry Run) πŸ—ΊοΈ')\n );\n p.outro(pc.cyan('Dry run completed: no files written.'));\n return;\n }\n\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms`));\n\n const markdown = generateArchitectureMarkdown(scanResult);\n\n // Ensure output directory exists if custom path\n const parentDir = path.dirname(destination);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(destination, markdown, 'utf-8');\n\n // Display summary\n p.note(\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Documentation:')} Saved to ${pc.cyan(path.relative(projectInfo.rootPath, destination) || outputPath)}`,\n pc.green('Architecture Map Generated! πŸ—ΊοΈ')\n );\n\n p.outro(pc.cyan(`Open ${outputPath} to view your project structure & Mermaid diagram!`));\n } catch (err: any) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(err.message || String(err));\n process.exitCode = 1;\n }\n}\n\n/**\n * Execute scaffold workflow\n */\nasync function runScaffold(\n projectInfo: ProjectInfo,\n moduleNameArg?: string,\n cliOptions: { modular?: boolean; standard?: boolean; force?: boolean; dryRun?: boolean } = {}\n) {\n // Warn if project type unknown or non-standard framework\n if (projectInfo.type === 'unknown') {\n p.log.warn(pc.yellow('Warning: Project type is unknown (neither Laravel nor TypeScript detected). Scaffolding standard TypeScript/Express components.'));\n } else if (\n projectInfo.type === 'typescript' &&\n projectInfo.typescript?.framework &&\n !['express', 'node-vanilla', 'unknown'].includes(projectInfo.typescript.framework)\n ) {\n p.log.warn(\n pc.yellow(`Warning: Project detected as \"${projectInfo.typescript.framework}\". LaraTS generates standard Express-compatible TypeScript boilerplate.`)\n );\n }\n\n let moduleName = moduleNameArg;\n\n if (moduleName) {\n const errorMsg = validateModuleName(moduleName);\n if (errorMsg) {\n p.log.error(pc.red(`Invalid module name: ${errorMsg}`));\n process.exitCode = 1;\n return;\n }\n } else {\n // Non-TTY check: cannot prompt\n if (!process.stdin.isTTY) {\n p.log.error(pc.red('Error: Module name is required in non-interactive (non-TTY) mode. Example: `larats scaffold Payment`'));\n process.exitCode = 1;\n return;\n }\n\n const input = await p.text({\n message: 'What is the name of the new module or feature?',\n placeholder: 'e.g. Payment, Order, UserProfile',\n validate(val) {\n return validateModuleName(val) || undefined;\n },\n });\n\n if (p.isCancel(input)) handleCancel();\n moduleName = input.trim();\n }\n\n // Component selection based on project type\n let selectedComponents: string[] = [];\n\n if (projectInfo.type === 'laravel') {\n if (!process.stdin.isTTY) {\n selectedComponents = ['model', 'controller', 'service', 'request', 'migration'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'model', label: 'Eloquent Model', hint: 'Includes table name, fillables, and casts' },\n { value: 'controller', label: 'Resourceful Controller', hint: 'Includes standard CRUD methods & DI service' },\n { value: 'service', label: 'Service Class', hint: 'Encapsulated business logic operations' },\n { value: 'action', label: 'Single Action Class', hint: 'Invokable single-responsibility class' },\n { value: 'request', label: 'Form Request', hint: 'Request validation rules & authorization' },\n { value: 'migration', label: 'Database Migration', hint: 'Schema definition with timestamps' },\n ],\n initialValues: ['model', 'controller', 'service', 'request', 'migration'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Component dependencies: controller depends on service\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service class. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n } else {\n // TypeScript or fallback\n if (!process.stdin.isTTY) {\n selectedComponents = ['controller', 'service', 'repository', 'route', 'dto'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'controller', label: 'Controller', hint: 'Express request handlers & response orchestration' },\n { value: 'service', label: 'Service', hint: 'Application logic & repository coordination' },\n { value: 'repository', label: 'Repository', hint: 'Data persistence abstraction & queries' },\n { value: 'route', label: 'Router & Routes', hint: 'Express router mapping endpoints to controller' },\n { value: 'dto', label: 'DTOs & Interfaces', hint: 'Typed interfaces for entities and payloads' },\n ],\n initialValues: ['controller', 'service', 'repository', 'route', 'dto'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Dependencies: route -> controller -> service -> repository\n if (selectedComponents.includes('route') && !selectedComponents.includes('controller')) {\n p.log.warn(pc.yellow('Notice: Route requires Controller. Auto-adding \"controller\" to scaffolded components.'));\n selectedComponents.push('controller');\n }\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n if (selectedComponents.includes('service') && !selectedComponents.includes('repository')) {\n p.log.warn(pc.yellow('Notice: Service requires Repository. Auto-adding \"repository\" to scaffolded components.'));\n selectedComponents.push('repository');\n }\n }\n\n // Determine modular vs standard structure\n let isModular = true;\n if (cliOptions.modular) {\n isModular = true;\n } else if (cliOptions.standard) {\n isModular = false;\n } else if (!process.stdin.isTTY) {\n isModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n } else {\n const defaultModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n\n const structurePrompt = await p.select({\n message: 'Choose folder architecture structure:',\n options: projectInfo.type === 'laravel'\n ? [\n {\n value: 'modular',\n label: 'Modular Domain Structure',\n hint: `app/Modules/${moduleName}/[Models, Controllers, Services]`,\n },\n {\n value: 'standard',\n label: 'Standard Laravel Structure',\n hint: `app/Models, app/Http/Controllers, app/Services`,\n },\n ]\n : [\n {\n value: 'modular',\n label: 'Modular Feature Structure',\n hint: `src/modules/${moduleName.toLowerCase()}/...`,\n },\n {\n value: 'standard',\n label: 'Layered Folder Structure',\n hint: `src/controllers, src/services, src/routes...`,\n },\n ],\n initialValue: defaultModular ? 'modular' : 'standard',\n });\n\n if (p.isCancel(structurePrompt)) handleCancel();\n isModular = structurePrompt === 'modular';\n }\n\n const spinner = p.spinner();\n spinner.start(`Generating boilerplate files for ${pc.cyan(moduleName)}...`);\n\n const result: ScaffoldResult = await scaffoldModule(projectInfo, {\n moduleName,\n components: selectedComponents,\n isModular,\n dryRun: cliOptions.dryRun,\n forceOverwrite: cliOptions.force,\n });\n\n spinner.stop('Generation finished!');\n\n if (result.errorCount > 0) {\n process.exitCode = 1;\n }\n\n // Report files status\n const fileLines = result.files.map((f) => {\n if (f.status === 'created') {\n if (cliOptions.dryRun) {\n return ` ${pc.blue('β„Ή')} ${f.relativeFilePath} ${pc.gray('(would create)')}`;\n }\n return ` ${pc.green('βœ”')} ${f.relativeFilePath} ${pc.gray('(created)')}`;\n } else if (f.status === 'skipped') {\n return ` ${pc.yellow('⚠')} ${f.relativeFilePath} ${pc.yellow(`(skipped - ${f.reason})`)}`;\n } else {\n return ` ${pc.red('βœ–')} ${f.relativeFilePath} ${pc.red(`(error - ${f.reason})`)}`;\n }\n });\n\n if (cliOptions.dryRun) {\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Dry run summary:')} ${pc.cyan(`${result.createdCount} would be created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Dry run: Scaffolding ${moduleName}`)\n );\n p.outro(pc.cyan('Dry run: no files written.'));\n return;\n }\n\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Summary:')} ${pc.green(`${result.createdCount} created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Module Scaffolding: ${moduleName}`)\n );\n\n if (result.skippedCount > 0 && !cliOptions.force) {\n p.log.warn(pc.yellow('Anti-Overwrite Protection prevented modifying existing files. Use --force to overwrite if intended.'));\n }\n\n // Next steps guidance\n const names = getNaming(moduleName);\n if (result.createdCount > 0) {\n if (projectInfo.type === 'laravel') {\n p.note(\n `1. Run database migration:\\n ${pc.cyan('php artisan migrate')}\\n` +\n `2. Register routes in routes/api.php or routes/web.php:\\n ${pc.cyan(`Route::apiResource('${names.kebab}', \\\\${isModular ? `App\\\\Modules\\\\${names.pascal}\\\\Controllers\\\\` : 'App\\\\Http\\\\Controllers\\\\'}${names.pascal}Controller::class);`)}`,\n 'πŸš€ Next Steps'\n );\n } else {\n p.note(\n `1. Mount routes into Express app:\\n ${pc.cyan(`import { ${names.camel}Routes } from './${isModular ? `modules/${names.kebab}` : `routes/${names.kebab}.routes.js`}';\\n app.use('/api/${names.kebab}', ${names.camel}Routes);`)}`,\n 'πŸš€ Next Steps'\n );\n }\n }\n\n p.outro(pc.green(`✨ Successfully scaffolded ${moduleName} module!`));\n}\n\n/**\n * Display quick project info\n */\nfunction showProjectInfo(projectInfo: ProjectInfo) {\n let details = `${pc.bold('Project Name:')} ${projectInfo.name}\\n` +\n `${pc.bold('Project Type:')} ${projectInfo.type.toUpperCase()}\\n` +\n `${pc.bold('Flavor / Stack:')} ${projectInfo.summary}\\n` +\n `${pc.bold('Working Path:')} ${projectInfo.rootPath}`;\n\n if (projectInfo.type === 'laravel' && projectInfo.laravel) {\n details += `\\n${pc.bold('Filament Admin:')} ${projectInfo.laravel.hasFilament ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Livewire:')} ${projectInfo.laravel.hasLivewire ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Inertia.js:')} ${projectInfo.laravel.hasInertia ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular App:')} ${projectInfo.laravel.isModular ? pc.green('Yes') : 'No'}`;\n } else if (projectInfo.type === 'typescript' && projectInfo.typescript) {\n details += `\\n${pc.bold('Framework:')} ${projectInfo.typescript.framework}` +\n `\\n${pc.bold('Prisma ORM:')} ${projectInfo.typescript.hasPrisma ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Monorepo:')} ${projectInfo.typescript.isMonorepo ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular Src:')} ${projectInfo.typescript.isModular ? pc.green('Yes') : 'No'}`;\n }\n\n p.note(details, pc.cyan('Detected Project Architecture'));\n}\n\n/**\n * CLI Main Entrypoint\n */\nasync function main() {\n let parsed;\n try {\n parsed = parseArgs({\n args: process.argv.slice(2),\n options: {\n output: { type: 'string', short: 'o' },\n modular: { type: 'boolean', short: 'm' },\n standard: { type: 'boolean', short: 's' },\n force: { type: 'boolean', short: 'f' },\n 'dry-run': { type: 'boolean' },\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' },\n },\n allowPositionals: true,\n strict: true,\n });\n } catch (err: any) {\n console.error(pc.red(`Error: ${err.message}`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n // Flags check\n if (parsed.values.help || parsed.positionals[0] === 'help') {\n showHelp();\n return;\n }\n\n if (parsed.values.version || parsed.positionals[0] === 'version') {\n console.log(`larats v${VERSION}`);\n return;\n }\n\n const command = parsed.positionals[0];\n const VALID_COMMANDS = new Set(['scan', 'scaffold', 'make', 'info', 'help']);\n if (command && !VALID_COMMANDS.has(command)) {\n console.error(pc.red(`Error: Unknown command \"${command}\".`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n const outputPath = parsed.values.output || 'ARCHITECTURE.md';\n const isModularFlag = parsed.values.modular;\n const isStandardFlag = parsed.values.standard;\n const isForceFlag = parsed.values.force;\n const isDryRunFlag = parsed.values['dry-run'];\n\n // Auto-detect project type in current working directory\n const projectInfo = await detectProjectType(process.cwd());\n\n // Non-interactive command routing\n if (command === 'scan') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Scanning Architecture`);\n p.log.info(`Detected: ${pc.green(projectInfo.summary)}`);\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n return;\n }\n\n if (command === 'scaffold' || command === 'make') {\n const moduleName = parsed.positionals[1];\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Module Scaffolder`);\n p.log.info(`Target Project: ${pc.green(projectInfo.summary)}`);\n await runScaffold(projectInfo, moduleName, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n return;\n }\n\n if (command === 'info') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)}`);\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done.'));\n return;\n }\n\n // No command supplied: check for non-TTY\n if (!process.stdin.isTTY) {\n showHelp();\n return;\n }\n\n // Interactive Menu Mode\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.bold('Smart Architecture Visualizer & Scaffolder')} ${pc.gray(`v${VERSION}`)}`);\n\n p.log.info(`Working Directory: ${pc.gray(process.cwd())}`);\n p.log.info(`Detected Architecture: ${pc.bold(pc.green(projectInfo.summary))}`);\n\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n {\n value: 'scan',\n label: 'πŸ” Scan Architecture & Generate ARCHITECTURE.md',\n hint: 'Creates component stats, directory tree & Mermaid flowchart',\n },\n {\n value: 'scaffold',\n label: 'πŸ—οΈ Scaffold New Feature / Module',\n hint: 'Interactively generate boilerplate components with safety checks',\n },\n {\n value: 'info',\n label: 'πŸ“Š Inspect Detected Architecture Details',\n hint: 'View detected frameworks, ORMs, and configurations',\n },\n {\n value: 'exit',\n label: 'πŸšͺ Exit',\n },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n handleCancel();\n }\n\n if (action === 'scan') {\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'scaffold') {\n await runScaffold(projectInfo, undefined, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'info') {\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done!'));\n }\n}\n\nmain().catch((err) => {\n p.log.error(pc.red(`Fatal error: ${err.message || String(err)}`));\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type ProjectType = 'laravel' | 'typescript' | 'unknown';\n\nexport interface LaravelDetails {\n version?: string;\n hasFilament: boolean;\n hasLivewire: boolean;\n hasInertia: boolean;\n hasSanctum: boolean;\n isModular: boolean;\n modulesDir?: string;\n}\n\nexport interface TypeScriptDetails {\n framework: 'express' | 'nest' | 'fastify' | 'hono' | 'react' | 'next' | 'vue' | 'node-vanilla' | 'unknown';\n hasPrisma: boolean;\n hasTypeORM: boolean;\n hasDrizzle: boolean;\n isMonorepo: boolean;\n isModular: boolean;\n srcDir: string;\n}\n\nexport interface ProjectInfo {\n type: ProjectType;\n name: string;\n rootPath: string;\n laravel?: LaravelDetails;\n typescript?: TypeScriptDetails;\n summary: string;\n}\n\n/**\n * Safely parse a JSON file without throwing errors.\n */\nfunction readJsonSafe<T = any>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, 'utf-8').replace(/^\\uFEFF/, '');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect the project type and architectural characteristics of the target directory.\n */\nexport async function detectProjectType(targetDir: string = process.cwd()): Promise<ProjectInfo> {\n const resolvedDir = path.resolve(targetDir);\n const dirName = path.basename(resolvedDir);\n\n const hasArtisan = fs.existsSync(path.join(resolvedDir, 'artisan'));\n const composerPath = path.join(resolvedDir, 'composer.json');\n const hasComposer = fs.existsSync(composerPath);\n\n const tsconfigPath = path.join(resolvedDir, 'tsconfig.json');\n const hasTsConfig = fs.existsSync(tsconfigPath);\n const packageJsonPath = path.join(resolvedDir, 'package.json');\n const hasPackageJson = fs.existsSync(packageJsonPath);\n\n // 1. Check for Laravel Project\n if (hasArtisan && hasComposer) {\n const composerData = readJsonSafe<{\n name?: string;\n require?: Record<string, string>;\n 'require-dev'?: Record<string, string>;\n }>(composerPath);\n\n const allDeps = {\n ...(composerData?.require || {}),\n ...(composerData?.['require-dev'] || {}),\n };\n\n const hasFilament = Object.keys(allDeps).some((dep) => dep.startsWith('filament/'));\n const hasLivewire = 'livewire/livewire' in allDeps;\n const hasInertia = 'inertiajs/inertia-laravel' in allDeps;\n const hasSanctum = 'laravel/sanctum' in allDeps;\n\n const rawVersion = allDeps['laravel/framework'] || '';\n const versionMatch = rawVersion.match(/\\d+(?:\\.\\d+)*/);\n const cleanVersion = versionMatch ? versionMatch[0] : '';\n\n // Check for modular architecture\n const appModulesDir = path.join(resolvedDir, 'app', 'Modules');\n const rootModulesDir = path.join(resolvedDir, 'modules');\n const rootModulesCapDir = path.join(resolvedDir, 'Modules');\n const isModular =\n fs.existsSync(appModulesDir) ||\n fs.existsSync(rootModulesDir) ||\n fs.existsSync(rootModulesCapDir);\n const modulesDir = fs.existsSync(appModulesDir)\n ? 'app/Modules'\n : fs.existsSync(rootModulesDir)\n ? 'modules'\n : fs.existsSync(rootModulesCapDir)\n ? 'Modules'\n : undefined;\n\n const extras: string[] = [];\n if (hasFilament) extras.push('Filament');\n if (hasLivewire) extras.push('Livewire');\n if (hasInertia) extras.push('Inertia');\n if (isModular) extras.push('Modular Architecture');\n\n const summary = `Laravel ${cleanVersion || ''}${extras.length > 0 ? ` (${extras.join(', ')})` : ''}`.trim();\n\n return {\n type: 'laravel',\n name: composerData?.name?.split('/')[1] || dirName,\n rootPath: resolvedDir,\n laravel: {\n version: cleanVersion || undefined,\n hasFilament,\n hasLivewire,\n hasInertia,\n hasSanctum,\n isModular,\n modulesDir,\n },\n summary,\n };\n }\n\n // 2. Check for TypeScript Project\n if (hasTsConfig && hasPackageJson) {\n const pkg = readJsonSafe<{\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: any;\n }>(packageJsonPath);\n\n const allDeps = {\n ...(pkg?.dependencies || {}),\n ...(pkg?.devDependencies || {}),\n };\n\n let framework: TypeScriptDetails['framework'] = 'unknown';\n if ('@nestjs/core' in allDeps) framework = 'nest';\n else if ('next' in allDeps) framework = 'next';\n else if ('express' in allDeps) framework = 'express';\n else if ('fastify' in allDeps) framework = 'fastify';\n else if ('hono' in allDeps) framework = 'hono';\n else if ('react' in allDeps) framework = 'react';\n else if ('vue' in allDeps) framework = 'vue';\n else framework = 'node-vanilla';\n\n const hasPrisma = 'prisma' in allDeps || '@prisma/client' in allDeps || fs.existsSync(path.join(resolvedDir, 'prisma'));\n const hasTypeORM = 'typeorm' in allDeps;\n const hasDrizzle = 'drizzle-orm' in allDeps;\n\n const isMonorepo =\n Boolean(pkg?.workspaces) ||\n fs.existsSync(path.join(resolvedDir, 'pnpm-workspace.yaml')) ||\n fs.existsSync(path.join(resolvedDir, 'turbo.json')) ||\n fs.existsSync(path.join(resolvedDir, 'lerna.json'));\n\n const hasSrc = fs.existsSync(path.join(resolvedDir, 'src'));\n const srcDir = hasSrc ? 'src' : '.';\n const isModular =\n fs.existsSync(path.join(resolvedDir, srcDir, 'modules')) ||\n fs.existsSync(path.join(resolvedDir, 'modules'));\n\n const extras: string[] = [framework !== 'node-vanilla' ? framework : 'TypeScript'];\n if (hasPrisma) extras.push('Prisma');\n if (hasTypeORM) extras.push('TypeORM');\n if (hasDrizzle) extras.push('Drizzle');\n if (isMonorepo) extras.push('Monorepo');\n if (isModular) extras.push('Modular');\n\n const summary = `TypeScript (${extras.join(', ')})`;\n\n return {\n type: 'typescript',\n name: pkg?.name || dirName,\n rootPath: resolvedDir,\n typescript: {\n framework,\n hasPrisma,\n hasTypeORM,\n hasDrizzle,\n isMonorepo,\n isModular,\n srcDir,\n },\n summary,\n };\n }\n\n // 3. Fallback / Unknown Project\n let fallbackName = dirName;\n if (hasPackageJson) {\n const pkg = readJsonSafe<{ name?: string }>(packageJsonPath);\n if (pkg?.name) fallbackName = pkg.name;\n }\n\n return {\n type: 'unknown',\n name: fallbackName,\n rootPath: resolvedDir,\n summary: 'Generic / Unknown Project',\n };\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport fg from 'fast-glob';\nimport type { ProjectInfo } from './detector.js';\n\nexport const SAFE_IGNORE_LIST = [\n // Dependencies & package management\n '**/node_modules/**',\n '**/vendor/**',\n '**/.pnpm/**',\n '**/.yarn/**',\n // Version control\n '**/.git/**',\n '**/.svn/**',\n '**/.hg/**',\n // Storage, cache & build outputs (scoped to root to preserve src/build/)\n '**/storage/**',\n '**/dist/**',\n 'build/**',\n 'out/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/.turbo/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/.temp/**',\n 'tmp/**',\n // IDEs & OS files\n '**/.idea/**',\n '**/.vscode/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n // Secrets, private keys & cloud credentials\n '**/.env*',\n '**/*.pem',\n '**/*.key',\n '**/*.pfx',\n '**/*.p12',\n '**/*.jks',\n '**/*.keystore',\n '**/*.cert',\n '**/*.crt',\n '**/*.secret',\n '**/secrets/**',\n '**/.aws/**',\n '**/.ssh/**',\n '**/credentials*.json',\n '**/*service-account*.json',\n '**/id_rsa*',\n '**/id_ed25519*',\n '**/id_ecdsa*',\n '**/*.pub',\n // Logs & Lock files\n '**/*.log',\n '**/*.lock',\n '**/package-lock.json',\n '**/yarn.lock',\n '**/pnpm-lock.yaml',\n '**/composer.lock',\n];\n\nexport interface ComponentGroup {\n name: string;\n count: number;\n files: string[];\n description: string;\n}\n\nexport interface ScanResult {\n projectInfo: ProjectInfo;\n totalFilesScanned: number;\n components: Record<string, ComponentGroup>;\n modules: string[];\n directoryTree: string;\n scanDurationMs: number;\n}\n\nexport function localeIndependentCompare(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Build a clean ASCII directory tree representation from a list of relative file paths.\n */\nexport function buildCleanDirectoryTree(files: string[], maxDepth: number = 3): string {\n interface TreeNode {\n name: string;\n isDir: boolean;\n children: Map<string, TreeNode>;\n }\n\n const root: TreeNode = { name: '', isDir: true, children: new Map() };\n\n // Populate tree\n for (const file of files) {\n const parts = file.split(/[/\\\\]/);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n isDir: !isLast,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n }\n }\n\n const lines: string[] = [];\n\n function renderNode(node: TreeNode, prefix: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = Array.from(node.children.values()).sort((a, b) => {\n // Directories first, then files\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n // If at maxDepth and has children, show summary\n if (currentDepth === maxDepth && entries.length > 0) {\n lines.push(`${prefix}└── ... (${entries.length} items hidden)`);\n return;\n }\n\n // Limit files shown per directory if too many\n const maxEntriesPerDir = 8;\n const displayedEntries = entries.slice(0, maxEntriesPerDir);\n const hiddenCount = entries.length - displayedEntries.length;\n\n displayedEntries.forEach((child, index) => {\n const isLast = index === displayedEntries.length - 1 && hiddenCount === 0;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${prefix}${pointer}${displayName}`);\n\n if (child.isDir) {\n const nextPrefix = prefix + (isLast ? ' ' : 'β”‚ ');\n renderNode(child, nextPrefix, currentDepth + 1);\n }\n });\n\n if (hiddenCount > 0) {\n lines.push(`${prefix}└── ... (${hiddenCount} more files/folders)`);\n }\n }\n\n // Render children of root\n const topLevel = Array.from(root.children.values()).sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n topLevel.forEach((child, index) => {\n const isLast = index === topLevel.length - 1;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${pointer}${displayName}`);\n if (child.isDir) {\n const nextPrefix = isLast ? ' ' : 'β”‚ ';\n renderNode(child, nextPrefix, 1);\n }\n });\n\n return lines.join('\\n');\n}\n\n/**\n * Scan project safely using fast-glob and categorize architectural components.\n */\nexport async function scanProject(projectInfo: ProjectInfo): Promise<ScanResult> {\n const startTime = Date.now();\n const root = projectInfo.rootPath;\n\n // Avoid scanning system root drive or home directory directly\n const resolvedRoot = path.resolve(root);\n const parsedRoot = path.parse(resolvedRoot);\n if (parsedRoot.root === resolvedRoot || (typeof os.homedir === 'function' && resolvedRoot === os.homedir())) {\n throw new Error(`Refusing to scan system drive or home directory root directly: \"${resolvedRoot}\".`);\n }\n\n // Scan all relevant files in repo while respecting SAFE_IGNORE_LIST\n const allFiles = await fg('**/*', {\n cwd: root,\n ignore: SAFE_IGNORE_LIST,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n\n const MAX_FILES_CAP = 10000;\n let normalizedFiles = allFiles.map((f) => f.replace(/\\\\/g, '/'));\n if (normalizedFiles.length > MAX_FILES_CAP) {\n console.warn(`[WARN] Large codebase detected (${normalizedFiles.length} files). Capping scan analysis to first ${MAX_FILES_CAP} files.`);\n normalizedFiles = normalizedFiles.slice(0, MAX_FILES_CAP);\n }\n const components: Record<string, ComponentGroup> = {};\n const modulesSet = new Set<string>();\n\n if (projectInfo.type === 'laravel') {\n // 1. Models - match Models/ anywhere under app or modules dirs, exclude non-model files\n const models = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Models\\/.*\\.php$/i.test(f)\n );\n components['Models'] = {\n name: 'Eloquent Models',\n count: models.length,\n files: models,\n description: 'Database entity mappings and business logic models',\n };\n\n // 2. Controllers\n const controllers = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Controllers\\/.*\\.php$/i.test(f)\n );\n components['Controllers'] = {\n name: 'HTTP Controllers',\n count: controllers.length,\n files: controllers,\n description: 'Request handling and response orchestration',\n };\n\n // 3. Services\n const services = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Services\\/.*\\.php$/i.test(f)\n );\n components['Services'] = {\n name: 'Service Classes',\n count: services.length,\n files: services,\n description: 'Encapsulated business logic and external integrations',\n };\n\n // 4. Actions\n const actions = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Actions\\/.*\\.php$/i.test(f)\n );\n components['Actions'] = {\n name: 'Action Classes',\n count: actions.length,\n files: actions,\n description: 'Single-responsibility invokable operations',\n };\n\n // 5. Form Requests\n const requests = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?(?:Http\\/)?Requests\\/.*\\.php$/i.test(f)\n );\n components['Form Requests'] = {\n name: 'Form Requests',\n count: requests.length,\n files: requests,\n description: 'Input validation and authorization rules',\n };\n\n // 6. Filament Resources\n const filament = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Filament\\/.*\\.php$/i.test(f)\n );\n if (filament.length > 0 || projectInfo.laravel?.hasFilament) {\n components['Filament Resources'] = {\n name: 'Filament Admin Resources',\n count: filament.length,\n files: filament,\n description: 'Admin panel CRUD pages, widgets, and schemas',\n };\n }\n\n // 7. Routes\n const routes = normalizedFiles.filter((f) =>\n /^(?:routes\\/.*\\.php|(?:app\\/Modules|modules|Modules)\\/.*\\/routes?.*\\.php)$/i.test(f)\n );\n components['Routes'] = {\n name: 'Routing Definitions',\n count: routes.length,\n files: routes,\n description: 'Web, API, and console endpoint routes',\n };\n\n // 8. Database Migrations\n const migrations = normalizedFiles.filter((f) =>\n /(?:^database\\/migrations\\/.*\\.php$|\\/migrations\\/.*\\.php$)/i.test(f)\n );\n components['Migrations'] = {\n name: 'Database Migrations',\n count: migrations.length,\n files: migrations,\n description: 'Schema version control and table definitions',\n };\n\n // Detect Laravel Modules - must require a trailing slash after module name so loose files are excluded\n const modDirPattern = projectInfo.laravel?.modulesDir\n ? `(?:${projectInfo.laravel.modulesDir}|app/Modules|modules|Modules)`\n : '(?:app/Modules|modules|Modules)';\n const modRegex = new RegExp(`^${modDirPattern}/([^/]+)/`, 'i');\n\n for (const f of normalizedFiles) {\n const match = f.match(modRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n } else if (projectInfo.type === 'typescript') {\n const srcDir = projectInfo.typescript?.srcDir ?? 'src';\n // Support custom srcDir as well as monorepo packages (apps/*/src, packages/*/src)\n const tsPrefix = `(?:${srcDir}|(?:apps|packages)/[^/]+/(?:${srcDir}|src))`;\n\n // 1. Controllers (files in controllers/ or matching .controller.(ts|js))\n const controllers = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:controllers/.*\\\\.(?:ts|js|mts|cts)|.*[./]controller\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Controllers'] = {\n name: 'Controllers',\n count: controllers.length,\n files: controllers,\n description: 'HTTP request handlers and response dispatchers',\n };\n\n // 2. Services (files in services/ or matching .service.(ts|js))\n const services = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:services/.*\\\\.(?:ts|js|mts|cts)|.*[./]service\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Services'] = {\n name: 'Services',\n count: services.length,\n files: services,\n description: 'Core domain logic and application workflows',\n };\n\n // 3. Repositories (files in repositories/ or matching .repository.(ts|js))\n const repositories = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:repositories/.*\\\\.(?:ts|js|mts|cts)|.*[./]repository\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Repositories'] = {\n name: 'Repositories',\n count: repositories.length,\n files: repositories,\n description: 'Data access abstraction and database queries',\n };\n\n // 4. Routes (files in routes/ or matching .routes.(ts|js))\n const routes = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:routes/.*\\\\.(?:ts|js|mts|cts)|.*[./]routes?\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Routes'] = {\n name: 'Routes',\n count: routes.length,\n files: routes,\n description: 'API endpoint mappings and router handlers',\n };\n\n // 5. DTOs & Validation Schemas\n const dtos = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:dtos|schemas)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:dto|schema)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['DTOs & Schemas'] = {\n name: 'DTOs & Schemas',\n count: dtos.length,\n files: dtos,\n description: 'Data transfer objects and request validation schemas',\n };\n\n // 6. Models / Prisma / Entities\n const models = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n (new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:models|entities)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:model|entity)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f) ||\n /(?:^|\\/)prisma\\/schema\\.prisma$/i.test(f))\n );\n components['Models & Entities'] = {\n name: 'Models & Entities',\n count: models.length,\n files: models,\n description: 'Database schema definitions and entity declarations',\n };\n\n // 7. Frontend Components (if React/Vue/Next/Vite)\n const componentsFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/(?:components|ui)/.*\\\\.(?:tsx|jsx|vue|svelte|ts|js)$`, 'i').test(f)\n );\n if (componentsFiles.length > 0) {\n components['UI Components'] = {\n name: 'UI Components',\n count: componentsFiles.length,\n files: componentsFiles,\n description: 'Reusable user interface views and components',\n };\n }\n\n // Detect TypeScript Modules (requiring trailing slash after module name)\n const moduleRegex = new RegExp(`^(?:${tsPrefix}/modules|modules)/([^/]+)/`, 'i');\n for (const mf of normalizedFiles) {\n const match = mf.match(moduleRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n\n // If no classic web layers are found (e.g. CLI tool, utility library), populate Source and Test files\n const totalWebLayers = Object.values(components).reduce((acc, c) => acc + c.count, 0);\n if (totalWebLayers === 0) {\n const srcFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/`, 'i').test(f)\n );\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n } else {\n // Generic project component classification\n const srcFiles = normalizedFiles.filter((f) => /^src\\//i.test(f));\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n\n // Generate clean directory tree\n const directoryTree = buildCleanDirectoryTree(normalizedFiles, 3);\n const scanDurationMs = Date.now() - startTime;\n\n return {\n projectInfo,\n totalFilesScanned: normalizedFiles.length,\n components,\n modules: Array.from(modulesSet).sort(localeIndependentCompare),\n directoryTree,\n scanDurationMs,\n };\n}\n","import type { ScanResult } from '../scanner.js';\nimport { SAFE_IGNORE_LIST } from '../scanner.js';\n\n/**\n * Escape pipe and newline characters in Markdown table cells.\n */\nexport function mdCell(str: string): string {\n if (!str) return '-';\n const cleaned = str.replace(/\\|/g, '\\\\|').replace(/[\\r\\n]+/g, ' ').trim();\n return cleaned || '-';\n}\n\n/**\n * Format markdown code fence handling nested backticks safely.\n */\nexport function fence(body: string, lang: string = ''): string {\n const matches = body.match(/`+/g);\n let maxBackticks = 2;\n if (matches) {\n for (const match of matches) {\n if (match.length > maxBackticks) maxBackticks = match.length;\n }\n }\n const f = '`'.repeat(maxBackticks + 1);\n return `${f}${lang ? lang : ''}\\n${body}\\n${f}`;\n}\n\n/**\n * Escape text for safe rendering in Mermaid diagram node labels and sanitize characters.\n */\nexport function mermaidLabel(str: string, maxLen: number = 40): string {\n if (!str) return '';\n let cleaned = str\n .replace(/\"/g, \"'\")\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/`/g, \"'\")\n .replace(/[\\r\\n]+/g, ' ')\n .trim();\n if (cleaned.length > maxLen) {\n cleaned = cleaned.slice(0, maxLen - 3) + '...';\n }\n return cleaned;\n}\n\n/**\n * Render feature modules subgraph for Mermaid diagrams.\n */\nfunction renderModulesSubgraph(modules: string[]): string {\n if (modules.length === 0) return '';\n let output = `\\n subgraph ModulesLayer [\"πŸ“¦ Detected Modules (${modules.length})\"]\\n`;\n modules.slice(0, 6).forEach((mod, idx) => {\n output += ` Mod_${idx}[\"${mermaidLabel(mod)} Module\"]:::service\\n`;\n });\n if (modules.length > 6) {\n output += ` Mod_More[\"...and ${modules.length - 6} more modules\"]:::service\\n`;\n }\n output += ` end\\n`;\n return output;\n}\n\n/**\n * Generate a dynamic Mermaid.js diagram representing only the components and layers\n * that actually exist in the scanned codebase.\n */\nexport function generateMermaidDiagram(scanResult: ScanResult): string {\n const { projectInfo, components, modules } = scanResult;\n\n if (projectInfo.type === 'laravel') {\n const hasFilament = projectInfo.laravel?.hasFilament || (components['Filament Resources']?.count ?? 0) > 0;\n const hasActions = (components['Actions']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRequests = (components['Form Requests']?.count ?? 0) > 0;\n const hasModels = (components['Models']?.count ?? 0) > 0;\n const hasMigrations = (components['Migrations']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & Entrypoints\"]\n Client[\"Client / Browser / API Consumer\"]:::client\n Routes[\"HTTP Routes\"]:::routing\n end\n`;\n\n if (hasRequests) {\n diagram += `\n subgraph RequestLayer [\"2. Request Pipeline & Validation\"]\n Middleware[\"Middleware Pipeline<br/>(Auth, CSRF, Rate Limiting)\"]:::routing\n FormRequests[\"Form Requests<br/>(Validation & Authorization)\"]:::routing\n end\n`;\n }\n\n diagram += `\n subgraph HttpLayer [\"3. Controllers & Presentation\"]\n Controllers[\"HTTP Controllers\"]:::controller\n`;\n if (hasFilament) {\n diagram += ` Filament[\"Filament Admin Resources\"]:::controller\\n`;\n }\n diagram += ` end\\n`;\n\n if (hasServices || hasActions) {\n diagram += `\n subgraph DomainLayer [\"4. Domain & Business Logic\"]\n`;\n if (hasServices) {\n diagram += ` Services[\"Service Classes\"]:::service\\n`;\n }\n if (hasActions) {\n diagram += ` Actions[\"Action Classes\"]:::service\\n`;\n }\n diagram += ` end\\n`;\n }\n\n diagram += `\n subgraph DataLayer [\"5. Data Persistence & Storage\"]\n`;\n if (hasModels) {\n diagram += ` Models[\"Eloquent Models\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database<br/>(MySQL / Postgres / SQLite)\")]:::db\\n`;\n if (hasMigrations) {\n diagram += ` Migrations[\"Database Migrations\"]:::data\\n`;\n }\n diagram += ` end\\n\\n`;\n\n // Connect nodes dynamically\n diagram += ` Client --> Routes\\n`;\n\n if (hasRequests) {\n diagram += ` Routes --> Middleware\\n`;\n diagram += ` Middleware --> FormRequests\\n`;\n diagram += ` FormRequests --> Controllers\\n`;\n } else {\n diagram += ` Routes --> Controllers\\n`;\n }\n\n if (hasServices && hasActions) {\n diagram += ` Controllers --> Services\\n`;\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n diagram += ` Actions --> Database\\n`;\n }\n } else if (hasServices) {\n diagram += ` Controllers --> Services\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n }\n } else if (hasActions) {\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Actions --> Database\\n`;\n }\n } else {\n if (hasModels) {\n diagram += ` Controllers --> Models\\n`;\n } else {\n diagram += ` Controllers --> Database\\n`;\n }\n }\n\n if (hasFilament) {\n if (hasModels) {\n diagram += ` Client --> Filament\\n Filament --> Models\\n`;\n } else {\n diagram += ` Client --> Filament\\n Filament --> Database\\n`;\n }\n }\n\n if (hasModels) {\n diagram += ` Models --> Database\\n`;\n }\n if (hasMigrations) {\n diagram += ` Migrations -.-> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n\n if (projectInfo.type === 'typescript') {\n const rawFw = projectInfo.typescript?.framework || 'express';\n const fwDisplay =\n rawFw !== 'unknown' && rawFw !== 'node-vanilla'\n ? `${rawFw.charAt(0).toUpperCase() + rawFw.slice(1)} Router`\n : 'API Endpoints & Handlers';\n\n const orm = projectInfo.typescript?.hasPrisma ? 'Prisma' : projectInfo.typescript?.hasTypeORM ? 'TypeORM' : projectInfo.typescript?.hasDrizzle ? 'Drizzle' : null;\n\n const hasControllers = (components['Controllers']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRepositories = (components['Repositories']?.count ?? 0) > 0;\n const hasDtos = (components['DTOs & Schemas']?.count ?? 0) > 0;\n const hasUi = (components['UI Components']?.count ?? 0) > 0;\n const hasModels = (components['Models & Entities']?.count ?? 0) > 0;\n const hasAnyLayer = hasControllers || hasServices || hasRepositories || hasDtos || hasUi || hasModels;\n\n if (hasAnyLayer) {\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & API Gateway\"]\n Client[\"Frontend / API Client\"]:::client\n Router[\"Router & Endpoints<br/>(${fwDisplay})\"]:::routing\n end\n`;\n\n if (hasUi) {\n diagram += `\n subgraph UiLayer [\"Frontend Presentation\"]\n UiComponents[\"UI Components<br/>(src/components)\"]:::controller\n end\n`;\n }\n\n if (hasDtos) {\n diagram += `\n subgraph ValidationLayer [\"2. Validation & Schemas\"]\n DTOs[\"DTOs & Schemas<br/>(Input Validation)\"]:::routing\n end\n`;\n }\n\n if (hasControllers) {\n diagram += `\n subgraph ControllerLayer [\"3. Controllers\"]\n Controllers[\"Controllers<br/>(Request Handling)\"]:::controller\n end\n`;\n }\n\n if (hasServices) {\n diagram += `\n subgraph ServiceLayer [\"4. Application Services\"]\n Services[\"Domain Services<br/>(Business Logic)\"]:::service\n end\n`;\n }\n\n diagram += `\n subgraph PersistenceLayer [\"5. Data Layer & Storage\"]\n`;\n if (hasRepositories) {\n diagram += ` Repositories[\"Repositories / Data Access<br/>(${orm || 'Data Layer'})\"]:::data\\n`;\n } else if (hasModels) {\n diagram += ` Entities[\"Models & Entities<br/>(${orm || 'ORM'})\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database / Storage\")]:::db\\n`;\n diagram += ` end\\n\\n`;\n\n // Dynamic Connections\n diagram += ` Client --> Router\\n`;\n if (hasUi) {\n diagram += ` Client --> UiComponents\\n`;\n diagram += ` UiComponents --> Router\\n`;\n }\n\n let previousNode = 'Router';\n if (hasDtos) {\n diagram += ` ${previousNode} --> DTOs\\n`;\n previousNode = 'DTOs';\n }\n\n if (hasControllers) {\n diagram += ` ${previousNode} --> Controllers\\n`;\n previousNode = 'Controllers';\n }\n\n if (hasServices) {\n diagram += ` ${previousNode} --> Services\\n`;\n previousNode = 'Services';\n }\n\n if (hasRepositories) {\n diagram += ` ${previousNode} --> Repositories\\n`;\n diagram += ` Repositories --> Database\\n`;\n } else if (hasModels) {\n diagram += ` ${previousNode} --> Entities\\n`;\n diagram += ` Entities --> Database\\n`;\n } else {\n diagram += ` ${previousNode} --> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n }\n\n // Generic / CLI projects\n const hasEntry = (components['Source Files']?.files || []).some((f) =>\n /(?:^|\\/)(?:index|cli|main|bin)\\.[a-z]+$/i.test(f)\n );\n const hasSource = (components['Source Files']?.count ?? 0) > 0;\n const hasTests = (components['Test Files']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef core fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef test fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n\n subgraph App [\"CLI & Application Architecture\"]\n`;\n if (hasEntry) {\n diagram += ` Entry[\"Entrypoint CLI (bin/)\"]:::client\\n`;\n }\n if (hasSource) {\n diagram += ` Source[\"Core Modules & Generators (src/)\"]:::core\\n`;\n }\n if (hasTests) {\n diagram += ` Tests[\"Automated Test Suites (tests/)\"]:::test\\n`;\n }\n if (!hasEntry && !hasSource && !hasTests) {\n diagram += ` Source[\"Source Files\"]:::core\\n`;\n }\n diagram += ` end\\n\\n`;\n\n if (hasEntry && hasSource) {\n diagram += ` Entry --> Source\\n`;\n }\n if (hasTests && hasSource) {\n diagram += ` Tests -.-> Source\\n`;\n }\n\n return diagram;\n}\n\n/**\n * Generate full ARCHITECTURE.md markdown content.\n */\nexport function generateArchitectureMarkdown(scanResult: ScanResult): string {\n const { projectInfo, totalFilesScanned, components, modules, directoryTree } = scanResult;\n\n const mermaid = generateMermaidDiagram(scanResult);\n\n // Component statistics rows\n const componentRows = Object.entries(components)\n .map(([, comp]) => {\n const sampleFiles = comp.files.slice(0, 3).map((f) => `\\`${f}\\``).join(', ');\n const moreSuffix = comp.files.length > 3 ? ` *(+${comp.files.length - 3} more)*` : '';\n return `| **${mdCell(comp.name)}** | \\`${comp.count}\\` | ${mdCell(comp.description)} | ${sampleFiles ? mdCell(sampleFiles + moreSuffix) : '-'} |`;\n })\n .join('\\n');\n\n // Modules section if present\n let modulesSection = '';\n if (modules.length > 0) {\n modulesSection = `\n## πŸ“¦ Detected Modules & Domains (${modules.length})\n\nThis project organizes features into modular domains:\n\n${modules.map((m) => `- **\\`${m}\\`**`).join('\\n')}\n`;\n }\n\n // Security notice generated from SAFE_IGNORE_LIST\n const sampleIgnores = SAFE_IGNORE_LIST.slice(0, 8).map((p) => `\\`${p}\\``).join(', ');\n const securityNotice = `## πŸ”’ Security & Privacy Notice\n\nThis architectural map was produced with strict privacy guarantees:\n- **Zero Network Transmission:** Executed locally without telemetry, tracking, or outbound communication.\n- **Safe Exclusion Filter:** Automatically ignores sensitive files and secret patterns (${sampleIgnores}, etc.) including \\`node_modules\\`, \\`vendor\\`, \\`.env*\\`, private keys, secrets, credentials, cloud configs, and cache folders.\n- **Manifest & Structure Only:** Safely reads standard manifest dependencies (\\`package.json\\` / \\`composer.json\\`) to determine framework types, and relative file paths to categorize components. Never reads private configurations or file contents.\n\n*Generated with ❀️ by LaraTS CLI.*`;\n\n return `# πŸ›οΈ Architecture Overview: ${projectInfo.name}\n\n> Auto-generated by **[LaraTS CLI](https://github.com/SidiqFatuh187/Larats)**. \n> **100% Local & Safe:** Generated entirely in offline mode via local filesystem manifest & structure analysis. Zero data transmitted.\n\n---\n\n## πŸ“Œ Project Summary\n\n| Attribute | Details |\n| :--- | :--- |\n| **Project Name** | \\`${projectInfo.name}\\` |\n| **Project Type** | **${projectInfo.type.toUpperCase()}** |\n| **Detected Stack** | \\`${projectInfo.summary}\\` |\n| **Scanned Files** | \\`${totalFilesScanned}\\` files indexed (safe ignore filter applied) |\n\n---\n\n## πŸ“Š Architectural Components Statistics\n\n| Component Layer | Count | Description | Sample Files |\n| :--- | :---: | :--- | :--- |\n${componentRows || '| *No architectural components identified* | `0` | - | - |'}\n${modulesSection}\n---\n\n## πŸ—ΊοΈ Visual Architecture Flowchart\n\nVisual representation of the project layers and request lifecycle rendered with [Mermaid.js](https://mermaid.js.org/):\n\n${fence(mermaid, 'mermaid')}\n\n---\n\n## 🌲 Directory Structure Tree\n\nClean, high-level directory tree showing key folders (ignoring build artifacts, vendor files, and sensitive keys):\n\n${fence(directoryTree || '(Empty directory structure)', 'text')}\n\n---\n\n${securityNotice}\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectInfo } from '../detector.js';\nimport {\n getNaming,\n laravelModelTemplate,\n laravelControllerTemplate,\n laravelServiceTemplate,\n laravelActionTemplate,\n laravelRequestTemplate,\n laravelMigrationTemplate,\n} from '../templates/laravel.js';\nimport {\n tsControllerTemplate,\n tsServiceTemplate,\n tsRepositoryTemplate,\n tsRoutesTemplate,\n tsDtoTemplate,\n} from '../templates/typescript.js';\n\nexport interface ScaffoldOptions {\n moduleName: string;\n components: string[];\n isModular?: boolean;\n dryRun?: boolean;\n forceOverwrite?: boolean;\n}\n\nexport interface ScaffoldFileResult {\n filePath: string;\n relativeFilePath: string;\n status: 'created' | 'skipped' | 'error';\n reason?: string;\n}\n\nexport interface ScaffoldResult {\n moduleName: string;\n targetDir: string;\n files: ScaffoldFileResult[];\n createdCount: number;\n skippedCount: number;\n errorCount: number;\n dryRun?: boolean;\n}\n\nconst RESERVED_NAMES = new Set([\n 'model',\n 'controller',\n 'service',\n 'action',\n 'request',\n 'migration',\n 'repository',\n 'route',\n 'dto',\n 'object',\n 'class',\n 'interface',\n 'module',\n 'app',\n 'base',\n]);\n\n/**\n * Validate a user-provided module or feature name.\n * Returns an error string if invalid, or null if valid.\n */\nexport function validateModuleName(name: string): string | null {\n if (!name || !name.trim()) {\n return 'Module name cannot be empty.';\n }\n const trimmed = name.trim();\n if (!/^[a-zA-Z]/.test(trimmed)) {\n return 'Module name must start with an alphabetical letter.';\n }\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(trimmed)) {\n return 'Module name may only contain alphanumeric characters, hyphens, and underscores.';\n }\n if (RESERVED_NAMES.has(trimmed.toLowerCase())) {\n return `\"${trimmed}\" is a reserved framework name and cannot be used as a module name.`;\n }\n return null;\n}\n\n/**\n * Format timestamp for Laravel migration file name (e.g. 2026_10_24_114000)\n */\nfunction getMigrationTimestamp(): string {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `${YYYY}_${MM}_${DD}_${hh}${mm}${ss}`;\n}\n\n/**\n * Scaffold components for Laravel or TypeScript projects safely without overwriting existing code.\n */\nexport async function scaffoldModule(\n projectInfo: ProjectInfo,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const root = projectInfo.rootPath;\n const names = getNaming(options.moduleName);\n const filesToGenerate: {\n relativePath: string;\n content: string;\n isBarrel?: boolean;\n barrelExports?: string[];\n }[] = [];\n const results: ScaffoldFileResult[] = [];\n let createdCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n const isModular =\n options.isModular ??\n (projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true);\n\n if (projectInfo.type === 'laravel') {\n const selected = new Set(options.components);\n\n const addMigrationIfRequested = () => {\n const migrationsDir = path.join(root, 'database', 'migrations');\n let existingMigration: string | null = null;\n if (fs.existsSync(migrationsDir)) {\n const files = fs.readdirSync(migrationsDir);\n const match = files.find((f) => f.endsWith(`_create_${names.pluralSnake}_table.php`));\n if (match) {\n existingMigration = match;\n }\n }\n\n if (existingMigration && !options.forceOverwrite) {\n results.push({\n filePath: path.join(migrationsDir, existingMigration),\n relativeFilePath: `database/migrations/${existingMigration}`,\n status: 'skipped',\n reason: 'Migration for table already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n const timestamp = existingMigration ? existingMigration.split('_create_')[0] : getMigrationTimestamp();\n filesToGenerate.push({\n relativePath: `database/migrations/${timestamp}_create_${names.pluralSnake}_table.php`,\n content: laravelMigrationTemplate(names),\n });\n }\n };\n\n if (isModular) {\n const baseDir = `app/Modules/${names.pascal}`;\n const baseNamespace = `App\\\\Modules\\\\${names.pascal}`;\n\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, `${baseNamespace}\\\\Models`, projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names, {\n namespace: `${baseNamespace}\\\\Controllers`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n serviceNamespace: `${baseNamespace}\\\\Services`,\n requestNamespace: `${baseNamespace}\\\\Requests`,\n }),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names, {\n namespace: `${baseNamespace}\\\\Services`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names, {\n namespace: `${baseNamespace}\\\\Actions`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names, `${baseNamespace}\\\\Requests`),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n } else {\n // Standard Laravel Structure\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `app/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, 'App\\\\Models', projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `app/Http/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `app/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `app/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `app/Http/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n }\n } else {\n // TypeScript (or fallback)\n const selected = new Set(options.components);\n const srcDir = projectInfo.typescript?.srcDir || 'src';\n\n if (isModular) {\n const moduleFolder = `${srcDir}/modules/${names.kebab}`;\n\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, true),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, true),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, true),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, true),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n\n // Add barrel index.ts export if multiple components generated in module\n if (filesToGenerate.length > 1) {\n const exports: string[] = [];\n if (selected.has('controller')) exports.push(`export * from './${names.kebab}.controller.js';`);\n if (selected.has('service')) exports.push(`export * from './${names.kebab}.service.js';`);\n if (selected.has('repository')) exports.push(`export * from './${names.kebab}.repository.js';`);\n if (selected.has('route')) exports.push(`export * from './${names.kebab}.routes.js';`);\n if (selected.has('dto')) exports.push(`export * from './${names.kebab}.dto.js';`);\n\n if (exports.length > 0) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/index.ts`,\n content: `${exports.join('\\n')}\\n`,\n isBarrel: true,\n barrelExports: exports,\n });\n }\n }\n } else {\n // Layered structure\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/controllers/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, false),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/services/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, false),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/repositories/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, false),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/routes/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, false),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/dtos/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n }\n }\n\n // Execute file writing with strict Anti-Overwrite Protection\n\n for (const item of filesToGenerate) {\n const fullPath = path.resolve(root, item.relativePath);\n\n // Defense in depth: path traversal check\n const rel = path.relative(root, fullPath);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: 'Path traversal attempt detected outside project root',\n });\n errorCount++;\n continue;\n }\n\n if (options.dryRun) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Dry run simulated',\n });\n createdCount++;\n continue;\n }\n\n // Handle TS barrel index.ts appending if file already exists\n if (item.isBarrel && item.barrelExports && fs.existsSync(fullPath)) {\n try {\n const existingContent = fs.readFileSync(fullPath, 'utf-8');\n const missingExports = item.barrelExports.filter(\n (line) => !existingContent.includes(line)\n );\n\n if (missingExports.length > 0) {\n const newContent = existingContent.endsWith('\\n')\n ? existingContent + missingExports.join('\\n') + '\\n'\n : existingContent + '\\n' + missingExports.join('\\n') + '\\n';\n fs.writeFileSync(fullPath, newContent, 'utf-8');\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Appended exports to existing barrel index',\n });\n createdCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists and contains all module exports',\n });\n skippedCount++;\n }\n continue;\n } catch (err: any) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n continue;\n }\n }\n\n try {\n // Ensure directory exists\n const parentDir = path.dirname(fullPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(fullPath, item.content, {\n flag: options.forceOverwrite ? 'w' : 'wx',\n encoding: 'utf-8',\n });\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n });\n createdCount++;\n } catch (err: any) {\n if (err.code === 'EEXIST') {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n }\n }\n }\n\n return {\n moduleName: names.pascal,\n targetDir: root,\n files: results,\n createdCount,\n skippedCount,\n errorCount,\n dryRun: Boolean(options.dryRun),\n };\n}\n\n","export interface NamingVariations {\n pascal: string; // e.g. PaymentOrder\n camel: string; // e.g. paymentOrder\n kebab: string; // e.g. payment-order\n snake: string; // e.g. payment_order\n pluralSnake: string;// e.g. payment_orders\n pluralPascal: string;// e.g. PaymentOrders\n}\n\nfunction pluralize(word: string): string {\n const lower = word.toLowerCase();\n // If already ends in s and not ss (e.g. payments, orders, users)\n if (lower.endsWith('s') && !lower.endsWith('ss')) {\n return word;\n }\n // consonant + y -> ies (e.g., category -> categories, company -> companies)\n if (/[bcdfghjklmnpqrstvwxyz]y$/i.test(word)) {\n return word.slice(0, -1) + (word.endsWith('Y') ? 'IES' : 'ies');\n }\n // s, x, z, ch, sh -> es (box -> boxes, church -> churches, dish -> dishes, pass -> passes)\n if (/(?:s|x|z|ch|sh)$/i.test(word)) {\n return word + (word === word.toUpperCase() ? 'ES' : 'es');\n }\n return word + (word === word.toUpperCase() ? 'S' : 's');\n}\n\nexport function getNaming(input: string): NamingVariations {\n // Clean string and split on camelCase/PascalCase boundaries and separators\n const words = input\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n words.push('sample', 'module');\n }\n\n const pascal = words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1);\n\n const snake = words.map((w) => w.toLowerCase()).join('_');\n\n const kebab = words.map((w) => w.toLowerCase()).join('-');\n\n // Pluralization\n const pluralWords = [...words];\n const lastIdx = pluralWords.length - 1;\n pluralWords[lastIdx] = pluralize(pluralWords[lastIdx]);\n\n const pluralSnake = pluralWords.map((w) => w.toLowerCase()).join('_');\n const pluralPascal = pluralWords\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n return { pascal, camel, kebab, snake, pluralSnake, pluralPascal };\n}\n\nexport function laravelModelTemplate(\n names: NamingVariations,\n namespace: string = 'App\\\\Models',\n laravelVersion?: string\n): string {\n const major = laravelVersion ? parseInt(laravelVersion.split('.')[0], 10) : 11;\n const isLaravel10OrOlder = major > 0 && major < 11;\n\n const castsBlock = isLaravel10OrOlder\n ? ` /**\n * The attributes that should be cast.\n *\n * @var array<string, string>\n */\n protected $casts = [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];`\n : ` /**\n * Get the attributes that should be cast.\n *\n * @return array<string, string>\n */\n protected function casts(): array\n {\n return [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];\n }`;\n\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\nuse Illuminate\\\\Database\\\\Eloquent\\\\Model;\n\nclass ${names.pascal} extends Model\n{\n use HasFactory;\n\n /**\n * The table associated with the model.\n *\n * @var string\n */\n protected $table = '${names.pluralSnake}';\n\n /**\n * The attributes that are mass assignable.\n *\n * @var list<string>\n */\n protected $fillable = [\n 'name',\n 'status',\n 'metadata',\n ];\n\n${castsBlock}\n}\n`;\n}\n\nexport function laravelControllerTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n serviceNamespace?: string;\n requestNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Http\\\\Controllers';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n const serviceNamespace = options.serviceNamespace || 'App\\\\Services';\n const requestNamespace = options.requestNamespace || 'App\\\\Http\\\\Requests';\n\n const baseControllerImport =\n namespace !== 'App\\\\Http\\\\Controllers' ? 'use App\\\\Http\\\\Controllers\\\\Controller;\\n' : '';\n\n return `<?php\n\nnamespace ${namespace};\n\n${baseControllerImport}use ${modelNamespace}\\\\${names.pascal};\nuse ${serviceNamespace}\\\\${names.pascal}Service;\nuse ${requestNamespace}\\\\${names.pascal}Request;\nuse Illuminate\\\\Http\\\\JsonResponse;\nuse Illuminate\\\\Http\\\\Request;\n\nclass ${names.pascal}Controller extends Controller\n{\n public function __construct(\n protected ${names.pascal}Service $${names.camel}Service\n ) {}\n\n /**\n * Display a listing of ${names.pascal} resources.\n */\n public function index(Request $request): JsonResponse\n {\n $items = $this->${names.camel}Service->getAll($request->all());\n\n return response()->json([\n 'status' => 'success',\n 'data' => $items,\n ]);\n }\n\n /**\n * Display the specified ${names.pascal} resource.\n */\n public function show(int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->getById($id);\n\n return response()->json([\n 'status' => 'success',\n 'data' => $item,\n ]);\n }\n\n /**\n * Store a newly created ${names.pascal} in storage.\n */\n public function store(${names.pascal}Request $request): JsonResponse\n {\n $item = $this->${names.camel}Service->create($request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} created successfully.',\n 'data' => $item,\n ], 201);\n }\n\n /**\n * Update the specified ${names.pascal} in storage.\n */\n public function update(${names.pascal}Request $request, int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->update($id, $request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} updated successfully.',\n 'data' => $item,\n ]);\n }\n\n /**\n * Remove the specified ${names.pascal} from storage.\n */\n public function destroy(int $id): JsonResponse\n {\n $this->${names.camel}Service->delete($id);\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} deleted successfully.',\n ]);\n }\n}\n`;\n}\n\nexport function laravelServiceTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Services';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\nuse Illuminate\\\\Database\\\\Eloquent\\\\Collection;\n\nclass ${names.pascal}Service\n{\n /**\n * Retrieve all ${names.pluralPascal}.\n */\n public function getAll(array $filters = []): Collection\n {\n return ${names.pascal}::query()\n ->latest()\n ->get();\n }\n\n /**\n * Find ${names.pascal} by primary key.\n */\n public function getById(int $id): ${names.pascal}\n {\n return ${names.pascal}::findOrFail($id);\n }\n\n /**\n * Create a new ${names.pascal}.\n */\n public function create(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n\n /**\n * Update an existing ${names.pascal}.\n */\n public function update(int $id, array $data): ${names.pascal}\n {\n $item = $this->getById($id);\n $item->update($data);\n\n return $item;\n }\n\n /**\n * Delete a ${names.pascal}.\n */\n public function delete(int $id): bool\n {\n $item = $this->getById($id);\n\n return (bool) $item->delete();\n }\n}\n`;\n}\n\nexport function laravelActionTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Actions';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\n\nclass Create${names.pascal}Action\n{\n /**\n * Execute the ${names.pascal} creation workflow.\n */\n public function execute(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n}\n`;\n}\n\nexport function laravelRequestTemplate(names: NamingVariations, namespace: string = 'App\\\\Http\\\\Requests'): string {\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Foundation\\\\Http\\\\FormRequest;\n\nclass ${names.pascal}Request extends FormRequest\n{\n /**\n * Determine if the user is authorized to make this request.\n */\n public function authorize(): bool\n {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request.\n *\n * @return array<string, list<string>>\n */\n public function rules(): array\n {\n return [\n 'name' => ['required', 'string', 'max:255'],\n 'status' => ['nullable', 'string', 'in:draft,active,archived'],\n 'metadata' => ['nullable', 'array'],\n ];\n }\n\n /**\n * Get custom error messages for validation rules.\n *\n * @return array<string, string>\n */\n public function messages(): array\n {\n return [\n 'name.required' => 'The ${names.camel} name field is required.',\n ];\n }\n}\n`;\n}\n\nexport function laravelMigrationTemplate(names: NamingVariations): string {\n return `<?php\n\nuse Illuminate\\\\Database\\\\Migrations\\\\Migration;\nuse Illuminate\\\\Database\\\\Schema\\\\Blueprint;\nuse Illuminate\\\\Support\\\\Facades\\\\Schema;\n\nreturn new class extends Migration\n{\n /**\n * Run the migrations.\n */\n public function up(): void\n {\n Schema::create('${names.pluralSnake}', function (Blueprint $table) {\n $table->id();\n $table->string('name');\n $table->string('status')->default('draft');\n $table->json('metadata')->nullable();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n public function down(): void\n {\n Schema::dropIfExists('${names.pluralSnake}');\n }\n};\n`;\n}\n","import type { NamingVariations } from './laravel.js';\n\nexport function tsControllerTemplate(names: NamingVariations, isModular: boolean = true): string {\n const serviceImport = isModular ? `./${names.kebab}.service.js` : `../services/${names.kebab}.service.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import type { Request, Response, NextFunction } from 'express';\nimport { ${names.pascal}Service } from '${serviceImport}';\nimport type { Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Controller {\n constructor(private readonly ${names.camel}Service: ${names.pascal}Service = new ${names.pascal}Service()) {}\n\n /**\n * GET /api/${names.kebab}\n */\n getAll = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const items = await this.${names.camel}Service.findAll(req.query);\n res.status(200).json({ status: 'success', data: items });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * GET /api/${names.kebab}/:id\n */\n getById = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const item = await this.${names.camel}Service.findById(id);\n if (!item) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', data: item });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * POST /api/${names.kebab}\n */\n create = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const payload: Create${names.pascal}Dto = req.body;\n const created = await this.${names.camel}Service.create(payload);\n res.status(201).json({ status: 'success', data: created });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * PUT /api/${names.kebab}/:id\n */\n update = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const payload: Update${names.pascal}Dto = req.body;\n const updated = await this.${names.camel}Service.update(id, payload);\n res.status(200).json({ status: 'success', data: updated });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * DELETE /api/${names.kebab}/:id\n */\n delete = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const deleted = await this.${names.camel}Service.delete(id);\n if (!deleted) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', message: '${names.pascal} deleted successfully' });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n}\n`;\n}\n\nexport function tsServiceTemplate(names: NamingVariations, isModular: boolean = true): string {\n const repoImport = isModular ? `./${names.kebab}.repository.js` : `../repositories/${names.kebab}.repository.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { ${names.pascal}Repository } from '${repoImport}';\nimport type { ${names.pascal}Entity, Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Service {\n constructor(private readonly ${names.camel}Repository: ${names.pascal}Repository = new ${names.pascal}Repository()) {}\n\n async findAll(query: Record<string, any> = {}): Promise<${names.pascal}Entity[]> {\n return this.${names.camel}Repository.findAll(query);\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.${names.camel}Repository.findById(id);\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.create(data);\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.update(id, data);\n }\n\n async delete(id: string): Promise<boolean> {\n return this.${names.camel}Repository.delete(id);\n }\n}\n`;\n}\n\nexport function tsRepositoryTemplate(names: NamingVariations, isModular: boolean = true): string {\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { randomUUID } from 'node:crypto';\nimport { NotFoundError, type ${names.pascal}Entity, type Create${names.pascal}Dto, type Update${names.pascal}Dto } from '${dtoImport}';\n\nexport interface I${names.pascal}Repository {\n findAll(query?: Record<string, any>): Promise<${names.pascal}Entity[]>;\n findById(id: string): Promise<${names.pascal}Entity | null>;\n create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity>;\n update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity>;\n delete(id: string): Promise<boolean>;\n}\n\nexport class ${names.pascal}Repository implements I${names.pascal}Repository {\n // In-memory store fallback. Replace with Prisma / TypeORM / Drizzle client calls.\n private storage: Map<string, ${names.pascal}Entity> = new Map();\n\n async findAll(_query?: Record<string, any>): Promise<${names.pascal}Entity[]> {\n return Array.from(this.storage.values());\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.storage.get(id) || null;\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const id = randomUUID();\n const newRecord: ${names.pascal}Entity = {\n id,\n ...data,\n status: data.status || 'draft',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.storage.set(id, newRecord);\n return newRecord;\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const existing = await this.findById(id);\n if (!existing) {\n throw new NotFoundError(\\`${names.pascal} with id \\${id} not found\\`);\n }\n const updated: ${names.pascal}Entity = {\n ...existing,\n ...data,\n updatedAt: new Date(),\n };\n this.storage.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return this.storage.delete(id);\n }\n}\n`;\n}\n\nexport function tsRoutesTemplate(names: NamingVariations, isModular: boolean = true): string {\n const controllerImport = isModular ? `./${names.kebab}.controller.js` : `../controllers/${names.kebab}.controller.js`;\n\n return `import { Router } from 'express';\nimport { ${names.pascal}Controller } from '${controllerImport}';\n\nconst router = Router();\nconst controller = new ${names.pascal}Controller();\n\n/**\n * Route declarations for ${names.pascal}\n */\nrouter.get('/', controller.getAll);\nrouter.get('/:id', controller.getById);\nrouter.post('/', controller.create);\nrouter.put('/:id', controller.update);\nrouter.delete('/:id', controller.delete);\n\nexport const ${names.camel}Routes = router;\nexport default router;\n`;\n}\n\nexport function tsDtoTemplate(names: NamingVariations): string {\n return `export class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\nexport interface ${names.pascal}Entity {\n id: string;\n name: string;\n status: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Create${names.pascal}Dto {\n name: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Update${names.pascal}Dto {\n name?: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n`;\n}\n\n"],"mappings":"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","names":["fs","path","path","diagram","p","fs","path","path","fs","spinner","path","fs"]}