NeuraLegion/sectester-js

View on GitHub
packages/reporter/src/utils/issues-grouper.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { IssuesGroup } from '../models';
import { Issue, severityComparator } from '@sectester/scan';

export class IssuesGrouper {
  public static group(issues: Issue[]): IssuesGroup[] {
    const grouped = issues.reduce(
      (res: IssuesGroup[], issue: Issue): IssuesGroup[] => {
        const issuesGroup: IssuesGroup | undefined = res.find(
          (group: IssuesGroup) =>
            group.severity === issue.severity && group.name === issue.name
        );
        if (issuesGroup) {
          issuesGroup.issues.push(issue);
        } else {
          res.push({
            severity: issue.severity,
            name: issue.name,
            issues: [issue]
          });
        }

        return res;
      },
      []
    );

    grouped.sort(this.groupComparator);

    return grouped;
  }

  public static groupComparator(a: IssuesGroup, b: IssuesGroup): number {
    const res = severityComparator(a.severity, b.severity);

    return res ? res : b.issues.length - a.issues.length;
  }
}