(issue: LayoutIssue)
| 122 | } |
| 123 | |
| 124 | export function formatLayoutIssue(issue: LayoutIssue): string { |
| 125 | const timeLabel = |
| 126 | issue.occurrences && issue.occurrences > 1 |
| 127 | ? `t=${formatNumber(issue.firstSeen ?? issue.time)}-${formatNumber(issue.lastSeen ?? issue.time)}s (${issue.occurrences} samples)` |
| 128 | : `t=${formatNumber(issue.time)}s`; |
| 129 | const parts = [ |
| 130 | timeLabel, |
| 131 | issue.code, |
| 132 | issue.selector, |
| 133 | issue.containerSelector ? `inside ${issue.containerSelector}` : "", |
| 134 | issue.overflow ? `overflowed ${formatOverflow(issue.overflow)}` : "", |
| 135 | issue.text ? quoteText(issue.text) : "", |
| 136 | ].filter(Boolean); |
| 137 | |
| 138 | const line = `${parts.join(" ")} — ${issue.message}`; |
| 139 | return issue.fixHint ? `${line}\n Fix: ${issue.fixHint}` : line; |
| 140 | } |
| 141 | |
| 142 | export function dedupeLayoutIssues(issues: LayoutIssue[]): LayoutIssue[] { |
| 143 | const seen = new Set<string>(); |
no test coverage detected