All files / src format.ts

100% Statements 17/17
81.25% Branches 13/16
100% Functions 4/4
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43    3x             3x 15x     15x 15x 15x     3x 9x 9x       9x     3x 7x                 7x     3x 4x  
import type { ScanResult, Category, Checkpoint } from "./types.js";
 
const statusIcon: Record<string, string> = {
  pass: "[PASS]",
  partial: "[PARTIAL]",
  fail: "[FAIL]",
  skip: "[SKIP]",
};
 
export const formatCheckpoint = (cp: Checkpoint): string => {
  const lines = [
    `  ${statusIcon[cp.status] ?? cp.status} ${cp.id} ${cp.name} (${cp.score}/${cp.max_score})`,
  ];
  Eif (cp.details) lines.push(`    Details: ${cp.details}`);
  if (cp.status !== "pass" && cp.recommendation) lines.push(`    Recommendation: ${cp.recommendation}`);
  return lines.join("\n");
};
 
export const formatCategory = (cat: Category): string => {
  const pct = cat.max_score > 0 ? Math.round((cat.score / cat.max_score) * 100) : 0;
  const lines = [
    `${cat.label} — ${cat.score}/${cat.max_score} (${pct}%, weight: ${cat.weight}%)`,
    ...cat.checkpoints.map(formatCheckpoint),
  ];
  return lines.join("\n");
};
 
export const formatScanResult = (scan: ScanResult): string => {
  const lines = [
    `Domain: ${scan.domain}`,
    `Grade: ${scan.letter_grade} (${scan.overall_score}/100)`,
    `Status: ${scan.status}`,
    scan.scan_duration_ms ? `Scan duration: ${scan.scan_duration_ms}ms` : "",
    scan.completed_at ? `Completed: ${scan.completed_at}` : "",
    "",
    ...(scan.categories ?? []).map(formatCategory),
  ];
  return lines.filter(Boolean).join("\n");
};
 
export const formatScanSummary = (scan: ScanResult): string =>
  `${scan.domain} — Grade: ${scan.letter_grade} (${scan.overall_score}/100)`;