UNPKG

dev-lamp

Version:

Your friendly lighthouse performance companion - 100% local

189 lines 8.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MarkdownFormatter = void 0; const base_formatter_1 = require("../base.formatter"); class MarkdownFormatter extends base_formatter_1.BaseFormatter { async format(report, options) { const template = options.template || 'detailed'; switch (template) { case 'minimal': return this.formatMinimal(report, options); case 'github': return this.formatGitHub(report, options); case 'detailed': default: return this.formatDetailed(report, options); } } formatMinimal(report, options) { const lines = []; const score = report.scores.performance || 0; lines.push(`# Lighthouse Report`); lines.push(''); lines.push(`**URL:** ${report.metadata.url}`); lines.push(`**Score:** ${options.includeEmoji ? this.getScoreEmoji(score) : ''} ${score}/100`); lines.push(''); if (report.metrics.lcp || report.metrics.fid || report.metrics.cls) { lines.push('## Core Web Vitals'); if (report.metrics.lcp) { lines.push(`- **LCP:** ${report.metrics.lcp.displayValue}`); } if (report.metrics.fid) { lines.push(`- **FID:** ${report.metrics.fid.displayValue}`); } if (report.metrics.cls) { lines.push(`- **CLS:** ${report.metrics.cls.displayValue}`); } } lines.push(''); lines.push('---'); lines.push(`_Generated by ${options.includeEmoji ? '🪔 ' : ''}dev-lamp_`); return lines.join('\n'); } formatDetailed(report, options) { const lines = []; // Header lines.push('# Lighthouse Performance Report'); lines.push(''); lines.push('Generated by dev-lamp'); lines.push(`**URL:** ${report.metadata.url}`); lines.push(`**Date:** ${report.metadata.timestamp}`); lines.push(`**Device:** ${report.metadata.device || 'desktop'}`); lines.push(''); // Overall Score if (report.scores.performance !== undefined) { const score = report.scores.performance; lines.push(`## Overall Score: ${options.includeEmoji ? this.getScoreEmoji(score) + ' ' : ''}${score}/100`); lines.push(''); } // All Category Scores if (Object.keys(report.scores).length > 0) { lines.push('## Category Scores'); lines.push(''); for (const [category, score] of Object.entries(report.scores)) { if (score !== undefined) { const categoryName = this.formatCategoryName(category); const emoji = options.includeEmoji ? this.getScoreEmoji(score) + ' ' : ''; lines.push(`- **${categoryName}:** ${emoji}${score}/100 (${this.getScoreLabel(score)})`); } } lines.push(''); } // Core Web Vitals if (report.metrics.lcp || report.metrics.fid || report.metrics.cls) { lines.push('## Core Web Vitals'); lines.push(''); lines.push('| Metric | Value | Rating |'); lines.push('|--------|-------|--------|'); if (report.metrics.lcp) { const emoji = options.includeEmoji ? this.getScoreEmoji(report.metrics.lcp.score) + ' ' : ''; lines.push(`| **LCP** (Largest Contentful Paint) | ${report.metrics.lcp.displayValue} | ${emoji}${this.getScoreLabel(report.metrics.lcp.score)} |`); } if (report.metrics.fid) { const emoji = options.includeEmoji ? this.getScoreEmoji(report.metrics.fid.score) + ' ' : ''; lines.push(`| **FID** (First Input Delay) | ${report.metrics.fid.displayValue} | ${emoji}${this.getScoreLabel(report.metrics.fid.score)} |`); } if (report.metrics.cls) { const emoji = options.includeEmoji ? this.getScoreEmoji(report.metrics.cls.score) + ' ' : ''; lines.push(`| **CLS** (Cumulative Layout Shift) | ${report.metrics.cls.displayValue} | ${emoji}${this.getScoreLabel(report.metrics.cls.score)} |`); } lines.push(''); } // Additional Metrics const additionalMetrics = ['fcp', 'ttfb', 'speedIndex', 'totalBlockingTime']; const hasAdditionalMetrics = additionalMetrics.some(m => report.metrics[m]); if (hasAdditionalMetrics) { lines.push('## Performance Metrics'); lines.push(''); for (const metricKey of additionalMetrics) { const metric = report.metrics[metricKey]; if (metric) { lines.push(`- **${metric.title || metricKey}:** ${metric.displayValue}`); if (metric.description) { lines.push(` - ${metric.description}`); } } } lines.push(''); } // Opportunities if (report.opportunities && report.opportunities.length > 0) { lines.push('## Opportunities for Improvement'); lines.push(''); for (const opp of report.opportunities) { lines.push(`### ${opp.title}`); if (opp.displayValue) { lines.push(`- **Potential Savings:** ${opp.displayValue}`); } lines.push(`- ${opp.description}`); lines.push(''); } } // Diagnostics if (report.diagnostics && report.diagnostics.length > 0) { lines.push('## Diagnostics'); lines.push(''); for (const diag of report.diagnostics) { lines.push(`### ${diag.title}`); lines.push(diag.description); if (diag.displayValue) { lines.push(`- Value: ${diag.displayValue}`); } lines.push(''); } } // Footer lines.push('---'); lines.push('_Report generated locally on your machine. Your data never left your device._'); lines.push('_dev-lamp - [github.com/incrediblecrab/dev-lamp](https://github.com/incrediblecrab/dev-lamp)_'); return lines.join('\n'); } formatGitHub(report, _options) { const lines = []; const score = report.scores.performance || 0; const scoreEmoji = this.getScoreEmoji(score); lines.push('## Lighthouse Performance Report'); lines.push(''); lines.push(`### ${scoreEmoji} Performance Score: ${score}/100`); lines.push(''); // Summary table lines.push('<details>'); lines.push('<summary>View Details</summary>'); lines.push(''); lines.push('| Metric | Value |'); lines.push('|--------|-------|'); lines.push(`| URL | ${report.metadata.url} |`); lines.push(`| Device | ${report.metadata.device || 'desktop'} |`); if (report.metrics.lcp) { lines.push(`| LCP | ${report.metrics.lcp.displayValue} |`); } if (report.metrics.fid) { lines.push(`| FID | ${report.metrics.fid.displayValue} |`); } if (report.metrics.cls) { lines.push(`| CLS | ${report.metrics.cls.displayValue} |`); } lines.push(''); if (report.opportunities && report.opportunities.length > 0) { lines.push('**Top Opportunities:**'); report.opportunities.slice(0, 3).forEach(opp => { lines.push(`- ${opp.title}${opp.displayValue ? ` (${opp.displayValue})` : ''}`); }); } lines.push(''); lines.push('</details>'); return lines.join('\n'); } formatCategoryName(category) { const names = { performance: 'Performance', accessibility: 'Accessibility', bestPractices: 'Best Practices', seo: 'SEO', pwa: 'Progressive Web App' }; return names[category] || category; } } exports.MarkdownFormatter = MarkdownFormatter; //# sourceMappingURL=markdown.formatter.js.map