({
results,
ruleOptionsPerFile,
}: LinterOutput)
| 23 | } |
| 24 | |
| 25 | export function lintResultsToAudits({ |
| 26 | results, |
| 27 | ruleOptionsPerFile, |
| 28 | }: LinterOutput): AuditOutput[] { |
| 29 | const issuesPerAudit = results |
| 30 | .flatMap(({ messages, filePath }) => |
| 31 | messages.map((message): LintIssue => ({ ...message, filePath })), |
| 32 | ) |
| 33 | .reduce<Record<string, LintIssue[]>>((acc, issue) => { |
| 34 | const { ruleId, message, filePath } = issue; |
| 35 | if (!ruleId) { |
| 36 | logger.warn(`ESLint core error - ${message} (file: ${filePath})`); |
| 37 | return acc; |
| 38 | } |
| 39 | const options = ruleOptionsPerFile[filePath]?.[ruleId] ?? []; |
| 40 | const auditSlug = ruleIdToSlug(ruleId, options); |
| 41 | return { ...acc, [auditSlug]: [...(acc[auditSlug] ?? []), issue] }; |
| 42 | }, {}); |
| 43 | |
| 44 | return Object.entries(issuesPerAudit).map(entry => toAudit(...entry)); |
| 45 | } |
| 46 | |
| 47 | function toAudit(slug: string, issues: LintIssue[]): AuditOutput { |
| 48 | const auditIssues = issues.map(convertIssue); |
no test coverage detected