Files
2026-07-13 12:38:34 +08:00

87 lines
2.3 KiB
TypeScript

#!/usr/bin/env bun
/**
* Generate a Markdown table comparing API metrics before and after an optimization PR.
*
* Usage:
* pnpm run metrics
*/
interface Metric {
requests: number;
megabytes: number;
}
interface MetricRow {
name: string;
before: Metric;
after: Metric;
}
const data: MetricRow[] = [
{
name: 'Default',
before: { requests: 4, megabytes: 1.71 },
after: { requests: 3, megabytes: 1.7 },
},
{
name: '`--type-tools`',
before: { requests: 26, megabytes: 111.3 },
after: { requests: 24, megabytes: 110.62 },
},
{
name: '`--toolkits entelligence`',
before: { requests: 5, megabytes: 2.35 },
after: { requests: 3, megabytes: 76.21 / 1024 }, // Convert KB to MB
},
{
name: '`--type-tools` + `--toolkits entelligence`',
before: { requests: 27, megabytes: 111.94 },
after: { requests: 3, megabytes: 6.21 / 1024 }, // Convert KB to MB
},
];
function percentChange(before: number, after: number): string {
let change = ((after - before) / before) * 100;
// Cap at -99.9% unless it's truly 0
if (after > 0 && change < -99.9) {
change = -99.9;
}
const sign = change > 0 ? '+' : '';
return `${sign}${change.toFixed(1)}%`;
}
function formatMB(mb: number): string {
if (mb < 1) {
return `${(mb * 1024).toFixed(2)} KB`;
}
return `${mb.toFixed(2)} MB`;
}
function generateMarkdownTable(rows: MetricRow[]): string {
const lines: string[] = [];
lines.push('# Metrics Comparison: Before vs After Optimization');
lines.push('');
lines.push(
'| Case | Requests (Before) | Requests (After) | Requests Δ | Downloaded (Before) | Downloaded (After) | Downloaded Δ |'
);
lines.push(
'|------|-------------------|------------------|------------|---------------------|--------------------|--------------| '
);
for (const row of rows) {
const reqChange = percentChange(row.before.requests, row.after.requests);
const mbChange = percentChange(row.before.megabytes, row.after.megabytes);
lines.push(
`| ${row.name} | ${row.before.requests} | ${row.after.requests} | ${reqChange} | ${formatMB(row.before.megabytes)} | ${formatMB(row.after.megabytes)} | ${mbChange} |`
);
}
return lines.join('\n');
}
const table = generateMarkdownTable(data);
console.log(table);