|
| 1 | +import type { Audit } from '@quality-metrics/models'; |
| 2 | +import { distinct, toArray } from '@quality-metrics/utils'; |
| 3 | +import type { ESLint, Linter, Rule } from 'eslint'; |
| 4 | + |
| 5 | +export async function listAudits( |
| 6 | + eslint: ESLint, |
| 7 | + patterns: string | string[], |
| 8 | +): Promise<Audit[]> { |
| 9 | + const configs = await toArray(patterns).reduce( |
| 10 | + async (acc, pattern) => [ |
| 11 | + ...(await acc), |
| 12 | + await eslint.calculateConfigForFile(pattern), |
| 13 | + ], |
| 14 | + Promise.resolve<Linter.Config[]>([]), |
| 15 | + ); |
| 16 | + |
| 17 | + const rulesIds = distinct( |
| 18 | + configs.flatMap(config => Object.keys(config.rules ?? {})), |
| 19 | + ); |
| 20 | + const rulesMeta = eslint.getRulesMetaForResults([ |
| 21 | + { |
| 22 | + messages: rulesIds.map(ruleId => ({ ruleId })), |
| 23 | + suppressedMessages: [] as Linter.SuppressedLintMessage[], |
| 24 | + } as ESLint.LintResult, |
| 25 | + ]); |
| 26 | + |
| 27 | + return Object.entries(rulesMeta).map(args => ruleToAudit(...args)); |
| 28 | +} |
| 29 | + |
| 30 | +function ruleToAudit(ruleId: string, meta: Rule.RuleMetaData): Audit { |
| 31 | + return { |
| 32 | + slug: ruleId, // TODO: slugify |
| 33 | + title: meta.docs?.description ?? ruleId, |
| 34 | + docsUrl: meta.docs?.url, |
| 35 | + }; |
| 36 | +} |
0 commit comments