Skip to content

Commit 64d40a1

Browse files
committed
feat(plugin-eslint): log initializer steps (rules discovery, group creation, nx helpers)
1 parent 29e8039 commit 64d40a1

File tree

9 files changed

+97
-12
lines changed

9 files changed

+97
-12
lines changed

packages/plugin-eslint/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
},
3939
"type": "module",
4040
"dependencies": {
41+
"ansis": "^3.3.2",
4142
"glob": "^11.0.0",
4243
"@code-pushup/utils": "0.94.0",
4344
"@code-pushup/models": "0.94.0",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export const ESLINT_PLUGIN_SLUG = 'eslint';
2+
export const ESLINT_PLUGIN_TITLE = 'ESLint';

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
eslintPluginConfigSchema,
77
eslintPluginOptionsSchema,
88
} from './config.js';
9-
import { ESLINT_PLUGIN_SLUG } from './constants.js';
9+
import { ESLINT_PLUGIN_SLUG, ESLINT_PLUGIN_TITLE } from './constants.js';
1010
import { listAuditsAndGroups } from './meta/index.js';
1111
import { createRunnerFunction } from './runner/index.js';
1212

@@ -51,7 +51,7 @@ export async function eslintPlugin(
5151

5252
return {
5353
slug: ESLINT_PLUGIN_SLUG,
54-
title: 'ESLint',
54+
title: ESLINT_PLUGIN_TITLE,
5555
icon: 'eslint',
5656
description: 'Official Code PushUp ESLint plugin',
5757
docsUrl: 'https://www.npmjs.com/package/@code-pushup/eslint-plugin',
@@ -61,7 +61,7 @@ export async function eslintPlugin(
6161
audits,
6262
groups,
6363

64-
runner: await createRunnerFunction({
64+
runner: createRunnerFunction({
6565
audits,
6666
targets,
6767
...(artifacts ? { artifacts } : {}),
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { pluginMetaLogFormatter } from '@code-pushup/utils';
2+
import { ESLINT_PLUGIN_TITLE } from '../constants.js';
3+
4+
export const formatMetaLog = pluginMetaLogFormatter(ESLINT_PLUGIN_TITLE);
Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { Audit, Group } from '@code-pushup/models';
2+
import { formatAsciiTable, logger, pluralizeToken } from '@code-pushup/utils';
23
import type { CustomGroup, ESLintTarget } from '../config.js';
4+
import { formatMetaLog } from './format.js';
35
import {
46
groupsFromCustomConfig,
57
groupsFromRuleCategories,
@@ -10,24 +12,50 @@ import { ruleToAudit } from './transform.js';
1012

1113
export { ruleIdToSlug } from './hash.js';
1214
export { detectConfigVersion, type ConfigFormat } from './versions/index.js';
15+
export { formatMetaLog };
1316

1417
export async function listAuditsAndGroups(
1518
targets: ESLintTarget[],
1619
customGroups?: CustomGroup[] | undefined,
1720
): Promise<{ audits: Audit[]; groups: Group[] }> {
1821
const rules = await listRules(targets);
22+
const audits = rules.map(ruleToAudit);
23+
24+
logger.info(
25+
formatMetaLog(
26+
`Found ${pluralizeToken('rule', rules.length)} in total for ${pluralizeToken('target', targets.length)}, mapped to audits`,
27+
),
28+
);
1929

30+
const resolvedTypeGroups = groupsFromRuleTypes(rules);
31+
const resolvedCategoryGroups = groupsFromRuleCategories(rules);
2032
const resolvedCustomGroups = customGroups
2133
? groupsFromCustomConfig(rules, customGroups)
2234
: [];
23-
24-
const audits = rules.map(ruleToAudit);
25-
2635
const groups = [
27-
...groupsFromRuleTypes(rules),
28-
...groupsFromRuleCategories(rules),
36+
...resolvedTypeGroups,
37+
...resolvedCategoryGroups,
2938
...resolvedCustomGroups,
3039
];
3140

41+
logger.info(
42+
formatMetaLog(
43+
`Created ${pluralizeToken('group', groups.length)} (${resolvedTypeGroups.length} from meta.type, ${resolvedCategoryGroups.length} from meta.docs.category, ${resolvedCustomGroups.length} from custom groups)`,
44+
),
45+
);
46+
logger.debug(
47+
formatMetaLog(
48+
formatAsciiTable(
49+
{
50+
rows: groups.map(group => [
51+
`• ${group.title}`,
52+
pluralizeToken('audit', group.refs.length),
53+
]),
54+
},
55+
{ borderless: true },
56+
),
57+
),
58+
);
59+
3260
return { audits, groups };
3361
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import ansis from 'ansis';
2+
import { logger, pluralize, pluralizeToken, toArray } from '@code-pushup/utils';
13
import type { ESLintTarget } from '../config.js';
4+
import { formatMetaLog } from './format.js';
25
import { jsonHash } from './hash.js';
36
import type { RuleData } from './parse.js';
47
import { detectConfigVersion, selectRulesLoader } from './versions/index.js';
@@ -8,10 +11,16 @@ type RulesMap = Record<string, Record<string, RuleData>>;
811
export async function listRules(targets: ESLintTarget[]): Promise<RuleData[]> {
912
const version = await detectConfigVersion();
1013
const loadRulesMap = selectRulesLoader(version);
14+
logger.debug(formatMetaLog(`Detected ${version} config format`));
1115

1216
const rulesMap = await targets.reduce(async (acc, target) => {
1317
const map = await acc;
1418
const rules = await loadRulesMap(target);
19+
logger.debug(
20+
formatMetaLog(
21+
`Found ${pluralizeToken('rule', rules.length)} for ${formatTarget(target)}`,
22+
),
23+
);
1524
return rules.reduce(mergeRuleIntoMap, map);
1625
}, Promise.resolve<RulesMap>({}));
1726

@@ -28,6 +37,16 @@ function mergeRuleIntoMap(map: RulesMap, rule: RuleData): RulesMap {
2837
};
2938
}
3039

40+
function formatTarget(target: ESLintTarget): string {
41+
const patterns = toArray(target.patterns);
42+
return [
43+
`${pluralize('pattern', patterns.length)} ${ansis.bold(patterns.join(' '))}`,
44+
target.eslintrc && `using config ${ansis.bold(target.eslintrc)}`,
45+
]
46+
.filter(Boolean)
47+
.join(' ');
48+
}
49+
3150
export function expandWildcardRules(
3251
wildcard: string,
3352
rules: string[],

packages/plugin-eslint/src/lib/nx/find-all-projects.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { logger, stringifyError } from '@code-pushup/utils';
1+
import { logger, pluralizeToken, stringifyError } from '@code-pushup/utils';
22
import type { ESLintTarget } from '../config.js';
3+
import { formatMetaLog } from '../meta/format.js';
34
import { filterProjectGraph } from './filter-project-graph.js';
45
import { nxProjectsToConfig } from './projects-to-config.js';
56

@@ -14,7 +15,7 @@ async function resolveCachedProjectGraph() {
1415
try {
1516
return readCachedProjectGraph();
1617
} catch (error) {
17-
logger.info(
18+
logger.warn(
1819
`Could not read cached project graph, falling back to async creation.\n${stringifyError(error)}`,
1920
);
2021
return await createProjectGraphAsync({ exitOnError: false });
@@ -55,7 +56,21 @@ export async function eslintConfigFromAllNxProjects(
5556
projectGraph,
5657
options.exclude,
5758
);
58-
return nxProjectsToConfig(filteredProjectGraph);
59+
const targets = await nxProjectsToConfig(filteredProjectGraph);
60+
61+
logger.info(
62+
formatMetaLog(
63+
[
64+
`Inferred ${pluralizeToken('lint target', targets.length)} for all Nx projects`,
65+
options.exclude?.length &&
66+
`(excluding ${pluralizeToken('project', options.exclude.length)})`,
67+
]
68+
.filter(Boolean)
69+
.join(' '),
70+
),
71+
);
72+
73+
return targets;
5974
}
6075

6176
/**

packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import { logger } from '@nx/devkit';
2+
import { pluralizeToken } from '@code-pushup/utils';
13
import type { ESLintTarget } from '../config.js';
4+
import { formatMetaLog } from '../meta/format.js';
25
import { nxProjectsToConfig } from './projects-to-config.js';
36
import { findAllDependencies } from './traverse-graph.js';
47

@@ -35,10 +38,18 @@ export async function eslintConfigFromNxProjectAndDeps(
3538

3639
const dependencies = findAllDependencies(projectName, projectGraph);
3740

38-
return nxProjectsToConfig(
41+
const targets = await nxProjectsToConfig(
3942
projectGraph,
4043
project =>
4144
!!project.name &&
4245
(project.name === projectName || dependencies.has(project.name)),
4346
);
47+
48+
logger.info(
49+
formatMetaLog(
50+
`Inferred ${pluralizeToken('lint target', targets.length)} for Nx project "${projectName}" and its dependencies`,
51+
),
52+
);
53+
54+
return targets;
4455
}

packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { logger } from '@code-pushup/utils';
12
import type { ESLintTarget } from '../config.js';
3+
import { formatMetaLog } from '../meta/format.js';
24
import { nxProjectsToConfig } from './projects-to-config.js';
35

46
/**
@@ -41,5 +43,9 @@ export async function eslintConfigFromNxProject(
4143
throw new Error(`Couldn't find Nx project named "${projectName}"`);
4244
}
4345

46+
logger.info(
47+
formatMetaLog(`Inferred lint target for Nx project "${projectName}"`),
48+
);
49+
4450
return project;
4551
}

0 commit comments

Comments
 (0)