UNPKG

next-api-analyzer

Version:

Next.js API routes analyzer for security, performance, and maintainability

1 lines โ€ข 267 kB
{"version":3,"sources":["../src/bin/api-analyzer.ts","../src/lib/api-analyzer.ts","../src/config/default-config.ts","../src/utils/file-utils.ts","../src/utils/logger.ts","../src/analyzers/security-analyzer.ts","../src/utils/common.ts","../src/analyzers/base-analyzer.ts","../src/analyzers/performance-analyzer.ts","../src/lib/plugin-system.ts","../src/lib/report-generator.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { NextApiAnalyzer } from \"../lib/api-analyzer\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger, LogLevel } from \"../utils/logger\"\nimport { PluginManager, OpenApiPlugin, TestCoveragePlugin } from \"../lib/plugin-system\"\nimport { validateConfig, DEFAULT_CONFIG } from \"../config/default-config\"\nimport type { AnalyzerConfig, ApiAnalysisResult } from \"../types\"\nimport path from \"path\"\nimport { performance } from \"perf_hooks\"\nimport chalk from \"chalk\"\nimport { UnifiedReportGenerator } from \"../lib/report-generator\"\nimport type { SecurityReportData, PerformanceReportData, TrendsReportData, ComparisonReportData, } from \"../lib/report-generator\"\n\nconst program = new Command()\n\nprogram.name(\"next-api-analyzer\").description(\"Next.js API routes analyzer\").version(\"3.1.0\")\n\nprogram\n    .option(\"-v, --verbose\", \"Enable verbose logging\")\n    .option(\"-q, --quiet\", \"Suppress output\")\n    .option(\"-c, --config <file>\", \"Configuration file path\")\n    .option(\"--no-color\", \"Disable colored output\")\n    .hook(\"preAction\", (thisCommand) => {\n        const opts = thisCommand.opts()\n        if (opts.quiet) {\n            logger.configure({ level: LogLevel.ERROR })\n        } else if (opts.verbose) {\n            logger.configure({ level: LogLevel.DEBUG })\n        }\n\n        if (opts.noColor) {\n            logger.configure({ colors: false })\n        }\n    })\n\nprogram\n    .command(\"analyze\")\n    .description(\"Analyze API routes\")\n    .option(\"-d, --dir <directory>\", \"API directory\", \"src/app/api\")\n    .option(\"-o, --output <directory>\", \"Output directory\", \"./api-analysis\")\n    .option(\"-f, --format <format>\", \"Output format (md, json, html, all)\", \"md\")\n    .option(\"--include-trends\", \"Include historical trend analysis\", false)\n    .option(\"--parallel\", \"Enable parallel processing\", true)\n    .option(\"--max-concurrency <number>\", \"Maximum concurrent file processing\", \"4\")\n    .option(\"--cache\", \"Enable caching for faster subsequent runs\", true)\n    .option(\"--plugins <plugins>\", \"Comma-separated list of plugins to enable\")\n    .option(\"--exclude-patterns <patterns>\", \"Additional exclude patterns (comma-separated)\")\n    .option(\"--security\", \"Focus on security analysis\")\n    .option(\"--performance\", \"Focus on performance analysis\")\n    .action(async (options) => {\n        const startTime = performance.now()\n\n        try {\n            logger.info(\"๐Ÿš€ Starting API analysis...\")\n\n            const config = await loadConfig(options.config, {\n                apiDir: options.dir,\n                outputDir: options.output,\n                enableTrends: options.includeTrends,\n                parallel: options.parallel,\n                maxConcurrency: Number.parseInt(options.maxConcurrency),\n                cache: { ...DEFAULT_CONFIG.cache, enabled: options.cache },\n            })\n\n            if (options.excludePatterns) {\n                config.excludePatterns.push(...options.excludePatterns.split(\",\").map((p: string) => p.trim()))\n            }\n\n            if (options.security) {\n                config.enableSecurityAnalysis = true\n                config.enablePerformanceAnalysis = false\n            }\n\n            if (options.performance) {\n                config.enablePerformanceAnalysis = true\n                config.enableSecurityAnalysis = false\n            }\n\n            const configErrors = validateConfig(config)\n            if (configErrors.length > 0) {\n                logger.error(\"Configuration validation failed:\")\n                configErrors.forEach((error) => logger.error(`  - ${error}`))\n                process.exit(1)\n            }\n\n            const analyzer = new NextApiAnalyzer(config)\n\n            if (options.plugins) {\n                const pluginManager = new PluginManager()\n                const pluginNames = options.plugins.split(\",\").map((p: string) => p.trim())\n\n                for (const pluginName of pluginNames) {\n                    if (pluginName === \"openapi\") {\n                        await pluginManager.loadPlugin(new OpenApiPlugin())\n                    } else if (pluginName === \"test-coverage\") {\n                        await pluginManager.loadPlugin(new TestCoveragePlugin())\n                    }\n                }\n            }\n\n            const analysis = await analyzer.analyzeRoutes()\n\n            const formats = options.format === \"all\" ? [\"md\", \"json\", \"html\"] : [options.format]\n\n            for (const format of formats) {\n                await generateReport(analyzer, analysis, format, config.outputDir)\n            }\n\n            logger.info(\"๐Ÿ“Š Analysis Summary:\")\n            logger.info(`  Routes: ${analysis.summary.totalRoutes}`)\n            logger.info(`  Security Score: ${analysis.summary.securityScore.toFixed(1)}%`)\n            logger.info(`  Performance Score: ${analysis.summary.performanceScore.toFixed(1)}%`)\n            logger.info(`  Recommendations: ${analysis.recommendations.length}`)\n\n            displaySummary(analysis)\n\n            const duration = performance.now() - startTime\n            logger.success(`โœ… Analysis complete! Reports saved to: ${config.outputDir}`)\n            logger.success(`โœ… Analysis complete in ${duration.toFixed(2)}ms! Reports saved to: ${config.outputDir}`)\n\n            const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n            await reportGenerator.generateUnifiedReport(\"analyze\", analysis)\n        } catch (error) {\n            logger.error(\"Analysis failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"security\")\n    .description(\"Security-focused analysis\")\n    .option(\"-d, --dir <directory>\", \"API directory\", \"src/app/api\")\n    .option(\"-t, --threshold <number>\", \"Security threshold\", \"80\")\n    .option(\"--fail-on-threshold\", \"Exit with error code if threshold not met\")\n    .option(\"--export-sarif\", \"Export results in SARIF format for CI/CD\")\n    .option(\"--cwe-mapping\", \"Include CWE (Common Weakness Enumeration) mapping\", true)\n    .option(\"--compliance <standard>\", \"Check against compliance standards (owasp, pci-dss)\")\n    .option(\"--exclude-patterns <patterns>\", \"Exclude specific vulnerability patterns\")\n    .action(async (options) => {\n        const startTime = performance.now()\n\n        try {\n            logger.info(\"๐Ÿ” Running security analysis...\")\n\n            const config = await loadConfig(options.config, {\n                apiDir: options.dir,\n                enableSecurityAnalysis: true,\n                enablePerformanceAnalysis: false,\n            })\n\n            const analyzer = new NextApiAnalyzer(config)\n            const analysis = await analyzer.analyzeRoutes()\n            const threshold = Number.parseInt(options.threshold)\n\n            logger.info(`๐Ÿ›ก๏ธ Security Score: ${analysis.summary.securityScore.toFixed(1)}%`)\n\n            displaySecurityReport(analysis, {\n                cweMapping: options.cweMapping,\n                compliance: options.compliance,\n            })\n\n            if (options.exportSarif) {\n                await exportSarif(analysis, config.outputDir)\n                logger.success(\"๐Ÿ“„ SARIF report exported for CI/CD integration\")\n            }\n\n            if (options.failOnThreshold && analysis.summary.securityScore < threshold) {\n                logger.error(`โŒ Security score below threshold (${threshold}%)`)\n                logger.error(`โŒ Security score ${analysis.summary.securityScore.toFixed(1)}% is below threshold ${threshold}%`)\n                process.exit(1)\n            }\n\n            logger.success(\"โœ… Security analysis passed\")\n            const duration = performance.now() - startTime\n            logger.success(`๐Ÿ›ก๏ธ Security audit complete in ${duration.toFixed(2)}ms!`)\n\n            const securityData: SecurityReportData = await generateSecurityReportData(analysis)\n            const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n            await reportGenerator.generateUnifiedReport(\"security\", analysis, { security: securityData })\n        } catch (error) {\n            logger.error(\"Security analysis failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"performance\")\n    .description(\"Performance analysis with complexity metrics and optimization recommendations\")\n    .option(\"-d, --dir <directory>\", \"API directory to analyze\", \"src/app/api\")\n    .option(\"--benchmark\", \"Run performance benchmarks\")\n    .option(\"--complexity-threshold <number>\", \"Complexity threshold for warnings\", \"10\")\n    .option(\"--memory-analysis\", \"Include memory usage estimation\", true)\n    .option(\"--database-analysis\", \"Analyze database query patterns\", true)\n    .option(\"--external-calls\", \"Track external API dependencies\", true)\n    .action(async (options) => {\n        const startTime = performance.now()\n\n        try {\n            logger.info(\"โšก Running performance analysis...\")\n\n            const config = await loadConfig(options.config, {\n                apiDir: options.dir,\n                enablePerformanceAnalysis: true,\n                enableSecurityAnalysis: false,\n                thresholds: {\n                    ...DEFAULT_CONFIG.thresholds,\n                    complexity: Number.parseInt(options.complexityThreshold),\n                },\n            })\n\n            const analyzer = new NextApiAnalyzer(config)\n            const analysis = await analyzer.analyzeRoutes()\n\n            displayPerformanceReport(analysis, {\n                benchmark: options.benchmark,\n                memoryAnalysis: options.memoryAnalysis,\n                databaseAnalysis: options.databaseAnalysis,\n                externalCalls: options.externalCalls,\n            })\n\n            if (options.benchmark) {\n                logger.info(\"๐Ÿƒ Running performance benchmarks...\")\n                await runPerformanceBenchmarks(analysis)\n            }\n\n            const duration = performance.now() - startTime\n            logger.success(`โšก Performance analysis complete in ${duration.toFixed(2)}ms!`)\n\n            const performanceData: PerformanceReportData = await generatePerformanceReportData(analysis)\n            const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n            await reportGenerator.generateUnifiedReport(\"performance\", analysis, { performance: performanceData })\n        } catch (error) {\n            logger.error(\"Performance analysis failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"trends\")\n    .description(\"Historical trend analysis with configurable time ranges\")\n    .option(\"-d, --dir <directory>\", \"API directory to analyze\", \"src/app/api\")\n    .option(\"--days <number>\", \"Number of days to analyze\", \"30\")\n    .option(\"--export-csv\", \"Export trend data as CSV\")\n    .option(\"--compare-branches\", \"Compare trends across git branches\")\n    .option(\"--baseline <file>\", \"Set baseline for comparison\")\n    .action(async (options) => {\n        try {\n            logger.info(\"๐Ÿ“ˆ Analyzing trends...\")\n\n            const trendsFile = path.join(\"./api-analysis\", \"trends.json\")\n            const trends = await FileUtils.readJsonFile(trendsFile)\n\n            if (!Array.isArray(trends) || trends.length === 0) {\n                logger.warn(\"No trend data available. Run analysis with --include-trends first.\")\n                return\n            }\n\n            displayTrendsReport(trends, Number.parseInt(options.days), {\n                exportCsv: options.exportCsv,\n                compareBranches: options.compareBranches,\n                baseline: options.baseline,\n            })\n\n            const trendsData: TrendsReportData = await generateTrendsReportData(trends, Number.parseInt(options.days))\n            const config = await loadConfig(options.config)\n            const analysis = { summary: { securityScore: 0, performanceScore: 0, maintainabilityScore: 0 } } as any\n            const reportGenerator = new UnifiedReportGenerator(config, \"./api-analysis\")\n            await reportGenerator.generateUnifiedReport(\"trends\", analysis, { trends: trendsData })\n        } catch (error) {\n            logger.error(\"Trends analysis failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"compare <baseline> <current>\")\n    .description(\"Compare analysis results between different versions or branches\")\n    .option(\"--format <format>\", \"Output format for comparison\", \"md\")\n    .option(\"--show-diff\", \"Show detailed differences\")\n    .option(\"--regression-only\", \"Only show regressions\")\n    .action(async (baseline, current, options) => {\n        try {\n            logger.info(\"๐Ÿ”„ Comparing analysis reports...\")\n\n            const [baselineData, currentData] = await Promise.all([\n                FileUtils.readJsonFile(baseline),\n                FileUtils.readJsonFile(current),\n            ])\n\n            if (!baselineData || !currentData) {\n                logger.error(\"Could not read comparison files\")\n                process.exit(1)\n            }\n\n            displayComparisonReport(baselineData, currentData, {\n                format: options.format,\n                showDiff: options.showDiff,\n                regressionOnly: options.regressionOnly,\n            })\n\n            const config = await loadConfig(options.config)\n            const comparisonData: ComparisonReportData = await generateComparisonReportData(baselineData, currentData)\n            const reportGenerator = new UnifiedReportGenerator(config, \"./api-analysis\")\n            await reportGenerator.generateUnifiedReport(\"compare\", currentData as ApiAnalysisResult, { comparison: comparisonData })\n        } catch (error) {\n            logger.error(\"Comparison failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"plugins\")\n    .description(\"Manage and configure analysis plugins\")\n    .argument(\"<command>\", \"Plugin command (list, install, enable, disable, configure)\")\n    .argument(\"[plugin]\", \"Plugin name\")\n    .action(async (command, plugin) => {\n        try {\n            const pluginManager = new PluginManager()\n\n            switch (command) {\n                case \"list\":\n                    const plugins = pluginManager.getLoadedPlugins()\n                    logger.info(\"๐Ÿ“ฆ Loaded plugins:\")\n                    plugins.forEach((name) => logger.info(`  - ${name}`))\n                    break\n\n                case \"install\":\n                    if (!plugin) {\n                        logger.error(\"Plugin name is required\")\n                        process.exit(1)\n                    }\n                    logger.info(`Installing plugin: ${plugin}`)\n                    break\n\n                case \"enable\":\n                case \"disable\":\n                case \"configure\":\n                    logger.info(`${command} plugin: ${plugin}`)\n                    break\n\n                default:\n                    logger.error(`Unknown plugin command: ${command}`)\n                    process.exit(1)\n            }\n        } catch (error) {\n            logger.error(\"Plugin management failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"validate-config\")\n    .description(\"Validate configuration file\")\n    .option(\"-c, --config <file>\", \"Configuration file to validate\")\n    .action(async (options) => {\n        try {\n            const config = await loadConfig(options.config)\n            const errors = validateConfig(config)\n\n            if (errors.length === 0) {\n                logger.success(\"โœ… Configuration is valid\")\n            } else {\n                logger.error(\"โŒ Configuration validation failed:\")\n                errors.forEach((error) => logger.error(`  - ${error}`))\n                process.exit(1)\n            }\n        } catch (error) {\n            logger.error(\"Configuration validation failed:\", error)\n            process.exit(1)\n        }\n    })\n\nprogram\n    .command(\"init\")\n    .description(\"Initialize configuration file\")\n    .option(\"-f, --force\", \"Overwrite existing configuration\")\n    .option(\"--template <template>\", \"Template (basic, security, performance)\", \"basic\")\n    .action(async (options) => {\n        try {\n            const configPath = \"api-analyzer.config.json\"\n\n            if ((await FileUtils.fileExists(configPath)) && !options.force) {\n                logger.warn(\"Configuration file already exists. Use --force to overwrite.\")\n                return\n            }\n\n            const templates = {\n                basic: DEFAULT_CONFIG,\n                security: { ...DEFAULT_CONFIG, enableSecurityAnalysis: true, enablePerformanceAnalysis: false },\n                performance: { ...DEFAULT_CONFIG, enablePerformanceAnalysis: true, enableSecurityAnalysis: false },\n            }\n\n            const template = options.template || \"basic\"\n            const config = templates[options.template as keyof typeof templates] || templates.basic\n            await FileUtils.writeJsonFile(\"api-analyzer.config.json\", config)\n\n            await FileUtils.writeJsonFile(configPath, config)\n            logger.success(`โœ… Configuration file created with ${options.template} template`)\n            logger.success(`โœ… Configuration file created: ${configPath}`)\n            logger.info(`๐Ÿ“‹ Template used: ${template}`)\n        } catch (error) {\n            logger.error(\"Failed to create configuration:\", error)\n            process.exit(1)\n        }\n    })\n\nasync function loadConfig(configPath?: string, overrides: Partial<AnalyzerConfig> = {}): Promise<AnalyzerConfig> {\n    let config: Partial<AnalyzerConfig> = {}\n\n    const configPaths = [configPath, \"api-analyzer.config.json\", \"api-analyzer.config.js\", \".api-analyzer.json\"].filter(\n        Boolean,\n    )\n\n    for (const path of configPaths) {\n        if (await FileUtils.fileExists(path!)) {\n            try {\n                config = (await FileUtils.readJsonFile(path!)) || {}\n                logger.debug(`Loaded configuration from: ${path}`)\n                break\n            } catch (error) {\n                logger.warn(`Failed to load config from ${path}:`, error)\n            }\n        }\n    }\n\n    return { ...DEFAULT_CONFIG, ...config, ...overrides }\n}\n\nasync function generateReport(\n    analyzer: NextApiAnalyzer,\n    analysis: ApiAnalysisResult,\n    format: string,\n    outputDir: string,\n): Promise<void> {\n    await FileUtils.ensureDirectoryExists(outputDir)\n\n    switch (format) {\n        case \"md\":\n            const mdReport = analyzer.generateReport(analysis)\n            await FileUtils.writeFile(path.join(outputDir, \"analysis-report.md\"), mdReport)\n            logger.info(`๐Ÿ“„ Markdown report: ${path.join(outputDir, \"analysis-report.md\")}`)\n            break\n\n        case \"json\":\n            await FileUtils.writeJsonFile(path.join(outputDir, \"analysis-data.json\"), analysis)\n            logger.info(`๐Ÿ“Š JSON data: ${path.join(outputDir, \"analysis-data.json\")}`)\n            break\n\n        case \"html\":\n            const htmlReport = generateHtmlReport(analysis)\n            await FileUtils.writeFile(path.join(outputDir, \"analysis-report.html\"), htmlReport)\n            logger.info(`๐ŸŒ HTML report: ${path.join(outputDir, \"analysis-report.html\")}`)\n            break\n    }\n}\n\nfunction displaySummary(analysis: ApiAnalysisResult): void {\n    logger.separator()\n    logger.info(chalk.bold(\"๐Ÿ“Š Analysis Summary\"))\n    logger.separator()\n\n    const summary = analysis.summary\n\n    console.log(chalk.cyan(\"๐Ÿ“ Routes:\"), summary.totalRoutes)\n    console.log(chalk.green(\"๐Ÿ”’ Security Score:\"), `${summary.securityScore.toFixed(1)}%`)\n    console.log(chalk.blue(\"โšก Performance Score:\"), `${summary.performanceScore.toFixed(1)}%`)\n    console.log(chalk.magenta(\"๐Ÿ”ง Maintainability Score:\"), `${summary.maintainabilityScore.toFixed(1)}%`)\n    console.log(chalk.yellow(\"๐Ÿงช Test Coverage:\"), `${summary.testCoverageScore.toFixed(1)}%`)\n\n    if (analysis.recommendations.length > 0) {\n        console.log(chalk.yellow(\"๐Ÿ’ก Recommendations:\"), analysis.recommendations.length)\n\n        const severityCounts = analysis.recommendations.reduce(\n            (acc, rec) => {\n                acc[rec.severity] = (acc[rec.severity] || 0) + 1\n                return acc\n            },\n            {} as Record<string, number>,\n        )\n\n        if (severityCounts.CRITICAL) console.log(chalk.red(`  ๐Ÿšจ Critical: ${severityCounts.CRITICAL}`))\n        if (severityCounts.HIGH) console.log(chalk.yellow(`  โš ๏ธ  High: ${severityCounts.HIGH}`))\n        if (severityCounts.MEDIUM) console.log(chalk.blue(`  โ„น๏ธ  Medium: ${severityCounts.MEDIUM}`))\n        if (severityCounts.LOW) console.log(chalk.green(`  โœ… Low: ${severityCounts.LOW}`))\n    }\n\n    logger.separator()\n}\n\nfunction displaySecurityReport(analysis: ApiAnalysisResult, options: any = {}): void {\n    logger.separator()\n    logger.info(chalk.bold(\"๐Ÿ” Security Audit Report\"))\n    logger.separator()\n\n    const summary = analysis.summary\n\n    console.log(chalk.green(\"๐Ÿ›ก๏ธ  Security Score:\"), `${summary.securityScore.toFixed(1)}%`)\n    console.log(chalk.cyan(\"๐Ÿ”’ Secure Routes:\"), `${summary.secureRoutes}/${summary.totalRoutes}`)\n    console.log(chalk.red(\"๐Ÿ”“ Public Routes:\"), summary.publicRoutes)\n\n    console.log(chalk.bold(\"\\n๐Ÿ“Š Risk Distribution:\"))\n    Object.entries(summary.riskDistribution).forEach(([risk, count]) => {\n        const emoji = { CRITICAL: \"๐Ÿ”ด\", HIGH: \"๐ŸŸ \", MEDIUM: \"๐ŸŸก\", LOW: \"๐ŸŸข\" }[risk] || \"โšช\"\n        const color = { CRITICAL: chalk.red, HIGH: chalk.yellow, MEDIUM: chalk.blue, LOW: chalk.green }[risk] || chalk.gray\n        console.log(color(`  ${emoji} ${risk}: ${count} routes`))\n    })\n\n    const securityRecs = analysis.recommendations.filter((r) => r.type === \"SECURITY\")\n    if (securityRecs.length > 0) {\n        console.log(chalk.bold(\"\\n๐Ÿšจ Top Security Issues:\"))\n        securityRecs.slice(0, 5).forEach((rec, index) => {\n            const severityEmoji = { CRITICAL: \"๐Ÿšจ\", HIGH: \"โš ๏ธ\", MEDIUM: \"โ„น๏ธ\", LOW: \"โœ…\" }[rec.severity] || \"โ“\"\n            console.log(`  ${index + 1}. ${severityEmoji} ${rec.title}`)\n            if (rec.route) console.log(`     ๐Ÿ“ Route: ${rec.route}`)\n            if (options.cweMapping && rec.tags?.includes(\"cwe\")) {\n                console.log(`     ๐Ÿท๏ธ  CWE: ${rec.tags.find((tag) => tag.startsWith(\"CWE-\")) || \"N/A\"}`)\n            }\n        })\n    }\n\n    logger.separator()\n}\n\nfunction displayPerformanceReport(analysis: ApiAnalysisResult, options: any = {}): void {\n    logger.separator()\n    logger.info(chalk.bold(\"โšก Performance Analysis Report\"))\n    logger.separator()\n\n    const summary = analysis.summary\n    const routes = analysis.routes\n\n    console.log(chalk.blue(\"โšก Performance Score:\"), `${summary.performanceScore.toFixed(1)}%`)\n\n    const avgComplexity = routes.reduce((sum, route) => sum + (route.complexity || 0), 0) / routes.length\n    console.log(chalk.cyan(\"๐Ÿ”„ Average Complexity:\"), avgComplexity.toFixed(1))\n\n    const avgLinesOfCode = routes.reduce((sum, route) => sum + (route.linesOfCode || 0), 0) / routes.length\n    console.log(chalk.magenta(\"๐Ÿ“ Average Lines of Code:\"), Math.round(avgLinesOfCode))\n\n    if (options.memoryAnalysis) {\n        const totalMemoryEstimate = routes.reduce((sum, route) => sum + ((route as any).memoryEstimate || 0), 0)\n        console.log(chalk.yellow(\"๐Ÿ’พ Estimated Memory Usage:\"), `${(totalMemoryEstimate / 1024).toFixed(1)}MB`)\n    }\n\n    const highComplexityRoutes = routes.filter((r) => (r.complexity || 0) > 15)\n    if (highComplexityRoutes.length > 0) {\n        console.log(chalk.bold(\"\\n๐Ÿ”ฅ High Complexity Routes:\"))\n        highComplexityRoutes.slice(0, 5).forEach((route) => {\n            console.log(`  ๐Ÿ“ ${route.path} (complexity: ${route.complexity})`)\n        })\n    }\n\n    const performanceRecs = analysis.recommendations.filter((r) => r.type === \"PERFORMANCE\")\n    if (performanceRecs.length > 0) {\n        console.log(chalk.bold(\"\\nโšก Performance Issues:\"))\n        const issueTypes = performanceRecs.reduce(\n            (acc, rec) => {\n                acc[rec.category] = (acc[rec.category] || 0) + 1\n                return acc\n            },\n            {} as Record<string, number>,\n        )\n\n        Object.entries(issueTypes).forEach(([type, count]) => {\n            const emoji = { blocking: \"๐ŸŒ\", caching: \"๐Ÿ”„\", memory: \"๐Ÿ’พ\", database: \"๐Ÿ—„๏ธ\", loops: \"๐Ÿ”\" }[type] || \"โš ๏ธ\"\n            console.log(`  ${emoji} ${type}: ${count} issues`)\n        })\n    }\n\n    logger.separator()\n}\n\nfunction displayTrendsReport(trends: any[], days: number, options: any = {}): void {\n    logger.separator()\n    logger.info(chalk.bold(`๐Ÿ“ˆ Trends Analysis (Last ${days} Days)`))\n    logger.separator()\n\n    const recentTrends = trends.slice(-days)\n\n    if (recentTrends.length < 2) {\n        logger.warn(\"Not enough data for trend analysis\")\n        return\n    }\n\n    const first = recentTrends[0]\n    const last = recentTrends[recentTrends.length - 1]\n\n    const changes = {\n        routes: last.totalRoutes - first.totalRoutes,\n        security: last.securityScore - first.securityScore,\n        performance: last.performanceScore - first.performanceScore,\n        maintainability: last.maintainabilityScore - first.maintainabilityScore,\n    }\n\n    console.log(\n        chalk.cyan(\"๐Ÿ“ Route Count:\"),\n        `${first.totalRoutes} โ†’ ${last.totalRoutes}`,\n        changes.routes >= 0 ? chalk.green(`(+${changes.routes})`) : chalk.red(`(${changes.routes})`),\n    )\n\n    console.log(\n        chalk.green(\"๐Ÿ”’ Security Score:\"),\n        `${first.securityScore.toFixed(1)}% โ†’ ${last.securityScore.toFixed(1)}%`,\n        changes.security >= 0\n            ? chalk.green(`(+${changes.security.toFixed(1)}%)`)\n            : chalk.red(`(${changes.security.toFixed(1)}%)`),\n    )\n\n    console.log(\n        chalk.blue(\"โšก Performance Score:\"),\n        `${first.performanceScore.toFixed(1)}% โ†’ ${last.performanceScore.toFixed(1)}%`,\n        changes.performance >= 0\n            ? chalk.green(`(+${changes.performance.toFixed(1)}%)`)\n            : chalk.red(`(${changes.performance.toFixed(1)}%)`),\n    )\n\n    console.log(\n        chalk.magenta(\"๐Ÿ”ง Maintainability Score:\"),\n        `${first.maintainabilityScore.toFixed(1)}% โ†’ ${last.maintainabilityScore.toFixed(1)}%`,\n        changes.maintainability >= 0\n            ? chalk.green(`(+${changes.maintainability.toFixed(1)}%)`)\n            : chalk.red(`(${changes.maintainability.toFixed(1)}%)`),\n    )\n\n    const overallTrend = (changes.security + changes.performance + changes.maintainability) / 3\n    const trendEmoji = overallTrend > 2 ? \"๐Ÿ“ˆ\" : overallTrend < -2 ? \"๐Ÿ“‰\" : \"โžก๏ธ\"\n    const trendText = overallTrend > 2 ? \"Improving\" : overallTrend < -2 ? \"Declining\" : \"Stable\"\n\n    console.log(chalk.bold(`\\n${trendEmoji} Overall Trend: ${trendText}`))\n\n    if (options.exportCsv) {\n        logger.info(\"๐Ÿ“Š Trend data exported to CSV\")\n    }\n\n    logger.separator()\n}\n\nfunction displayComparisonReport(baseline: any, current: any, options: any = {}): void {\n    logger.separator()\n    logger.info(chalk.bold(\"๐Ÿ”„ Comparison Report\"))\n    logger.separator()\n\n    const changes = {\n        routes: current.summary.totalRoutes - baseline.summary.totalRoutes,\n        security: current.summary.securityScore - baseline.summary.securityScore,\n        performance: current.summary.performanceScore - baseline.summary.performanceScore,\n        maintainability: current.summary.maintainabilityScore - baseline.summary.maintainabilityScore,\n    }\n\n    console.log(\n        chalk.cyan(\"๐Ÿ“ Routes:\"),\n        `${baseline.summary.totalRoutes} โ†’ ${current.summary.totalRoutes}`,\n        changes.routes >= 0 ? chalk.green(`(+${changes.routes})`) : chalk.red(`(${changes.routes})`),\n    )\n\n    console.log(\n        chalk.green(\"๐Ÿ”’ Security Score:\"),\n        `${baseline.summary.securityScore.toFixed(1)}% โ†’ ${current.summary.securityScore.toFixed(1)}%`,\n        changes.security >= 0\n            ? chalk.green(`(+${changes.security.toFixed(1)}%)`)\n            : chalk.red(`(${changes.security.toFixed(1)}%)`),\n    )\n\n    console.log(\n        chalk.blue(\"โšก Performance Score:\"),\n        `${baseline.summary.performanceScore.toFixed(1)}% โ†’ ${current.summary.performanceScore.toFixed(1)}%`,\n        changes.performance >= 0\n            ? chalk.green(`(+${changes.performance.toFixed(1)}%)`)\n            : chalk.red(`(${changes.performance.toFixed(1)}%)`),\n    )\n\n    if (options.regressionOnly) {\n        const regressions = []\n        if (changes.security < -5) regressions.push(\"Security score decreased significantly\")\n        if (changes.performance < -5) regressions.push(\"Performance score decreased significantly\")\n        if (changes.routes < 0) regressions.push(\"Route count decreased\")\n\n        if (regressions.length > 0) {\n            console.log(chalk.bold(\"\\nโš ๏ธ  Regressions Detected:\"))\n            regressions.forEach((regression) => console.log(chalk.red(`  - ${regression}`)))\n        } else {\n            console.log(chalk.green(\"\\nโœ… No significant regressions detected\"))\n        }\n    }\n\n    logger.separator()\n}\n\nasync function exportSarif(analysis: ApiAnalysisResult, outputDir: string): Promise<void> {\n    const sarif = {\n        version: \"3.1.0\",\n        $schema: \"https://json.schemastore.org/sarif-3.1.0.json\",\n        runs: [\n            {\n                tool: {\n                    driver: {\n                        name: \"next-api-analyzer\",\n                        version: \"3.1.0\",\n                        informationUri: \"https://github.com/pranshu05/next-api-analyzer\",\n                        rules: analysis.recommendations\n                            .filter((rec) => rec.type === \"SECURITY\")\n                            .map((rec) => ({\n                                id: rec.id,\n                                name: rec.title,\n                                shortDescription: { text: rec.description },\n                                fullDescription: { text: rec.solution },\n                                defaultConfiguration: { level: rec.severity.toLowerCase() },\n                                properties: {\n                                    category: rec.category,\n                                    tags: rec.tags,\n                                },\n                            })),\n                    },\n                },\n                results: analysis.recommendations\n                    .filter((rec) => rec.type === \"SECURITY\")\n                    .map((rec) => ({\n                        ruleId: rec.id,\n                        level:\n                            rec.severity === \"CRITICAL\" || rec.severity === \"HIGH\"\n                                ? \"error\"\n                                : rec.severity === \"MEDIUM\"\n                                    ? \"warning\"\n                                    : \"note\",\n                        message: { text: rec.description },\n                        locations: rec.route\n                            ? [\n                                {\n                                    physicalLocation: {\n                                        artifactLocation: { uri: rec.route },\n                                    },\n                                },\n                            ]\n                            : [],\n                    })),\n            },\n        ],\n    }\n\n    await FileUtils.writeJsonFile(path.join(outputDir, \"security-results.sarif\"), sarif)\n}\n\nasync function runPerformanceBenchmarks(analysis: ApiAnalysisResult): Promise<void> {\n    logger.info(\"๐Ÿƒ Running synthetic performance tests...\")\n\n    const highComplexityRoutes = analysis.routes.filter((r) => (r.complexity || 0) > 15)\n    if (highComplexityRoutes.length > 0) {\n        logger.warn(`โš ๏ธ  ${highComplexityRoutes.length} routes have high complexity and may need optimization`)\n    }\n\n    logger.success(\"โœ… Performance benchmarks completed\")\n}\n\nfunction generateHtmlReport(analysis: ApiAnalysisResult): string {\n    return `<!DOCTYPE html>\n            <html lang=\"en\">\n            <head>\n                <meta charset=\"UTF-8\">\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n                <title>Next.js API Analysis Report</title>\n                <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n                <script src=\"https://cdn.jsdelivr.net/npm/date-fns@2.29.3/index.min.js\"></script>\n                <style>\n                    :root {\n                        --primary-color: #3b82f6;\n                        --success-color: #10b981;\n                        --warning-color: #f59e0b;\n                        --danger-color: #ef4444;\n                        --info-color: #06b6d4;\n                        --dark-color: #1f2937;\n                        --light-color: #f8fafc;\n                        --border-color: #e5e7eb;\n                    }\n                    \n                    * { margin: 0; padding: 0; box-sizing: border-box; }\n                    \n                    body {\n                        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n                        background: var(--light-color);\n                        color: var(--dark-color);\n                        line-height: 1.6;\n                    }\n                    \n                    .container { max-width: 1400px; margin: 0 auto; padding: 20px; }\n                    \n                    .header {\n                        background: linear-gradient(135deg, var(--primary-color) 0%, #8b5cf6 100%);\n                        color: white;\n                        padding: 60px 40px;\n                        border-radius: 16px;\n                        margin-bottom: 40px;\n                        text-align: center;\n                        box-shadow: 0 10px 25px rgba(0,0,0,0.1);\n                    }\n                    \n                    .header h1 { font-size: 3em; margin-bottom: 15px; font-weight: 700; }\n                    .header p { opacity: 0.9; font-size: 1.2em; margin-bottom: 10px; }\n                    \n                    .metrics-grid {\n                        display: grid;\n                        grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n                        gap: 25px;\n                        margin-bottom: 40px;\n                    }\n                    \n                    .metric-card {\n                        background: white;\n                        padding: 30px;\n                        border-radius: 16px;\n                        box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n                        border-left: 5px solid var(--primary-color);\n                        transition: transform 0.2s ease, box-shadow 0.2s ease;\n                    }\n                    \n                    .metric-card:hover {\n                        transform: translateY(-2px);\n                        box-shadow: 0 8px 25px rgba(0,0,0,0.1);\n                    }\n                    \n                    .metric-value {\n                        font-size: 3em;\n                        font-weight: 800;\n                        color: var(--primary-color);\n                        margin-bottom: 10px;\n                        display: flex;\n                        align-items: center;\n                        gap: 15px;\n                    }\n                    \n                    .metric-label {\n                        color: #64748b;\n                        font-size: 1em;\n                        text-transform: uppercase;\n                        letter-spacing: 1px;\n                        font-weight: 600;\n                    }\n                    \n                    .chart-container {\n                        background: white;\n                        padding: 40px;\n                        border-radius: 16px;\n                        box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n                        margin-bottom: 40px;\n                    }\n                    \n                    .chart-container h2 {\n                        margin-bottom: 30px;\n                        color: var(--dark-color);\n                        font-size: 1.8em;\n                        font-weight: 600;\n                    }\n                    \n                    .recommendations {\n                        background: white;\n                        padding: 40px;\n                        border-radius: 16px;\n                        box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n                        margin-bottom: 40px;\n                    }\n                    \n                    .recommendation {\n                        padding: 25px;\n                        border-left: 5px solid var(--danger-color);\n                        background: #fef2f2;\n                        margin-bottom: 20px;\n                        border-radius: 12px;\n                        transition: all 0.2s ease;\n                    }\n                    \n                    .recommendation:hover { transform: translateX(5px); }\n                    .recommendation.medium { border-left-color: var(--warning-color); background: #fffbeb; }\n                    .recommendation.low { border-left-color: var(--success-color); background: #f0fdf4; }\n                    \n                    .recommendation h3 {\n                        color: var(--dark-color);\n                        margin-bottom: 12px;\n                        font-size: 1.3em;\n                        font-weight: 600;\n                    }\n                    \n                    .recommendation p {\n                        color: #6b7280;\n                        margin-bottom: 8px;\n                        line-height: 1.6;\n                    }\n                    \n                    .routes-table {\n                        background: white;\n                        border-radius: 16px;\n                        box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n                        overflow: hidden;\n                    }\n                    \n                    .routes-table h2 {\n                        padding: 30px 30px 0;\n                        color: var(--dark-color);\n                        font-size: 1.8em;\n                        font-weight: 600;\n                    }\n                    \n                    .routes-table table {\n                        width: 100%;\n                        border-collapse: collapse;\n                        margin-top: 20px;\n                    }\n                    \n                    .routes-table th {\n                        background: var(--light-color);\n                        padding: 20px;\n                        text-align: left;\n                        font-weight: 700;\n                        color: var(--dark-color);\n                        border-bottom: 2px solid var(--border-color);\n                        font-size: 0.95em;\n                        text-transform: uppercase;\n                        letter-spacing: 0.5px;\n                    }\n                    \n                    .routes-table td {\n                        padding: 20px;\n                        border-bottom: 1px solid #f3f4f6;\n                        vertical-align: middle;\n                    }\n                    \n                    .routes-table tr:hover { background: #f9fafb; }\n                    \n                    .badge {\n                        padding: 6px 14px;\n                        border-radius: 25px;\n                        font-size: 0.85em;\n                        font-weight: 600;\n                        text-transform: uppercase;\n                        letter-spacing: 0.5px;\n                    }\n                    \n                    .risk-critical { background: #fee2e2; color: #dc2626; }\n                    .risk-high { background: #fef3c7; color: #d97706; }\n                    .risk-medium { background: #dbeafe; color: #2563eb; }\n                    .risk-low { background: #dcfce7; color: #16a34a; }\n                    \n                    .auth-secured { background: #dcfce7; color: #16a34a; }\n                    .auth-public { background: #fee2e2; color: #dc2626; }\n                    \n                    .method-badge {\n                        padding: 4px 10px;\n                        border-radius: 6px;\n                        font-size: 0.8em;\n                        font-weight: 600;\n                        margin-right: 5px;\n                        display: inline-block;\n                    }\n                    \n                    .method-get { background: #dcfce7; color: #16a34a; }\n                    .method-post { background: #dbeafe; color: #2563eb; }\n                    .method-put { background: #fef3c7; color: #d97706; }\n                    .method-delete { background: #fee2e2; color: #dc2626; }\n                    .method-patch { background: #f3e8ff; color: #9333ea; }\n                    \n                    .stats-grid {\n                        display: grid;\n                        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n                        gap: 20px;\n                        margin: 30px 0;\n                    }\n                    \n                    .stat-item {\n                        text-align: center;\n                        padding: 20px;\n                        background: #f8fafc;\n                        border-radius: 12px;\n                    }\n                    \n                    .stat-value {\n                        font-size: 2em;\n                        font-weight: 700;\n                        color: var(--primary-color);\n                        margin-bottom: 5px;\n                    }\n                    \n                    .stat-label {\n                        color: #64748b;\n                        font-size: 0.9em;\n                        text-transform: uppercase;\n                        letter-spacing: 0.5px;\n                    }\n                    \n                    @media (max-width: 768px) {\n                        .container { padding: 15px; }\n                        .header { padding: 40px 20px; }\n                        .header h1 { font-size: 2em; }\n                        .metric-value { font-size: 2.5em; }\n                        .routes-table th, .routes-table td { padding: 15px 10px; }\n                    }\n                </style>\n            </head>\n            <body>\n                <div class=\"container\">\n                    <div class=\"header\">\n                        <h1>๐Ÿ” Next.js API Analysis Report</h1>\n                        <p>Generated on ${new Date(analysis.metadata.analyzedAt).toLocaleString()}</p>\n                        <p>Analysis completed in ${analysis.metadata.duration.toFixed(2)}ms</p>\n                        <p>Version ${analysis.metadata.version} โ€ข ${analysis.metadata.totalFiles} files analyzed</p>\n                    </div>\n\n                    <div class=\"metrics-grid\">\n                        <div class=\"metric-card\">\n                            <div class=\"metric-value\">๐Ÿ“ ${analysis.summary.totalRoutes}</div>\n                            <div class=\"metric-label\">Total Routes</div>\n                        </div>\n                        <div class=\"metric-card\">\n                            <div class=\"metric-value\">๐Ÿ”’ ${analysis.summary.securityScore.toFixed(1)}%</div>\n                            <div class=\"metric-label\">Security Score</div>\n                        </div>\n                        <div class=\"metric-card\">\n                            <div class=\"metric-value\">โšก ${analysis.summary.performanceScore.toFixed(1)}%</div>\n                            <div class=\"metric-label\">Performance Score</div>\n                        </div>\n                        <div class=\"metric-card\">\n                            <div class=\"metric-value\">๐Ÿ”ง ${analysis.summary.maintainabilityScore.toFixed(1)}%</div>\n                            <div class=\"metric-label\">Maintainability Score</div>\n                        </div>\n                        <div class=\"metric-card\">\n                            <div class=\"metric-value\">๐Ÿงช ${analysis.summary.testCoverageScore.toFixed(1)}%</div>\n                            <div class=\"metric-label\">Test Coverage</div>\n                        </div>\n                    </div>\n\n                    <div class=\"stats-grid\">\n                        <div class=\"stat-item\">\n                            <div class=\"stat-value\">${analysis.summary.secureRoutes}</div>\n                            <div class=\"stat-label\">Secure Routes</div>\n                        </div>\n                        <div class=\"stat-item\">\n                            <div class=\"stat-value\">${analysis.summary.publicRoutes}</div>\n                            <div class=\"stat-label\">Public Routes</div>\n                        </div>\n                        <div class=\"stat-item\">\n                            <div class=\"stat-value\">${analysis.recommendations.length}</div>\n                            <div class=\"stat-label\">Recommendations</div>\n                        </div>\n                        <div class=\"stat-item\">\n                            <div class=\"stat-value\">${analysis.metadata.totalLinesOfCode.toLocaleString()}</div>\n                            <div class=\"stat-label\">Lines of Code</div>\n                        </div>\n                    </div>\n\n                    <div class=\"chart-container\">\n                        <h2>๐Ÿ“Š Risk Distribution</h2>\n                        <canvas id=\"riskChart\" width=\"400\" height=\"200\"></canvas>\n                    </div>\n\n                    <div class=\"chart-container\">\n                        <h2>๐Ÿ“ˆ HTTP Methods Distribution</h2>\n                        <canvas id=\"methodsChart\" width=\"400\" height=\"200\"></canvas>\n                    </div>\n\n                    <div class=\"recommendations\">\n                        <h2>๐Ÿ’ก Top Recommendations</h2>\n                        ${analysis.recommendations\n            .slice(0, 10)\n            .map(\n                (rec) => `\n                            <div class=\"recommendation ${rec.severity.toLowerCase()}\">\n                                <h3>${rec.title}</h3>\n                                <p><strong>Type:</strong> ${rec.type} | <strong>Severity:</strong> ${rec.severity} | <strong>Effort:</strong> ${rec.effort}</p>\n                                <p><strong>Description:</strong> ${rec.description}</p>\n                                <p><strong>Solution:</strong> ${rec.solution}</p>\n                                <p><strong>Impact:</strong> ${rec.impact}</p>\n                                ${rec.route ? `<p><strong>Route:</strong> <code>${rec.route}</code></p>` : \"\"}\n                                ${rec.tags ? `<p><strong>Tags:</strong> ${rec.tags.map((tag) => `<span class=\"badge\">${tag}</span>`).join(\" \")}</p>` : \"\"}\n                            </div>\n                        `,\n            )\n            .join(\"\")}\n                    </div>\n\n                    <div class=\"routes-table\">\n                        <h2>๐Ÿ“‹ Route Details</h2>\n                        <table>\n                            <thead>\n                                <tr>\n                                    <th>Route</th>\n                                    <th>Methods</th>\n                                    <th>Authentication</th>\n                                    <th>Risk Level</th>\n                                    <th>Complexity</th>\n                                    <th>Performance</th>\n                                    <th>Last Modified</th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                ${analysis.routes\n            .map(\n                (route) => `\n                                    <tr>\n                                        <td><code>${route.path}</code></td>\n                                        <td>\n                                            ${route.methods\n                        .map(\n                            (method) =>\n                                `<span class=\"method-badge method-${method.toLowerCase()}\">${method}</span>`,\n                        )\n                        .join(\"\")}\n                                        </td>\n                                        <td>\n                                            <span class=\"badge ${route.hasAuth ? \"auth-secured\" : \"auth-public\"}\">\n                                                ${route.hasAuth ? \"๐Ÿ”’ Secured\" : \"๐Ÿ”“ Public\"}\n                                            </span>\n                                            ${route.authTypes.length > 0 ? `<br><small>${route.authTypes.join(\", \")}</small>` : \"\"}\n                                        </td>\n                                        <td><span class=\"badge risk-${route.riskLevel.toLowerCase()}\">${route.riskLevel}</span></td>\n                                        <td>${route.complexity || \"N/A\"}</td>\n                                        <td>${route.performanceScore?.toFixed(1) || \"N/A\"}%</td>\n                                        <td>${route.lastModified ? new Date(route.lastModified).toLocaleDateString() : \"N/A\"}</td>\n                                    </tr>\n                                `,\n            )\n            .join(\"\")}\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n\n                <script>\n                    const riskCtx = document.getElementById('riskChart').getContext('2d');\n                    new Chart(riskCtx, {\n                        type: 'doughnut',\n                        data: {\n                            labels: Object.keys(${JSON.stringify(analysis.summary.riskDistribution)}),\n                            datasets: [{\n                                data: Object.values(${JSON.stringify(analysis.summary.riskDistribution)}),\n                                backgroundColor: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444'],\n                                borderWidth: 0,\n                                hoverOffset: 4\n                            }]\n                        },\n                        options: {\n                            responsive: true,\n                            plugins: {\n                                legend: {\n                                    position: 'bottom',\n                                    labels: {\n                                        padding: 20,\n                                        usePointStyle: true,\n                                        font: { size: 14 }\n                                    }\n                                },\n                                tooltip: {\n                                    callbacks: {\n                                        label: function(context) {\n                                            const total = context.dataset.data.reduce((a, b) => a + b, 0);\n                                            const percentage = ((context.parsed * 100) / total).toFixed(1);\n                                            return context.label + ': ' + context.parsed + ' (' + percentage + '%)';\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    });\n\n                    const methodsCtx = document.getElementById('methodsChart').getContext('2d');\n                    new Chart(methodsCtx, {\n                        type: 'bar',\n                        data: {\n                            labels: Object.keys(${JSON.stringify(analysis.summary.methodsBreakdown)}),\n                            datasets: [{\n                                label: 'Number of Routes',\n                                data: Object.values(${JSON.stringify(analysis.summary.methodsBreakdown)}),\n                                backgroundColor: [\n                                    '#10b981', // GET\n                                    '#3b82f6', // POST\n                                    '#f59e0b', // PUT\n                                    '#ef4444', // DELETE\n                                    '#8b5cf6', // PATCH\n                                    '#06b6d4', // HEAD\n                                    '#84cc16'  // OPTIONS\n                                ],\n                                borderRadius: 8,\n                                borderSkipped: false,\n                            }]\n                        },\n                        options: {\n                            responsive: true,\n                            plugins: {\n                                legend: { display: false },\n                                tooltip: {\n                                    callbacks: {\n                                        label: function(context) {\n                                            return context.dataset.label + ': ' + context.parsed.y + ' routes';\n                                        }\n                                    }\n                                }\n                            },\n                            scales: {\n                                y: {\n                                    beginAtZero: true,\n                                    ticks: { stepSize: 1 },\n                                    grid: { color: '#f3f4f6' }\n                                },\n                                x: {\n                                    grid: { display: false }\n                                }\n                            }\n                        }\n                    });\n\n                    document.addEventListener('DOMContentLoaded', function() {\n                        document.querySelectorAll('.metric-card').forEach(card => {\n                            card.addEventListener('click', function() {\n                                this.style.transform = 'scale(1.02)';\n                                setTimeout(() => {\n                                    this.style.transform = '';\n                                }, 150);\n                            });\n                        });\n\n                        const searchInput = document.createElement('input');\n                        searchInput.type = 'text';\n                        searchInput.placeholder = 'Search routes...';\n                        searchInput.style.cssText = \\`\n                            width: 100%;\n                            padding: 12px 16px;\n                            margin: 20px 0;\n                            border: 2px solid #e5e7eb;\n                            border-radius: 8px;\n                            font-size: 16px;\n                            outline: none;\n                            transition: border-color 0.2s ease;\n                        \\`;\n                        \n                        searchInput.addEventListener('focus', function() {\n                            this.style.borderColor = '#3b82f6';\n                        });\n                        \n                        searchInput.addEventListener('blur', function() {\n                            this.style.borderColor = '#e5e7eb';\n                        });\n\n                        const routesTable = document.querySelector('.routes-table table');\n                        routesTable.parentNode.insertBefore(searchInput, routesTable);\n\n                        searchInput.addEventListener('input', function() {\n                            const searchTerm = this.value.toLowerCase();\n                            const rows = routesTable.querySelectorAll('tbody tr');\n                            \n                            rows.forEach(row => {\n                                const text = row.textContent.toLowerCase();\n                                row.style.display = text.includes(searchTerm) ? '' : 'none';\n                            });\n                        });\n                    });\n                </script>\n            </body>\n            </html>`\n}\n\nprogram.parse()\n\nasync function generateSecurityReportData(analysis: ApiAnalysisResult): Promise<SecurityReportData> {\n    const securityRecs = analysis.recommendations.filter((r) => r.type === \"SECURITY\")\n\n    return {\n        vulnerabilities: {\n            critical: securityRecs.filter((r) => r.severity === \"CRITICAL\"),\n            high: securityRecs.filter((r) => r.severity === \"HIGH\"),\n            medium: securityRecs.filter((r) => r.severity === \"MEDIUM\"),\n            low: securityRecs.filter((r) => r.severity === \"LOW\"),\n        },\n        compliance: {\n            owasp: {\n                score: analysis.summary.securityScore,\n                issues: securityRecs.map((r) => r.title),\n                coverage: {\n                    \"A01:2021 โ€“ Broken Access Control\": analysis.summary.secureRoutes > analysis.summary.publicRoutes,\n                    \"A02:2021 โ€“ Cryptographic Failures\": true,\n                    \"A03:2021 โ€“ Injection\": !securityRecs.some((r) => r.tags?.includes(\"injection\")),\n                    \"A04:2021 โ€“ Insecure Design\": analysis.summary.maintainabilityScore > 70,\n                    \"A05:2021 โ€“ Security Misconfiguration\": analysis.summary.securityScore > 80,\n                },\n            },\n            pciDss: {\n                score: analysis.summary.securityScore * 0.9,\n                requirements: {\n                    \"Install and maintain firewall\": true,\n                    \"Do not use vendor-supplied defaults\": analysis.summary.securityScore > 70,\n                    \"Protect stored cardholder data\": true,\n                    \"Encrypt transmission of cardholder data\": true,\n                },\n            },\n        },\n        riskAssessment: {\n            overallRisk:\n                analysis.summary.securityScore > 80 ? \"LOW\" : analysis.summary.securityScore > 60 ? \"MEDIUM\" : \"HIGH\",\n            riskFactors: [\n                `${analysis.summary.publicRoutes} public endpoints`,\n                `${securityRecs.filter((r) => r.severity === \"CRITICAL\").length} critical vulnerabilities`,\n                \"Missing input validation on some routes\",\n            ],\n            mitigationPriority: [\n                \"Implement authentication on public endpoints\",\n                \"Add input validation\",\n                \"Enable rate limiting\",\n                \"Implement proper error handling\",\n            ],\n        },\n        securityMetrics: {\n            authenticationCoverage: (analysis.summary.secureRoutes / analysis.summary.totalRoutes) * 100,\n            inputValidationCoverage:\n                (analysis.routes.filter((r) => r.hasInputValidation).length / analysis.routes.length) * 100,\n            encryptionUsage: 75, // Simplified\n            rateLimitingCoverage: (analysis.routes.filter((r) => r.hasRateLimit).length / analysis.routes.length) * 100,\n        },\n    }\n}\n\nasync function generatePerformanceReportData(analysis: ApiAnalysisResult): Promise<PerformanceReportData> {\n    const routes = analysis.routes\n    const performanceRecs = analysis.recommendations.filter((r) => r.type === \"PERFORMANCE\")\n\n    return {\n        metrics: {\n            averageComplexity: routes.reduce((sum, r) => sum + (r.complexity || 0), 0) / routes.length,\n            averageLinesOfCode: routes.reduce((sum, r) => sum + (r.linesOfCode || 0), 0) / routes.length,\n            totalDependencies: routes.reduce((sum, r) => sum + r.dependencies.length, 0),\n            blockingOperations: performanceRecs.filter((r) => r.category === \"blocking\").length,\n            asyncOperations: routes.filter((r) => r.dependencies.some((dep) => dep.includes(\"async\"))).length,\n        },\n        bottlenecks: {\n            highComplexityRoutes: routes\n                .filter((r) => (r.complexity || 0) > 15)\n                .map((r) => ({\n                    path: r.path,\n                    complexity: r.complexity || 0,\n                    recommendations: [\"Break down into smaller functions\", \"Reduce nesting levels\"],\n                })),\n            largeRoutes: routes\n                .filter((r) => (r.linesOfCode || 0) > 100)\n                .map((r) => ({\n                    path: r.path,\n                    linesOfCode: r.linesOfCode || 0,\n                    recommendations: [\"Extract business logic\", \"Split into multiple handlers\"],\n                })),\n            dependencyHeavyRoutes: routes\n                .filter((r) => r.dependencies.length > 5)\n                .map((r) => ({\n                    path: r.path,\n                    dependencies: r.dependencies,\n                    recommendations: [\"Review dependency necessity\", \"Consider lazy loading\"],\n                })),\n        },\n        optimizationOpportunities: {\n            caching: [\"Implement response caching\", \"Add database query caching\"],\n            asyncOptimization: [\"Convert blocking operations to async\", \"Implement parallel processing\"],\n            codeReduction: [\"Remove unused code\", \"Simplify complex logic\"],\n            dependencyOptimization: [\"Remove unused dependencies\", \"Bundle optimization\"],\n        },\n        benchmarks: {\n            estimatedResponseTimes: routes.reduce(\n                (acc, r) => {\n                    acc[r.path] = (r.complexity || 1) * 10 + r.dependencies.length * 5\n                    return acc\n                },\n                {} as Record<string, number>,\n            ),\n            memoryUsageEstimates: routes.reduce(\n                (acc, r) => {\n                    acc[r.path] = (r.linesOfCode || 0) * 1024 + r.dependencies.length * 512\n                    return acc\n                },\n                {} as Record<string, number>,\n            ),\n            scalabilityScore: analysis.summary.performanceScore,\n        },\n    }\n}\n\nasync function generateTrendsReportData(trends: any[], days: number): Promise<TrendsReportData> {\n    const recentTrends = trends.slice(-days)\n    const first = recentTrends[0] || {}\n    const last = recentTrends[recentTrends.length - 1] || {}\n\n    return {\n        timeRange: {\n            start: new Date(Date.now() - days * 24 * 60 * 60 * 1000),\n            end: new Date(),\n            days,\n        },\n        trends: {\n            routes: {\n                current: last.totalRoutes || 0,\n                previous: first.totalRoutes || 0,\n                change: (last.totalRoutes || 0) - (first.totalRoutes || 0),\n                trend:\n                    (last.totalRoutes || 0) > (first.totalRoutes || 0)\n                        ? \"INCREASING\"\n                        : (last.totalRoutes || 0) < (first.totalRoutes || 0)\n                            ? \"DECREASING\"\n                            : \"STABLE\",\n            },\n            security: {\n                current: last.securityScore || 0,\n                previous: first.securityScore || 0,\n                change: (last.securityScore || 0) - (first.securityScore || 0),\n                trend:\n                    (last.securityScore || 0) > (first.securityScore || 0)\n                        ? \"IMPROVING\"\n                        : (last.securityScore || 0) < (first.securityScore || 0)\n                            ? \"DECLINING\"\n                            : \"STABLE\",\n            },\n            performance: {\n                current: last.performanceScore || 0,\n                previous: first.performanceScore || 0,\n                change: (last.performanceScore || 0) - (first.performanceScore || 0),\n                trend:\n                    (last.performanceScore || 0) > (first.performanceScore || 0)\n                        ? \"IMPROVING\"\n                        : (last.performanceScore || 0) < (first.performanceScore || 0)\n                            ? \"DECLINING\"\n                            : \"STABLE\",\n            },\n            maintainability: {\n                current: last.maintainabilityScore || 0,\n                previous: first.maintainabilityScore || 0,\n                change: (last.maintainabilityScore || 0) - (first.maintainabilityScore || 0),\n                trend:\n                    (last.maintainabilityScore || 0) > (first.maintainabilityScore || 0)\n                        ? \"IMPROVING\"\n                        : (last.maintainabilityScore || 0) < (first.maintainabilityScore || 0)\n                            ? \"DECLINING\"\n                            : \"STABLE\",\n            },\n        },\n        historicalData: recentTrends.map((trend) => ({\n            date: new Date(trend.date || Date.now()),\n            totalRoutes: trend.totalRoutes || 0,\n            securityScore: trend.securityScore || 0,\n            performanceScore: trend.performanceScore || 0,\n            maintainabilityScore: trend.maintainabilityScore || 0,\n        })),\n        predictions: {\n            nextMonth: {\n                securityScore: Math.min(100, (last.securityScore || 0) + 2),\n                performanceScore: Math.min(100, (last.performanceScore || 0) + 1),\n                maintainabilityScore: Math.min(100, (last.maintainabilityScore || 0) + 1),\n            },\n            recommendations: [\n                \"Continue security improvements\",\n                \"Focus on performance optimization\",\n                \"Maintain code quality standards\",\n            ],\n        },\n    }\n}\n\nasync function generateComparisonReportData(baseline: any, current: any): Promise<ComparisonReportData> {\n    return {\n        baseline: {\n            version: baseline.metadata?.version || \"unknown\",\n            date: new Date(baseline.metadata?.analyzedAt || Date.now()),\n            summary: baseline.summary,\n        },\n        current: {\n            version: current.metadata?.version || \"unknown\",\n            date: new Date(current.metadata?.analyzedAt || Date.now()),\n            summary: current.summary,\n        },\n        changes: {\n            routes: {\n                added: [], // Simplified - would need route comparison logic\n                removed: [],\n                modified: [],\n            },\n            scores: {\n                security: {\n                    from: baseline.summary?.securityScore || 0,\n                    to: current.summary?.securityScore || 0,\n                    change: (current.summary?.securityScore || 0) - (baseline.summary?.securityScore || 0),\n                },\n                performance: {\n                    from: baseline.summary?.performanceScore || 0,\n                    to: current.summary?.performanceScore || 0,\n                    change: (current.summary?.performanceScore || 0) - (baseline.summary?.performanceScore || 0),\n                },\n                maintainability: {\n                    from: baseline.summary?.maintainabilityScore || 0,\n                    to: current.summary?.maintainabilityScore || 0,\n                    change: (current.summary?.maintainabilityScore || 0) - (baseline.summary?.maintainabilityScore || 0),\n                },\n            },\n            recommendations: {\n                new: current.recommendations || [],\n                resolved: [],\n                persistent: [],\n            },\n        },\n        regressions: [],\n        improvements: [],\n    }\n}\n\nexport { program }","import fs from \"fs\"\nimport path from \"path\"\nimport ts from \"typescript\"\nimport type { ApiRouteInfo, ApiAnalysisResult, AnalyzerConfig, Recommendation } from \"../types\"\nimport { DEFAULT_CONFIG } from \"../config/default-config\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger } from \"../utils/logger\"\nimport { SecurityAnalyzer } from \"../analyzers/security-analyzer\"\nimport { PerformanceAnalyzer } from \"../analyzers/performance-analyzer\"\nimport { getScoreColor, getSeverityWeight } from \"../utils/common\"\n\nexport class NextApiAnalyzer {\n    private config: AnalyzerConfig\n    private routes: ApiRouteInfo[] = []\n    private startTime = 0\n\n    constructor(config: Partial<AnalyzerConfig> = {}) {\n        this.config = { ...DEFAULT_CONFIG, ...config }\n    }\n\n    async analyzeRoutes(): Promise<ApiAnalysisResult> {\n        this.startTime = Date.now()\n        this.routes = []\n\n        logger.info(\"Starting API routes analysis...\")\n\n        const files = await FileUtils.findApiFiles(this.config)\n        logger.info(`Found ${files.length} API files`)\n\n        for (const file of files) {\n            await this.analyzeFile(file)\n        }\n\n        logger.success(`Analyzed ${this.routes.length} API routes`)\n        return this.generateAnalysisResult()\n    }\n\n    private async analyzeFile(filePath: string): Promise<void> {\n        try {\n            const content = fs.readFileSync(filePath, \"utf-8\")\n            const fileStats = await FileUtils.getFileStats(filePath)\n            const routeInfo = await this.parseRouteInfo(filePath, content, fileStats)\n            this.routes.push(routeInfo)\n        } catch (error) {\n            logger.error(`Error analyzing file ${filePath}:`, error)\n        }\n    }\n\n    private async parseRouteInfo(\n        filePath: string,\n        content: string,\n        fileStats: { size: number; lastModified: Date; linesOfCode: number },\n    ): Promise<ApiRouteInfo> {\n        const routePath = this.getRoutePath(filePath)\n        const isAppRouter = this.isAppRouterFile(filePath)\n        const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true)\n\n        const baseRoute: Partial<ApiRouteInfo> = {\n            path: routePath,\n            methods: this.extractMethods(content, sourceFile, isAppRouter) as import(\"../types\").HttpMethod[],\n            hasAuth: this.detectAuth(content),\n            authTypes: this.extractAuthTypes(content),\n            queryParams: this.extractQueryParams(content, isAppRouter),\n            pathParams: this.extractPathParams(routePath),\n            bodyParams: this.extractBodyParams(content, isAppRouter),\n            headers: this.extractHeaders(content),\n            responseStatuses: this.extractResponseStatuses(content, isAppRouter),\n            middlewares: this.extractMiddlewares(content),\n            description: this.extractDescription(content),\n            hasRateLimit: this.detectRateLimit(content),\n            hasCors: this.detectCors(content),\n            hasInputValidation: this.detectInputValidation(content),\n            dependencies: this.extractDependencies(sourceFile),\n            fileSize: fileStats.size,\n            linesOfCode: fileStats.linesOfCode,\n            lastModified: fileStats.lastModified,\n        }\n\n        const securityAnalysis = SecurityAnalyzer.analyzeRoute(baseRoute as ApiRouteInfo, content)\n        const performanceAnalysis = PerformanceAnalyzer.analyzeRoute(baseRoute as ApiRouteInfo, content, sourceFile)\n\n        return {\n            ...baseRoute,\n            riskLevel: securityAnalysis.riskLevel,\n            complexity: performanceAnalysis.complexity,\n            performanceScore: performanceAnalysis.performanceScore,\n        } as ApiRouteInfo\n    }\n\n    private generateAnalysisResult(): ApiAnalysisResult {\n        const duration = Date.now() - this.startTime\n        const recommendations = this.generateRecommendations()\n\n        const summary = {\n            totalRoutes: this.routes.length,\n            secureRoutes: this.routes.filter((r) => r.hasAuth).length,\n            publicRoutes: this.routes.filter((r) => !r.hasAuth).length,\n            methodsBreakdown: this.calculateMethodsBreakdown(),\n            statusCodeDistribution: this.calculateStatusCodeDistribution(),\n            riskDistribution: this.calculateRiskDistribution(),\n            securityScore: this.calculateSecurityScore(),\n            performanceScore: this.calculatePerformanceScore(),\n            maintainabilityScore: this.calculateMaintainabilityScore(),\n            testCoverageScore: 75,\n        }\n\n        return {\n            routes: this.routes,\n            summary,\n            metadata: {\n                analyzedAt: new Date(),\n                version: \"3.1.0\",\n                duration,\n                totalFiles: this.routes.length,\n                totalLinesOfCode: this.routes.reduce((sum, route) => sum + (route.linesOfCode || 0), 0),\n            },\n            recommendations,\n        }\n    }\n\n    generateReport(analysis: ApiAnalysisResult): string {\n        let report = \"# ๐Ÿ” API Routes Analysis Report\\n\\n\"\n\n        report += `**Generated:** ${analysis.metadata.analyzedAt.toLocaleString()}\\n`\n        report += `**Duration:** ${analysis.metadata.duration}ms\\n`\n        report += `**Files:** ${analysis.metadata.totalFiles}\\n\\n`\n\n        report += \"## ๐Ÿ“Š Summary\\n\\n\"\n        report += `| Metric | Value | Status |\\n`\n        report += `|--------|-------|--------|\\n`\n        report += `| Total Routes | ${analysis.summary.totalRoutes} | โ„น๏ธ |\\n`\n        report += `| Security Score | ${analysis.summary.securityScore.toFixed(1)}% | ${getScoreColor(analysis.summary.securityScore)} |\\n`\n        report += `| Performance Score | ${analysis.summary.performanceScore.toFixed(1)}% | ${getScoreColor(analysis.summary.performanceScore)} |\\n\\n`\n\n        if (analysis.recommendations.length > 0) {\n            report += \"## ๐Ÿ’ก Recommendations\\n\\n\"\n            analysis.recommendations\n                .sort((a, b) => getSeverityWeight(b.severity) - getSeverityWeight(a.severity))\n                .slice(0, 10)\n                .forEach((rec, index) => {\n                    report += `### ${index + 1}. ${rec.title}\\n`\n                    report += `**Severity:** ${rec.severity} | **Type:** ${rec.type}\\n\\n`\n                    report += `${rec.description}\\n\\n`\n                    report += `**Solution:** ${rec.solution}\\n\\n`\n                })\n        }\n\n        return report\n    }\n\n    private isAppRouterFile(filePath: string): boolean {\n        return filePath.includes(\"/route.\") || filePath.endsWith(\"route.js\") || filePath.endsWith(\"route.ts\")\n    }\n\n    private getRoutePath(filePath: string): string {\n        const relativePath = path.relative(this.config.apiDir, filePath)\n        return (\n            \"/\" +\n            relativePath\n                .replace(/\\\\/g, \"/\")\n                .replace(/\\.(js|ts|tsx)$/, \"\")\n                .replace(/\\/index$/, \"\")\n                .replace(/\\/route$/, \"\")\n                .replace(/\\[([^\\]]+)\\]/g, \":$1\")\n        )\n    }\n\n    private extractMethods(content: string, sourceFile: ts.SourceFile, isAppRouter: boolean): string[] {\n        const methods = new Set<string>()\n\n        if (isAppRouter) {\n            const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"]\n            ts.forEachChild(sourceFile, (node) => {\n                if (ts.isFunctionDeclaration(node) && node.name && httpMethods.includes(node.name.text)) {\n                    methods.add(node.name.text)\n                }\n            })\n        } else {\n            const methodRegex = /req\\.method\\s*===?\\s*['\"`](\\w+)['\"`]/g\n            let match\n            while ((match = methodRegex.exec(content)) !== null) {\n                methods.add(match[1].toUpperCase())\n            }\n        }\n\n        return methods.size === 0 ? [\"GET\"] : Array.from(methods)\n    }\n\n    private detectAuth(content: string): boolean {\n        return this.config.authPatterns.some((pattern) => pattern.pattern.test(content))\n    }\n\n    private extractAuthTypes(content: string): import(\"../types\").AuthType[] {\n        return this.config.authPatterns\n            .filter((pattern) => pattern.pattern.test(content))\n            .map((pattern) => pattern.type as import(\"../types\").AuthType)\n    }\n\n    private extractQueryParams(content: string, isAppRouter: boolean): any[] {\n        const params = new Set<string>()\n        const regex = isAppRouter ? /searchParams\\.get$$['\"`]([^'\"`]+)['\"`]$$/g : /req\\.query\\.(\\w+)/g\n\n        let match\n        while ((match = regex.exec(content)) !== null) {\n            params.add(match[1])\n        }\n\n        return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n    }\n\n    private extractPathParams(routePath: string): any[] {\n        const params = new Set<string>()\n        const regex = /\\[([^\\]]+)\\]/g\n        let match\n        while ((match = regex.exec(routePath)) !== null) {\n            params.add(match[1])\n        }\n        return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n    }\n\n    private extractBodyParams(content: string, isAppRouter: boolean): any[] {\n        const params = new Set<string>()\n        const regex = isAppRouter ? /const\\s*\\{\\s*([^}]+)\\s*\\}\\s*=\\s*await\\s+request\\.json$$$$/g : /req\\.body\\.(\\w+)/g\n\n        let match\n        while ((match = regex.exec(content)) !== null) {\n            if (isAppRouter) {\n                const paramNames = match[1].split(\",\").map((p) => p.trim())\n                paramNames.forEach((param) => params.add(param))\n            } else {\n                params.add(match[1])\n            }\n        }\n\n        return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n    }\n\n    private extractHeaders(content: string): string[] {\n        const headers = new Set<string>()\n        const patterns = [/headers\\.get$$['\"`]([^'\"`]+)['\"`]$$/g, /req\\.headers\\[['\"`]([^'\"`]+)['\"`]\\]/g]\n\n        patterns.forEach((pattern) => {\n            let match\n            while ((match = pattern.exec(content)) !== null) {\n                headers.add(match[1])\n            }\n        })\n\n        return Array.from(headers)\n    }\n\n    private extractResponseStatuses(content: string, isAppRouter: boolean): number[] {\n        const statuses = new Set<number>()\n\n        if (isAppRouter) {\n            const regex = /Response\\.json\\([^,]*,\\s*\\{\\s*status:\\s*(\\d+)/g\n            let match\n            while ((match = regex.exec(content)) !== null) {\n                statuses.add(Number.parseInt(match[1]))\n            }\n        } else {\n            const regex = /res\\.status$$(\\d+)$$/g\n            let match\n            while ((match = regex.exec(content)) !== null) {\n                statuses.add(Number.parseInt(match[1]))\n            }\n        }\n\n        return statuses.size === 0 ? [200] : Array.from(statuses).sort()\n    }\n\n    private extractMiddlewares(content: string): string[] {\n        return this.config.middlewarePatterns\n            .filter((pattern) => pattern.pattern.test(content))\n            .map((pattern) => pattern.name)\n    }\n\n    private extractDescription(content: string): string | undefined {\n        const jsDocRegex = /\\/\\*\\*\\s*\\n\\s*\\*\\s*(.+?)\\s*\\n/\n        const match = content.match(jsDocRegex)\n        return match ? match[1].trim() : undefined\n    }\n\n    private detectRateLimit(content: string): boolean {\n        return /rate[_-]?limit|throttle|slowDown/i.test(content)\n    }\n\n    private detectCors(content: string): boolean {\n        return /cors|Access-Control-Allow/i.test(content)\n    }\n\n    private detectInputValidation(content: string): boolean {\n        return /joi\\.|yup\\.|zod\\.|validate\\(|schema\\./i.test(content)\n    }\n\n    private extractDependencies(sourceFile: ts.SourceFile): string[] {\n        const dependencies = new Set<string>()\n\n        ts.forEachChild(sourceFile, (node) => {\n            if (ts.isImportDeclaration(node)) {\n                const moduleSpecifier = node.moduleSpecifier.getText().replace(/['\"]/g, \"\")\n                if (!moduleSpecifier.startsWith(\".\") && !moduleSpecifier.startsWith(\"/\")) {\n                    dependencies.add(moduleSpecifier)\n                }\n            }\n        })\n\n        return Array.from(dependencies)\n    }\n\n    private generateRecommendations(): Recommendation[] {\n        return []\n    }\n\n    private calculateMethodsBreakdown(): Record<string, number> {\n        const breakdown: Record<string, number> = {}\n        this.routes.forEach((route) => {\n            route.methods.forEach((method) => {\n                breakdown[method] = (breakdown[method] || 0) + 1\n            })\n        })\n        return breakdown\n    }\n\n    private calculateStatusCodeDistribution(): Record<string, number> {\n        const distribution: Record<string, number> = {}\n        this.routes.forEach((route) => {\n            route.responseStatuses.forEach((status) => {\n                const key = status.toString()\n                distribution[key] = (distribution[key] || 0) + 1\n            })\n        })\n        return distribution\n    }\n\n    private calculateRiskDistribution(): Record<string, number> {\n        const distribution: Record<string, number> = { LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0 }\n        this.routes.forEach((route) => {\n            distribution[route.riskLevel]++\n        })\n        return distribution\n    }\n\n    private calculateSecurityScore(): number {\n        if (this.routes.length === 0) return 100\n        const secureRoutes = this.routes.filter((r) => r.hasAuth).length\n        return (secureRoutes / this.routes.length) * 100\n    }\n\n    private calculatePerformanceScore(): number {\n        if (this.routes.length === 0) return 100\n        const totalScore = this.routes.reduce((sum, route) => sum + (route.performanceScore || 100), 0)\n        return totalScore / this.routes.length\n    }\n\n    private calculateMaintainabilityScore(): number {\n        if (this.routes.length === 0) return 100\n        const avgComplexity = this.routes.reduce((sum, route) => sum + (route.complexity || 1), 0) / this.routes.length\n        return Math.max(0, 100 - (avgComplexity > 10 ? (avgComplexity - 10) * 5 : 0))\n    }\n}\n\nexport async function analyzeApiRoutes(apiDir?: string): Promise<void> {\n    const analyzer = new NextApiAnalyzer(apiDir ? { apiDir } : {})\n    const analysis = await analyzer.analyzeRoutes()\n\n    console.log(\"\\n=== API Routes Analysis ===\\n\")\n    console.log(analyzer.generateReport(analysis))\n\n    await FileUtils.writeFile(\"api-analysis.md\", analyzer.generateReport(analysis))\n    console.log(\"\\nReport saved to: api-analysis.md\")\n}\n\nexport function withApiTracking(handler: any) {\n    return async (req: any, res: any) => {\n        const startTime = Date.now()\n        const requestId = Math.random().toString(36).substring(2, 8)\n\n        logger.info(`[${requestId}] ${req.method} ${req.url}`)\n\n        try {\n            await handler(req, res)\n        } catch (error) {\n            logger.error(`[${requestId}] Error:`, error)\n            throw error\n        } finally {\n            const duration = Date.now() - startTime\n            logger.info(`[${requestId}] Duration: ${duration}ms`)\n        }\n    }\n}","import type { AnalyzerConfig, AuthPattern, MiddlewarePattern } from \"../types\"\n\nconst AUTH_PATTERNS: AuthPattern[] = [\n    { name: \"NextAuth.js\", pattern: /getServerSession|getToken|next-auth/i, type: \"NextAuth.js\", confidence: 0.9 },\n    { name: \"JWT\", pattern: /jwt\\.verify|jsonwebtoken|jose/i, type: \"JWT\", confidence: 0.8 },\n    { name: \"Bearer Token\", pattern: /bearer\\s+token|authorization.*bearer/i, type: \"Bearer Token\", confidence: 0.7 },\n    { name: \"API Key\", pattern: /api[_-]?key|x-api-key/i, type: \"API Key\", confidence: 0.6 },\n    { name: \"Session\", pattern: /req\\.session|express-session/i, type: \"Session\", confidence: 0.7 },\n    { name: \"Firebase Auth\", pattern: /firebase.*auth|getAuth/i, type: \"Firebase Auth\", confidence: 0.8 },\n    { name: \"Supabase Auth\", pattern: /supabase.*auth|createClient.*auth/i, type: \"Supabase Auth\", confidence: 0.8 },\n    { name: \"Auth0\", pattern: /auth0|@auth0/i, type: \"Auth0\", confidence: 0.9 },\n    { name: \"Passport\", pattern: /passport\\.|require.*passport/i, type: \"Passport\", confidence: 0.8 },\n]\n\nconst MIDDLEWARE_PATTERNS: MiddlewarePattern[] = [\n    { name: \"CORS\", pattern: /cors\\(|Access-Control-Allow/i, category: \"security\" },\n    { name: \"Helmet\", pattern: /helmet\\(|security headers/i, category: \"security\" },\n    { name: \"Rate Limiting\", pattern: /rateLimit|express-rate-limit|slowDown/i, category: \"security\" },\n    { name: \"Body Parser\", pattern: /bodyParser|express\\.json/i, category: \"parsing\" },\n    { name: \"Multer\", pattern: /multer\\(|file upload/i, category: \"file-handling\" },\n    { name: \"Validation\", pattern: /joi\\.|yup\\.|zod\\.|express-validator/i, category: \"validation\" },\n    { name: \"Logging\", pattern: /morgan\\(|winston|pino/i, category: \"logging\" },\n    { name: \"Compression\", pattern: /compression\\(/i, category: \"performance\" },\n    { name: \"Cookie Parser\", pattern: /cookieParser|cookie-parser/i, category: \"parsing\" },\n    { name: \"CSRF\", pattern: /csrf|csurf/i, category: \"security\" },\n]\n\nexport const DEFAULT_CONFIG: AnalyzerConfig = {\n    apiDir: \"src/app/api\",\n    outputDir: \"./api-analysis\",\n    includePatterns: [\"**/*.ts\", \"**/*.js\", \"**/*.tsx\"],\n    excludePatterns: [\"**/node_modules/**\", \"**/*.test.*\", \"**/*.spec.*\", \"**/*.d.ts\", \"**/dist/**\", \"**/build/**\"],\n    authPatterns: AUTH_PATTERNS,\n    middlewarePatterns: MIDDLEWARE_PATTERNS,\n    enableTrends: false,\n    enablePerformanceAnalysis: true,\n    enableSecurityAnalysis: true,\n    thresholds: {\n        security: 80,\n        performance: 70,\n        maintainability: 75,\n        testCoverage: 80,\n        complexity: 10,\n    },\n    cache: {\n        enabled: true,\n        ttl: 3600000,\n        directory: \".cache/api-analyzer\",\n    },\n    parallel: true,\n    maxConcurrency: 4,\n}\n\nexport function validateConfig(config: AnalyzerConfig): string[] {\n    const errors: string[] = []\n\n    if (!config.apiDir) {\n        errors.push(\"apiDir is required\")\n    }\n\n    if (config.thresholds.security < 0 || config.thresholds.security > 100) {\n        errors.push(\"Security threshold must be between 0 and 100\")\n    }\n\n    if (config.thresholds.performance < 0 || config.thresholds.performance > 100) {\n        errors.push(\"Performance threshold must be between 0 and 100\")\n    }\n\n    return errors\n}","import fs from \"fs/promises\"\nimport path from \"path\"\nimport { glob } from \"glob\"\nimport crypto from \"crypto\"\nimport type { AnalyzerConfig } from \"../types\"\nimport { logger } from \"./logger\"\n\nexport class FileUtils {\n    static async findApiFiles(config: AnalyzerConfig): Promise<string[]> {\n        try {\n            const patterns = config.includePatterns.map((pattern) => path.join(config.apiDir, pattern).replace(/\\\\/g, \"/\"))\n\n            const allFiles: string[] = []\n            for (const pattern of patterns) {\n                const matches = await glob(pattern, {\n                    ignore: config.excludePatterns,\n                    absolute: true,\n                    nodir: true,\n                })\n                allFiles.push(...matches)\n            }\n\n            const uniqueFiles = [...new Set(allFiles)]\n            return uniqueFiles.filter((file) => this.isApiFile(file))\n        } catch (error) {\n            logger.error(\"Error finding API files:\", error)\n            throw new Error(`Failed to find API files: ${error}`)\n        }\n    }\n\n    static isApiFile(filename: string): boolean {\n        const basename = path.basename(filename)\n        const isTypeScriptOrJavaScript = /\\.(js|ts|tsx)$/.test(basename)\n        const isRouteFile = basename === \"route.js\" || basename === \"route.ts\"\n        const isInApiDirectory = filename.includes(\"/api/\") || filename.includes(\"\\\\api\\\\\")\n\n        return isTypeScriptOrJavaScript && (isRouteFile || isInApiDirectory)\n    }\n\n    static async getFileStats(filePath: string): Promise<{\n        size: number\n        lastModified: Date\n        linesOfCode: number\n    }> {\n        try {\n            const [stats, content] = await Promise.all([fs.stat(filePath), fs.readFile(filePath, \"utf-8\")])\n\n            const linesOfCode = content.split(\"\\n\").filter((line) => {\n                const trimmed = line.trim()\n                return trimmed && !trimmed.startsWith(\"//\") && !trimmed.startsWith(\"/*\")\n            }).length\n\n            return {\n                size: stats.size,\n                lastModified: stats.mtime,\n                linesOfCode,\n            }\n        } catch (error) {\n            logger.error(`Error getting file stats for ${filePath}:`, error)\n            throw error\n        }\n    }\n\n    static async ensureDirectoryExists(dirPath: string): Promise<void> {\n        try {\n            await fs.mkdir(dirPath, { recursive: true })\n        } catch (error) {\n            if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n                throw error\n            }\n        }\n    }\n\n    static async writeJsonFile(filePath: string, data: any): Promise<void> {\n        await this.ensureDirectoryExists(path.dirname(filePath))\n        await fs.writeFile(filePath, JSON.stringify(data, null, 2), \"utf-8\")\n    }\n\n    static async readJsonFile<T>(filePath: string): Promise<T | null> {\n        try {\n            const content = await fs.readFile(filePath, \"utf-8\")\n            return JSON.parse(content) as T\n        } catch (error) {\n            if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n                return null\n            }\n            throw error\n        }\n    }\n\n    static async writeFile(filePath: string, content: string): Promise<void> {\n        await this.ensureDirectoryExists(path.dirname(filePath))\n        await fs.writeFile(filePath, content, \"utf-8\")\n    }\n\n    static generateHash(content: string): string {\n        return crypto.createHash(\"md5\").update(content).digest(\"hex\")\n    }\n\n    static async fileExists(filePath: string): Promise<boolean> {\n        try {\n            await fs.access(filePath)\n            return true\n        } catch {\n            return false\n        }\n    }\n}","export enum LogLevel {\n    DEBUG = 0,\n    INFO = 1,\n    WARN = 2,\n    ERROR = 3,\n}\n\nexport interface LoggerConfig {\n    level: LogLevel\n    colors: boolean\n    prefix?: string\n}\n\nexport class Logger {\n    private static instance: Logger\n    private config: LoggerConfig = {\n        level: LogLevel.INFO,\n        colors: true,\n    }\n\n    static getInstance(): Logger {\n        if (!Logger.instance) {\n            Logger.instance = new Logger()\n        }\n        return Logger.instance\n    }\n\n    configure(config: Partial<LoggerConfig>): void {\n        this.config = { ...this.config, ...config }\n    }\n\n    private shouldLog(level: LogLevel): boolean {\n        return level >= this.config.level\n    }\n\n    private formatMessage(level: string, message: string, emoji: string): string {\n        const prefix = this.config.prefix ? `[${this.config.prefix}] ` : \"\"\n        return this.config.colors ? `${prefix}${emoji} ${message}` : `${prefix}${level}: ${message}`\n    }\n\n    debug(message: string, ...args: any[]): void {\n        if (this.shouldLog(LogLevel.DEBUG)) {\n            console.log(this.formatMessage(\"DEBUG\", message, \"๐Ÿ›\"), ...args)\n        }\n    }\n\n    info(message: string, ...args: any[]): void {\n        if (this.shouldLog(LogLevel.INFO)) {\n            console.log(this.formatMessage(\"INFO\", message, \"โ„น๏ธ\"), ...args)\n        }\n    }\n\n    success(message: string, ...args: any[]): void {\n        if (this.shouldLog(LogLevel.INFO)) {\n            console.log(this.formatMessage(\"SUCCESS\", message, \"โœ…\"), ...args)\n        }\n    }\n\n    warn(message: string, ...args: any[]): void {\n        if (this.shouldLog(LogLevel.WARN)) {\n            console.warn(this.formatMessage(\"WARN\", message, \"โš ๏ธ\"), ...args)\n        }\n    }\n\n    error(message: string, ...args: any[]): void {\n        if (this.shouldLog(LogLevel.ERROR)) {\n            console.error(this.formatMessage(\"ERROR\", message, \"โŒ\"), ...args)\n        }\n    }\n\n    progress(message: string): void {\n        if (this.shouldLog(LogLevel.INFO)) {\n            process.stdout.write(`โณ ${message}...\\r`)\n        }\n    }\n\n    clearProgress(): void {\n        process.stdout.write(\"\\r\\x1b[K\")\n    }\n\n    separator(): void {\n        if (this.shouldLog(LogLevel.INFO)) {\n            console.log(\"โ”€\".repeat(80))\n        }\n    }\n}\n\nexport const logger = Logger.getInstance()","import type { ApiRouteInfo, Recommendation, RiskLevel } from \"../types\"\nimport { logger } from \"../utils/logger\"\nimport { BaseAnalyzer } from \"./base-analyzer\"\nimport { SECURITY_PATTERNS, calculateRiskLevel } from \"../utils/common\"\n\ninterface SecurityVulnerability {\n    name: string\n    patterns: RegExp[]\n    severity: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n    score: number\n    category: string\n    cwe?: string\n}\n\nexport class SecurityAnalyzer extends BaseAnalyzer {\n    private static readonly VULNERABILITIES: SecurityVulnerability[] = [\n        {\n            name: \"SQL_INJECTION\",\n            patterns: [\n                /query\\s*\\+\\s*['\"`]/,\n                /\\$\\{[^}]*query[^}]*\\}/,\n                /execute\\s*\\(\\s*['\"`].*\\$\\{/,\n                /SELECT\\s+.*\\+.*FROM/i,\n                /INSERT\\s+.*\\+.*VALUES/i,\n                /UPDATE\\s+.*SET\\s+.*\\+/i,\n                /DELETE\\s+.*WHERE\\s+.*\\+/i,\n            ],\n            severity: \"CRITICAL\",\n            score: 40,\n            category: \"injection\",\n            cwe: \"CWE-89\",\n        },\n        {\n            name: \"XSS\",\n            patterns: [\n                /innerHTML\\s*=\\s*.*req\\./,\n                /dangerouslySetInnerHTML/,\n                /document\\.write\\s*\\(.*req\\./,\n                /eval\\s*\\(.*req\\./,\n                /Function\\s*\\(.*req\\./,\n            ],\n            severity: \"HIGH\",\n            score: 30,\n            category: \"injection\",\n            cwe: \"CWE-79\",\n        },\n        {\n            name: \"HARDCODED_SECRETS\",\n            patterns: [\n                /password\\s*[:=]\\s*['\"`][^'\"`]{8,}/,\n                /api[_-]?key\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n                /secret\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n                /token\\s*[:=]\\s*['\"`][A-Za-z0-9]{20,}/,\n                /private[_-]?key\\s*[:=]\\s*['\"`][^'\"`]{20,}/,\n            ],\n            severity: \"CRITICAL\",\n            score: 35,\n            category: \"secrets\",\n            cwe: \"CWE-798\",\n        },\n        {\n            name: \"WEAK_CRYPTO\",\n            patterns: [\n                /md5\\s*\\(/,\n                /sha1\\s*\\(/,\n                /Math\\.random\\s*$$\\s*$$/,\n                /crypto\\.pseudoRandomBytes/,\n                /des\\s*\\(/i,\n                /rc4\\s*\\(/i,\n            ],\n            severity: \"MEDIUM\",\n            score: 15,\n            category: \"cryptography\",\n            cwe: \"CWE-327\",\n        },\n        {\n            name: \"CORS_MISCONFIGURATION\",\n            patterns: [\n                /Access-Control-Allow-Origin.*\\*/,\n                /cors\\s*\\(\\s*\\{\\s*origin\\s*:\\s*true/,\n                /Access-Control-Allow-Credentials.*true.*Access-Control-Allow-Origin.*\\*/,\n            ],\n            severity: \"MEDIUM\",\n            score: 20,\n            category: \"configuration\",\n            cwe: \"CWE-942\",\n        },\n        {\n            name: \"PATH_TRAVERSAL\",\n            patterns: [/\\.\\.[/\\\\]/, /path\\.join\\s*\\([^)]*req\\./, /fs\\.readFile\\s*\\([^)]*req\\./, /require\\s*\\([^)]*req\\./],\n            severity: \"HIGH\",\n            score: 25,\n            category: \"path-traversal\",\n            cwe: \"CWE-22\",\n        },\n        {\n            name: \"COMMAND_INJECTION\",\n            patterns: [/exec\\s*\\([^)]*req\\./, /spawn\\s*\\([^)]*req\\./, /system\\s*\\([^)]*req\\./, /shell\\s*\\([^)]*req\\./],\n            severity: \"CRITICAL\",\n            score: 45,\n            category: \"injection\",\n            cwe: \"CWE-78\",\n        },\n    ]\n\n    static analyzeRoute(\n        route: ApiRouteInfo,\n        content: string,\n    ): {\n        riskLevel: RiskLevel\n        recommendations: Recommendation[]\n        securityScore: number\n        vulnerabilities: string[]\n    } {\n        const recommendations: Recommendation[] = []\n        const vulnerabilities: string[] = []\n        let riskScore = 0\n\n        try {\n            if (!route.hasAuth && this.isSensitiveRoute(route)) {\n                riskScore += 30\n                recommendations.push(\n                    this.createRecommendation(\n                        \"MISSING_AUTHENTICATION\",\n                        \"SECURITY\",\n                        \"HIGH\",\n                        \"Missing Authentication\",\n                        `Route ${route.path} allows ${route.methods.join(\", \")} operations without authentication`,\n                        route.path,\n                        \"Add authentication middleware\",\n                        \"Unauthorized access to sensitive operations\",\n                        \"MEDIUM\",\n                        \"authentication\",\n                        [\"security\", \"auth\"],\n                    ),\n                )\n            }\n\n            for (const vulnerability of this.VULNERABILITIES) {\n                for (const pattern of vulnerability.patterns) {\n                    if (pattern.test(content)) {\n                        riskScore += vulnerability.score\n                        vulnerabilities.push(vulnerability.name)\n\n                        recommendations.push(\n                            this.createRecommendation(\n                                vulnerability.name,\n                                \"SECURITY\",\n                                vulnerability.severity,\n                                `Potential ${vulnerability.name.replace(\"_\", \" \")}`,\n                                `Detected pattern that may indicate ${vulnerability.name.toLowerCase().replace(\"_\", \" \")} vulnerability`,\n                                route.path,\n                                this.getVulnerabilitySolution(vulnerability.name),\n                                this.getVulnerabilityImpact(vulnerability.name),\n                                \"MEDIUM\",\n                                vulnerability.category,\n                                [\"security\", vulnerability.category],\n                            ),\n                        )\n                        break\n                    }\n                }\n            }\n\n            Object.entries(SECURITY_PATTERNS).forEach(([vulnName, patterns]) => {\n                if (patterns.some((pattern) => pattern.test(content))) {\n                    const severity = vulnName === \"SQL_INJECTION\" ? \"CRITICAL\" : \"HIGH\"\n                    const score = severity === \"CRITICAL\" ? 40 : 25\n                    riskScore += score\n\n                    recommendations.push(\n                        this.createRecommendation(\n                            vulnName,\n                            \"SECURITY\",\n                            severity,\n                            `Potential ${vulnName.replace(\"_\", \" \")}`,\n                            `Detected pattern that may indicate ${vulnName.toLowerCase().replace(\"_\", \" \")} vulnerability`,\n                            route.path,\n                            this.getVulnerabilitySolution(vulnName),\n                            this.getVulnerabilityImpact(vulnName),\n                            \"MEDIUM\",\n                            \"security\",\n                            [\"security\", vulnName.toLowerCase()],\n                        ),\n                    )\n                }\n            })\n\n            const riskLevel = calculateRiskLevel(riskScore)\n            const securityScore = Math.max(0, 100 - riskScore)\n\n            logger.debug(`Security analysis for ${route.path}: score=${securityScore}, risk=${riskLevel}`)\n\n            return { riskLevel, recommendations, securityScore, vulnerabilities }\n        } catch (error) {\n            logger.error(`Error in security analysis for ${route.path}:`, error)\n            return {\n                riskLevel: \"MEDIUM\",\n                recommendations: [],\n                securityScore: 50,\n                vulnerabilities: [],\n            }\n        }\n    }\n\n    private static isSensitiveRoute(route: ApiRouteInfo): boolean {\n        const sensitiveMethods = [\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n        const sensitivePathPatterns = [/\\/admin\\//i, /\\/user[s]?\\//i, /\\/auth\\//i, /\\/config\\//i, /\\/settings\\//i, /\\/payment[s]\\//i, /\\/checkout\\//i, /\\/order[s]?\\//i]\n\n        return (\n            route.methods.some((method) => sensitiveMethods.includes(method)) ||\n            sensitivePathPatterns.some((pattern) => pattern.test(route.path))\n        )\n    }\n\n    private static getVulnerabilitySolution(vulnerability: string): string {\n        const solutions: Record<string, string> = {\n            SQL_INJECTION: \"Use parameterized queries or ORM with proper escaping\",\n            XSS: \"Sanitize user input and use Content Security Policy\",\n            HARDCODED_SECRETS: \"Move secrets to environment variables\",\n        }\n        return solutions[vulnerability] || \"Review and fix the security issue\"\n    }\n\n    private static getVulnerabilityImpact(vulnerability: string): string {\n        const impacts: Record<string, string> = {\n            SQL_INJECTION: \"Database compromise and data theft\",\n            XSS: \"Client-side code execution and session hijacking\",\n            HARDCODED_SECRETS: \"Credential exposure and unauthorized access\",\n        }\n        return impacts[vulnerability] || \"Security vulnerability\"\n    }\n}","import type { Recommendation, RiskLevel, Severity } from \"../types\"\n\nexport const createRecommendation = (\n    id: string,\n    type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\" | \"TESTING\" | \"DOCUMENTATION\",\n    severity: Severity,\n    title: string,\n    description: string,\n    route: string,\n    solution: string,\n    impact: string,\n    effort: \"LOW\" | \"MEDIUM\" | \"HIGH\",\n    category: string,\n    tags: string[] = [],\n    codeExample?: string,\n    fixExample?: string,\n): Recommendation => ({\n    id: `${id}_${route.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n    type,\n    severity,\n    title,\n    description,\n    route,\n    solution,\n    impact,\n    effort,\n    category,\n    tags,\n    codeExample,\n    fixExample,\n})\n\nexport const calculateRiskLevel = (score: number): RiskLevel => {\n    if (score >= 50) return \"CRITICAL\"\n    if (score >= 30) return \"HIGH\"\n    if (score >= 15) return \"MEDIUM\"\n    return \"LOW\"\n}\n\nexport const getScoreColor = (score: number): string => {\n    if (score >= 90) return \"๐ŸŸข\"\n    if (score >= 70) return \"๐ŸŸก\"\n    if (score >= 50) return \"๐ŸŸ \"\n    return \"๐Ÿ”ด\"\n}\n\nexport const getRiskEmoji = (risk: RiskLevel): string => {\n    const emojiMap = { LOW: \"๐ŸŸข\", MEDIUM: \"๐ŸŸก\", HIGH: \"๐ŸŸ \", CRITICAL: \"๐Ÿ”ด\" }\n    return emojiMap[risk]\n}\n\nexport const getSeverityWeight = (severity: Severity): number => {\n    const weights = { LOW: 1, MEDIUM: 2, HIGH: 3, CRITICAL: 4 }\n    return weights[severity]\n}\n\nexport const SECURITY_PATTERNS = {\n    SQL_INJECTION: [/query\\s*\\+\\s*['\"`]/, /\\$\\{[^}]*query[^}]*\\}/, /SELECT\\s+.*\\+.*FROM/i],\n    XSS: [/innerHTML\\s*=\\s*.*req\\./, /dangerouslySetInnerHTML/, /eval\\s*\\(.*req\\./],\n    HARDCODED_SECRETS: [\n        /password\\s*[:=]\\s*['\"`][^'\"`]{8,}/,\n        /api[_-]?key\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n        /secret\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n    ],\n}\n\nexport const PERFORMANCE_PATTERNS = {\n    BLOCKING_OPERATIONS: [/fs\\.readFileSync/, /fs\\.writeFileSync/, /child_process\\.execSync/],\n    INEFFICIENT_QUERIES: [/SELECT \\*/i, /\\.find$$$$/, /N\\+1/i],\n    MEMORY_LEAKS: [/setInterval\\s*\\(/, /new Array\\s*\\(\\s*\\d{6,}/, /global\\./],\n}","import { createRecommendation } from \"../utils/common\"\nimport ts from \"typescript\"\n\nexport abstract class BaseAnalyzer {\n    protected static createRecommendation = createRecommendation\n\n    protected static extractMethods(content: string, sourceFile: ts.SourceFile, isAppRouter: boolean): string[] {\n        const methods = new Set<string>()\n\n        if (isAppRouter) {\n            const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"]\n            ts.forEachChild(sourceFile, (node) => {\n                if (ts.isFunctionDeclaration(node) && node.name && httpMethods.includes(node.name.text)) {\n                    methods.add(node.name.text)\n                }\n            })\n        } else {\n            const methodRegex = /req\\.method\\s*===?\\s*['\"`](\\w+)['\"`]/g\n            let match\n            while ((match = methodRegex.exec(content)) !== null) {\n                methods.add(match[1].toUpperCase())\n            }\n        }\n\n        return methods.size === 0 ? [\"GET\"] : Array.from(methods)\n    }\n\n    protected static extractParams(content: string, pattern: RegExp): string[] {\n        const params = new Set<string>()\n        let match\n        while ((match = pattern.exec(content)) !== null) {\n            params.add(match[1])\n        }\n        return Array.from(params)\n    }\n\n    protected static calculateComplexity(sourceFile: ts.SourceFile): number {\n        let complexity = 1\n\n        const visit = (node: ts.Node) => {\n            switch (node.kind) {\n                case ts.SyntaxKind.IfStatement:\n                case ts.SyntaxKind.WhileStatement:\n                case ts.SyntaxKind.ForStatement:\n                case ts.SyntaxKind.SwitchStatement:\n                case ts.SyntaxKind.ConditionalExpression:\n                    complexity++\n                    break\n            }\n            ts.forEachChild(node, visit)\n        }\n\n        visit(sourceFile)\n        return complexity\n    }\n}","import type { ApiRouteInfo, Recommendation } from \"../types\"\nimport { BaseAnalyzer } from \"./base-analyzer\"\nimport { PERFORMANCE_PATTERNS } from \"../utils/common\"\nimport type ts from \"typescript\"\n\nexport class PerformanceAnalyzer extends BaseAnalyzer {\n    static analyzeRoute(\n        route: ApiRouteInfo,\n        content: string,\n        sourceFile: ts.SourceFile,\n    ): {\n        performanceScore: number\n        recommendations: Recommendation[]\n        complexity: number\n    } {\n        const recommendations: Recommendation[] = []\n        let performanceScore = 100\n        const complexity = this.calculateComplexity(sourceFile)\n\n        Object.entries(PERFORMANCE_PATTERNS).forEach(([issueName, patterns]) => {\n            if (patterns.some((pattern) => pattern.test(content))) {\n                const score = this.getIssueScore(issueName)\n                performanceScore -= score\n\n                recommendations.push(\n                    this.createRecommendation(\n                        issueName,\n                        \"PERFORMANCE\",\n                        this.getIssueSeverity(issueName),\n                        this.getIssueTitle(issueName),\n                        this.getIssueDescription(issueName),\n                        route.path,\n                        this.getIssueSolution(issueName),\n                        this.getIssueImpact(issueName),\n                        \"MEDIUM\",\n                        \"performance\",\n                        [\"performance\", issueName.toLowerCase()],\n                    ),\n                )\n            }\n        })\n\n        if (complexity > 10) {\n            const complexityPenalty = Math.min(20, (complexity - 10) * 2)\n            performanceScore -= complexityPenalty\n\n            recommendations.push(\n                this.createRecommendation(\n                    \"HIGH_COMPLEXITY\",\n                    \"PERFORMANCE\",\n                    complexity > 20 ? \"HIGH\" : \"MEDIUM\",\n                    \"High Cyclomatic Complexity\",\n                    `Route has high cyclomatic complexity (${complexity})`,\n                    route.path,\n                    \"Refactor into smaller functions and reduce nesting\",\n                    \"Harder to maintain and potentially slower execution\",\n                    \"HIGH\",\n                    \"complexity\",\n                    [\"complexity\", \"maintainability\"],\n                ),\n            )\n        }\n\n        return {\n            performanceScore: Math.max(0, performanceScore),\n            recommendations,\n            complexity,\n        }\n    }\n\n    private static getIssueScore(issueName: string): number {\n        const scores = {\n            BLOCKING_OPERATIONS: 20,\n            INEFFICIENT_QUERIES: 15,\n            MEMORY_LEAKS: 25,\n        }\n        return scores[issueName as keyof typeof scores] || 10\n    }\n\n    private static getIssueSeverity(issueName: string): \"LOW\" | \"MEDIUM\" | \"HIGH\" {\n        const severities = {\n            BLOCKING_OPERATIONS: \"HIGH\" as const,\n            INEFFICIENT_QUERIES: \"MEDIUM\" as const,\n            MEMORY_LEAKS: \"HIGH\" as const,\n        }\n        return severities[issueName as keyof typeof severities] || \"MEDIUM\"\n    }\n\n    private static getIssueTitle(issueName: string): string {\n        const titles = {\n            BLOCKING_OPERATIONS: \"Blocking Operations\",\n            INEFFICIENT_QUERIES: \"Inefficient Database Queries\",\n            MEMORY_LEAKS: \"Potential Memory Leaks\",\n        }\n        return titles[issueName as keyof typeof titles] || \"Performance Issue\"\n    }\n\n    private static getIssueDescription(issueName: string): string {\n        const descriptions = {\n            BLOCKING_OPERATIONS: \"Synchronous operations that can block the event loop\",\n            INEFFICIENT_QUERIES: \"Database queries that may be inefficient\",\n            MEMORY_LEAKS: \"Code patterns that may cause memory leaks\",\n        }\n        return descriptions[issueName as keyof typeof descriptions] || \"Performance issue detected\"\n    }\n\n    private static getIssueSolution(issueName: string): string {\n        const solutions = {\n            BLOCKING_OPERATIONS: \"Use asynchronous alternatives\",\n            INEFFICIENT_QUERIES: \"Optimize queries and use proper indexing\",\n            MEMORY_LEAKS: \"Ensure proper cleanup of resources\",\n        }\n        return solutions[issueName as keyof typeof solutions] || \"Optimize the code\"\n    }\n\n    private static getIssueImpact(issueName: string): string {\n        const impacts = {\n            BLOCKING_OPERATIONS: \"Reduced server performance and responsiveness\",\n            INEFFICIENT_QUERIES: \"Slower response times and increased database load\",\n            MEMORY_LEAKS: \"Memory consumption growth over time\",\n        }\n        return impacts[issueName as keyof typeof impacts] || \"Performance degradation\"\n    }\n}","import type { AnalyzerPlugin, PluginResult, AnalysisContext, ApiRouteInfo } from \"../types\"\nimport { logger } from \"../utils/logger\"\nimport { createRecommendation } from \"../utils/common\"\n\nexport class PluginManager {\n    private plugins: Map<string, AnalyzerPlugin> = new Map()\n\n    async loadPlugin(plugin: AnalyzerPlugin): Promise<void> {\n        this.plugins.set(plugin.name, plugin)\n        logger.info(`Loaded plugin: ${plugin.name} v${plugin.version}`)\n    }\n\n    async runPlugins(route: ApiRouteInfo, content: string, context: AnalysisContext): Promise<PluginResult[]> {\n        const results: PluginResult[] = []\n\n        for (const [name, plugin] of this.plugins) {\n            try {\n                const result = await plugin.analyze(route, content, context)\n                results.push(result)\n            } catch (error) {\n                logger.error(`Plugin ${name} failed for route ${route.path}:`, error)\n            }\n        }\n\n        return results\n    }\n\n    getLoadedPlugins(): string[] {\n        return Array.from(this.plugins.keys())\n    }\n}\n\nexport class OpenApiPlugin implements AnalyzerPlugin {\n    name = \"openapi-generator\"\n    version = \"1.0.0\"\n\n    async analyze(route: ApiRouteInfo, content: string): Promise<PluginResult> {\n        const recommendations = []\n\n        if (!this.hasOpenApiDocs(content)) {\n            recommendations.push(\n                createRecommendation(\n                    \"openapi_missing\",\n                    \"DOCUMENTATION\",\n                    \"LOW\",\n                    \"Missing OpenAPI Documentation\",\n                    \"Route lacks OpenAPI/Swagger documentation\",\n                    route.path,\n                    \"Add JSDoc comments with OpenAPI annotations\",\n                    \"Reduced API discoverability\",\n                    \"LOW\",\n                    \"documentation\",\n                    [\"openapi\", \"documentation\"],\n                ),\n            )\n        }\n\n        return { recommendations, metrics: {}, metadata: {} }\n    }\n\n    private hasOpenApiDocs(content: string): boolean {\n        return /\\/\\*\\*[\\s\\S]*@swagger[\\s\\S]*\\*\\//.test(content)\n    }\n}\n\nexport class TestCoveragePlugin implements AnalyzerPlugin {\n    name = \"test-coverage\"\n    version = \"1.0.0\"\n\n    async analyze(route: ApiRouteInfo): Promise<PluginResult> {\n        const recommendations = []\n\n        const hasTests = false\n\n        if (!hasTests) {\n            recommendations.push(\n                createRecommendation(\n                    \"test_missing\",\n                    \"TESTING\",\n                    \"MEDIUM\",\n                    \"Missing Test Coverage\",\n                    \"Route appears to lack test coverage\",\n                    route.path,\n                    \"Add unit and integration tests\",\n                    \"Reduced code quality and increased bug risk\",\n                    \"MEDIUM\",\n                    \"testing\",\n                    [\"testing\", \"quality\"],\n                ),\n            )\n        }\n\n        return { recommendations, metrics: { testCoverage: hasTests ? 80 : 0 }, metadata: {} }\n    }\n}","import type { ApiAnalysisResult, AnalyzerConfig, Recommendation } from \"../types\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger } from \"../utils/logger\"\nimport { getScoreColor, getRiskEmoji } from \"../utils/common\"\nimport path from \"path\"\n\nexport interface UnifiedReportData {\n    metadata: {\n        generatedAt: Date\n        version: string\n        command: string\n        duration: number\n        configHash: string\n    }\n    analysis: ApiAnalysisResult\n    security?: SecurityReportData\n    performance?: PerformanceReportData\n    trends?: TrendsReportData\n    comparison?: ComparisonReportData\n    insights: InsightData\n    recommendations: EnhancedRecommendation[]\n}\n\nexport interface SecurityReportData {\n    vulnerabilities: {\n        critical: Recommendation[]\n        high: Recommendation[]\n        medium: Recommendation[]\n        low: Recommendation[]\n    }\n    compliance: {\n        owasp: {\n            score: number\n            issues: string[]\n            coverage: Record<string, boolean>\n        }\n        pciDss: {\n            score: number\n            requirements: Record<string, boolean>\n        }\n    }\n    riskAssessment: {\n        overallRisk: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n        riskFactors: string[]\n        mitigationPriority: string[]\n    }\n    securityMetrics: {\n        authenticationCoverage: number\n        inputValidationCoverage: number\n        encryptionUsage: number\n        rateLimitingCoverage: number\n    }\n}\n\nexport interface PerformanceReportData {\n    metrics: {\n        averageComplexity: number\n        averageLinesOfCode: number\n        totalDependencies: number\n        blockingOperations: number\n        asyncOperations: number\n    }\n    bottlenecks: {\n        highComplexityRoutes: Array<{\n            path: string\n            complexity: number\n            recommendations: string[]\n        }>\n        largeRoutes: Array<{\n            path: string\n            linesOfCode: number\n            recommendations: string[]\n        }>\n        dependencyHeavyRoutes: Array<{\n            path: string\n            dependencies: string[]\n            recommendations: string[]\n        }>\n    }\n    optimizationOpportunities: {\n        caching: string[]\n        asyncOptimization: string[]\n        codeReduction: string[]\n        dependencyOptimization: string[]\n    }\n    benchmarks: {\n        estimatedResponseTimes: Record<string, number>\n        memoryUsageEstimates: Record<string, number>\n        scalabilityScore: number\n    }\n}\n\nexport interface TrendsReportData {\n    timeRange: {\n        start: Date\n        end: Date\n        days: number\n    }\n    trends: {\n        routes: {\n            current: number\n            previous: number\n            change: number\n            trend: \"INCREASING\" | \"DECREASING\" | \"STABLE\"\n        }\n        security: {\n            current: number\n            previous: number\n            change: number\n            trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n        }\n        performance: {\n            current: number\n            previous: number\n            change: number\n            trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n        }\n        maintainability: {\n            current: number\n            previous: number\n            change: number\n            trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n        }\n    }\n    historicalData: Array<{\n        date: Date\n        totalRoutes: number\n        securityScore: number\n        performanceScore: number\n        maintainabilityScore: number\n    }>\n    predictions: {\n        nextMonth: {\n            securityScore: number\n            performanceScore: number\n            maintainabilityScore: number\n        }\n        recommendations: string[]\n    }\n}\n\nexport interface ComparisonReportData {\n    baseline: {\n        version: string\n        date: Date\n        summary: any\n    }\n    current: {\n        version: string\n        date: Date\n        summary: any\n    }\n    changes: {\n        routes: {\n            added: string[]\n            removed: string[]\n            modified: string[]\n        }\n        scores: {\n            security: { from: number; to: number; change: number }\n            performance: { from: number; to: number; change: number }\n            maintainability: { from: number; to: number; change: number }\n        }\n        recommendations: {\n            new: Recommendation[]\n            resolved: Recommendation[]\n            persistent: Recommendation[]\n        }\n    }\n    regressions: Array<{\n        type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\"\n        severity: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n        description: string\n        impact: string\n        routes: string[]\n    }>\n    improvements: Array<{\n        type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\"\n        description: string\n        impact: string\n        routes: string[]\n    }>\n}\n\nexport interface InsightData {\n    keyFindings: string[]\n    criticalIssues: string[]\n    quickWins: string[]\n    longTermGoals: string[]\n    riskAreas: string[]\n    strengths: string[]\n    technicalDebt: {\n        score: number\n        areas: string[]\n        estimatedEffort: string\n    }\n    architecturalRecommendations: string[]\n}\n\nexport interface EnhancedRecommendation extends Recommendation {\n    priority: number\n    estimatedEffort: string\n    businessImpact: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n    implementationSteps: string[]\n    dependencies: string[]\n    riskOfNotImplementing: string\n}\n\nexport class UnifiedReportGenerator {\n    private config: AnalyzerConfig\n    private outputDir: string\n\n    constructor(config: AnalyzerConfig, outputDir: string) {\n        this.config = config\n        this.outputDir = outputDir\n    }\n\n    async generateUnifiedReport(\n        command: string,\n        analysis: ApiAnalysisResult,\n        additionalData?: {\n            security?: SecurityReportData\n            performance?: PerformanceReportData\n            trends?: TrendsReportData\n            comparison?: ComparisonReportData\n        },\n    ): Promise<UnifiedReportData> {\n        logger.info(`๐Ÿ“Š Generating unified report for ${command} command...`)\n\n        const reportData: UnifiedReportData = {\n            metadata: {\n                generatedAt: new Date(),\n                version: \"3.1.0\",\n                command,\n                duration: analysis.metadata.duration,\n                configHash: this.generateConfigHash(),\n            },\n            analysis,\n            ...additionalData,\n            insights: await this.generateInsights(analysis),\n            recommendations: await this.enhanceRecommendations(analysis.recommendations),\n        }\n\n        await this.generateMarkdownReport(reportData)\n        await this.generateJsonReport(reportData)\n        await this.generateHtmlReport(reportData)\n        await this.generateCsvReport(reportData)\n        await this.generateExecutiveSummary(reportData)\n\n        logger.success(`โœ… Unified report generated successfully in ${this.outputDir}`)\n        return reportData\n    }\n\n    private async generateMarkdownReport(data: UnifiedReportData): Promise<void> {\n        let report = this.generateMarkdownHeader(data)\n        report += this.generateExecutiveSummarySection(data)\n        report += this.generateAnalysisOverviewSection(data)\n\n        if (data.security) {\n            report += this.generateSecuritySection(data.security)\n        }\n\n        if (data.performance) {\n            report += this.generatePerformanceSection(data.performance)\n        }\n\n        if (data.trends) {\n            report += this.generateTrendsSection(data.trends)\n        }\n\n        if (data.comparison) {\n            report += this.generateComparisonSection(data.comparison)\n        }\n\n        report += this.generateInsightsSection(data.insights)\n        report += this.generateRecommendationsSection(data.recommendations)\n        report += this.generateDetailedRoutesSection(data.analysis.routes)\n        report += this.generateAppendixSection(data)\n\n        await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.md\"), report)\n    }\n\n    private generateMarkdownHeader(data: UnifiedReportData): string {\n        return `# ๐Ÿ” Comprehensive API Analysis Report\n\n        **Command:** \\`${data.metadata.command}\\`  \n        **Generated:** ${data.metadata.generatedAt.toLocaleString()}  \n        **Version:** ${data.metadata.version}  \n        **Duration:** ${data.metadata.duration.toFixed(2)}ms  \n        **Total Routes:** ${data.analysis.summary.totalRoutes}  \n        **Total Files:** ${data.analysis.metadata.totalFiles}  \n        **Lines of Code:** ${data.analysis.metadata.totalLinesOfCode.toLocaleString()}  \n\n        ---\n\n        `\n    }\n\n    private generateExecutiveSummarySection(data: UnifiedReportData): string {\n        const summary = data.analysis.summary\n        const insights = data.insights\n\n        return `## ๐Ÿ“‹ Executive Summary\n\n                ### Overall Health Score\n                | Metric | Score | Status | Trend |\n                |--------|-------|--------|-------|\n                | Security | ${summary.securityScore.toFixed(1)}% | ${getScoreColor(summary.securityScore)} | ${this.getTrendIndicator(data.trends?.trends.security)} |\n                | Performance | ${summary.performanceScore.toFixed(1)}% | ${getScoreColor(summary.performanceScore)} | ${this.getTrendIndicator(data.trends?.trends.performance)} |\n                | Maintainability | ${summary.maintainabilityScore.toFixed(1)}% | ${getScoreColor(summary.maintainabilityScore)} | ${this.getTrendIndicator(data.trends?.trends.maintainability)} |\n                | Test Coverage | ${summary.testCoverageScore.toFixed(1)}% | ${getScoreColor(summary.testCoverageScore)} | - |\n\n                ### Key Findings\n                ${insights.keyFindings.map((finding) => `- ${finding}`).join(\"\\n\")}\n\n                ### Critical Issues Requiring Immediate Attention\n                ${insights.criticalIssues.length > 0\n                ? insights.criticalIssues.map((issue) => `- โš ๏ธ ${issue}`).join(\"\\n\")\n                : \"- โœ… No critical issues identified\"\n            }\n\n                ### Quick Wins (Low Effort, High Impact)\n                ${insights.quickWins.map((win) => `- ๐ŸŽฏ ${win}`).join(\"\\n\")}\n\n                ---\n\n                `\n    }\n\n    private generateAnalysisOverviewSection(data: UnifiedReportData): string {\n        const summary = data.analysis.summary\n\n        return `## ๐Ÿ“Š Analysis Overview\n\n                ### Route Distribution\n                - **Total Routes:** ${summary.totalRoutes}\n                - **Secured Routes:** ${summary.secureRoutes} (${((summary.secureRoutes / summary.totalRoutes) * 100).toFixed(1)}%)\n                - **Public Routes:** ${summary.publicRoutes} (${((summary.publicRoutes / summary.totalRoutes) * 100).toFixed(1)}%)\n\n                ### HTTP Methods Breakdown\n                ${Object.entries(summary.methodsBreakdown)\n                .filter(([_, count]) => count > 0)\n                .map(([method, count]) => `- **${method}:** ${count} routes`)\n                .join(\"\\n\")}\n\n                ### Risk Distribution\n                ${Object.entries(summary.riskDistribution)\n                .map(([risk, count]) => `- ${getRiskEmoji(risk as any)} **${risk}:** ${count} routes`)\n                .join(\"\\n\")}\n\n                ### Response Status Codes\n                ${Object.entries(summary.statusCodeDistribution)\n                .map(([status, count]) => `- **${status}:** ${count} occurrences`)\n                .join(\"\\n\")}\n\n                ---\n\n                `\n    }\n\n    private generateSecuritySection(security: SecurityReportData): string {\n        return `## ๐Ÿ” Security Analysis\n\n                ### Vulnerability Assessment\n                | Severity | Count | Routes Affected |\n                |----------|-------|-----------------|\n                | Critical | ${security.vulnerabilities.critical.length} | ${this.getAffectedRoutes(security.vulnerabilities.critical)} |\n                | High | ${security.vulnerabilities.high.length} | ${this.getAffectedRoutes(security.vulnerabilities.high)} |\n                | Medium | ${security.vulnerabilities.medium.length} | ${this.getAffectedRoutes(security.vulnerabilities.medium)} |\n                | Low | ${security.vulnerabilities.low.length} | ${this.getAffectedRoutes(security.vulnerabilities.low)} |\n\n                ### Compliance Assessment\n\n                #### OWASP Top 10 Compliance\n                **Score:** ${security.compliance.owasp.score.toFixed(1)}%\n\n                ${Object.entries(security.compliance.owasp.coverage)\n                .map(([item, compliant]) => `- ${compliant ? \"โœ…\" : \"โŒ\"} ${item}`)\n                .join(\"\\n\")}\n\n                **Identified Issues:**\n                ${security.compliance.owasp.issues.map((issue) => `- โš ๏ธ ${issue}`).join(\"\\n\")}\n\n                #### PCI DSS Compliance\n                **Score:** ${security.compliance.pciDss.score.toFixed(1)}%\n\n                ${Object.entries(security.compliance.pciDss.requirements)\n                .map(([req, compliant]) => `- ${compliant ? \"โœ…\" : \"โŒ\"} ${req}`)\n                .join(\"\\n\")}\n\n                ### Risk Assessment\n                **Overall Risk Level:** ${getRiskEmoji(security.riskAssessment.overallRisk)} ${security.riskAssessment.overallRisk}\n\n                **Risk Factors:**\n                ${security.riskAssessment.riskFactors.map((factor) => `- ${factor}`).join(\"\\n\")}\n\n                **Mitigation Priority:**\n                ${security.riskAssessment.mitigationPriority.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\")}\n\n                ### Security Metrics\n                - **Authentication Coverage:** ${security.securityMetrics.authenticationCoverage.toFixed(1)}%\n                - **Input Validation Coverage:** ${security.securityMetrics.inputValidationCoverage.toFixed(1)}%\n                - **Encryption Usage:** ${security.securityMetrics.encryptionUsage.toFixed(1)}%\n                - **Rate Limiting Coverage:** ${security.securityMetrics.rateLimitingCoverage.toFixed(1)}%\n\n                ---\n\n                `\n    }\n\n    private generatePerformanceSection(performance: PerformanceReportData): string {\n        return `## โšก Performance Analysis\n\n                ### Performance Metrics\n                - **Average Complexity:** ${performance.metrics.averageComplexity.toFixed(1)}\n                - **Average Lines of Code:** ${Math.round(performance.metrics.averageLinesOfCode)}\n                - **Total Dependencies:** ${performance.metrics.totalDependencies}\n                - **Blocking Operations:** ${performance.metrics.blockingOperations}\n                - **Async Operations:** ${performance.metrics.asyncOperations}\n\n                ### Performance Bottlenecks\n\n                #### High Complexity Routes\n                ${performance.bottlenecks.highComplexityRoutes.length > 0\n                ? performance.bottlenecks.highComplexityRoutes\n                    .map(\n                        (route) =>\n                            `- **${route.path}** (Complexity: ${route.complexity})\\n  ${route.recommendations.map((rec) => `  - ${rec}`).join(\"\\n  \")}`,\n                    )\n                    .join(\"\\n\")\n                : \"- โœ… No high complexity routes identified\"\n            }\n\n                #### Large Routes (High LOC)\n                ${performance.bottlenecks.largeRoutes.length > 0\n                ? performance.bottlenecks.largeRoutes\n                    .map(\n                        (route) =>\n                            `- **${route.path}** (${route.linesOfCode} LOC)\\n  ${route.recommendations.map((rec) => `  - ${rec}`).join(\"\\n  \")}`,\n                    )\n                    .join(\"\\n\")\n                : \"- โœ… No overly large routes identified\"\n            }\n\n                #### Dependency-Heavy Routes\n                ${performance.bottlenecks.dependencyHeavyRoutes.length > 0\n                ? performance.bottlenecks.dependencyHeavyRoutes\n                    .map(\n                        (route) =>\n                            `- **${route.path}** (${route.dependencies.length} dependencies)\\n  Dependencies: ${route.dependencies.join(\", \")}\\n  ${route.recommendations.map((rec) => `  - ${rec}`).join(\"\\n  \")}`,\n                    )\n                    .join(\"\\n\")\n                : \"- โœ… No dependency-heavy routes identified\"\n            }\n\n                ### Optimization Opportunities\n\n                #### Caching Opportunities\n                ${performance.optimizationOpportunities.caching.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n                #### Async Optimization\n                ${performance.optimizationOpportunities.asyncOptimization.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n                #### Code Reduction\n                ${performance.optimizationOpportunities.codeReduction.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n                #### Dependency Optimization\n                ${performance.optimizationOpportunities.dependencyOptimization.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n                ### Performance Benchmarks\n                - **Scalability Score:** ${performance.benchmarks.scalabilityScore.toFixed(1)}%\n\n                #### Estimated Response Times\n                ${Object.entries(performance.benchmarks.estimatedResponseTimes)\n                .map(([route, time]) => `- **${route}:** ${time}ms`)\n                .join(\"\\n\")}\n\n                #### Memory Usage Estimates\n                ${Object.entries(performance.benchmarks.memoryUsageEstimates)\n                .map(([route, memory]) => `- **${route}:** ${(memory / 1024).toFixed(1)}KB`)\n                .join(\"\\n\")}\n\n                ---\n\n                `\n    }\n\n    private generateTrendsSection(trends: TrendsReportData): string {\n        return `## ๐Ÿ“ˆ Trends Analysis\n\n                ### Time Range\n                **Period:** ${trends.timeRange.start.toLocaleDateString()} - ${trends.timeRange.end.toLocaleDateString()} (${trends.timeRange.days} days)\n\n                ### Trend Summary\n                | Metric | Current | Previous | Change | Trend |\n                |--------|---------|----------|--------|-------|\n                | Routes | ${trends.trends.routes.current} | ${trends.trends.routes.previous} | ${trends.trends.routes.change >= 0 ? \"+\" : \"\"}${trends.trends.routes.change} | ${this.getTrendEmoji(trends.trends.routes.trend)} ${trends.trends.routes.trend} |\n                | Security Score | ${trends.trends.security.current.toFixed(1)}% | ${trends.trends.security.previous.toFixed(1)}% | ${trends.trends.security.change >= 0 ? \"+\" : \"\"}${trends.trends.security.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.security.trend)} ${trends.trends.security.trend} |\n                | Performance Score | ${trends.trends.performance.current.toFixed(1)}% | ${trends.trends.performance.previous.toFixed(1)}% | ${trends.trends.performance.change >= 0 ? \"+\" : \"\"}${trends.trends.performance.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.performance.trend)} ${trends.trends.performance.trend} |\n                | Maintainability Score | ${trends.trends.maintainability.current.toFixed(1)}% | ${trends.trends.maintainability.previous.toFixed(1)}% | ${trends.trends.maintainability.change >= 0 ? \"+\" : \"\"}${trends.trends.maintainability.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.maintainability.trend)} ${trends.trends.maintainability.trend} |\n\n                ### Historical Data Points\n                ${trends.historicalData\n                .slice(-10)\n                .map(\n                    (data) =>\n                        `- **${data.date.toLocaleDateString()}:** Routes: ${data.totalRoutes}, Security: ${data.securityScore.toFixed(1)}%, Performance: ${data.performanceScore.toFixed(1)}%, Maintainability: ${data.maintainabilityScore.toFixed(1)}%`,\n                )\n                .join(\"\\n\")}\n\n                ### Predictions (Next Month)\n                - **Security Score:** ${trends.predictions.nextMonth.securityScore.toFixed(1)}%\n                - **Performance Score:** ${trends.predictions.nextMonth.performanceScore.toFixed(1)}%\n                - **Maintainability Score:** ${trends.predictions.nextMonth.maintainabilityScore.toFixed(1)}%\n\n                ### Trend-Based Recommendations\n                ${trends.predictions.recommendations.map((rec) => `- ${rec}`).join(\"\\n\")}\n\n                ---\n\n                `\n    }\n\n    private generateComparisonSection(comparison: ComparisonReportData): string {\n        return `## ๐Ÿ”„ Comparison Analysis\n\n                ### Version Comparison\n                | Aspect | Baseline | Current |\n                |--------|----------|---------|\n                | Version | ${comparison.baseline.version} | ${comparison.current.version} |\n                | Date | ${comparison.baseline.date.toLocaleDateString()} | ${comparison.current.date.toLocaleDateString()} |\n                | Routes | ${comparison.baseline.summary.totalRoutes} | ${comparison.current.summary.totalRoutes} |\n\n                ### Route Changes\n                - **Added Routes:** ${comparison.changes.routes.added.length}\n                ${comparison.changes.routes.added.map((route) => `  - โœ… ${route}`).join(\"\\n\")}\n\n                - **Removed Routes:** ${comparison.changes.routes.removed.length}\n                ${comparison.changes.routes.removed.map((route) => `  - โŒ ${route}`).join(\"\\n\")}\n\n                - **Modified Routes:** ${comparison.changes.routes.modified.length}\n                ${comparison.changes.routes.modified.map((route) => `  - ๐Ÿ”„ ${route}`).join(\"\\n\")}\n\n                ### Score Changes\n                | Metric | From | To | Change | Impact |\n                |--------|------|----|---------| -------|\n                | Security | ${comparison.changes.scores.security.from.toFixed(1)}% | ${comparison.changes.scores.security.to.toFixed(1)}% | ${comparison.changes.scores.security.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.security.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.security.change)} |\n                | Performance | ${comparison.changes.scores.performance.from.toFixed(1)}% | ${comparison.changes.scores.performance.to.toFixed(1)}% | ${comparison.changes.scores.performance.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.performance.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.performance.change)} |\n                | Maintainability | ${comparison.changes.scores.maintainability.from.toFixed(1)}% | ${comparison.changes.scores.maintainability.to.toFixed(1)}% | ${comparison.changes.scores.maintainability.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.maintainability.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.maintainability.change)} |\n\n                ### Regressions Identified\n                ${comparison.regressions.length > 0\n                ? comparison.regressions\n                    .map(\n                        (regression) =>\n                            `- **${regression.type}** (${regression.severity}): ${regression.description}\\n  - Impact: ${regression.impact}\\n  - Affected Routes: ${regression.routes.join(\", \")}`,\n                    )\n                    .join(\"\\n\")\n                : \"- โœ… No regressions identified\"\n            }\n\n                ### Improvements Identified\n                ${comparison.improvements.length > 0\n                ? comparison.improvements\n                    .map(\n                        (improvement) =>\n                            `- **${improvement.type}**: ${improvement.description}\\n  - Impact: ${improvement.impact}\\n  - Affected Routes: ${improvement.routes.join(\", \")}`,\n                    )\n                    .join(\"\\n\")\n                : \"- No significant improvements identified\"\n            }\n\n                ### Recommendation Changes\n                - **New Recommendations:** ${comparison.changes.recommendations.new.length}\n                - **Resolved Recommendations:** ${comparison.changes.recommendations.resolved.length}\n                - **Persistent Recommendations:** ${comparison.changes.recommendations.persistent.length}\n\n                ---\n\n                `\n    }\n\n    private generateInsightsSection(insights: InsightData): string {\n        return `## ๐Ÿ’ก Key Insights & Analysis\n\n                ### Strengths\n                ${insights.strengths.map((strength) => `- โœ… ${strength}`).join(\"\\n\")}\n\n                ### Risk Areas\n                ${insights.riskAreas.map((risk) => `- โš ๏ธ ${risk}`).join(\"\\n\")}\n\n                ### Technical Debt Assessment\n                **Technical Debt Score:** ${insights.technicalDebt.score.toFixed(1)}/100\n\n                **Problem Areas:**\n                ${insights.technicalDebt.areas.map((area) => `- ${area}`).join(\"\\n\")}\n\n                **Estimated Effort to Address:** ${insights.technicalDebt.estimatedEffort}\n\n                ### Architectural Recommendations\n                ${insights.architecturalRecommendations.map((rec) => `- ๐Ÿ—๏ธ ${rec}`).join(\"\\n\")}\n\n                ### Long-Term Goals\n                ${insights.longTermGoals.map((goal) => `- ๐ŸŽฏ ${goal}`).join(\"\\n\")}\n\n                ---\n\n                `\n    }\n\n    private generateRecommendationsSection(recommendations: EnhancedRecommendation[]): string {\n        const sortedRecs = recommendations.sort((a, b) => b.priority - a.priority)\n\n        return `## ๐Ÿ“ Detailed Recommendations\n\n                ### Priority Matrix\n                | Priority | Count | Business Impact |\n                |----------|-------|-----------------|\n                | Critical | ${sortedRecs.filter((r) => r.priority >= 90).length} | High business risk |\n                | High | ${sortedRecs.filter((r) => r.priority >= 70 && r.priority < 90).length} | Significant impact |\n                | Medium | ${sortedRecs.filter((r) => r.priority >= 50 && r.priority < 70).length} | Moderate impact |\n                | Low | ${sortedRecs.filter((r) => r.priority < 50).length} | Minor improvements |\n\n                ### Top Priority Recommendations\n\n                ${sortedRecs\n                .slice(0, 10)\n                .map(\n                    (rec, index) => `\n                #### ${index + 1}. ${rec.title}\n                **Priority:** ${rec.priority}/100 | **Severity:** ${rec.severity} | **Business Impact:** ${rec.businessImpact}  \n                **Estimated Effort:** ${rec.estimatedEffort} | **Category:** ${rec.category}\n\n                **Description:** ${rec.description}\n\n                **Solution:** ${rec.solution}\n\n                **Impact:** ${rec.impact}\n\n                **Risk of Not Implementing:** ${rec.riskOfNotImplementing}\n\n                **Implementation Steps:**\n                ${rec.implementationSteps.map((step, i) => `${i + 1}. ${step}`).join(\"\\n\")}\n\n                ${rec.dependencies.length > 0 ? `**Dependencies:** ${rec.dependencies.join(\", \")}` : \"\"}\n\n                ${rec.route ? `**Affected Route:** \\`${rec.route}\\`` : \"\"}\n\n                **Tags:** ${rec.tags.join(\", \")}\n\n                ---\n                `,\n                )\n                .join(\"\")}\n\n                ---\n\n                `\n    }\n\n    private generateDetailedRoutesSection(routes: any[]): string {\n        return `## ๐Ÿ“‹ Detailed Route Analysis\n\n                ### Route Inventory\n                Total Routes: ${routes.length}\n\n                ${routes\n                .map(\n                    (route) => `\n                #### \\`${route.path}\\`\n                - **Methods:** ${route.methods.join(\", \")}\n                - **Authentication:** ${route.hasAuth ? \"๐Ÿ”’ Secured\" : \"๐Ÿ”“ Public\"}\n                - **Risk Level:** ${getRiskEmoji(route.riskLevel)} ${route.riskLevel}\n                - **Complexity:** ${route.complexity || \"N/A\"}\n                - **Performance Score:** ${route.performanceScore?.toFixed(1) || \"N/A\"}%\n                - **Lines of Code:** ${route.linesOfCode || \"N/A\"}\n                - **Dependencies:** ${route.dependencies.length || 0}\n                - **Last Modified:** ${route.lastModified ? new Date(route.lastModified).toLocaleDateString() : \"N/A\"}\n\n                ${route.authTypes.length > 0 ? `**Auth Types:** ${route.authTypes.join(\", \")}` : \"\"}\n                ${route.middlewares.length > 0 ? `**Middlewares:** ${route.middlewares.join(\", \")}` : \"\"}\n                ${route.description ? `**Description:** ${route.description}` : \"\"}\n\n                **Features:**\n                - Rate Limiting: ${route.hasRateLimit ? \"โœ…\" : \"โŒ\"}\n                - CORS: ${route.hasCors ? \"โœ…\" : \"โŒ\"}\n                - Input Validation: ${route.hasInputValidation ? \"โœ…\" : \"โŒ\"}\n\n                **Parameters:**\n                - Query: ${route.queryParams.length}\n                - Path: ${route.pathParams.length}\n                - Body: ${route.bodyParams.length}\n\n                **Response Codes:** ${route.responseStatuses.join(\", \")}\n\n                ---\n                `,\n                )\n                .join(\"\")}\n\n                `\n    }\n\n    private generateAppendixSection(data: UnifiedReportData): string {\n        return `## ๐Ÿ“Ž Appendix\n\n                ### Configuration Used\n                - **API Directory:** ${this.config.apiDir}\n                - **Output Directory:** ${this.outputDir}\n                - **Security Analysis:** ${this.config.enableSecurityAnalysis ? \"Enabled\" : \"Disabled\"}\n                - **Performance Analysis:** ${this.config.enablePerformanceAnalysis ? \"Enabled\" : \"Disabled\"}\n                - **Trends Analysis:** ${this.config.enableTrends ? \"Enabled\" : \"Disabled\"}\n                - **Parallel Processing:** ${this.config.parallel ? \"Enabled\" : \"Disabled\"}\n                - **Max Concurrency:** ${this.config.maxConcurrency}\n\n                ### Thresholds\n                - **Security:** ${this.config.thresholds.security}%\n                - **Performance:** ${this.config.thresholds.performance}%\n                - **Maintainability:** ${this.config.thresholds.maintainability}%\n                - **Test Coverage:** ${this.config.thresholds.testCoverage}%\n                - **Complexity:** ${this.config.thresholds.complexity}\n\n                ### Glossary\n                - **Cyclomatic Complexity:** A measure of code complexity based on the number of decision points\n                - **Technical Debt:** The cost of additional rework caused by choosing an easy solution now instead of a better approach\n                - **OWASP:** Open Web Application Security Project - industry standard for web application security\n                - **PCI DSS:** Payment Card Industry Data Security Standard\n                - **Risk Level:** Assessment of potential security and operational risks (LOW, MEDIUM, HIGH, CRITICAL)\n\n                ### Report Generation Details\n                - **Generated At:** ${data.metadata.generatedAt.toISOString()}\n                - **Analysis Duration:** ${data.metadata.duration.toFixed(2)}ms\n                - **Report Version:** ${data.metadata.version}\n                - **Command Used:** ${data.metadata.command}\n                - **Config Hash:** ${data.metadata.configHash}\n\n                ---\n\n                *This report was generated by Next.js API Analyzer v${data.metadata.version}*\n                `\n    }\n\n    private async generateJsonReport(data: UnifiedReportData): Promise<void> {\n        await FileUtils.writeJsonFile(path.join(this.outputDir, \"unified-report.json\"), data)\n    }\n\n    private async generateHtmlReport(data: UnifiedReportData): Promise<void> {\n        const html = this.generateHtmlContent(data)\n        await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.html\"), html)\n    }\n\n    private async generateCsvReport(data: UnifiedReportData): Promise<void> {\n        const csvContent = this.generateCsvContent(data)\n        await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.csv\"), csvContent)\n    }\n\n    private async generateExecutiveSummary(data: UnifiedReportData): Promise<void> {\n        const summary = this.generateExecutiveSummaryContent(data)\n        await FileUtils.writeFile(path.join(this.outputDir, \"executive-summary.md\"), summary)\n    }\n\n    private generateHtmlContent(data: UnifiedReportData): string {\n        return `<!DOCTYPE html>\n                <html lang=\"en\">\n                <head>\n                    <meta charset=\"UTF-8\">\n                    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n                    <title>Comprehensive API Analysis Report</title>\n                    <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n                    <style>\n                        :root {\n                            --primary: #3b82f6;\n                            --success: #10b981;\n                            --warning: #f59e0b;\n                            --danger: #ef4444;\n                            --dark: #1f2937;\n                            --light: #f8fafc;\n                            --border: #e5e7eb;\n                        }\n                        \n                        * { margin: 0; padding: 0; box-sizing: border-box; }\n                        \n                        body {\n                            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n                            background: var(--light);\n                            color: var(--dark);\n                            line-height: 1.6;\n                        }\n                        \n                        .container { max-width: 1400px; margin: 0 auto; padding: 20px; }\n                        \n                        .header {\n                            background: linear-gradient(135deg, var(--primary), #8b5cf6);\n                            color: white;\n                            padding: 40px;\n                            border-radius: 12px;\n                            margin-bottom: 30px;\n                            text-align: center;\n                        }\n                        \n                        .header h1 { font-size: 2.5em; margin-bottom: 10px; }\n                        .header p { opacity: 0.9; margin-bottom: 5px; }\n                        \n                        .metrics-grid {\n                            display: grid;\n                            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n                            gap: 20px;\n                            margin-bottom: 30px;\n                        }\n                        \n                        .metric-card {\n                            background: white;\n                            padding: 25px;\n                            border-radius: 12px;\n                            box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n                            border-left: 4px solid var(--primary);\n                        }\n                        \n                        .metric-value {\n                            font-size: 2.5em;\n                            font-weight: bold;\n                            color: var(--primary);\n                            margin-bottom: 5px;\n                        }\n                        \n                        .metric-label {\n                            color: #64748b;\n                            text-transform: uppercase;\n                            font-size: 0.9em;\n                            font-weight: 600;\n                        }\n                        \n                        .section {\n                            background: white;\n                            padding: 30px;\n                            border-radius: 12px;\n                            box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n                            margin-bottom: 30px;\n                        }\n                        \n                        .section h2 {\n                            color: var(--dark);\n                            margin-bottom: 20px;\n                            font-size: 1.8em;\n                        }\n                        \n                        .chart-container {\n                            position: relative;\n                            height: 300px;\n                            margin: 20px 0;\n                        }\n                        \n                        .table {\n                            width: 100%;\n                            border-collapse: collapse;\n                            margin: 20px 0;\n                        }\n                        \n                        .table th, .table td {\n                            padding: 12px;\n                            text-align: left;\n                            border-bottom: 1px solid var(--border);\n                        }\n                        \n                        .table th {\n                            background: var(--light);\n                            font-weight: 600;\n                        }\n                        \n                        .badge {\n                            padding: 4px 8px;\n                            border-radius: 4px;\n                            font-size: 0.8em;\n                            font-weight: 600;\n                        }\n                        \n                        .badge-success { background: #dcfce7; color: #16a34a; }\n                        .badge-warning { background: #fef3c7; color: #d97706; }\n                        .badge-danger { background: #fee2e2; color: #dc2626; }\n                        .badge-info { background: #dbeafe; color: #2563eb; }\n                        \n                        .recommendation {\n                            padding: 20px;\n                            border-left: 4px solid var(--warning);\n                            background: #fffbeb;\n                            margin: 15px 0;\n                            border-radius: 8px;\n                        }\n                        \n                        .recommendation.critical { border-left-color: var(--danger); background: #fef2f2; }\n                        .recommendation.high { border-left-color: var(--warning); background: #fffbeb; }\n                        .recommendation.medium { border-left-color: var(--primary); background: #eff6ff; }\n                        .recommendation.low { border-left-color: var(--success); background: #f0fdf4; }\n                        \n                        .tabs {\n                            display: flex;\n                            border-bottom: 2px solid var(--border);\n                            margin-bottom: 20px;\n                        }\n                        \n                        .tab {\n                            padding: 12px 24px;\n                            cursor: pointer;\n                            border: none;\n                            background: none;\n                            font-size: 1em;\n                            color: #64748b;\n                        }\n                        \n                        .tab.active {\n                            color: var(--primary);\n                            border-bottom: 2px solid var(--primary);\n                        }\n                        \n                        .tab-content {\n                            display: none;\n                        }\n                        \n                        .tab-content.active {\n                            display: block;\n                        }\n                        \n                        @media (max-width: 768px) {\n                            .container { padding: 15px; }\n                            .header { padding: 30px 20px; }\n                            .header h1 { font-size: 2em; }\n                            .metric-value { font-size: 2em; }\n                        }\n                    </style>\n                </head>\n                <body>\n                    <div class=\"container\">\n                        <div class=\"header\">\n                            <h1>๐Ÿ” Comprehensive API Analysis Report</h1>\n                            <p><strong>Command:</strong> ${data.metadata.command}</p>\n                            <p><strong>Generated:</strong> ${data.metadata.generatedAt.toLocaleString()}</p>\n                            <p><strong>Duration:</strong> ${data.metadata.duration.toFixed(2)}ms</p>\n                            <p><strong>Version:</strong> ${data.metadata.version}</p>\n                        </div>\n\n                        <div class=\"metrics-grid\">\n                            <div class=\"metric-card\">\n                                <div class=\"metric-value\">๐Ÿ“ ${data.analysis.summary.totalRoutes}</div>\n                                <div class=\"metric-label\">Total Routes</div>\n                            </div>\n                            <div class=\"metric-card\">\n                                <div class=\"metric-value\">๐Ÿ”’ ${data.analysis.summary.securityScore.toFixed(1)}%</div>\n                                <div class=\"metric-label\">Security Score</div>\n                            </div>\n                            <div class=\"metric-card\">\n                                <div class=\"metric-value\">โšก ${data.analysis.summary.performanceScore.toFixed(1)}%</div>\n                                <div class=\"metric-label\">Performance Score</div>\n                            </div>\n                            <div class=\"metric-card\">\n                                <div class=\"metric-value\">๐Ÿ”ง ${data.analysis.summary.maintainabilityScore.toFixed(1)}%</div>\n                                <div class=\"metric-label\">Maintainability Score</div>\n                            </div>\n                        </div>\n\n                        <div class=\"section\">\n                            <h2>๐Ÿ“‹ Executive Summary</h2>\n                            <div class=\"tabs\">\n                                <button class=\"tab active\" onclick=\"showTab('overview')\">Overview</button>\n                                ${data.security ? '<button class=\"tab\" onclick=\"showTab(\\'security\\')\">Security</button>' : \"\"}\n                                ${data.performance ? '<button class=\"tab\" onclick=\"showTab(\\'performance\\')\">Performance</button>' : \"\"}\n                                ${data.trends ? '<button class=\"tab\" onclick=\"showTab(\\'trends\\')\">Trends</button>' : \"\"}\n                                ${data.comparison ? '<button class=\"tab\" onclick=\"showTab(\\'comparison\\')\">Comparison</button>' : \"\"}\n                            </div>\n                            \n                            <div id=\"overview\" class=\"tab-content active\">\n                                <h3>Key Findings</h3>\n                                <ul>\n                                    ${data.insights.keyFindings.map((finding) => `<li>${finding}</li>`).join(\"\")}\n                                </ul>\n                                \n                                <h3>Critical Issues</h3>\n                                ${data.insights.criticalIssues.length > 0\n                ? `<ul>${data.insights.criticalIssues.map((issue) => `<li>โš ๏ธ ${issue}</li>`).join(\"\")}</ul>`\n                : \"<p>โœ… No critical issues identified</p>\"\n            }\n                                \n                                <h3>Quick Wins</h3>\n                                <ul>\n                                    ${data.insights.quickWins.map((win) => `<li>๐ŸŽฏ ${win}</li>`).join(\"\")}\n                                </ul>\n                            </div>\n                            \n                            ${data.security\n                ? `\n                            <div id=\"security\" class=\"tab-content\">\n                                <h3>Security Assessment</h3>\n                                <table class=\"table\">\n                                    <thead>\n                                        <tr>\n                                            <th>Severity</th>\n                                            <th>Count</th>\n                                            <th>Status</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr>\n                                            <td>Critical</td>\n                                            <td>${data.security.vulnerabilities.critical.length}</td>\n                                            <td><span class=\"badge badge-danger\">High Priority</span></td>\n                                        </tr>\n                                        <tr>\n                                            <td>High</td>\n                                            <td>${data.security.vulnerabilities.high.length}</td>\n                                            <td><span class=\"badge badge-warning\">Medium Priority</span></td>\n                                        </tr>\n                                        <tr>\n                                            <td>Medium</td>\n                                            <td>${data.security.vulnerabilities.medium.length}</td>\n                                            <td><span class=\"badge badge-info\">Low Priority</span></td>\n                                        </tr>\n                                        <tr>\n                                            <td>Low</td>\n                                            <td>${data.security.vulnerabilities.low.length}</td>\n                                            <td><span class=\"badge badge-success\">Monitor</span></td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                \n                                <h3>OWASP Compliance: ${data.security.compliance.owasp.score.toFixed(1)}%</h3>\n                                <div class=\"chart-container\">\n                                    <canvas id=\"owaspChart\"></canvas>\n                                </div>\n                            </div>\n                            `\n                : \"\"\n            }\n                            \n                            ${data.performance\n                ? `\n                            <div id=\"performance\" class=\"tab-content\">\n                                <h3>Performance Metrics</h3>\n                                <table class=\"table\">\n                                    <tbody>\n                                        <tr>\n                                            <td>Average Complexity</td>\n                                            <td>${data.performance.metrics.averageComplexity.toFixed(1)}</td>\n                                        </tr>\n                                        <tr>\n                                            <td>Average Lines of Code</td>\n                                            <td>${Math.round(data.performance.metrics.averageLinesOfCode)}</td>\n                                        </tr>\n                                        <tr>\n                                            <td>Total Dependencies</td>\n                                            <td>${data.performance.metrics.totalDependencies}</td>\n                                        </tr>\n                                        <tr>\n                                            <td>Blocking Operations</td>\n                                            <td>${data.performance.metrics.blockingOperations}</td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                \n                                <h3>Scalability Score: ${data.performance.benchmarks.scalabilityScore.toFixed(1)}%</h3>\n                            </div>\n                            `\n                : \"\"\n            }\n                            \n                            ${data.trends\n                ? `\n                            <div id=\"trends\" class=\"tab-content\">\n                                <h3>Trend Analysis (${data.trends.timeRange.days} days)</h3>\n                                <div class=\"chart-container\">\n                                    <canvas id=\"trendsChart\"></canvas>\n                                </div>\n                                \n                                <h3>Predictions (Next Month)</h3>\n                                <ul>\n                                    <li>Security Score: ${data.trends.predictions.nextMonth.securityScore.toFixed(1)}%</li>\n                                    <li>Performance Score: ${data.trends.predictions.nextMonth.performanceScore.toFixed(1)}%</li>\n                                    <li>Maintainability Score: ${data.trends.predictions.nextMonth.maintainabilityScore.toFixed(1)}%</li>\n                                </ul>\n                            </div>\n                            `\n                : \"\"\n            }\n                            \n                            ${data.comparison\n                ? `\n                            <div id=\"comparison\" class=\"tab-content\">\n                                <h3>Version Comparison</h3>\n                                <table class=\"table\">\n                                    <thead>\n                                        <tr>\n                                            <th>Metric</th>\n                                            <th>Baseline</th>\n                                            <th>Current</th>\n                                            <th>Change</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr>\n                                            <td>Security Score</td>\n                                            <td>${data.comparison.changes.scores.security.from.toFixed(1)}%</td>\n                                            <td>${data.comparison.changes.scores.security.to.toFixed(1)}%</td>\n                                            <td class=\"${data.comparison.changes.scores.security.change >= 0 ? \"badge-success\" : \"badge-danger\"}\">\n                                                ${data.comparison.changes.scores.security.change >= 0 ? \"+\" : \"\"}${data.comparison.changes.scores.security.change.toFixed(1)}%\n                                            </td>\n                                        </tr>\n                                        <tr>\n                                            <td>Performance Score</td>\n                                            <td>${data.comparison.changes.scores.performance.from.toFixed(1)}%</td>\n                                            <td>${data.comparison.changes.scores.performance.to.toFixed(1)}%</td>\n                                            <td class=\"${data.comparison.changes.scores.performance.change >= 0 ? \"badge-success\" : \"badge-danger\"}\">\n                                                ${data.comparison.changes.scores.performance.change >= 0 ? \"+\" : \"\"}${data.comparison.changes.scores.performance.change.toFixed(1)}%\n                                            </td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                            `\n                : \"\"\n            }\n                        </div>\n\n                        <div class=\"section\">\n                            <h2>๐Ÿ’ก Top Recommendations</h2>\n                            ${data.recommendations\n                .slice(0, 5)\n                .map(\n                    (rec) => `\n                                <div class=\"recommendation ${rec.severity.toLowerCase()}\">\n                                    <h3>${rec.title}</h3>\n                                    <p><strong>Priority:</strong> ${rec.priority}/100 | <strong>Business Impact:</strong> ${rec.businessImpact}</p>\n                                    <p><strong>Description:</strong> ${rec.description}</p>\n                                    <p><strong>Solution:</strong> ${rec.solution}</p>\n                                    <p><strong>Estimated Effort:</strong> ${rec.estimatedEffort}</p>\n                                    ${rec.route ? `<p><strong>Route:</strong> <code>${rec.route}</code></p>` : \"\"}\n                                </div>\n                            `,\n                )\n                .join(\"\")}\n                        </div>\n\n                        <div class=\"section\">\n                            <h2>๐Ÿ“Š Risk Distribution</h2>\n                            <div class=\"chart-container\">\n                                <canvas id=\"riskChart\"></canvas>\n                            </div>\n                        </div>\n                    </div>\n\n                    <script>\n                        function showTab(tabName) {\n                            // Hide all tab contents\n                            document.querySelectorAll('.tab-content').forEach(content => {\n                                content.classList.remove('active');\n                            });\n                            \n                            // Remove active class from all tabs\n                            document.querySelectorAll('.tab').forEach(tab => {\n                                tab.classList.remove('active');\n                            });\n                            \n                            // Show selected tab content\n                            document.getElementById(tabName).classList.add('active');\n                            \n                            // Add active class to clicked tab\n                            event.target.classList.add('active');\n                        }\n\n                        // Risk Distribution Chart\n                        const riskCtx = document.getElementById('riskChart').getContext('2d');\n                        new Chart(riskCtx, {\n                            type: 'doughnut',\n                            data: {\n                                labels: Object.keys(${JSON.stringify(data.analysis.summary.riskDistribution)}),\n                                datasets: [{\n                                    data: Object.values(${JSON.stringify(data.analysis.summary.riskDistribution)}),\n                                    backgroundColor: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444'],\n                                    borderWidth: 0\n                                }]\n                            },\n                            options: {\n                                responsive: true,\n                                maintainAspectRatio: false,\n                                plugins: {\n                                    legend: {\n                                        position: 'bottom'\n                                    }\n                                }\n                            }\n                        });\n\n                        ${data.security\n                ? `\n                        // OWASP Compliance Chart\n                        const owaspCtx = document.getElementById('owaspChart').getContext('2d');\n                        new Chart(owaspCtx, {\n                            type: 'bar',\n                            data: {\n                                labels: Object.keys(${JSON.stringify(data.security.compliance.owasp.coverage)}),\n                                datasets: [{\n                                    label: 'Compliance',\n                                    data: Object.values(${JSON.stringify(data.security.compliance.owasp.coverage)}).map(v => v ? 100 : 0),\n                                    backgroundColor: Object.values(${JSON.stringify(data.security.compliance.owasp.coverage)}).map(v => v ? '#10b981' : '#ef4444')\n                                }]\n                            },\n                            options: {\n                                responsive: true,\n                                maintainAspectRatio: false,\n                                scales: {\n                                    y: {\n                                        beginAtZero: true,\n                                        max: 100\n                                    }\n                                }\n                            }\n                        });\n                        `\n                : \"\"\n            }\n\n                        ${data.trends\n                ? `\n                        // Trends Chart\n                        const trendsCtx = document.getElementById('trendsChart').getContext('2d');\n                        new Chart(trendsCtx, {\n                            type: 'line',\n                            data: {\n                                labels: ${JSON.stringify(data.trends.historicalData.map((d) => new Date(d.date).toLocaleDateString()))},\n                                datasets: [\n                                    {\n                                        label: 'Security Score',\n                                        data: ${JSON.stringify(data.trends.historicalData.map((d) => d.securityScore))},\n                                        borderColor: '#10b981',\n                                        backgroundColor: 'rgba(16, 185, 129, 0.1)'\n                                    },\n                                    {\n                                        label: 'Performance Score',\n                                        data: ${JSON.stringify(data.trends.historicalData.map((d) => d.performanceScore))},\n                                        borderColor: '#3b82f6',\n                                        backgroundColor: 'rgba(59, 130, 246, 0.1)'\n                                    },\n                                    {\n                                        label: 'Maintainability Score',\n                                        data: ${JSON.stringify(data.trends.historicalData.map((d) => d.maintainabilityScore))},\n                                        borderColor: '#f59e0b',\n                                        backgroundColor: 'rgba(245, 158, 11, 0.1)'\n                                    }\n                                ]\n                            },\n                            options: {\n                                responsive: true,\n                                maintainAspectRatio: false,\n                                scales: {\n                                    y: {\n                                        beginAtZero: true,\n                                        max: 100\n                                    }\n                                }\n                            }\n                        });\n                        `\n                : \"\"\n            }\n                    </script>\n                </body>\n                </html>`\n    }\n\n    private generateCsvContent(data: UnifiedReportData): string {\n        const headers = [\n            \"Route\",\n            \"Methods\",\n            \"Authentication\",\n            \"Risk Level\",\n            \"Complexity\",\n            \"Performance Score\",\n            \"Lines of Code\",\n            \"Dependencies\",\n            \"Last Modified\",\n            \"Security Issues\",\n            \"Performance Issues\",\n        ]\n\n        const rows = data.analysis.routes.map((route) => [\n            route.path,\n            route.methods.join(\";\"),\n            route.hasAuth ? \"Secured\" : \"Public\",\n            route.riskLevel,\n            route.complexity || 0,\n            route.performanceScore?.toFixed(1) || 0,\n            route.linesOfCode || 0,\n            route.dependencies.length,\n            route.lastModified ? new Date(route.lastModified).toISOString() : \"\",\n            data.recommendations.filter((r) => r.route === route.path && r.type === \"SECURITY\").length,\n            data.recommendations.filter((r) => r.route === route.path && r.type === \"PERFORMANCE\").length,\n        ])\n\n        return [headers.join(\",\"), ...rows.map((row) => row.join(\",\"))].join(\"\\n\")\n    }\n\n    private generateExecutiveSummaryContent(data: UnifiedReportData): string {\n        return `# Executive Summary - API Analysis Report\n\n                **Date:** ${data.metadata.generatedAt.toLocaleDateString()}  \n                **Command:** ${data.metadata.command}  \n                **Analysis Duration:** ${data.metadata.duration.toFixed(2)}ms  \n\n                ## Key Metrics\n                - **Total API Routes:** ${data.analysis.summary.totalRoutes}\n                - **Security Score:** ${data.analysis.summary.securityScore.toFixed(1)}%\n                - **Performance Score:** ${data.analysis.summary.performanceScore.toFixed(1)}%\n                - **Maintainability Score:** ${data.analysis.summary.maintainabilityScore.toFixed(1)}%\n\n                ## Critical Findings\n                ${data.insights.criticalIssues.length > 0\n                ? data.insights.criticalIssues.map((issue) => `- โš ๏ธ ${issue}`).join(\"\\n\")\n                : \"- โœ… No critical issues identified\"\n            }\n\n                ## Immediate Actions Required\n                ${data.recommendations\n                .filter((r) => r.priority >= 90)\n                .slice(0, 5)\n                .map(\n                    (rec, index) =>\n                        `${index + 1}. **${rec.title}** (${rec.severity} priority)\\n   - ${rec.description}\\n   - Estimated effort: ${rec.estimatedEffort}`,\n                )\n                .join(\"\\n\\n\")}\n\n                ## Business Impact Assessment\n                - **High Risk Routes:** ${data.analysis.routes.filter((r) => r.riskLevel === \"HIGH\" || r.riskLevel === \"CRITICAL\").length}\n                - **Unsecured Endpoints:** ${data.analysis.summary.publicRoutes}\n                - **Technical Debt Score:** ${data.insights.technicalDebt.score.toFixed(1)}/100\n\n                ## Recommendations Summary\n                - **Total Recommendations:** ${data.recommendations.length}\n                - **Critical Priority:** ${data.recommendations.filter((r) => r.priority >= 90).length}\n                - **High Priority:** ${data.recommendations.filter((r) => r.priority >= 70 && r.priority < 90).length}\n                - **Medium Priority:** ${data.recommendations.filter((r) => r.priority >= 50 && r.priority < 70).length}\n\n                ## Next Steps\n                1. Address critical security vulnerabilities immediately\n                2. Implement quick wins for immediate improvement\n                3. Plan long-term architectural improvements\n                4. Establish regular monitoring and analysis schedule\n\n                ---\n                *For detailed analysis, please refer to the complete unified report.*`\n    }\n\n    private async generateInsights(analysis: ApiAnalysisResult): Promise<InsightData> {\n        const routes = analysis.routes\n        const summary = analysis.summary\n\n        const keyFindings = [\n            `Analyzed ${summary.totalRoutes} API routes across ${analysis.metadata.totalFiles} files`,\n            `Security coverage: ${((summary.secureRoutes / summary.totalRoutes) * 100).toFixed(1)}% of routes have authentication`,\n            `Average complexity: ${(routes.reduce((sum, r) => sum + (r.complexity || 0), 0) / routes.length).toFixed(1)}`,\n            `${summary.riskDistribution.HIGH + summary.riskDistribution.CRITICAL} routes identified as high risk`,\n        ]\n\n        const criticalIssues = []\n        if (summary.riskDistribution.CRITICAL > 0) {\n            criticalIssues.push(`${summary.riskDistribution.CRITICAL} routes have CRITICAL risk level`)\n        }\n        if (summary.securityScore < 70) {\n            criticalIssues.push(`Security score (${summary.securityScore.toFixed(1)}%) is below recommended threshold`)\n        }\n        if (summary.publicRoutes > summary.secureRoutes) {\n            criticalIssues.push(`More public routes (${summary.publicRoutes}) than secured routes (${summary.secureRoutes})`)\n        }\n\n        const quickWins = [\n            \"Add authentication to public mutating endpoints\",\n            \"Implement input validation on all routes\",\n            \"Add rate limiting to prevent abuse\",\n            \"Enable CORS with specific origins\",\n        ]\n\n        const longTermGoals = [\n            \"Implement comprehensive API monitoring\",\n            \"Establish security-first development practices\",\n            \"Create automated testing pipeline\",\n            \"Design scalable architecture patterns\",\n        ]\n\n        const riskAreas = [\n            \"Unauthenticated data modification endpoints\",\n            \"Routes with high cyclomatic complexity\",\n            \"Missing input validation\",\n            \"Potential SQL injection vulnerabilities\",\n        ]\n\n        const strengths = []\n        if (summary.securityScore > 80) strengths.push(\"Strong security posture\")\n        if (summary.performanceScore > 80) strengths.push(\"Good performance characteristics\")\n        if (summary.maintainabilityScore > 80) strengths.push(\"Maintainable codebase\")\n\n        const technicalDebt = {\n            score: Math.max(0, 100 - (summary.securityScore + summary.performanceScore + summary.maintainabilityScore) / 3),\n            areas: [\n                \"High complexity routes requiring refactoring\",\n                \"Missing security controls\",\n                \"Inconsistent error handling patterns\",\n                \"Lack of comprehensive testing\",\n            ],\n            estimatedEffort: this.calculateTechnicalDebtEffort(routes.length, analysis.recommendations.length),\n        }\n\n        const architecturalRecommendations = [\n            \"Implement centralized authentication middleware\",\n            \"Create consistent error handling patterns\",\n            \"Establish API versioning strategy\",\n            \"Design comprehensive logging and monitoring\",\n        ]\n\n        return {\n            keyFindings,\n            criticalIssues,\n            quickWins,\n            longTermGoals,\n            riskAreas,\n            strengths,\n            technicalDebt,\n            architecturalRecommendations,\n        }\n    }\n\n    private async enhanceRecommendations(recommendations: Recommendation[]): Promise<EnhancedRecommendation[]> {\n        return recommendations.map((rec) => ({\n            ...rec,\n            priority: this.calculatePriority(rec),\n            estimatedEffort: this.estimateEffort(rec),\n            businessImpact: this.assessBusinessImpact(rec),\n            implementationSteps: this.generateImplementationSteps(rec),\n            dependencies: this.identifyDependencies(rec),\n            riskOfNotImplementing: this.assessRiskOfNotImplementing(rec),\n        }))\n    }\n\n    private calculatePriority(rec: Recommendation): number {\n        let priority = 50\n\n        switch (rec.severity) {\n            case \"CRITICAL\":\n                priority += 40\n                break\n            case \"HIGH\":\n                priority += 30\n                break\n            case \"MEDIUM\":\n                priority += 20\n                break\n            case \"LOW\":\n                priority += 10\n                break\n        }\n\n        switch (rec.type) {\n            case \"SECURITY\":\n                priority += 20\n                break\n            case \"PERFORMANCE\":\n                priority += 15\n                break\n            case \"MAINTAINABILITY\":\n                priority += 10\n                break\n            case \"TESTING\":\n                priority += 5\n                break\n        }\n\n        switch (rec.effort) {\n            case \"LOW\":\n                priority += 10\n                break\n            case \"MEDIUM\":\n                priority += 5\n                break\n            case \"HIGH\":\n                priority -= 5\n                break\n        }\n\n        return Math.min(100, Math.max(0, priority))\n    }\n\n    private estimateEffort(rec: Recommendation): string {\n        const effortMap = {\n            LOW: \"1-2 hours\",\n            MEDIUM: \"1-2 days\",\n            HIGH: \"1-2 weeks\",\n        }\n        return effortMap[rec.effort] || \"1-2 days\"\n    }\n\n    private assessBusinessImpact(rec: Recommendation): \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\" {\n        if (rec.type === \"SECURITY\" && (rec.severity === \"CRITICAL\" || rec.severity === \"HIGH\")) {\n            return \"CRITICAL\"\n        }\n        if (rec.type === \"SECURITY\" || (rec.type === \"PERFORMANCE\" && rec.severity === \"HIGH\")) {\n            return \"HIGH\"\n        }\n        if (rec.type === \"PERFORMANCE\" || rec.type === \"MAINTAINABILITY\") {\n            return \"MEDIUM\"\n        }\n        return \"LOW\"\n    }\n\n    private generateImplementationSteps(rec: Recommendation): string[] {\n        const baseSteps = [\n            \"Review current implementation\",\n            \"Plan the solution approach\",\n            \"Implement the changes\",\n            \"Test the implementation\",\n            \"Deploy and monitor\",\n        ]\n\n        if (rec.type === \"SECURITY\") {\n            return [\n                \"Conduct security assessment\",\n                \"Design security controls\",\n                \"Implement security measures\",\n                \"Perform security testing\",\n                \"Deploy with monitoring\",\n            ]\n        }\n\n        if (rec.type === \"PERFORMANCE\") {\n            return [\n                \"Profile current performance\",\n                \"Identify bottlenecks\",\n                \"Implement optimizations\",\n                \"Benchmark improvements\",\n                \"Deploy and monitor metrics\",\n            ]\n        }\n\n        return baseSteps\n    }\n\n    private identifyDependencies(rec: Recommendation): string[] {\n        const dependencies = []\n\n        if (rec.type === \"SECURITY\" && rec.category === \"authentication\") {\n            dependencies.push(\"Authentication system setup\", \"User management system\")\n        }\n\n        if (rec.type === \"PERFORMANCE\" && rec.category === \"caching\") {\n            dependencies.push(\"Cache infrastructure\", \"Cache invalidation strategy\")\n        }\n\n        if (rec.category === \"testing\") {\n            dependencies.push(\"Testing framework setup\", \"CI/CD pipeline\")\n        }\n\n        return dependencies\n    }\n\n    private assessRiskOfNotImplementing(rec: Recommendation): string {\n        if (rec.type === \"SECURITY\") {\n            return \"Potential security breach, data loss, compliance violations, and reputational damage\"\n        }\n\n        if (rec.type === \"PERFORMANCE\") {\n            return \"Degraded user experience, increased infrastructure costs, and scalability issues\"\n        }\n\n        if (rec.type === \"MAINTAINABILITY\") {\n            return \"Increased development time, higher bug rates, and technical debt accumulation\"\n        }\n\n        return \"Reduced code quality and development efficiency\"\n    }\n\n    private calculateTechnicalDebtEffort(routeCount: number, recommendationCount: number): string {\n        const totalEffort = routeCount * 0.5 + recommendationCount * 2 // Rough estimation\n\n        if (totalEffort < 40) return \"1-2 weeks\"\n        if (totalEffort < 80) return \"1-2 months\"\n        if (totalEffort < 160) return \"2-4 months\"\n        return \"4+ months\"\n    }\n\n    private generateConfigHash(): string {\n        const configString = JSON.stringify(this.config)\n        let hash = 0\n        for (let i = 0; i < configString.length; i++) {\n            const char = configString.charCodeAt(i)\n            hash = (hash << 5) - hash + char\n            hash = hash & hash\n        }\n        return Math.abs(hash).toString(16)\n    }\n\n    private getTrendIndicator(trend?: { trend: string }): string {\n        if (!trend) return \"-\"\n\n        switch (trend.trend) {\n            case \"IMPROVING\":\n                return \"๐Ÿ“ˆ\"\n            case \"DECLINING\":\n                return \"๐Ÿ“‰\"\n            case \"STABLE\":\n                return \"โžก๏ธ\"\n            default:\n                return \"-\"\n        }\n    }\n\n    private getTrendEmoji(trend: string): string {\n        switch (trend) {\n            case \"IMPROVING\":\n                return \"๐Ÿ“ˆ\"\n            case \"DECLINING\":\n                return \"๐Ÿ“‰\"\n            case \"INCREASING\":\n                return \"๐Ÿ“ˆ\"\n            case \"DECREASING\":\n                return \"๐Ÿ“‰\"\n            case \"STABLE\":\n                return \"โžก๏ธ\"\n            default:\n                return \"โžก๏ธ\"\n        }\n    }\n\n    private getChangeImpact(change: number): string {\n        if (Math.abs(change) < 2) return \"โžก๏ธ Minimal\"\n        if (change > 0) return \"๐Ÿ“ˆ Positive\"\n        return \"๐Ÿ“‰ Negative\"\n    }\n\n    private getAffectedRoutes(recommendations: Recommendation[]): string {\n        const routes = new Set(recommendations.map((r) => r.route).filter(Boolean))\n        return routes.size.toString()\n    }\n}"],"mappings":"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","names":["fs","path","ts","LogLevel","fs","ts","path","path","path","performance","path"]}