@code-pushup/eslint-plugin 0.56.0 → 0.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/package.json +9 -7
- package/src/bin.js +6 -0
- package/src/bin.js.map +1 -0
- package/src/index.d.ts +3 -3
- package/src/index.js +4 -0
- package/src/index.js.map +1 -0
- package/src/lib/config.d.ts +59 -0
- package/src/lib/config.js +40 -0
- package/src/lib/config.js.map +1 -0
- package/src/lib/eslint-plugin.d.ts +3 -2
- package/src/lib/eslint-plugin.js +54 -0
- package/src/lib/eslint-plugin.js.map +1 -0
- package/src/lib/meta/groups.d.ts +8 -1
- package/src/lib/meta/groups.js +112 -0
- package/src/lib/meta/groups.js.map +1 -0
- package/src/lib/meta/hash.d.ts +2 -0
- package/src/lib/meta/hash.js +19 -0
- package/src/lib/meta/hash.js.map +1 -0
- package/src/lib/meta/index.d.ts +4 -3
- package/src/lib/meta/index.js +19 -0
- package/src/lib/meta/index.js.map +1 -0
- package/src/lib/meta/parse.d.ts +2 -1
- package/src/lib/meta/parse.js +36 -0
- package/src/lib/meta/parse.js.map +1 -0
- package/src/lib/meta/rules.d.ts +3 -2
- package/src/lib/meta/rules.js +26 -0
- package/src/lib/meta/rules.js.map +1 -0
- package/src/lib/meta/transform.d.ts +2 -2
- package/src/lib/meta/transform.js +21 -0
- package/src/lib/meta/transform.js.map +1 -0
- package/src/lib/meta/versions/detect.d.ts +1 -1
- package/src/lib/meta/versions/detect.js +22 -0
- package/src/lib/meta/versions/detect.js.map +1 -0
- package/src/lib/meta/versions/flat.d.ts +2 -2
- package/src/lib/meta/versions/flat.js +81 -0
- package/src/lib/meta/versions/flat.js.map +1 -0
- package/src/lib/meta/versions/formats.js +2 -0
- package/src/lib/meta/versions/formats.js.map +1 -0
- package/src/lib/meta/versions/index.d.ts +5 -5
- package/src/lib/meta/versions/index.js +12 -0
- package/src/lib/meta/versions/index.js.map +1 -0
- package/src/lib/meta/versions/legacy.d.ts +2 -2
- package/src/lib/meta/versions/legacy.js +36 -0
- package/src/lib/meta/versions/legacy.js.map +1 -0
- package/src/lib/nx/filter-project-graph.js +12 -0
- package/src/lib/nx/filter-project-graph.js.map +1 -0
- package/src/lib/nx/find-all-projects.d.ts +1 -1
- package/src/lib/nx/find-all-projects.js +40 -0
- package/src/lib/nx/find-all-projects.js.map +1 -0
- package/src/lib/nx/find-project-with-deps.d.ts +1 -1
- package/src/lib/nx/find-project-with-deps.js +35 -0
- package/src/lib/nx/find-project-with-deps.js.map +1 -0
- package/src/lib/nx/find-project-without-deps.d.ts +1 -1
- package/src/lib/nx/find-project-without-deps.js +36 -0
- package/src/lib/nx/find-project-without-deps.js.map +1 -0
- package/src/lib/nx/index.d.ts +3 -3
- package/src/lib/nx/index.js +4 -0
- package/src/lib/nx/index.js.map +1 -0
- package/src/lib/nx/projects-to-config.d.ts +1 -1
- package/src/lib/nx/projects-to-config.js +18 -0
- package/src/lib/nx/projects-to-config.js.map +1 -0
- package/src/lib/nx/traverse-graph.js +21 -0
- package/src/lib/nx/traverse-graph.js.map +1 -0
- package/src/lib/nx/utils.d.ts +1 -1
- package/src/lib/nx/utils.js +75 -0
- package/src/lib/nx/utils.js.map +1 -0
- package/src/lib/runner/index.d.ts +3 -6
- package/src/lib/runner/index.js +38 -0
- package/src/lib/runner/index.js.map +1 -0
- package/src/lib/runner/lint.d.ts +2 -2
- package/src/lib/runner/lint.js +49 -0
- package/src/lib/runner/lint.js.map +1 -0
- package/src/lib/runner/transform.d.ts +1 -1
- package/src/lib/runner/transform.js +74 -0
- package/src/lib/runner/transform.js.map +1 -0
- package/src/lib/runner/types.js +2 -0
- package/src/lib/runner/types.js.map +1 -0
- package/src/lib/setup.d.ts +1 -1
- package/src/lib/setup.js +17 -0
- package/src/lib/setup.js.map +1 -0
- package/bin.js +0 -1129
- package/index.js +0 -1413
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ESLint } from 'eslint';
|
|
2
|
+
import { fileExists } from '@code-pushup/utils';
|
|
3
|
+
// relevant ESLint docs:
|
|
4
|
+
// - https://eslint.org/docs/latest/use/configure/configuration-files
|
|
5
|
+
// - https://eslint.org/docs/latest/use/configure/configuration-files-deprecated
|
|
6
|
+
// - https://eslint.org/docs/v8.x/use/configure/configuration-files-new
|
|
7
|
+
export async function detectConfigVersion() {
|
|
8
|
+
if (process.env['ESLINT_USE_FLAT_CONFIG'] === 'true') {
|
|
9
|
+
return 'flat';
|
|
10
|
+
}
|
|
11
|
+
if (process.env['ESLINT_USE_FLAT_CONFIG'] === 'false') {
|
|
12
|
+
return 'legacy';
|
|
13
|
+
}
|
|
14
|
+
if (ESLint.version.startsWith('8.')) {
|
|
15
|
+
if (await fileExists('eslint.config.js')) {
|
|
16
|
+
return 'flat';
|
|
17
|
+
}
|
|
18
|
+
return 'legacy';
|
|
19
|
+
}
|
|
20
|
+
return 'flat';
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,wBAAwB;AACxB,qEAAqE;AACrE,gFAAgF;AAChF,uEAAuE;AAEvE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,OAAO,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,MAAM,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ESLintTarget } from '../../config';
|
|
2
|
-
import { type RuleData } from '../parse';
|
|
1
|
+
import type { ESLintTarget } from '../../config.js';
|
|
2
|
+
import { type RuleData } from '../parse.js';
|
|
3
3
|
export declare function loadRulesForFlatConfig({ eslintrc, }: Pick<ESLintTarget, 'eslintrc'>): Promise<RuleData[]>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { builtinRules } from 'eslint/use-at-your-own-risk';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { exists, findNearestFile, toArray, ui } from '@code-pushup/utils';
|
|
5
|
+
import { jsonHash } from '../hash.js';
|
|
6
|
+
import { isRuleOff, optionsFromRuleEntry, parseRuleId, } from '../parse.js';
|
|
7
|
+
export async function loadRulesForFlatConfig({ eslintrc, }) {
|
|
8
|
+
const config = eslintrc
|
|
9
|
+
? await loadConfigByPath(eslintrc)
|
|
10
|
+
: await loadConfigByDefaultLocation();
|
|
11
|
+
const configs = toArray(config);
|
|
12
|
+
const rules = findEnabledRulesWithOptions(configs);
|
|
13
|
+
return rules
|
|
14
|
+
.map(rule => {
|
|
15
|
+
const meta = findRuleMeta(rule.id, configs);
|
|
16
|
+
if (!meta) {
|
|
17
|
+
ui().logger.warning(`Cannot find metadata for rule ${rule.id}`);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return { ...rule, meta };
|
|
21
|
+
})
|
|
22
|
+
.filter(exists);
|
|
23
|
+
}
|
|
24
|
+
async function loadConfigByDefaultLocation() {
|
|
25
|
+
const flatConfigFileNames = [
|
|
26
|
+
'eslint.config.js',
|
|
27
|
+
'eslint.config.mjs',
|
|
28
|
+
'eslint.config.cjs',
|
|
29
|
+
];
|
|
30
|
+
const configPath = await findNearestFile(flatConfigFileNames);
|
|
31
|
+
if (configPath) {
|
|
32
|
+
return loadConfigByPath(configPath);
|
|
33
|
+
}
|
|
34
|
+
throw new Error([
|
|
35
|
+
`ESLint config file not found - expected ${flatConfigFileNames.join('/')} in ${process.cwd()} or some parent directory`,
|
|
36
|
+
'If your ESLint config is in a non-standard location, use the `eslintrc` parameter to specify the path.',
|
|
37
|
+
].join('\n'));
|
|
38
|
+
}
|
|
39
|
+
async function loadConfigByPath(configPath) {
|
|
40
|
+
const absolutePath = path.isAbsolute(configPath)
|
|
41
|
+
? configPath
|
|
42
|
+
: path.join(process.cwd(), configPath);
|
|
43
|
+
const url = pathToFileURL(absolutePath).toString();
|
|
44
|
+
const mod = (await import(url));
|
|
45
|
+
return 'default' in mod ? mod.default : mod;
|
|
46
|
+
}
|
|
47
|
+
function findEnabledRulesWithOptions(configs) {
|
|
48
|
+
const enabledRules = configs
|
|
49
|
+
.flatMap(({ rules }) => Object.entries(rules ?? {}))
|
|
50
|
+
.filter(([, entry]) => entry != null && !isRuleOff(entry))
|
|
51
|
+
.map(([id, entry]) => ({
|
|
52
|
+
id,
|
|
53
|
+
options: entry ? optionsFromRuleEntry(entry) : [],
|
|
54
|
+
}));
|
|
55
|
+
const uniqueRulesMap = new Map(enabledRules.map(({ id, options }) => [
|
|
56
|
+
`${id}::${jsonHash(options)}`,
|
|
57
|
+
{ id, options },
|
|
58
|
+
]));
|
|
59
|
+
return [...uniqueRulesMap.values()];
|
|
60
|
+
}
|
|
61
|
+
function findRuleMeta(ruleId, configs) {
|
|
62
|
+
const { plugin, name } = parseRuleId(ruleId);
|
|
63
|
+
if (!plugin) {
|
|
64
|
+
return findBuiltinRuleMeta(name);
|
|
65
|
+
}
|
|
66
|
+
return findPluginRuleMeta(plugin, name, configs);
|
|
67
|
+
}
|
|
68
|
+
function findBuiltinRuleMeta(name) {
|
|
69
|
+
const rule = builtinRules.get(name);
|
|
70
|
+
return rule?.meta;
|
|
71
|
+
}
|
|
72
|
+
function findPluginRuleMeta(plugin, name, configs) {
|
|
73
|
+
const config = configs.find(({ plugins = {} }) => plugin in plugins);
|
|
74
|
+
const rule = config?.plugins?.[plugin]?.rules?.[name];
|
|
75
|
+
if (typeof rule === 'function') {
|
|
76
|
+
ui().logger.warning(`Cannot parse metadata for rule ${plugin}/${name}, plugin registers it as a function`);
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
return rule?.meta;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=flat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/flat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formats.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/formats.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ESLintTarget } from '../../config';
|
|
2
|
-
import type { RuleData } from '../parse';
|
|
3
|
-
import type { ConfigFormat } from './formats';
|
|
4
|
-
export { detectConfigVersion } from './detect';
|
|
5
|
-
export type { ConfigFormat } from './formats';
|
|
1
|
+
import type { ESLintTarget } from '../../config.js';
|
|
2
|
+
import type { RuleData } from '../parse.js';
|
|
3
|
+
import type { ConfigFormat } from './formats.js';
|
|
4
|
+
export { detectConfigVersion } from './detect.js';
|
|
5
|
+
export type { ConfigFormat } from './formats.js';
|
|
6
6
|
export declare function selectRulesLoader(version: ConfigFormat): (target: ESLintTarget) => Promise<RuleData[]>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { loadRulesForFlatConfig } from './flat.js';
|
|
2
|
+
import { loadRulesForLegacyConfig } from './legacy.js';
|
|
3
|
+
export { detectConfigVersion } from './detect.js';
|
|
4
|
+
export function selectRulesLoader(version) {
|
|
5
|
+
switch (version) {
|
|
6
|
+
case 'flat':
|
|
7
|
+
return loadRulesForFlatConfig;
|
|
8
|
+
case 'legacy':
|
|
9
|
+
return loadRulesForLegacyConfig;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,UAAU,iBAAiB,CAC/B,OAAqB;IAErB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,sBAAsB,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,wBAAwB,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ESLintTarget } from '../../config';
|
|
2
|
-
import { type RuleData } from '../parse';
|
|
1
|
+
import type { ESLintTarget } from '../../config.js';
|
|
2
|
+
import { type RuleData } from '../parse.js';
|
|
3
3
|
export declare function loadRulesForLegacyConfig({ eslintrc, patterns, }: ESLintTarget): Promise<RuleData[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { distinct, exists, toArray, ui } from '@code-pushup/utils';
|
|
2
|
+
import { setupESLint } from '../../setup.js';
|
|
3
|
+
import { isRuleOff, optionsFromRuleEntry } from '../parse.js';
|
|
4
|
+
export async function loadRulesForLegacyConfig({ eslintrc, patterns, }) {
|
|
5
|
+
const eslint = await setupESLint(eslintrc);
|
|
6
|
+
const configs = await toArray(patterns).reduce(async (acc, pattern) => [
|
|
7
|
+
...(await acc),
|
|
8
|
+
(await eslint.calculateConfigForFile(pattern)),
|
|
9
|
+
], Promise.resolve([]));
|
|
10
|
+
const rulesIds = distinct(configs.flatMap(config => Object.keys(config.rules ?? {})));
|
|
11
|
+
const rulesMeta = eslint.getRulesMetaForResults([
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
13
|
+
{
|
|
14
|
+
messages: rulesIds.map(ruleId => ({ ruleId })),
|
|
15
|
+
suppressedMessages: [],
|
|
16
|
+
},
|
|
17
|
+
]);
|
|
18
|
+
return configs
|
|
19
|
+
.flatMap(config => Object.entries(config.rules ?? {}))
|
|
20
|
+
.map(([id, entry]) => {
|
|
21
|
+
if (entry == null || isRuleOff(entry)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const ruleMeta = rulesMeta[id];
|
|
25
|
+
if (!ruleMeta) {
|
|
26
|
+
ui().logger.warning(`Metadata not found for ESLint rule ${id}`);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// ignoring meta.defaultOptions to match legacy config handling in calculateConfigForFile
|
|
30
|
+
const { defaultOptions: _, ...meta } = ruleMeta;
|
|
31
|
+
const options = optionsFromRuleEntry(entry);
|
|
32
|
+
return { id, meta, options };
|
|
33
|
+
})
|
|
34
|
+
.filter(exists);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=legacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/legacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAiB,SAAS,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAC7C,QAAQ,EACR,QAAQ,GACK;IACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC5C,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;QACtB,GAAG,CAAC,MAAM,GAAG,CAAC;QACd,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAwB;KACtE,EACD,OAAO,CAAC,OAAO,CAAwB,EAAE,CAAC,CAC3C,CAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAC3D,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC;QAC9C,yEAAyE;QACzE;YACE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,kBAAkB,EAAE,EAAoC;SACpC;KACvB,CAAC,CAAC;IAEH,OAAO,OAAO;SACX,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAmB,EAAE;QACpC,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,yFAAyF;QACzF,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QAChD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;SACD,MAAM,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function filterProjectGraph(projectGraph, exclude = []) {
|
|
2
|
+
const filteredNodes = Object.entries(projectGraph.nodes).reduce((acc, [projectName, projectNode]) => exclude.includes(projectName)
|
|
3
|
+
? acc
|
|
4
|
+
: { ...acc, [projectName]: projectNode }, {});
|
|
5
|
+
const filteredDependencies = Object.entries(projectGraph.dependencies).reduce((acc, [key, deps]) => exclude.includes(key) ? acc : { ...acc, [key]: deps }, {});
|
|
6
|
+
return {
|
|
7
|
+
nodes: filteredNodes,
|
|
8
|
+
dependencies: filteredDependencies,
|
|
9
|
+
version: projectGraph.version,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=filter-project-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-project-graph.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/filter-project-graph.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,kBAAkB,CAChC,YAA0B,EAC1B,UAAoB,EAAE;IAEtB,MAAM,aAAa,GAA4C,MAAM,CAAC,OAAO,CAC3E,YAAY,CAAC,KAAK,CACnB,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAC5C,EAAE,CACH,CAAC;IACF,MAAM,oBAAoB,GACxB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CACnB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EACvD,EAAE,CACH,CAAC;IACJ,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,oBAAoB;QAClC,OAAO,EAAE,YAAY,CAAC,OAAO;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { filterProjectGraph } from './filter-project-graph.js';
|
|
2
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Finds all Nx projects in workspace and converts their lint configurations to Code PushUp ESLint plugin parameters.
|
|
5
|
+
*
|
|
6
|
+
* Allows excluding certain projects from the configuration using the `options.exclude` parameter.
|
|
7
|
+
*
|
|
8
|
+
* Use when you wish to automatically include every Nx project in a single Code PushUp project.
|
|
9
|
+
* If you prefer to include only a subset of your Nx monorepo, specify projects to exclude using the `exclude` option
|
|
10
|
+
* or consider using {@link eslintConfigFromNxProjectAndDeps} for finer control.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import eslintPlugin, {
|
|
14
|
+
* eslintConfigFromAllNxProjects,
|
|
15
|
+
* } from '@code-pushup/eslint-plugin';
|
|
16
|
+
*
|
|
17
|
+
* export default {
|
|
18
|
+
* plugins: [
|
|
19
|
+
* await eslintPlugin(
|
|
20
|
+
* await eslintConfigFromAllNxProjects({ exclude: ['server'] })
|
|
21
|
+
* )
|
|
22
|
+
* ]
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @param options - Configuration options to filter projects
|
|
26
|
+
* @param options.exclude - Array of project names to exclude from the ESLint configuration
|
|
27
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
28
|
+
*/
|
|
29
|
+
export async function eslintConfigFromAllNxProjects(options = {}) {
|
|
30
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
31
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
32
|
+
const filteredProjectGraph = filterProjectGraph(projectGraph, options.exclude);
|
|
33
|
+
return nxProjectsToConfig(filteredProjectGraph);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @deprecated
|
|
37
|
+
* Helper is renamed, please use `eslintConfigFromAllNxProjects` function instead.
|
|
38
|
+
*/
|
|
39
|
+
export const eslintConfigFromNxProjects = eslintConfigFromAllNxProjects;
|
|
40
|
+
//# sourceMappingURL=find-all-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-all-projects.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-all-projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,UAAkC,EAAE;IAEpC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,oBAAoB,GAAG,kBAAkB,CAC7C,YAAY,EACZ,OAAO,CAAC,OAAO,CAChB,CAAC;IACF,OAAO,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
2
|
+
import { findAllDependencies } from './traverse-graph.js';
|
|
3
|
+
/**
|
|
4
|
+
* Accepts a target Nx projects, finds projects it depends on, and converts lint configurations to Code PushUp ESLint plugin parameters.
|
|
5
|
+
*
|
|
6
|
+
* Use when you wish to include a targeted subset of your Nx monorepo in your Code PushUp project.
|
|
7
|
+
* If you prefer to include all Nx projects, refer to {@link eslintConfigFromAllNxProjects} instead.
|
|
8
|
+
* if you'd like to skip dependencies of the provided target project use {@link eslintConfigFromNxProject} instead.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import eslintPlugin, {
|
|
12
|
+
* eslintConfigFromNxProjectAndDeps,
|
|
13
|
+
* } from '@code-pushup/eslint-plugin';
|
|
14
|
+
*
|
|
15
|
+
* const projectName = 'backoffice'; // <-- name from project.json
|
|
16
|
+
*
|
|
17
|
+
* export default {
|
|
18
|
+
* plugins: [
|
|
19
|
+
* await eslintPlugin(
|
|
20
|
+
* await eslintConfigFromNxProjectAndDeps(projectName)
|
|
21
|
+
* )
|
|
22
|
+
* ]
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @param projectName Nx project serving as main entry point
|
|
26
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
27
|
+
*/
|
|
28
|
+
export async function eslintConfigFromNxProjectAndDeps(projectName) {
|
|
29
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
30
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
31
|
+
const dependencies = findAllDependencies(projectName, projectGraph);
|
|
32
|
+
return nxProjectsToConfig(projectGraph, project => !!project.name &&
|
|
33
|
+
(project.name === projectName || dependencies.has(project.name)));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=find-project-with-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-project-with-deps.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAmB;IAEnB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEpE,OAAO,kBAAkB,CACvB,YAAY,EACZ,OAAO,CAAC,EAAE,CACR,CAAC,CAAC,OAAO,CAAC,IAAI;QACd,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Accepts a target Nx project, converts its lint configuration to Code PushUp ESLint plugin parameters.
|
|
4
|
+
*
|
|
5
|
+
* Use when you wish to only have a single Nx project as your Code PushUp project, without any other dependencies.
|
|
6
|
+
* If you prefer to include all Nx projects, refer to {@link eslintConfigFromAllNxProjects} instead.
|
|
7
|
+
* If you'd like to auto include all dependencies of the provided target project use {@link eslintConfigFromNxProjectAndDeps} instead.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import eslintPlugin, {
|
|
11
|
+
* eslintConfigFromNxProject,
|
|
12
|
+
* } from '@code-pushup/eslint-plugin';
|
|
13
|
+
*
|
|
14
|
+
* const projectName = 'backoffice'; // <-- name from project.json
|
|
15
|
+
*
|
|
16
|
+
* export default {
|
|
17
|
+
* plugins: [
|
|
18
|
+
* await eslintPlugin(
|
|
19
|
+
* await eslintConfigFromNxProject(projectName)
|
|
20
|
+
* )
|
|
21
|
+
* ]
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* @param projectName Nx project name
|
|
25
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
26
|
+
*/
|
|
27
|
+
export async function eslintConfigFromNxProject(projectName) {
|
|
28
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
29
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
30
|
+
const [project] = await nxProjectsToConfig(projectGraph, ({ name }) => !!name && name === projectName);
|
|
31
|
+
if (!project) {
|
|
32
|
+
throw new Error(`Couldn't find Nx project named "${projectName}"`);
|
|
33
|
+
}
|
|
34
|
+
return project;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=find-project-without-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-project-without-deps.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB;IAEnB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,kBAAkB,CACxC,YAAY,EACZ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,WAAW,CAC7C,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,WAAW,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/src/lib/nx/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProjects, } from './find-all-projects.js';
|
|
2
|
+
export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps.js';
|
|
3
|
+
export { eslintConfigFromNxProject } from './find-project-without-deps.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProjects, } from './find-all-projects.js';
|
|
2
|
+
export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps.js';
|
|
3
|
+
export { eslintConfigFromNxProject } from './find-project-without-deps.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ProjectConfiguration, ProjectGraph } from '@nx/devkit';
|
|
2
|
-
import type { ESLintTarget } from '../config';
|
|
2
|
+
import type { ESLintTarget } from '../config.js';
|
|
3
3
|
export declare function nxProjectsToConfig(projectGraph: ProjectGraph, predicate?: (project: ProjectConfiguration) => boolean): Promise<ESLintTarget[]>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { detectConfigVersion } from '../meta/index.js';
|
|
2
|
+
import { findCodePushupEslintConfig, findEslintConfig, getLintFilePatterns, } from './utils.js';
|
|
3
|
+
export async function nxProjectsToConfig(projectGraph, predicate = () => true) {
|
|
4
|
+
// find Nx projects with lint target
|
|
5
|
+
const { readProjectsConfigurationFromProjectGraph } = await import('@nx/devkit');
|
|
6
|
+
const projectsConfiguration = readProjectsConfigurationFromProjectGraph(projectGraph);
|
|
7
|
+
const projects = Object.values(projectsConfiguration.projects)
|
|
8
|
+
.filter(project => 'lint' in (project.targets ?? {}))
|
|
9
|
+
.filter(predicate) // apply predicate
|
|
10
|
+
.sort((a, b) => a.root.localeCompare(b.root));
|
|
11
|
+
const format = await detectConfigVersion();
|
|
12
|
+
return Promise.all(projects.map(async (project) => ({
|
|
13
|
+
eslintrc: (await findCodePushupEslintConfig(project, format)) ??
|
|
14
|
+
(await findEslintConfig(project, format)),
|
|
15
|
+
patterns: getLintFilePatterns(project, format),
|
|
16
|
+
})));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=projects-to-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects-to-config.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/projects-to-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,YAAwD,GAAG,EAAE,CAAC,IAAI;IAElE,oCAAoC;IACpC,MAAM,EAAE,yCAAyC,EAAE,GAAG,MAAM,MAAM,CAChE,YAAY,CACb,CAAC;IACF,MAAM,qBAAqB,GACzB,yCAAyC,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC;SAC3D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;SACpD,MAAM,CAAC,SAAS,CAAC,CAAC,kBAAkB;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAE3C,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CACV,KAAK,EAAE,OAAO,EAAyB,EAAE,CAAC,CAAC;QACzC,QAAQ,EACN,CAAC,MAAM,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;KAC/C,CAAC,CACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function findAllDependencies(entry, projectGraph) {
|
|
2
|
+
const results = new Set();
|
|
3
|
+
const queue = [entry];
|
|
4
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
5
|
+
while (queue.length > 0) {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, functional/immutable-data
|
|
7
|
+
const source = queue.shift();
|
|
8
|
+
const dependencies = projectGraph.dependencies[source];
|
|
9
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
10
|
+
for (const { target } of dependencies ?? []) {
|
|
11
|
+
// skip duplicates (cycle in graph)
|
|
12
|
+
if (!results.has(target) && target !== entry) {
|
|
13
|
+
results.add(target);
|
|
14
|
+
// eslint-disable-next-line functional/immutable-data
|
|
15
|
+
queue.push(target);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return results;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=traverse-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse-graph.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/traverse-graph.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,YAA0B;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAEtB,yDAAyD;IACzD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,+FAA+F;QAC/F,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEvD,yDAAyD;QACzD,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;YAC5C,mCAAmC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,qDAAqD;gBACrD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/src/lib/nx/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ProjectConfiguration } from '@nx/devkit';
|
|
2
|
-
import type { ConfigFormat } from '../meta';
|
|
2
|
+
import type { ConfigFormat } from '../meta/index.js';
|
|
3
3
|
export declare function findCodePushupEslintConfig(project: ProjectConfiguration, format: ConfigFormat): Promise<string | undefined>;
|
|
4
4
|
export declare function findEslintConfig(project: ProjectConfiguration, format: ConfigFormat): Promise<string | undefined>;
|
|
5
5
|
export declare function getLintFilePatterns(project: ProjectConfiguration, format: ConfigFormat): string[];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileExists, toArray } from '@code-pushup/utils';
|
|
3
|
+
const ESLINT_CONFIG_EXTENSIONS = {
|
|
4
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats
|
|
5
|
+
flat: ['js', 'mjs', 'cjs'],
|
|
6
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files-deprecated
|
|
7
|
+
legacy: ['json', 'js', 'cjs', 'yml', 'yaml'],
|
|
8
|
+
};
|
|
9
|
+
const ESLINT_CONFIG_NAMES = {
|
|
10
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats
|
|
11
|
+
flat: ['eslint.config'],
|
|
12
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files-deprecated
|
|
13
|
+
legacy: ['.eslintrc'],
|
|
14
|
+
};
|
|
15
|
+
const CP_ESLINT_CONFIG_NAMES = {
|
|
16
|
+
flat: [
|
|
17
|
+
'code-pushup.eslint.config',
|
|
18
|
+
'eslint.code-pushup.config',
|
|
19
|
+
'eslint.config.code-pushup',
|
|
20
|
+
'eslint.strict.config',
|
|
21
|
+
'eslint.config.strict',
|
|
22
|
+
],
|
|
23
|
+
legacy: ['code-pushup.eslintrc', '.eslintrc.code-pushup', '.eslintrc.strict'],
|
|
24
|
+
};
|
|
25
|
+
export async function findCodePushupEslintConfig(project, format) {
|
|
26
|
+
return findProjectFile(project, {
|
|
27
|
+
names: CP_ESLINT_CONFIG_NAMES[format],
|
|
28
|
+
extensions: ESLINT_CONFIG_EXTENSIONS[format],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function findEslintConfig(project, format) {
|
|
32
|
+
const options = project.targets?.['lint']?.options;
|
|
33
|
+
return (options?.eslintConfig ??
|
|
34
|
+
(await findProjectFile(project, {
|
|
35
|
+
names: ESLINT_CONFIG_NAMES[format],
|
|
36
|
+
extensions: ESLINT_CONFIG_EXTENSIONS[format],
|
|
37
|
+
})));
|
|
38
|
+
}
|
|
39
|
+
export function getLintFilePatterns(project, format) {
|
|
40
|
+
const options = project.targets?.['lint']?.options;
|
|
41
|
+
// lintFilePatterns defaults to ["{projectRoot}"] - https://github.com/nrwl/nx/pull/20313
|
|
42
|
+
const defaultPatterns = format === 'legacy'
|
|
43
|
+
? `${project.root}/**/*` // files not folder needed for legacy because rules detected with ESLint.calculateConfigForFile
|
|
44
|
+
: project.root;
|
|
45
|
+
const patterns = options?.lintFilePatterns == null
|
|
46
|
+
? [defaultPatterns]
|
|
47
|
+
: toArray(options.lintFilePatterns);
|
|
48
|
+
if (format === 'legacy') {
|
|
49
|
+
return [
|
|
50
|
+
...patterns,
|
|
51
|
+
// HACK: ESLint.calculateConfigForFile won't find rules included only for subsets of *.ts when globs used
|
|
52
|
+
// so we explicitly provide additional patterns used by @code-pushup/eslint-config to ensure those rules are included
|
|
53
|
+
// this workaround is only necessary for legacy configs (rules are detected more reliably in flat configs)
|
|
54
|
+
`${project.root}/*.spec.ts`, // jest/* and vitest/* rules
|
|
55
|
+
`${project.root}/*.cy.ts`, // cypress/* rules
|
|
56
|
+
`${project.root}/*.stories.ts`, // storybook/* rules
|
|
57
|
+
`${project.root}/.storybook/main.ts`, // storybook/no-uninstalled-addons rule
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
return patterns;
|
|
61
|
+
}
|
|
62
|
+
async function findProjectFile(project, file) {
|
|
63
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
64
|
+
for (const name of file.names) {
|
|
65
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
66
|
+
for (const ext of file.extensions) {
|
|
67
|
+
const filename = `./${project.root}/${name}.${ext}`;
|
|
68
|
+
if (await fileExists(path.join(process.cwd(), filename))) {
|
|
69
|
+
return filename;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type { Audit, RunnerConfig } from '@code-pushup/models';
|
|
2
|
-
import type { ESLintTarget } from '../config';
|
|
3
|
-
export declare
|
|
4
|
-
export declare const RUNNER_OUTPUT_PATH: string;
|
|
5
|
-
export declare const PLUGIN_CONFIG_PATH: string;
|
|
6
|
-
export declare function executeRunner(): Promise<void>;
|
|
1
|
+
import type { Audit, RunnerConfig, RunnerFilesPaths } from '@code-pushup/models';
|
|
2
|
+
import type { ESLintTarget } from '../config.js';
|
|
3
|
+
export declare function executeRunner({ runnerConfigPath, runnerOutputPath, }: RunnerFilesPaths): Promise<void>;
|
|
7
4
|
export declare function createRunnerConfig(scriptPath: string, audits: Audit[], targets: ESLintTarget[]): Promise<RunnerConfig>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createRunnerFiles, ensureDirectoryExists, filePathToCliArg, objectToCliArgs, readJsonFile, ui, } from '@code-pushup/utils';
|
|
4
|
+
import { lint } from './lint.js';
|
|
5
|
+
import { lintResultsToAudits, mergeLinterOutputs } from './transform.js';
|
|
6
|
+
export async function executeRunner({ runnerConfigPath, runnerOutputPath, }) {
|
|
7
|
+
const { slugs, targets } = await readJsonFile(runnerConfigPath);
|
|
8
|
+
ui().logger.log(`ESLint plugin executing ${targets.length} lint targets`);
|
|
9
|
+
const linterOutputs = await targets.reduce(async (acc, target) => [...(await acc), await lint(target)], Promise.resolve([]));
|
|
10
|
+
const lintResults = mergeLinterOutputs(linterOutputs);
|
|
11
|
+
const failedAudits = lintResultsToAudits(lintResults);
|
|
12
|
+
const audits = slugs.map((slug) => failedAudits.find(audit => audit.slug === slug) ?? {
|
|
13
|
+
slug,
|
|
14
|
+
score: 1,
|
|
15
|
+
value: 0,
|
|
16
|
+
displayValue: 'passed',
|
|
17
|
+
details: { issues: [] },
|
|
18
|
+
});
|
|
19
|
+
await ensureDirectoryExists(path.dirname(runnerOutputPath));
|
|
20
|
+
await writeFile(runnerOutputPath, JSON.stringify(audits));
|
|
21
|
+
}
|
|
22
|
+
export async function createRunnerConfig(scriptPath, audits, targets) {
|
|
23
|
+
const config = {
|
|
24
|
+
targets,
|
|
25
|
+
slugs: audits.map(audit => audit.slug),
|
|
26
|
+
};
|
|
27
|
+
const { runnerConfigPath, runnerOutputPath } = await createRunnerFiles('eslint', JSON.stringify(config));
|
|
28
|
+
return {
|
|
29
|
+
command: 'node',
|
|
30
|
+
args: [
|
|
31
|
+
filePathToCliArg(scriptPath),
|
|
32
|
+
...objectToCliArgs({ runnerConfigPath, runnerOutputPath }),
|
|
33
|
+
],
|
|
34
|
+
configFile: runnerConfigPath,
|
|
35
|
+
outputFile: runnerOutputPath,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,EAAE,GACH,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,gBAAgB,EAChB,gBAAgB,GACC;IACjB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GACtB,MAAM,YAAY,CAA2B,gBAAgB,CAAC,CAAC;IAEjE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;IAE1E,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CACxC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,EAC3D,OAAO,CAAC,OAAO,CAAiB,EAAE,CAAC,CACpC,CAAC;IACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CACtB,CAAC,IAAI,EAAe,EAAE,CACpB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QACjD,IAAI;QACJ,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KACxB,CACJ,CAAC;IAEF,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,MAAe,EACf,OAAuB;IAEvB,MAAM,MAAM,GAA6B;QACvC,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KACvC,CAAC;IACF,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,MAAM,iBAAiB,CACpE,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CACvB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,gBAAgB,CAAC,UAAU,CAAC;YAC5B,GAAG,eAAe,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;SAC3D;QACD,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,gBAAgB;KAC7B,CAAC;AACJ,CAAC"}
|
package/src/lib/runner/lint.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ESLintTarget } from '../config';
|
|
2
|
-
import type { LinterOutput } from './types';
|
|
1
|
+
import type { ESLintTarget } from '../config.js';
|
|
2
|
+
import type { LinterOutput } from './types.js';
|
|
3
3
|
export declare function lint({ eslintrc, patterns, }: ESLintTarget): Promise<LinterOutput>;
|