infra-cost 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/demo/test-enhanced-ui.ts","../../src/visualization/terminal-ui.ts","../../src/demo/demo-data-generator.ts","../../src/exporters/pdf-exporter.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport chalk from 'chalk';\nimport { TerminalUIEngine } from '../visualization/terminal-ui';\nimport { DemoDataGenerator } from './demo-data-generator';\nimport { PDFExporter } from '../exporters/pdf-exporter';\n\n/**\n * Test utility for enhanced UI features using demo data\n * Run with: node dist/demo/test-enhanced-ui.js\n */\nasync function testEnhancedUI() {\n console.log(chalk.bold.cyan('🧪 Testing Enhanced Terminal UI Features\\n'));\n\n const ui = new TerminalUIEngine();\n\n // Test 1: Enhanced Header\n console.log(chalk.bold.yellow('Test 1: Enhanced Header'));\n console.log('─'.repeat(50));\n const header = ui.createHeader('🚀 Infrastructure Cost Analysis', 'Demo Production Account');\n console.log(header);\n\n // Test 2: Cost Table with Rich Formatting\n console.log(chalk.bold.yellow('Test 2: Rich Cost Breakdown Table'));\n console.log('─'.repeat(50));\n const costBreakdown = DemoDataGenerator.generateCostBreakdown();\n const costTable = ui.createCostTable(costBreakdown, {\n showPercentages: true,\n highlightTop: 8,\n currency: 'USD',\n compact: false\n });\n console.log(costTable);\n\n // Test 3: Trend Chart Visualization\n console.log(chalk.bold.yellow('Test 3: ASCII Trend Chart'));\n console.log('─'.repeat(50));\n const trendAnalysis = DemoDataGenerator.generateTrendAnalysis();\n if (trendAnalysis.trendData) {\n const trendChart = ui.createTrendChart(trendAnalysis.trendData, {\n width: 50,\n showLabels: true,\n currency: 'USD',\n colorThreshold: 0.7\n });\n console.log(trendChart);\n }\n\n // Test 4: Cost Anomaly Alerts\n console.log(chalk.bold.yellow('Test 4: Cost Anomaly Alerts'));\n console.log('─'.repeat(50));\n const anomalies = DemoDataGenerator.generateCostAnomalies();\n const anomalyAlert = ui.createAnomalyAlert(anomalies);\n console.log(anomalyAlert);\n\n // Test 5: Progress Indicators\n console.log(chalk.bold.yellow('Test 5: Progress Indicators'));\n console.log('─'.repeat(50));\n ui.startProgress('Processing cost analysis', 100);\n\n // Simulate processing steps\n for (let i = 0; i <= 100; i += 20) {\n await new Promise(resolve => setTimeout(resolve, 200));\n ui.updateProgress(i, { step: `Processing step ${i/20 + 1}/6` });\n }\n\n ui.stopProgress();\n console.log(chalk.green('✅ Processing completed!\\n'));\n\n // Test 6: Summary Display\n console.log(chalk.bold.yellow('Test 6: Executive Summary Format'));\n console.log('─'.repeat(50));\n const recommendations = DemoDataGenerator.generateRecommendations();\n const totalSavings = recommendations.reduce((sum, rec) => sum + rec.potentialSavings.amount, 0);\n\n console.log('\\n' + chalk.bold.cyan('🎯 Key Performance Indicators'));\n console.log('═'.repeat(50));\n console.log(`Monthly Spend: ${chalk.yellow('$' + costBreakdown.totals.thisMonth.toFixed(2))}`);\n console.log(`Cost Change: ${costBreakdown.totals.thisMonth > costBreakdown.totals.lastMonth ?\n chalk.red('↗ +' + ((costBreakdown.totals.thisMonth - costBreakdown.totals.lastMonth) / costBreakdown.totals.lastMonth * 100).toFixed(1) + '%') :\n chalk.green('↘ ' + ((costBreakdown.totals.thisMonth - costBreakdown.totals.lastMonth) / costBreakdown.totals.lastMonth * 100).toFixed(1) + '%')\n }`);\n console.log(`Optimization Potential: ${chalk.green('$' + totalSavings.toFixed(2))}`);\n console.log(`Active Recommendations: ${chalk.cyan(recommendations.length.toString())}`);\n\n // Test 7: Recommendations Display\n console.log('\\n' + chalk.bold.cyan('💡 Top Cost Optimization Recommendations'));\n console.log('═'.repeat(60));\n recommendations.slice(0, 3).forEach((rec, index) => {\n console.log(`\\n${index + 1}. ${chalk.bold(rec.title)}`);\n console.log(` ${rec.description}`);\n console.log(` 💰 Potential savings: ${chalk.green('$' + rec.potentialSavings.amount.toFixed(2))} ${rec.potentialSavings.timeframe.toLowerCase()}`);\n console.log(` 🎯 Priority: ${chalk[rec.priority === 'HIGH' ? 'red' : rec.priority === 'MEDIUM' ? 'yellow' : 'cyan'](rec.priority)}`);\n console.log(` 🔧 Effort: ${chalk.gray(rec.effort)}`);\n });\n\n console.log('\\n' + chalk.gray('━'.repeat(70)));\n console.log(chalk.gray('💡 Demo completed successfully! All enhanced UI features are working.'));\n console.log(chalk.gray('📊 Use --trend, --audit, or --executive-summary with real data'));\n\n return true;\n}\n\n/**\n * Test PDF generation with demo data\n */\nasync function testPDFGeneration() {\n console.log('\\n' + chalk.bold.cyan('📄 Testing PDF Generation'));\n console.log('─'.repeat(50));\n\n try {\n const pdfExporter = new PDFExporter({\n outputPath: './demo-reports',\n includeCharts: true,\n includeSummary: true,\n includeDetails: true,\n includeRecommendations: true\n });\n\n const accountInfo = DemoDataGenerator.generateAccountInfo();\n const costBreakdown = DemoDataGenerator.generateCostBreakdown();\n const recommendations = DemoDataGenerator.generateRecommendations();\n const anomalies = DemoDataGenerator.generateCostAnomalies();\n const inventory = DemoDataGenerator.generateResourceInventory();\n\n console.log('🔄 Generating comprehensive demo audit report...');\n\n const auditData = {\n accountInfo,\n costBreakdown,\n resourceInventory: inventory,\n recommendations,\n anomalies,\n generatedAt: new Date(),\n reportPeriod: {\n start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n end: new Date()\n }\n };\n\n const pdfPath = await pdfExporter.generateAuditReport(auditData);\n console.log(chalk.green(`✅ Demo PDF report generated: ${pdfPath}`));\n\n return true;\n } catch (error) {\n console.log(chalk.yellow(`⚠️ PDF generation test skipped: ${error instanceof Error ? error.message : 'Unknown error'}`));\n console.log(chalk.gray(' (This is expected in environments without browser support)'));\n return false;\n }\n}\n\n// Main execution\nasync function main() {\n try {\n console.log(chalk.bold.blue('🚀 Enhanced infra-cost UI Testing Suite'));\n console.log(chalk.gray('Testing all new features with realistic demo data\\n'));\n\n const uiTestResult = await testEnhancedUI();\n const pdfTestResult = await testPDFGeneration();\n\n console.log('\\n' + chalk.bold.green('🎉 Testing Complete!'));\n console.log(`Terminal UI Features: ${uiTestResult ? chalk.green('✅ PASS') : chalk.red('❌ FAIL')}`);\n console.log(`PDF Generation: ${pdfTestResult ? chalk.green('✅ PASS') : chalk.yellow('⚠️ SKIP')}`);\n\n if (uiTestResult) {\n console.log('\\n' + chalk.bold.cyan('Next Steps:'));\n console.log('• Run with real AWS credentials: infra-cost --trend');\n console.log('• Generate audit reports: infra-cost --audit --pdf-report');\n console.log('• Create executive summaries: infra-cost --executive-summary');\n }\n\n } catch (error) {\n console.error(chalk.red('❌ Test failed:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\n// Run if called directly (ES module version)\nif (import.meta.url === `file://${process.argv[1]}`) {\n main();\n}\n\nexport { testEnhancedUI, testPDFGeneration };","import Table from 'cli-table3';\nimport chalk from 'chalk';\nimport cliProgress from 'cli-progress';\nimport moment from 'moment';\nimport { CostBreakdown, TrendData, CostTrendAnalysis } from '../types/providers';\n\ninterface TableColumn {\n header: string;\n width?: number;\n align?: 'left' | 'right' | 'center';\n color?: keyof typeof chalk;\n}\n\ninterface TableRow {\n [key: string]: string | number;\n}\n\ninterface TrendChartOptions {\n width: number;\n showLabels: boolean;\n colorThreshold?: number;\n currency?: string;\n}\n\ninterface CostTableOptions {\n showPercentages: boolean;\n highlightTop: number;\n currency: string;\n compact: boolean;\n}\n\nexport class TerminalUIEngine {\n private progressBar: cliProgress.SingleBar | null = null;\n\n /**\n * Creates a formatted table with enhanced styling\n */\n createTable(columns: TableColumn[], rows: TableRow[]): string {\n const table = new Table({\n head: columns.map(col => chalk.bold(col.header)),\n colWidths: columns.map(col => col.width || 20),\n colAligns: columns.map(col => col.align || 'left'),\n style: {\n head: [],\n border: [],\n compact: false\n },\n chars: {\n 'top': '─',\n 'top-mid': '┬',\n 'top-left': '┌',\n 'top-right': '┐',\n 'bottom': '─',\n 'bottom-mid': '┴',\n 'bottom-left': '└',\n 'bottom-right': '┘',\n 'left': '│',\n 'left-mid': '├',\n 'mid': '─',\n 'mid-mid': '┼',\n 'right': '│',\n 'right-mid': '┤',\n 'middle': '│'\n }\n });\n\n // Add rows with color formatting\n rows.forEach(row => {\n const formattedRow = columns.map((col, index) => {\n const value = Object.values(row)[index];\n const colorKey = col.color;\n\n if (colorKey && typeof value === 'string') {\n return chalk[colorKey](value);\n }\n\n return String(value);\n });\n\n table.push(formattedRow);\n });\n\n return table.toString();\n }\n\n /**\n * Creates a cost breakdown table with rich formatting\n * Optimized for large datasets with pagination and filtering\n */\n createCostTable(costBreakdown: CostBreakdown, options: CostTableOptions = {\n showPercentages: true,\n highlightTop: 5,\n currency: 'USD',\n compact: false\n }): string {\n const { totals, totalsByService } = costBreakdown;\n\n // Header with summary\n let output = '\\n' + chalk.bold.cyan('💰 Cost Analysis Summary') + '\\n';\n output += '═'.repeat(50) + '\\n\\n';\n\n // Create summary table\n const summaryColumns: TableColumn[] = [\n { header: 'Period', width: 15, align: 'left', color: 'cyan' },\n { header: 'Cost', width: 15, align: 'right', color: 'yellow' },\n { header: 'Change', width: 20, align: 'right' }\n ];\n\n const summaryRows: TableRow[] = [\n {\n period: 'Yesterday',\n cost: this.formatCurrency(totals.yesterday, options.currency),\n change: ''\n },\n {\n period: 'Last 7 Days',\n cost: this.formatCurrency(totals.last7Days, options.currency),\n change: this.calculateChange(totals.last7Days, totals.yesterday * 7)\n },\n {\n period: 'This Month',\n cost: this.formatCurrency(totals.thisMonth, options.currency),\n change: this.calculateChange(totals.thisMonth, totals.lastMonth)\n },\n {\n period: 'Last Month',\n cost: this.formatCurrency(totals.lastMonth, options.currency),\n change: ''\n }\n ];\n\n output += this.createTable(summaryColumns, summaryRows) + '\\n\\n';\n\n // Service breakdown for this month with performance optimizations\n output += chalk.bold.cyan('📊 Service Breakdown (This Month)') + '\\n';\n output += '═'.repeat(50) + '\\n\\n';\n\n // Performance optimization: Pre-filter and batch process large datasets\n const allServiceEntries = Object.entries(totalsByService.thisMonth);\n const significantServices = allServiceEntries\n .filter(([_, cost]) => cost > 0.01) // Filter out negligible costs for performance\n .sort(([, a], [, b]) => b - a);\n\n const maxDisplay = options.highlightTop || 15;\n const serviceEntries = significantServices.slice(0, maxDisplay);\n\n // Show stats for large datasets\n if (allServiceEntries.length > maxDisplay) {\n const hiddenServices = allServiceEntries.length - maxDisplay;\n const hiddenCost = significantServices.slice(maxDisplay)\n .reduce((sum, [_, cost]) => sum + cost, 0);\n\n if (hiddenCost > 0) {\n output += chalk.gray(`Showing top ${maxDisplay} of ${allServiceEntries.length} services `) +\n chalk.gray(`(${hiddenServices} services with $${hiddenCost.toFixed(2)} hidden)\\n\\n`);\n }\n }\n\n const serviceColumns: TableColumn[] = [\n { header: 'Service', width: 25, align: 'left', color: 'blue' },\n { header: 'Cost', width: 15, align: 'right', color: 'yellow' },\n { header: 'Share', width: 10, align: 'right' },\n { header: 'Trend', width: 15, align: 'center' }\n ];\n\n const serviceRows: TableRow[] = serviceEntries.map(([service, cost]) => {\n const share = (cost / totals.thisMonth * 100).toFixed(1);\n const lastMonthCost = totalsByService.lastMonth[service] || 0;\n const trend = this.getTrendIndicator(cost, lastMonthCost);\n\n return {\n service: service,\n cost: this.formatCurrency(cost, options.currency),\n share: `${share}%`,\n trend: trend\n };\n });\n\n output += this.createTable(serviceColumns, serviceRows);\n\n return output;\n }\n\n /**\n * Creates ASCII trend chart for cost visualization\n */\n createTrendChart(trendData: TrendData[], options: TrendChartOptions = {\n width: 60,\n showLabels: true,\n currency: 'USD'\n }): string {\n if (!trendData || trendData.length === 0) {\n return chalk.red('No trend data available');\n }\n\n let output = '\\n' + chalk.bold.cyan('📈 Cost Trend Analysis') + '\\n';\n output += '═'.repeat(50) + '\\n\\n';\n\n const maxCost = Math.max(...trendData.map(d => d.actualCost));\n const minCost = Math.min(...trendData.map(d => d.actualCost));\n const range = maxCost - minCost;\n\n trendData.forEach((data, index) => {\n const normalizedValue = range > 0 ? (data.actualCost - minCost) / range : 0.5;\n const barLength = Math.round(normalizedValue * options.width);\n\n // Create the bar\n const bar = '█'.repeat(barLength) + '░'.repeat(options.width - barLength);\n const coloredBar = this.colorizeBar(bar, normalizedValue, options.colorThreshold);\n\n // Format the line\n const period = moment(data.period).format('MMM YYYY');\n const cost = this.formatCurrency(data.actualCost, options.currency);\n const change = data.changeFromPrevious ?\n this.formatChangeIndicator(data.changeFromPrevious.percentage) : '';\n\n output += `${period.padEnd(10)} ${coloredBar} ${cost.padStart(10)} ${change}\\n`;\n });\n\n output += '\\n' + '─'.repeat(options.width + 25) + '\\n';\n output += `Range: ${this.formatCurrency(minCost, options.currency)} - ${this.formatCurrency(maxCost, options.currency)}\\n`;\n\n return output;\n }\n\n /**\n * Creates a progress bar for long-running operations\n */\n startProgress(label: string, total: number = 100): void {\n if (this.progressBar) {\n this.progressBar.stop();\n }\n\n this.progressBar = new cliProgress.SingleBar({\n format: `${chalk.cyan(label)} ${chalk.cyan('[')}${chalk.yellow('{bar}')}${chalk.cyan(']')} {percentage}% | ETA: {eta}s | {value}/{total}`,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true\n });\n\n this.progressBar.start(total, 0);\n }\n\n /**\n * Updates progress bar\n */\n updateProgress(value: number, payload?: object): void {\n if (this.progressBar) {\n this.progressBar.update(value, payload);\n }\n }\n\n /**\n * Stops and clears progress bar\n */\n stopProgress(): void {\n if (this.progressBar) {\n this.progressBar.stop();\n this.progressBar = null;\n }\n }\n\n /**\n * Creates a cost anomaly alert box\n */\n createAnomalyAlert(anomalies: Array<{\n date: string;\n actualCost: number;\n expectedCost: number;\n deviation: number;\n severity: string;\n description?: string;\n }>): string {\n if (anomalies.length === 0) {\n return chalk.green('✅ No cost anomalies detected');\n }\n\n let output = '\\n' + chalk.bold.red('🚨 Cost Anomalies Detected') + '\\n';\n output += '═'.repeat(50) + '\\n\\n';\n\n anomalies.forEach(anomaly => {\n const severityColor = this.getSeverityColor(anomaly.severity);\n const icon = this.getSeverityIcon(anomaly.severity);\n\n output += chalk[severityColor](`${icon} ${anomaly.date}\\n`);\n output += ` Expected: ${this.formatCurrency(anomaly.expectedCost, 'USD')}\\n`;\n output += ` Actual: ${this.formatCurrency(anomaly.actualCost, 'USD')}\\n`;\n output += ` Deviation: ${anomaly.deviation > 0 ? '+' : ''}${anomaly.deviation.toFixed(1)}%\\n`;\n\n if (anomaly.description) {\n output += ` ${chalk.gray(anomaly.description)}\\n`;\n }\n output += '\\n';\n });\n\n return output;\n }\n\n /**\n * Creates a fancy header with branding\n */\n createHeader(title: string, subtitle?: string): string {\n const width = 60;\n let output = '\\n';\n\n // Top border\n output += chalk.cyan('┌' + '─'.repeat(width - 2) + '┐') + '\\n';\n\n // Title line\n const titlePadding = Math.floor((width - title.length - 4) / 2);\n output += chalk.cyan('│') + ' '.repeat(titlePadding) + chalk.bold.white(title) +\n ' '.repeat(width - title.length - titlePadding - 2) + chalk.cyan('│') + '\\n';\n\n // Subtitle if provided\n if (subtitle) {\n const subtitlePadding = Math.floor((width - subtitle.length - 4) / 2);\n output += chalk.cyan('│') + ' '.repeat(subtitlePadding) + chalk.gray(subtitle) +\n ' '.repeat(width - subtitle.length - subtitlePadding - 2) + chalk.cyan('│') + '\\n';\n }\n\n // Bottom border\n output += chalk.cyan('└' + '─'.repeat(width - 2) + '┘') + '\\n\\n';\n\n return output;\n }\n\n // Helper methods\n private formatCurrency(amount: number, currency: string): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount);\n }\n\n private calculateChange(current: number, previous: number): string {\n if (previous === 0) return '';\n\n const change = ((current - previous) / previous) * 100;\n const changeStr = `${change >= 0 ? '+' : ''}${change.toFixed(1)}%`;\n\n if (change > 0) {\n return chalk.red(`↗ ${changeStr}`);\n } else if (change < 0) {\n return chalk.green(`↘ ${changeStr}`);\n } else {\n return chalk.gray('→ 0.0%');\n }\n }\n\n private getTrendIndicator(current: number, previous: number): string {\n if (previous === 0) return chalk.gray('─');\n\n const change = ((current - previous) / previous) * 100;\n\n if (change > 10) return chalk.red('↗↗');\n if (change > 0) return chalk.yellow('↗');\n if (change < -10) return chalk.green('↘↘');\n if (change < 0) return chalk.green('↘');\n return chalk.gray('→');\n }\n\n private colorizeBar(bar: string, normalizedValue: number, threshold?: number): string {\n const thresholdValue = threshold || 0.7;\n\n if (normalizedValue > thresholdValue) {\n return chalk.red(bar);\n } else if (normalizedValue > 0.4) {\n return chalk.yellow(bar);\n } else {\n return chalk.green(bar);\n }\n }\n\n private formatChangeIndicator(percentage: number): string {\n const indicator = percentage >= 0 ? '↗' : '↘';\n const color = percentage >= 0 ? 'red' : 'green';\n const sign = percentage >= 0 ? '+' : '';\n\n return chalk[color](`${indicator} ${sign}${percentage.toFixed(1)}%`);\n }\n\n private getSeverityColor(severity: string): keyof typeof chalk {\n switch (severity.toLowerCase()) {\n case 'critical': return 'red';\n case 'high': return 'red';\n case 'medium': return 'yellow';\n case 'low': return 'cyan';\n default: return 'gray';\n }\n }\n\n private getSeverityIcon(severity: string): string {\n switch (severity.toLowerCase()) {\n case 'critical': return '🔴';\n case 'high': return '🟠';\n case 'medium': return '🟡';\n case 'low': return '🔵';\n default: return '⚪';\n }\n }\n}\n\nexport default TerminalUIEngine;","import {\n CloudProvider,\n CostBreakdown,\n TrendData,\n CostTrendAnalysis,\n FinOpsRecommendation,\n AccountInfo,\n ResourceInventory,\n ResourceType\n} from '../types/providers';\n\n/**\n * Demo data generator for testing enhanced features without real cloud credentials\n */\nexport class DemoDataGenerator {\n\n /**\n * Generate sample account information\n */\n static generateAccountInfo(): AccountInfo {\n return {\n id: '123456789012',\n name: 'Demo Production Account',\n provider: CloudProvider.AWS\n };\n }\n\n /**\n * Generate realistic cost breakdown data\n */\n static generateCostBreakdown(): CostBreakdown {\n const services = [\n 'Amazon EC2-Instance', 'Amazon S3', 'Amazon RDS', 'AWS Lambda',\n 'Amazon CloudFront', 'Amazon EBS', 'Amazon VPC', 'Amazon Route 53',\n 'AWS Application Load Balancer', 'Amazon ElastiCache', 'Amazon SES',\n 'Amazon CloudWatch', 'AWS Data Transfer', 'Amazon DynamoDB'\n ];\n\n const generateServiceCosts = (baseMultiplier: number) => {\n const costs: { [key: string]: number } = {};\n services.forEach(service => {\n // Generate realistic cost variations\n const baseCost = Math.random() * 1000 * baseMultiplier;\n const serviceMultiplier = this.getServiceMultiplier(service);\n costs[service] = Math.round(baseCost * serviceMultiplier * 100) / 100;\n });\n return costs;\n };\n\n const lastMonth = generateServiceCosts(1.0);\n const thisMonth = generateServiceCosts(0.85); // 15% decrease this month\n const last7Days = generateServiceCosts(0.2); // Proportional to monthly\n const yesterday = generateServiceCosts(0.03); // Daily portion\n\n return {\n totals: {\n lastMonth: Object.values(lastMonth).reduce((sum, cost) => sum + cost, 0),\n thisMonth: Object.values(thisMonth).reduce((sum, cost) => sum + cost, 0),\n last7Days: Object.values(last7Days).reduce((sum, cost) => sum + cost, 0),\n yesterday: Object.values(yesterday).reduce((sum, cost) => sum + cost, 0)\n },\n totalsByService: {\n lastMonth,\n thisMonth,\n last7Days,\n yesterday\n }\n };\n }\n\n /**\n * Generate trend analysis data for the last 6 months\n */\n static generateTrendAnalysis(): CostTrendAnalysis {\n const months = 6;\n const trendData: TrendData[] = [];\n\n // Generate trend data with some seasonal patterns\n for (let i = months - 1; i >= 0; i--) {\n const date = new Date();\n date.setMonth(date.getMonth() - i);\n\n const baselineCost = 3500;\n const seasonalFactor = 1 + 0.2 * Math.sin((date.getMonth() / 12) * 2 * Math.PI);\n const trendFactor = 1 + (months - i - 1) * 0.05; // Gradual increase\n const randomVariation = 0.9 + Math.random() * 0.2;\n\n const actualCost = baselineCost * seasonalFactor * trendFactor * randomVariation;\n const previousCost = i === months - 1 ? actualCost * 0.95 : trendData[i - 1]?.actualCost || actualCost;\n\n trendData.push({\n period: date.toISOString().substring(0, 7), // YYYY-MM format\n actualCost: Math.round(actualCost * 100) / 100,\n forecastedCost: actualCost * (0.95 + Math.random() * 0.1),\n budgetLimit: 4000,\n previousPeriodCost: previousCost,\n changeFromPrevious: {\n amount: actualCost - previousCost,\n percentage: ((actualCost - previousCost) / previousCost) * 100\n }\n });\n }\n\n // Generate top services data\n const topServices = [\n { serviceName: 'Amazon EC2-Instance', cost: 1250.80, percentage: 32.1, trend: 'INCREASING' as const },\n { serviceName: 'Amazon RDS', cost: 890.45, percentage: 22.9, trend: 'STABLE' as const },\n { serviceName: 'Amazon S3', cost: 420.30, percentage: 10.8, trend: 'DECREASING' as const },\n { serviceName: 'AWS Lambda', cost: 380.70, percentage: 9.8, trend: 'INCREASING' as const },\n { serviceName: 'Amazon CloudFront', cost: 220.15, percentage: 5.7, trend: 'STABLE' as const }\n ];\n\n // Generate cost anomalies\n const costAnomalies = [\n {\n date: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString().substring(0, 10),\n actualCost: 4850.30,\n expectedCost: 3200.50,\n deviation: 51.6,\n severity: 'HIGH' as const,\n possibleCause: 'EC2 instance scale-out event',\n description: 'Unusual spike in EC2 costs detected during weekend scaling event'\n },\n {\n date: new Date(Date.now() - 12 * 24 * 60 * 60 * 1000).toISOString().substring(0, 10),\n actualCost: 2100.80,\n expectedCost: 3100.20,\n deviation: -32.2,\n severity: 'MEDIUM' as const,\n possibleCause: 'Scheduled maintenance window',\n description: 'Lower than expected costs during planned maintenance'\n }\n ];\n\n return {\n provider: CloudProvider.AWS,\n timeRange: {\n start: trendData[0].period + '-01',\n end: trendData[trendData.length - 1].period + '-28'\n },\n granularity: 'MONTHLY',\n trendData,\n totalCost: trendData.reduce((sum, data) => sum + data.actualCost, 0),\n averageDailyCost: trendData[trendData.length - 1].actualCost / 30,\n projectedMonthlyCost: trendData[trendData.length - 1].actualCost * 1.05,\n avgMonthOverMonthGrowth: 5.2,\n topServices,\n costAnomalies,\n analytics: {\n insights: [\n 'EC2 costs have increased by 15% over the last 3 months due to increased workload',\n 'S3 storage costs decreased by 8% after implementing lifecycle policies',\n 'Lambda usage shows steady growth pattern aligned with application scaling',\n 'RDS costs remain stable with good resource utilization',\n 'CloudFront costs show seasonal variation with higher usage in Q4'\n ],\n recommendations: [\n 'Consider Reserved Instances for EC2 to reduce costs by up to 30%',\n 'Implement automated S3 lifecycle management for additional savings',\n 'Review Lambda memory allocation for cost optimization',\n 'Consider RDS instance rightsizing based on utilization metrics'\n ],\n volatilityScore: 0.15,\n trendStrength: 0.72\n }\n };\n }\n\n /**\n * Generate realistic FinOps recommendations\n */\n static generateRecommendations(): FinOpsRecommendation[] {\n return [\n {\n id: 'rec-001',\n type: 'COST_OPTIMIZATION',\n title: 'Purchase EC2 Reserved Instances',\n description: 'Based on your consistent EC2 usage patterns, purchasing Reserved Instances could save up to 30% on compute costs.',\n potentialSavings: {\n amount: 450.30,\n percentage: 30,\n timeframe: 'MONTHLY'\n },\n effort: 'LOW',\n priority: 'HIGH',\n resources: ['i-1234567890abcdef0', 'i-0987654321fedcba0'],\n implementationSteps: [\n 'Analyze current EC2 usage patterns over the last 12 months',\n 'Purchase 1-year Reserved Instances for consistent workloads',\n 'Set up automated monitoring for RI utilization',\n 'Review and optimize instance sizing before purchasing RIs'\n ],\n tags: ['ec2', 'reserved-instances', 'cost-optimization']\n },\n {\n id: 'rec-002',\n type: 'RESOURCE_RIGHTSIZING',\n title: 'Rightsize RDS Instances',\n description: 'Several RDS instances show low CPU utilization. Downsizing these instances could reduce costs without impacting performance.',\n potentialSavings: {\n amount: 280.75,\n percentage: 25,\n timeframe: 'MONTHLY'\n },\n effort: 'MEDIUM',\n priority: 'MEDIUM',\n resources: ['mydb-instance-1', 'mydb-instance-2'],\n implementationSteps: [\n 'Review RDS CloudWatch metrics for CPU, memory, and I/O utilization',\n 'Create RDS snapshots before making changes',\n 'Modify instance class during maintenance window',\n 'Monitor performance after changes for 1 week'\n ],\n tags: ['rds', 'rightsizing', 'database-optimization']\n },\n {\n id: 'rec-003',\n type: 'ARCHITECTURE',\n title: 'Implement S3 Intelligent Tiering',\n description: 'Enable S3 Intelligent Tiering to automatically optimize storage costs based on access patterns.',\n potentialSavings: {\n amount: 125.50,\n percentage: 15,\n timeframe: 'MONTHLY'\n },\n effort: 'LOW',\n priority: 'MEDIUM',\n resources: ['s3-bucket-logs', 's3-bucket-backups'],\n implementationSteps: [\n 'Enable S3 Intelligent Tiering on identified buckets',\n 'Set up lifecycle policies for automatic transitions',\n 'Monitor cost impact over 3 months',\n 'Review and adjust policies based on access patterns'\n ],\n tags: ['s3', 'storage-optimization', 'intelligent-tiering']\n },\n {\n id: 'rec-004',\n type: 'COST_OPTIMIZATION',\n title: 'Optimize Lambda Memory Allocation',\n description: 'Lambda functions are over-provisioned with memory. Optimizing memory allocation can reduce costs significantly.',\n potentialSavings: {\n amount: 95.80,\n percentage: 20,\n timeframe: 'MONTHLY'\n },\n effort: 'HIGH',\n priority: 'LOW',\n resources: ['process-images-lambda', 'data-processor-lambda'],\n implementationSteps: [\n 'Use AWS Lambda Power Tuning tool to find optimal memory settings',\n 'Test performance with different memory allocations',\n 'Update Lambda configurations incrementally',\n 'Set up monitoring for execution duration and cost metrics'\n ],\n tags: ['lambda', 'serverless-optimization', 'memory-tuning']\n }\n ];\n }\n\n /**\n * Generate sample resource inventory\n */\n static generateResourceInventory(): ResourceInventory {\n return {\n provider: CloudProvider.AWS,\n region: 'us-east-1',\n totalResources: 145,\n resourcesByType: {\n [ResourceType.COMPUTE]: 35,\n [ResourceType.STORAGE]: 28,\n [ResourceType.DATABASE]: 12,\n [ResourceType.NETWORK]: 25,\n [ResourceType.SECURITY]: 18,\n [ResourceType.SERVERLESS]: 15,\n [ResourceType.CONTAINER]: 8,\n [ResourceType.ANALYTICS]: 4\n },\n totalCost: 3890.50,\n resources: {\n compute: [],\n storage: [],\n database: [],\n network: []\n },\n lastUpdated: new Date()\n };\n }\n\n /**\n * Generate cost anomalies for testing\n */\n static generateCostAnomalies() {\n return [\n {\n date: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString().substring(0, 10),\n actualCost: 5200.80,\n expectedCost: 3500.20,\n deviation: 48.6,\n severity: 'CRITICAL',\n description: 'Significant cost spike detected in EC2 Auto Scaling group due to unexpected traffic surge'\n },\n {\n date: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().substring(0, 10),\n actualCost: 2800.30,\n expectedCost: 3200.50,\n deviation: -12.5,\n severity: 'LOW',\n description: 'Lower than expected S3 costs due to successful data archiving policies'\n }\n ];\n }\n\n /**\n * Helper method to generate realistic service cost multipliers\n */\n private static getServiceMultiplier(serviceName: string): number {\n const multipliers: { [key: string]: number } = {\n 'Amazon EC2-Instance': 2.5,\n 'Amazon RDS': 1.8,\n 'Amazon S3': 1.0,\n 'AWS Lambda': 0.8,\n 'Amazon CloudFront': 0.6,\n 'Amazon EBS': 0.9,\n 'Amazon VPC': 0.3,\n 'Amazon Route 53': 0.2,\n 'AWS Application Load Balancer': 0.4,\n 'Amazon ElastiCache': 0.7,\n 'Amazon SES': 0.1,\n 'Amazon CloudWatch': 0.3,\n 'AWS Data Transfer': 0.5,\n 'Amazon DynamoDB': 0.6\n };\n\n return multipliers[serviceName] || 0.5;\n }\n}\n\nexport default DemoDataGenerator;","import puppeteer, { Browser, Page } from 'puppeteer';\nimport { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport moment from 'moment';\nimport {\n CostBreakdown,\n CostTrendAnalysis,\n ResourceInventory,\n FinOpsRecommendation,\n AccountInfo,\n CloudProvider\n} from '../types/providers';\n\ninterface PDFExportOptions {\n outputPath?: string;\n filename?: string;\n includeCharts: boolean;\n includeSummary: boolean;\n includeDetails: boolean;\n includeRecommendations: boolean;\n format?: 'A4' | 'Letter';\n orientation?: 'portrait' | 'landscape';\n theme?: 'light' | 'dark';\n}\n\ninterface AuditReportData {\n accountInfo: AccountInfo;\n costBreakdown: CostBreakdown;\n trendAnalysis?: CostTrendAnalysis;\n resourceInventory?: ResourceInventory;\n recommendations?: FinOpsRecommendation[];\n anomalies?: Array<{\n date: string;\n actualCost: number;\n expectedCost: number;\n deviation: number;\n severity: string;\n description?: string;\n }>;\n generatedAt: Date;\n reportPeriod: {\n start: Date;\n end: Date;\n };\n}\n\nexport class PDFExporter {\n private browser: Browser | null = null;\n private options: PDFExportOptions;\n\n constructor(options: Partial<PDFExportOptions> = {}) {\n this.options = {\n outputPath: './reports',\n includeCharts: true,\n includeSummary: true,\n includeDetails: true,\n includeRecommendations: true,\n format: 'A4',\n orientation: 'portrait',\n theme: 'light',\n ...options\n };\n }\n\n /**\n * Generate comprehensive audit report PDF\n */\n async generateAuditReport(data: AuditReportData): Promise<string> {\n try {\n await this.initializeBrowser();\n\n const html = this.generateAuditHTML(data);\n const filename = this.options.filename ||\n `infra-cost-audit-${moment(data.generatedAt).format('YYYY-MM-DD-HHmm')}.pdf`;\n\n const outputPath = this.ensureOutputDirectory();\n const fullPath = join(outputPath, filename);\n\n const page = await this.browser!.newPage();\n await page.setContent(html, { waitUntil: 'networkidle0' });\n\n await page.pdf({\n path: fullPath,\n format: this.options.format,\n orientation: this.options.orientation,\n printBackground: true,\n margin: {\n top: '1in',\n bottom: '1in',\n left: '0.8in',\n right: '0.8in'\n },\n displayHeaderFooter: true,\n headerTemplate: this.generateHeaderTemplate(data.accountInfo),\n footerTemplate: this.generateFooterTemplate()\n });\n\n await page.close();\n await this.closeBrowser();\n\n return fullPath;\n } catch (error) {\n await this.closeBrowser();\n throw new Error(`PDF generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Generate cost trend report PDF\n */\n async generateTrendReport(\n accountInfo: AccountInfo,\n trendAnalysis: CostTrendAnalysis\n ): Promise<string> {\n const data: AuditReportData = {\n accountInfo,\n costBreakdown: {\n totals: {\n lastMonth: 0,\n thisMonth: 0,\n last7Days: 0,\n yesterday: 0\n },\n totalsByService: {\n lastMonth: {},\n thisMonth: {},\n last7Days: {},\n yesterday: {}\n }\n },\n trendAnalysis,\n generatedAt: new Date(),\n reportPeriod: {\n start: new Date(trendAnalysis.timeRange?.start || Date.now() - 6 * 30 * 24 * 60 * 60 * 1000),\n end: new Date(trendAnalysis.timeRange?.end || Date.now())\n }\n };\n\n return this.generateAuditReport(data);\n }\n\n /**\n * Generate executive summary PDF\n */\n async generateExecutiveSummary(data: AuditReportData): Promise<string> {\n this.options.includeDetails = false;\n this.options.includeCharts = true;\n this.options.includeSummary = true;\n this.options.includeRecommendations = true;\n\n const filename = `infra-cost-executive-summary-${moment(data.generatedAt).format('YYYY-MM-DD')}.pdf`;\n this.options.filename = filename;\n\n return this.generateAuditReport(data);\n }\n\n private generateAuditHTML(data: AuditReportData): string {\n const theme = this.getThemeStyles();\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>Infrastructure Cost Audit Report</title>\n <style>\n ${theme}\n ${this.getBaseStyles()}\n </style>\n </head>\n <body>\n <div class=\"report-container\">\n ${this.generateCoverPage(data)}\n ${this.options.includeSummary ? this.generateExecutiveSummary(data) : ''}\n ${this.generateCostBreakdownSection(data.costBreakdown)}\n ${data.trendAnalysis && this.options.includeCharts ? this.generateTrendAnalysisSection(data.trendAnalysis) : ''}\n ${data.resourceInventory && this.options.includeDetails ? this.generateResourceInventorySection(data.resourceInventory) : ''}\n ${data.anomalies && data.anomalies.length > 0 ? this.generateAnomaliesSection(data.anomalies) : ''}\n ${data.recommendations && this.options.includeRecommendations ? this.generateRecommendationsSection(data.recommendations) : ''}\n ${this.generateAppendixSection(data)}\n </div>\n </body>\n </html>`;\n }\n\n private generateCoverPage(data: AuditReportData): string {\n return `\n <div class=\"cover-page\">\n <div class=\"header\">\n <h1>Infrastructure Cost Analysis Report</h1>\n <div class=\"subtitle\">Comprehensive Cloud Cost Audit & Optimization</div>\n </div>\n\n <div class=\"account-info\">\n <h2>Account Information</h2>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <strong>Account ID:</strong> ${data.accountInfo.id}\n </div>\n <div class=\"info-item\">\n <strong>Account Name:</strong> ${data.accountInfo.name || 'N/A'}\n </div>\n <div class=\"info-item\">\n <strong>Cloud Provider:</strong> ${this.getProviderDisplayName(data.accountInfo.provider)}\n </div>\n <div class=\"info-item\">\n <strong>Report Generated:</strong> ${moment(data.generatedAt).format('MMMM Do YYYY, h:mm:ss a')}\n </div>\n <div class=\"info-item\">\n <strong>Report Period:</strong>\n ${moment(data.reportPeriod.start).format('MMM DD, YYYY')} -\n ${moment(data.reportPeriod.end).format('MMM DD, YYYY')}\n </div>\n </div>\n </div>\n\n <div class=\"cost-summary-card\">\n <h2>Cost Summary</h2>\n <div class=\"summary-grid\">\n <div class=\"summary-item\">\n <div class=\"amount\">${this.formatCurrency(data.costBreakdown.totals.thisMonth)}</div>\n <div class=\"label\">This Month</div>\n </div>\n <div class=\"summary-item\">\n <div class=\"amount\">${this.formatCurrency(data.costBreakdown.totals.lastMonth)}</div>\n <div class=\"label\">Last Month</div>\n </div>\n <div class=\"summary-item\">\n <div class=\"amount\">${this.formatCurrency(data.costBreakdown.totals.last7Days)}</div>\n <div class=\"label\">Last 7 Days</div>\n </div>\n <div class=\"summary-item\">\n <div class=\"amount\">${this.formatCurrency(data.costBreakdown.totals.yesterday)}</div>\n <div class=\"label\">Yesterday</div>\n </div>\n </div>\n </div>\n\n <div class=\"report-scope\">\n <h2>Report Scope</h2>\n <ul>\n ${this.options.includeSummary ? '<li>Executive Summary</li>' : ''}\n <li>Cost Breakdown Analysis</li>\n ${this.options.includeCharts ? '<li>Trend Analysis & Visualizations</li>' : ''}\n ${this.options.includeDetails ? '<li>Resource Inventory</li>' : ''}\n ${this.options.includeRecommendations ? '<li>Cost Optimization Recommendations</li>' : ''}\n </ul>\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateExecutiveSummary(data: AuditReportData): string {\n const monthlyChange = this.calculatePercentageChange(\n data.costBreakdown.totals.thisMonth,\n data.costBreakdown.totals.lastMonth\n );\n\n const topServices = Object.entries(data.costBreakdown.totalsByService.thisMonth)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5);\n\n return `\n <div class=\"section\">\n <h1>Executive Summary</h1>\n\n <div class=\"executive-insights\">\n <div class=\"insight-card ${monthlyChange >= 0 ? 'warning' : 'success'}\">\n <h3>Monthly Cost Trend</h3>\n <p>Your cloud spending has ${monthlyChange >= 0 ? 'increased' : 'decreased'} by\n <strong>${Math.abs(monthlyChange).toFixed(1)}%</strong> compared to last month.</p>\n </div>\n\n <div class=\"insight-card info\">\n <h3>Top Cost Drivers</h3>\n <ul>\n ${topServices.map(([service, cost]) => `\n <li>${service}: ${this.formatCurrency(cost)}\n (${((cost / data.costBreakdown.totals.thisMonth) * 100).toFixed(1)}% of total)\n </li>\n `).join('')}\n </ul>\n </div>\n\n ${data.anomalies && data.anomalies.length > 0 ? `\n <div class=\"insight-card warning\">\n <h3>Cost Anomalies</h3>\n <p><strong>${data.anomalies.length}</strong> cost anomalies detected requiring attention.</p>\n </div>\n ` : ''}\n </div>\n\n <div class=\"key-metrics\">\n <h3>Key Performance Indicators</h3>\n <div class=\"metrics-grid\">\n <div class=\"metric\">\n <div class=\"metric-value\">${this.formatCurrency(data.costBreakdown.totals.thisMonth / moment().date())}</div>\n <div class=\"metric-label\">Avg Daily Spend</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">${topServices.length}</div>\n <div class=\"metric-label\">Active Services</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">${data.trendAnalysis?.projectedMonthlyCost ? this.formatCurrency(data.trendAnalysis.projectedMonthlyCost) : 'N/A'}</div>\n <div class=\"metric-label\">Projected Monthly</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateCostBreakdownSection(costBreakdown: CostBreakdown): string {\n const serviceEntries = Object.entries(costBreakdown.totalsByService.thisMonth)\n .filter(([, cost]) => cost > 0)\n .sort(([, a], [, b]) => b - a);\n\n return `\n <div class=\"section\">\n <h1>Cost Breakdown Analysis</h1>\n\n <div class=\"cost-comparison\">\n <h3>Period Comparison</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Period</th>\n <th>Total Cost</th>\n <th>Change</th>\n <th>Trend</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>This Month</td>\n <td>${this.formatCurrency(costBreakdown.totals.thisMonth)}</td>\n <td>${this.formatChangePercentage(costBreakdown.totals.thisMonth, costBreakdown.totals.lastMonth)}</td>\n <td>${this.getTrendIcon(costBreakdown.totals.thisMonth, costBreakdown.totals.lastMonth)}</td>\n </tr>\n <tr>\n <td>Last Month</td>\n <td>${this.formatCurrency(costBreakdown.totals.lastMonth)}</td>\n <td>-</td>\n <td>-</td>\n </tr>\n <tr>\n <td>Last 7 Days</td>\n <td>${this.formatCurrency(costBreakdown.totals.last7Days)}</td>\n <td>${this.formatChangePercentage(costBreakdown.totals.last7Days, costBreakdown.totals.yesterday * 7)}</td>\n <td>${this.getTrendIcon(costBreakdown.totals.last7Days, costBreakdown.totals.yesterday * 7)}</td>\n </tr>\n <tr>\n <td>Yesterday</td>\n <td>${this.formatCurrency(costBreakdown.totals.yesterday)}</td>\n <td>-</td>\n <td>-</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"service-breakdown\">\n <h3>Service-Level Breakdown (This Month)</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Service</th>\n <th>Cost</th>\n <th>Share</th>\n <th>vs Last Month</th>\n </tr>\n </thead>\n <tbody>\n ${serviceEntries.map(([service, cost]) => {\n const share = ((cost / costBreakdown.totals.thisMonth) * 100).toFixed(1);\n const lastMonthCost = costBreakdown.totalsByService.lastMonth[service] || 0;\n const change = this.formatChangePercentage(cost, lastMonthCost);\n\n return `\n <tr>\n <td>${service}</td>\n <td>${this.formatCurrency(cost)}</td>\n <td>${share}%</td>\n <td>${change}</td>\n </tr>\n `;\n }).join('')}\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateTrendAnalysisSection(trendAnalysis: CostTrendAnalysis): string {\n return `\n <div class=\"section\">\n <h1>Trend Analysis</h1>\n\n <div class=\"trend-insights\">\n <div class=\"insight-grid\">\n <div class=\"insight-item\">\n <div class=\"insight-value\">${this.formatCurrency(trendAnalysis.totalCost)}</div>\n <div class=\"insight-label\">Total Period Cost</div>\n </div>\n <div class=\"insight-item\">\n <div class=\"insight-value\">${this.formatCurrency(trendAnalysis.averageDailyCost)}</div>\n <div class=\"insight-label\">Average Daily Cost</div>\n </div>\n <div class=\"insight-item\">\n <div class=\"insight-value\">${this.formatCurrency(trendAnalysis.projectedMonthlyCost)}</div>\n <div class=\"insight-label\">Projected Monthly</div>\n </div>\n <div class=\"insight-item\">\n <div class=\"insight-value\">${trendAnalysis.avgMonthOverMonthGrowth?.toFixed(1) || 'N/A'}%</div>\n <div class=\"insight-label\">Avg MoM Growth</div>\n </div>\n </div>\n </div>\n\n ${trendAnalysis.topServices ? `\n <div class=\"top-services\">\n <h3>Top Services by Cost</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Service</th>\n <th>Cost</th>\n <th>Share</th>\n <th>Trend</th>\n </tr>\n </thead>\n <tbody>\n ${trendAnalysis.topServices.map(service => `\n <tr>\n <td>${service.serviceName}</td>\n <td>${this.formatCurrency(service.cost)}</td>\n <td>${service.percentage.toFixed(1)}%</td>\n <td>${service.trend}</td>\n </tr>\n `).join('')}\n </tbody>\n </table>\n </div>\n ` : ''}\n\n ${trendAnalysis.analytics ? `\n <div class=\"analytics-insights\">\n <h3>Analytics Insights</h3>\n <ul>\n ${trendAnalysis.analytics.insights.map(insight => `<li>${insight}</li>`).join('')}\n </ul>\n\n <div class=\"analytics-metrics\">\n <div class=\"metric-row\">\n <span>Volatility Score:</span>\n <span class=\"metric-value\">${trendAnalysis.analytics.volatilityScore.toFixed(2)}</span>\n </div>\n <div class=\"metric-row\">\n <span>Trend Strength:</span>\n <span class=\"metric-value\">${trendAnalysis.analytics.trendStrength.toFixed(2)}</span>\n </div>\n </div>\n </div>\n ` : ''}\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateResourceInventorySection(inventory: ResourceInventory): string {\n return `\n <div class=\"section\">\n <h1>Resource Inventory</h1>\n\n <div class=\"inventory-summary\">\n <div class=\"summary-stats\">\n <div class=\"stat\">\n <div class=\"stat-value\">${inventory.totalResources}</div>\n <div class=\"stat-label\">Total Resources</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-value\">${this.formatCurrency(inventory.totalCost)}</div>\n <div class=\"stat-label\">Total Cost</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-value\">${inventory.region}</div>\n <div class=\"stat-label\">Primary Region</div>\n </div>\n </div>\n </div>\n\n <div class=\"resource-breakdown\">\n <h3>Resources by Type</h3>\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Resource Type</th>\n <th>Count</th>\n <th>Percentage</th>\n </tr>\n </thead>\n <tbody>\n ${Object.entries(inventory.resourcesByType).map(([type, count]) => `\n <tr>\n <td>${type.charAt(0).toUpperCase() + type.slice(1)}</td>\n <td>${count}</td>\n <td>${((count / inventory.totalResources) * 100).toFixed(1)}%</td>\n </tr>\n `).join('')}\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateAnomaliesSection(anomalies: Array<{\n date: string;\n actualCost: number;\n expectedCost: number;\n deviation: number;\n severity: string;\n description?: string;\n }>): string {\n return `\n <div class=\"section\">\n <h1>Cost Anomalies</h1>\n\n <div class=\"anomalies-overview\">\n <p class=\"overview-text\">\n <strong>${anomalies.length}</strong> cost anomalies have been detected during the report period.\n These represent significant deviations from expected spending patterns and require investigation.\n </p>\n </div>\n\n <div class=\"anomalies-list\">\n ${anomalies.map(anomaly => `\n <div class=\"anomaly-card severity-${anomaly.severity.toLowerCase()}\">\n <div class=\"anomaly-header\">\n <h4>${moment(anomaly.date).format('MMMM DD, YYYY')}</h4>\n <span class=\"severity-badge ${anomaly.severity.toLowerCase()}\">${anomaly.severity}</span>\n </div>\n <div class=\"anomaly-details\">\n <div class=\"detail-row\">\n <span>Expected Cost:</span>\n <span>${this.formatCurrency(anomaly.expectedCost)}</span>\n </div>\n <div class=\"detail-row\">\n <span>Actual Cost:</span>\n <span>${this.formatCurrency(anomaly.actualCost)}</span>\n </div>\n <div class=\"detail-row\">\n <span>Deviation:</span>\n <span class=\"${anomaly.deviation > 0 ? 'increase' : 'decrease'}\">\n ${anomaly.deviation > 0 ? '+' : ''}${anomaly.deviation.toFixed(1)}%\n </span>\n </div>\n ${anomaly.description ? `\n <div class=\"anomaly-description\">\n <p>${anomaly.description}</p>\n </div>\n ` : ''}\n </div>\n </div>\n `).join('')}\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateRecommendationsSection(recommendations: FinOpsRecommendation[]): string {\n const totalPotentialSavings = recommendations.reduce((sum, rec) => sum + rec.potentialSavings.amount, 0);\n\n return `\n <div class=\"section\">\n <h1>Cost Optimization Recommendations</h1>\n\n <div class=\"recommendations-overview\">\n <div class=\"savings-potential\">\n <h3>Potential Savings: ${this.formatCurrency(totalPotentialSavings)}</h3>\n <p>${recommendations.length} optimization opportunities identified</p>\n </div>\n </div>\n\n <div class=\"recommendations-list\">\n ${recommendations.map(rec => `\n <div class=\"recommendation-card priority-${rec.priority.toLowerCase()}\">\n <div class=\"recommendation-header\">\n <h4>${rec.title}</h4>\n <div class=\"recommendation-meta\">\n <span class=\"priority-badge ${rec.priority.toLowerCase()}\">${rec.priority}</span>\n <span class=\"effort-badge effort-${rec.effort.toLowerCase()}\">${rec.effort} Effort</span>\n </div>\n </div>\n\n <div class=\"recommendation-body\">\n <p>${rec.description}</p>\n\n <div class=\"savings-info\">\n <div class=\"savings-amount\">\n Potential Savings: <strong>${this.formatCurrency(rec.potentialSavings.amount)}</strong>\n <span class=\"timeframe\">(${rec.potentialSavings.timeframe.toLowerCase()})</span>\n </div>\n <div class=\"savings-percentage\">\n ${rec.potentialSavings.percentage.toFixed(1)}% reduction\n </div>\n </div>\n\n ${rec.implementationSteps.length > 0 ? `\n <div class=\"implementation-steps\">\n <h5>Implementation Steps:</h5>\n <ol>\n ${rec.implementationSteps.map(step => `<li>${step}</li>`).join('')}\n </ol>\n </div>\n ` : ''}\n\n ${rec.resources && rec.resources.length > 0 ? `\n <div class=\"affected-resources\">\n <h5>Affected Resources:</h5>\n <ul>\n ${rec.resources.map(resource => `<li>${resource}</li>`).join('')}\n </ul>\n </div>\n ` : ''}\n\n ${rec.tags.length > 0 ? `\n <div class=\"recommendation-tags\">\n ${rec.tags.map(tag => `<span class=\"tag\">${tag}</span>`).join('')}\n </div>\n ` : ''}\n </div>\n </div>\n `).join('')}\n </div>\n </div>\n <div class=\"page-break\"></div>`;\n }\n\n private generateAppendixSection(data: AuditReportData): string {\n return `\n <div class=\"section\">\n <h1>Appendix</h1>\n\n <div class=\"report-metadata\">\n <h3>Report Generation Details</h3>\n <table class=\"metadata-table\">\n <tr>\n <td>Report Generated:</td>\n <td>${moment(data.generatedAt).format('MMMM Do YYYY, h:mm:ss a')}</td>\n </tr>\n <tr>\n <td>Tool Version:</td>\n <td>infra-cost v0.1.0</td>\n </tr>\n <tr>\n <td>Report Type:</td>\n <td>Comprehensive Audit Report</td>\n </tr>\n <tr>\n <td>Data Source:</td>\n <td>${this.getProviderDisplayName(data.accountInfo.provider)} Cost Explorer API</td>\n </tr>\n <tr>\n <td>Analysis Period:</td>\n <td>${moment(data.reportPeriod.start).format('MMM DD, YYYY')} - ${moment(data.reportPeriod.end).format('MMM DD, YYYY')}</td>\n </tr>\n </table>\n </div>\n\n <div class=\"methodology\">\n <h3>Methodology</h3>\n <ul>\n <li>Cost data retrieved from cloud provider's native billing APIs</li>\n <li>Trend analysis based on historical spending patterns</li>\n <li>Anomaly detection using statistical analysis and machine learning algorithms</li>\n <li>Recommendations generated based on FinOps best practices and usage patterns</li>\n <li>All costs displayed in USD unless otherwise specified</li>\n </ul>\n </div>\n\n <div class=\"disclaimers\">\n <h3>Important Notes</h3>\n <ul>\n <li>Cost data is subject to cloud provider billing cycles and may include estimates</li>\n <li>Savings projections are estimates based on current usage patterns</li>\n <li>Implementation of recommendations should be carefully planned and tested</li>\n <li>This report is generated automatically and should be reviewed by qualified personnel</li>\n </ul>\n </div>\n </div>`;\n }\n\n // Helper methods and styles...\n private getThemeStyles(): string {\n if (this.options.theme === 'dark') {\n return `\n :root {\n --primary-color: #2563eb;\n --secondary-color: #64748b;\n --background-color: #1e293b;\n --text-color: #f8fafc;\n --border-color: #374151;\n --success-color: #10b981;\n --warning-color: #f59e0b;\n --danger-color: #ef4444;\n --card-background: #334155;\n }\n `;\n }\n\n return `\n :root {\n --primary-color: #2563eb;\n --secondary-color: #64748b;\n --background-color: #ffffff;\n --text-color: #1f2937;\n --border-color: #e5e7eb;\n --success-color: #10b981;\n --warning-color: #f59e0b;\n --danger-color: #ef4444;\n --card-background: #f9fafb;\n }\n `;\n }\n\n private getBaseStyles(): string {\n return `\n body {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n line-height: 1.6;\n color: var(--text-color);\n background-color: var(--background-color);\n margin: 0;\n padding: 0;\n }\n\n .report-container {\n max-width: 100%;\n margin: 0 auto;\n }\n\n .page-break {\n page-break-before: always;\n }\n\n .cover-page {\n text-align: center;\n padding: 2rem;\n min-height: 80vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .header h1 {\n font-size: 2.5rem;\n color: var(--primary-color);\n margin-bottom: 0.5rem;\n }\n\n .subtitle {\n font-size: 1.2rem;\n color: var(--secondary-color);\n margin-bottom: 3rem;\n }\n\n .section {\n padding: 2rem;\n margin-bottom: 2rem;\n }\n\n .section h1 {\n color: var(--primary-color);\n border-bottom: 2px solid var(--primary-color);\n padding-bottom: 0.5rem;\n margin-bottom: 2rem;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n margin: 1rem 0;\n }\n\n .data-table th,\n .data-table td {\n padding: 0.75rem;\n text-align: left;\n border-bottom: 1px solid var(--border-color);\n }\n\n .data-table th {\n background-color: var(--card-background);\n font-weight: 600;\n }\n\n .cost-summary-card {\n background: var(--card-background);\n border-radius: 8px;\n padding: 2rem;\n margin: 2rem 0;\n border: 1px solid var(--border-color);\n }\n\n .summary-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n text-align: center;\n }\n\n .summary-item .amount {\n font-size: 1.5rem;\n font-weight: bold;\n color: var(--primary-color);\n }\n\n .summary-item .label {\n color: var(--secondary-color);\n font-size: 0.9rem;\n }\n\n .anomaly-card {\n border-left: 4px solid;\n padding: 1rem;\n margin: 1rem 0;\n background: var(--card-background);\n border-radius: 0 8px 8px 0;\n }\n\n .anomaly-card.severity-critical {\n border-left-color: var(--danger-color);\n }\n\n .anomaly-card.severity-high {\n border-left-color: #ff6b35;\n }\n\n .anomaly-card.severity-medium {\n border-left-color: var(--warning-color);\n }\n\n .anomaly-card.severity-low {\n border-left-color: #3b82f6;\n }\n\n .recommendation-card {\n border: 1px solid var(--border-color);\n border-radius: 8px;\n padding: 1.5rem;\n margin: 1rem 0;\n background: var(--card-background);\n }\n\n .priority-badge {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .priority-badge.critical {\n background-color: var(--danger-color);\n color: white;\n }\n\n .priority-badge.high {\n background-color: #ff6b35;\n color: white;\n }\n\n .priority-badge.medium {\n background-color: var(--warning-color);\n color: white;\n }\n\n .priority-badge.low {\n background-color: #3b82f6;\n color: white;\n }\n\n .trend-chart {\n font-family: monospace;\n background: var(--card-background);\n padding: 1rem;\n border-radius: 4px;\n margin: 1rem 0;\n }\n\n @media print {\n body { print-color-adjust: exact; }\n .page-break { page-break-before: always; }\n }\n `;\n }\n\n private generateHeaderTemplate(accountInfo: AccountInfo): string {\n return `\n <div style=\"font-size: 10px; color: #666; width: 100%; text-align: center; margin-top: 10px;\">\n Infrastructure Cost Report - ${accountInfo.name || accountInfo.id} - ${this.getProviderDisplayName(accountInfo.provider)}\n </div>`;\n }\n\n private generateFooterTemplate(): string {\n return `\n <div style=\"font-size: 10px; color: #666; width: 100%; text-align: center; margin-bottom: 10px;\">\n <div style=\"display: flex; justify-content: space-between; width: 100%; align-items: center;\">\n <span>Generated by infra-cost v0.1.0</span>\n <span>Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></span>\n <span>${moment().format('YYYY-MM-DD HH:mm')}</span>\n </div>\n </div>`;\n }\n\n private async initializeBrowser(): Promise<void> {\n if (!this.browser) {\n this.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox']\n });\n }\n }\n\n private async closeBrowser(): Promise<void> {\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n }\n }\n\n private ensureOutputDirectory(): string {\n const outputPath = this.options.outputPath!;\n\n if (!existsSync(outputPath)) {\n mkdirSync(outputPath, { recursive: true });\n }\n\n return outputPath;\n }\n\n private formatCurrency(amount: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount);\n }\n\n private calculatePercentageChange(current: number, previous: number): number {\n if (previous === 0) return 0;\n return ((current - previous) / previous) * 100;\n }\n\n private formatChangePercentage(current: number, previous: number): string {\n const change = this.calculatePercentageChange(current, previous);\n const sign = change >= 0 ? '+' : '';\n return `${sign}${change.toFixed(1)}%`;\n }\n\n private getTrendIcon(current: number, previous: number): string {\n const change = this.calculatePercentageChange(current, previous);\n if (change > 5) return '↗️';\n if (change < -5) return '↘️';\n return '➡️';\n }\n\n private getProviderDisplayName(provider: CloudProvider): string {\n const displayNames = {\n [CloudProvider.AWS]: 'Amazon Web Services',\n [CloudProvider.GOOGLE_CLOUD]: 'Google Cloud Platform',\n [CloudProvider.AZURE]: 'Microsoft Azure',\n [CloudProvider.ALIBABA_CLOUD]: 'Alibaba Cloud',\n [CloudProvider.ORACLE_CLOUD]: 'Oracle Cloud Infrastructure'\n };\n\n return displayNames[provider] || provider;\n }\n}\n\nexport default PDFExporter;"],"mappings":"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","names":["import_chalk","Table","chalk","moment","cliProgress","import_moment","moment","puppeteer","chalk"]}