dev-lamp
Version:
Your friendly lighthouse performance companion - 100% local
189 lines • 8.32 kB
JavaScript
;
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