Skip to content

Commit b1c5dd7

Browse files
feat(utils): add sorting of audit issues for report md
Closes #313 #313
1 parent 8047ef7 commit b1c5dd7

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

packages/utils/src/lib/report-to-md.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
reportHeadlineText,
3535
reportMetaTableHeaders,
3636
reportOverviewTableHeaders,
37+
sortAuditIssues,
3738
sortAudits,
3839
sortCategoryAudits,
3940
} from './report';
@@ -216,7 +217,7 @@ function reportToAuditsSection(report: ScoredReport): string {
216217

217218
const detailsTableData = [
218219
detailsTableHeaders,
219-
...audit.details.issues.map((issue: Issue) => {
220+
...audit.details.issues.sort(sortAuditIssues).map((issue: Issue) => {
220221
const severity = `${getSeverityIcon(issue.severity)} <i>${
221222
issue.severity
222223
}</i>`;

packages/utils/src/lib/report.ts

+20
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
CategoryRef,
55
IssueSeverity as CliIssueSeverity,
66
Format,
7+
Issue,
78
PersistConfig,
89
Report,
910
reportSchema,
@@ -278,3 +279,22 @@ export function getPluginNameFromSlug(
278279
plugins.find(({ slug: pluginSlug }) => pluginSlug === slug)?.title || slug
279280
);
280281
}
282+
283+
export function sortAuditIssues(a: Issue, b: Issue): number {
284+
if (a.severity !== b.severity) {
285+
return -compareIssueSeverity(a.severity, b.severity);
286+
}
287+
288+
if (a.source?.file !== b.source?.file) {
289+
return a.source?.file.localeCompare(b.source?.file || '') || 0;
290+
}
291+
292+
if (a.source?.position?.startLine !== b.source?.position?.startLine) {
293+
return (
294+
(a.source?.position?.startLine || 0) -
295+
(b.source?.position?.startLine || 0)
296+
);
297+
}
298+
299+
return 0;
300+
}

packages/utils/src/lib/report.unit.test.ts

+41-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import { vol } from 'memfs';
22
import { afterEach, describe, expect, it, vi } from 'vitest';
3-
import { CategoryRef, IssueSeverity, PluginReport } from '@code-pushup/models';
3+
import {
4+
CategoryRef,
5+
Issue,
6+
IssueSeverity,
7+
PluginReport,
8+
} from '@code-pushup/models';
49
import { MEMFS_VOLUME, report } from '@code-pushup/models/testing';
510
import {
611
calcDuration,
712
compareIssueSeverity,
813
countWeightedRefs,
914
getPluginNameFromSlug,
1015
loadReport,
16+
sortAuditIssues,
1117
sortAudits,
1218
sortCategoryAudits,
1319
} from './report';
@@ -223,3 +229,37 @@ describe('getPluginNameFromSlug', () => {
223229
expect(getPluginNameFromSlug('plugin-b', plugins)).toBe('Plugin B');
224230
});
225231
});
232+
233+
describe('sortAuditIssues', () => {
234+
it('should sort issues by severity and source file', () => {
235+
const mockIssues = [
236+
{ severity: 'warning', source: { file: 'b' } },
237+
{ severity: 'error', source: { file: 'c' } },
238+
{ severity: 'error', source: { file: 'a' } },
239+
{ severity: 'info', source: { file: 'b' } },
240+
] as Issue[];
241+
const sortedIssues = [...mockIssues].sort(sortAuditIssues);
242+
expect(sortedIssues).toEqual([
243+
{ severity: 'error', source: { file: 'a' } },
244+
{ severity: 'error', source: { file: 'c' } },
245+
{ severity: 'warning', source: { file: 'b' } },
246+
{ severity: 'info', source: { file: 'b' } },
247+
]);
248+
});
249+
250+
it('should sort issues by source file and source start line', () => {
251+
const mockIssues = [
252+
{ severity: 'info', source: { file: 'b', position: { startLine: 2 } } },
253+
{ severity: 'info', source: { file: 'c', position: { startLine: 1 } } },
254+
{ severity: 'info', source: { file: 'a', position: { startLine: 2 } } },
255+
{ severity: 'info', source: { file: 'b', position: { startLine: 1 } } },
256+
] as Issue[];
257+
const sortedIssues = [...mockIssues].sort(sortAuditIssues);
258+
expect(sortedIssues).toEqual([
259+
{ severity: 'info', source: { file: 'a', position: { startLine: 2 } } },
260+
{ severity: 'info', source: { file: 'b', position: { startLine: 1 } } },
261+
{ severity: 'info', source: { file: 'b', position: { startLine: 2 } } },
262+
{ severity: 'info', source: { file: 'c', position: { startLine: 1 } } },
263+
]);
264+
});
265+
});

0 commit comments

Comments
 (0)