(rules: RuleData[])
| 58 | } |
| 59 | |
| 60 | export function groupsFromRuleCategories(rules: RuleData[]): Group[] { |
| 61 | const categoriesMap = rules.reduce<Record<string, Record<string, string[]>>>( |
| 62 | (acc, rule) => { |
| 63 | // meta.docs.category still used by some popular plugins (e.g. import, react, functional) |
| 64 | const category = rule.meta.docs?.category; |
| 65 | if (!category) { |
| 66 | return acc; |
| 67 | } |
| 68 | const { plugin = '' } = parseRuleId(rule.id); |
| 69 | return { |
| 70 | ...acc, |
| 71 | [plugin]: { |
| 72 | ...acc[plugin], |
| 73 | [category]: [...(acc[plugin]?.[category] ?? []), ruleToSlug(rule)], |
| 74 | }, |
| 75 | }; |
| 76 | }, |
| 77 | {}, |
| 78 | ); |
| 79 | |
| 80 | const groups = Object.entries(categoriesMap).flatMap(([plugin, categories]) => |
| 81 | Object.entries(categories).map( |
| 82 | ([category, slugs]): Group => ({ |
| 83 | slug: `${slugify(plugin)}-${slugify(category)}`, |
| 84 | title: `${category} (${plugin})`, |
| 85 | refs: slugs.map(slug => ({ slug, weight: 1 })), |
| 86 | }), |
| 87 | ), |
| 88 | ); |
| 89 | |
| 90 | return groups.toSorted((a, b) => a.slug.localeCompare(b.slug)); |
| 91 | } |
| 92 | |
| 93 | export function groupsFromCustomConfig( |
| 94 | rules: RuleData[], |
no test coverage detected