Skip to content

Commit 971c97a

Browse files
committed
feat(plugin-eslint): convert rule ids to slugs, add basic description to audits
1 parent 3aac581 commit 971c97a

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

packages/plugin-eslint/src/lib/meta/audits.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Audit } from '@quality-metrics/models';
2-
import { distinct, toArray } from '@quality-metrics/utils';
2+
import { distinct, slugify, toArray } from '@quality-metrics/utils';
33
import type { ESLint, Linter, Rule } from 'eslint';
44

55
export async function listAudits(
@@ -28,9 +28,16 @@ export async function listAudits(
2828
}
2929

3030
function ruleToAudit(ruleId: string, meta: Rule.RuleMetaData): Audit {
31+
const name = ruleId.split('/').at(-1) ?? ruleId;
32+
const plugin =
33+
name === ruleId ? null : ruleId.slice(0, ruleId.lastIndexOf('/'));
34+
// TODO: add custom options hash to slug, copy to description
3135
return {
32-
slug: ruleId, // TODO: slugify
33-
title: meta.docs?.description ?? ruleId,
36+
slug: slugify(ruleId),
37+
title: meta.docs?.description ?? name,
38+
description: `ESLint rule **${name}**${
39+
plugin ? `, from _${plugin}_ plugin` : ''
40+
}.`,
3441
docsUrl: meta.docs?.url,
3542
};
3643
}

packages/utils/src/index.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,10 @@ export {
99
export { importModule } from './lib/load-file';
1010
export { reportToMd } from './lib/report-to-md';
1111
export { reportToStdout } from './lib/report-to-stdout';
12-
export { calcDuration, formatBytes, toArray, distinct } from './lib/utils';
12+
export {
13+
calcDuration,
14+
formatBytes,
15+
toArray,
16+
distinct,
17+
slugify,
18+
} from './lib/utils';

packages/utils/src/lib/utils.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
countWeightedRefs,
66
distinct,
77
formatBytes,
8+
slugify,
89
sumRefs,
910
toArray,
1011
} from './utils';
@@ -141,3 +142,16 @@ describe('toArray', () => {
141142
expect(toArray(['*.ts', '*.js'])).toEqual(['*.ts', '*.js']);
142143
});
143144
});
145+
146+
describe('slugify', () => {
147+
it.each([
148+
['Largest Contentful Paint', 'largest-contentful-paint'],
149+
['cumulative-layout-shift', 'cumulative-layout-shift'],
150+
['max-lines-200', 'max-lines-200'],
151+
['rxjs/finnish', 'rxjs-finnish'],
152+
['@typescript-eslint/no-explicit-any', 'typescript-eslint-no-explicit-any'],
153+
['Code PushUp ', 'code-pushup'],
154+
])('should transform "%s" to valid slug "%s"', (text, slug) => {
155+
expect(slugify(text)).toBe(slug);
156+
});
157+
});

packages/utils/src/lib/utils.ts

+8
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,11 @@ export function distinct<T extends string | number | boolean>(array: T[]): T[] {
3838
export function toArray<T>(val: T | T[]): T[] {
3939
return Array.isArray(val) ? val : [val];
4040
}
41+
42+
export function slugify(text: string): string {
43+
return text
44+
.trim()
45+
.toLowerCase()
46+
.replace(/\s+|\//g, '-')
47+
.replace(/[^a-z0-9-]/g, '');
48+
}

0 commit comments

Comments
 (0)