@code-pushup/eslint-plugin 0.56.0 → 0.57.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/package.json +8 -7
- package/src/bin.js +3 -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.js +19 -0
- package/src/lib/config.js.map +1 -0
- package/src/lib/eslint-plugin.d.ts +1 -1
- package/src/lib/eslint-plugin.js +45 -0
- package/src/lib/eslint-plugin.js.map +1 -0
- package/src/lib/meta/groups.d.ts +1 -1
- package/src/lib/meta/groups.js +64 -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 +3 -2
- package/src/lib/meta/index.js +15 -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 +2 -2
- package/src/lib/meta/rules.js +22 -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 +1 -1
- package/src/lib/runner/index.js +37 -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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.57.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Code PushUp plugin for detecting problems in source code using ESLint.📋",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-eslint#readme",
|
|
@@ -37,11 +37,9 @@
|
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
39
|
"type": "module",
|
|
40
|
-
"main": "./index.js",
|
|
41
|
-
"types": "./src/index.d.ts",
|
|
42
40
|
"dependencies": {
|
|
43
|
-
"@code-pushup/utils": "0.
|
|
44
|
-
"@code-pushup/models": "0.
|
|
41
|
+
"@code-pushup/utils": "0.57.0",
|
|
42
|
+
"@code-pushup/models": "0.57.0",
|
|
45
43
|
"zod": "^3.22.4"
|
|
46
44
|
},
|
|
47
45
|
"peerDependencies": {
|
|
@@ -52,5 +50,8 @@
|
|
|
52
50
|
"@nx/devkit": {
|
|
53
51
|
"optional": true
|
|
54
52
|
}
|
|
55
|
-
}
|
|
56
|
-
|
|
53
|
+
},
|
|
54
|
+
"module": "./src/index.js",
|
|
55
|
+
"main": "./src/index.js",
|
|
56
|
+
"types": "./src/index.d.ts"
|
|
57
|
+
}
|
package/src/bin.js
ADDED
package/src/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../../packages/plugin-eslint/src/bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,aAAa,EAAE,CAAC"}
|
package/src/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { eslintPlugin } from './lib/eslint-plugin';
|
|
1
|
+
import { eslintPlugin } from './lib/eslint-plugin.js';
|
|
2
2
|
export default eslintPlugin;
|
|
3
|
-
export type { ESLintPluginConfig } from './lib/config';
|
|
4
|
-
export {
|
|
3
|
+
export type { ESLintPluginConfig } from './lib/config.js';
|
|
4
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProject, eslintConfigFromNxProjectAndDeps, eslintConfigFromNxProjects, } from './lib/nx/index.js';
|
package/src/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { eslintPlugin } from './lib/eslint-plugin.js';
|
|
2
|
+
export default eslintPlugin;
|
|
3
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProject, eslintConfigFromNxProjectAndDeps, eslintConfigFromNxProjects, } from './lib/nx/index.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/plugin-eslint/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAe,YAAY,CAAC;AAI5B,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { toArray } from '@code-pushup/utils';
|
|
3
|
+
const patternsSchema = z.union([z.string(), z.array(z.string()).min(1)], {
|
|
4
|
+
description: 'Lint target files. May contain file paths, directory paths or glob patterns',
|
|
5
|
+
});
|
|
6
|
+
const eslintrcSchema = z.string({ description: 'Path to ESLint config file' });
|
|
7
|
+
const eslintTargetObjectSchema = z.object({
|
|
8
|
+
eslintrc: eslintrcSchema.optional(),
|
|
9
|
+
patterns: patternsSchema,
|
|
10
|
+
});
|
|
11
|
+
export const eslintTargetSchema = z
|
|
12
|
+
.union([patternsSchema, eslintTargetObjectSchema])
|
|
13
|
+
.transform((target) => typeof target === 'string' || Array.isArray(target)
|
|
14
|
+
? { patterns: target }
|
|
15
|
+
: target);
|
|
16
|
+
export const eslintPluginConfigSchema = z
|
|
17
|
+
.union([eslintTargetSchema, z.array(eslintTargetSchema).min(1)])
|
|
18
|
+
.transform(toArray);
|
|
19
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../packages/plugin-eslint/src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;IACvE,WAAW,EACT,6EAA6E;CAChF,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAE/E,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,cAAc;CACzB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,KAAK,CAAC,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;KACjD,SAAS,CACR,CAAC,MAAM,EAAsB,EAAE,CAC7B,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACjD,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;IACtB,CAAC,CAAC,MAAM,CACb,CAAC;AAGJ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/D,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { eslintPluginConfigSchema } from './config.js';
|
|
5
|
+
import { listAuditsAndGroups } from './meta/index.js';
|
|
6
|
+
import { createRunnerConfig } from './runner/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Instantiates Code PushUp ESLint plugin for use in core config.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import eslintPlugin from '@code-pushup/eslint-plugin'
|
|
12
|
+
*
|
|
13
|
+
* export default {
|
|
14
|
+
* // ... core config ...
|
|
15
|
+
* plugins: [
|
|
16
|
+
* // ... other plugins ...
|
|
17
|
+
* await eslintPlugin({
|
|
18
|
+
* eslintrc: '.eslintrc.json',
|
|
19
|
+
* patterns: ['src', 'test/*.spec.js']
|
|
20
|
+
* })
|
|
21
|
+
* ]
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* @param config Configuration options.
|
|
25
|
+
* @returns Plugin configuration as a promise.
|
|
26
|
+
*/
|
|
27
|
+
export async function eslintPlugin(config) {
|
|
28
|
+
const targets = eslintPluginConfigSchema.parse(config);
|
|
29
|
+
const { audits, groups } = await listAuditsAndGroups(targets);
|
|
30
|
+
const runnerScriptPath = path.join(fileURLToPath(path.dirname(import.meta.url)), '..', 'bin.js');
|
|
31
|
+
const packageJson = createRequire(import.meta.url)('../../package.json');
|
|
32
|
+
return {
|
|
33
|
+
slug: 'eslint',
|
|
34
|
+
title: 'ESLint',
|
|
35
|
+
icon: 'eslint',
|
|
36
|
+
description: 'Official Code PushUp ESLint plugin',
|
|
37
|
+
docsUrl: 'https://www.npmjs.com/package/@code-pushup/eslint-plugin',
|
|
38
|
+
packageName: packageJson.name,
|
|
39
|
+
version: packageJson.version,
|
|
40
|
+
audits,
|
|
41
|
+
groups,
|
|
42
|
+
runner: await createRunnerConfig(runnerScriptPath, audits, targets),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=eslint-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint-plugin.js","sourceRoot":"","sources":["../../../../../packages/plugin-eslint/src/lib/eslint-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAA2B,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0B;IAE1B,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEvD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,QAAQ,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,0DAA0D;QACnE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAE5B,MAAM;QACN,MAAM;QAEN,MAAM,EAAE,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
package/src/lib/meta/groups.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Group } from '@code-pushup/models';
|
|
2
|
-
import { type RuleData } from './parse';
|
|
2
|
+
import { type RuleData } from './parse.js';
|
|
3
3
|
export declare function groupsFromRuleTypes(rules: RuleData[]): Group[];
|
|
4
4
|
export declare function groupsFromRuleCategories(rules: RuleData[]): Group[];
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { objectToKeys, slugify } from '@code-pushup/utils';
|
|
2
|
+
import { ruleToSlug } from './hash.js';
|
|
3
|
+
import { parseRuleId } from './parse.js';
|
|
4
|
+
// docs on meta.type: https://eslint.org/docs/latest/extend/custom-rules#rule-structure
|
|
5
|
+
const typeGroups = {
|
|
6
|
+
problem: {
|
|
7
|
+
slug: 'problems',
|
|
8
|
+
title: 'Problems',
|
|
9
|
+
description: 'Code that either will cause an error or may cause confusing behavior. Developers should consider this a high priority to resolve.',
|
|
10
|
+
},
|
|
11
|
+
suggestion: {
|
|
12
|
+
slug: 'suggestions',
|
|
13
|
+
title: 'Suggestions',
|
|
14
|
+
description: "Something that could be done in a better way but no errors will occur if the code isn't changed.",
|
|
15
|
+
},
|
|
16
|
+
layout: {
|
|
17
|
+
slug: 'formatting',
|
|
18
|
+
title: 'Formatting',
|
|
19
|
+
description: 'Primarily about whitespace, semicolons, commas, and parentheses, all the parts of the program that determine how the code looks rather than how it executes.',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export function groupsFromRuleTypes(rules) {
|
|
23
|
+
const allTypes = objectToKeys(typeGroups);
|
|
24
|
+
const auditSlugsMap = rules.reduce((acc, rule) => rule.meta.type == null
|
|
25
|
+
? acc
|
|
26
|
+
: {
|
|
27
|
+
...acc,
|
|
28
|
+
[rule.meta.type]: [
|
|
29
|
+
...(acc[rule.meta.type] ?? []),
|
|
30
|
+
ruleToSlug(rule),
|
|
31
|
+
],
|
|
32
|
+
}, {});
|
|
33
|
+
return allTypes
|
|
34
|
+
.map(type => ({
|
|
35
|
+
...typeGroups[type],
|
|
36
|
+
refs: auditSlugsMap[type]?.map((slug) => ({ slug, weight: 1 })) ??
|
|
37
|
+
[],
|
|
38
|
+
}))
|
|
39
|
+
.filter(group => group.refs.length);
|
|
40
|
+
}
|
|
41
|
+
export function groupsFromRuleCategories(rules) {
|
|
42
|
+
const categoriesMap = rules.reduce((acc, rule) => {
|
|
43
|
+
// meta.docs.category still used by some popular plugins (e.g. import, react, functional)
|
|
44
|
+
const category = rule.meta.docs?.category;
|
|
45
|
+
if (!category) {
|
|
46
|
+
return acc;
|
|
47
|
+
}
|
|
48
|
+
const { plugin = '' } = parseRuleId(rule.id);
|
|
49
|
+
return {
|
|
50
|
+
...acc,
|
|
51
|
+
[plugin]: {
|
|
52
|
+
...acc[plugin],
|
|
53
|
+
[category]: [...(acc[plugin]?.[category] ?? []), ruleToSlug(rule)],
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}, {});
|
|
57
|
+
const groups = Object.entries(categoriesMap).flatMap(([plugin, categories]) => Object.entries(categories).map(([category, slugs]) => ({
|
|
58
|
+
slug: `${slugify(plugin)}-${slugify(category)}`,
|
|
59
|
+
title: `${category} (${plugin})`,
|
|
60
|
+
refs: slugs.map(slug => ({ slug, weight: 1 })),
|
|
61
|
+
})));
|
|
62
|
+
return groups.toSorted((a, b) => a.slug.localeCompare(b.slug));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/groups.ts"],"names":[],"mappings":"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"}
|
package/src/lib/meta/hash.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
import { type RuleData } from './parse.js';
|
|
2
|
+
export declare function ruleToSlug(rule: RuleData): string;
|
|
1
3
|
export declare function ruleIdToSlug(ruleId: string, options: unknown[] | undefined): string;
|
|
2
4
|
export declare function jsonHash(data: unknown, bytes?: number): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { slugify } from '@code-pushup/utils';
|
|
3
|
+
import { resolveRuleOptions } from './parse.js';
|
|
4
|
+
export function ruleToSlug(rule) {
|
|
5
|
+
return ruleIdToSlug(rule.id, resolveRuleOptions(rule));
|
|
6
|
+
}
|
|
7
|
+
export function ruleIdToSlug(ruleId, options) {
|
|
8
|
+
const slug = slugify(ruleId);
|
|
9
|
+
if (!options?.length) {
|
|
10
|
+
return slug;
|
|
11
|
+
}
|
|
12
|
+
return `${slug}-${jsonHash(options)}`;
|
|
13
|
+
}
|
|
14
|
+
export function jsonHash(data, bytes = 8) {
|
|
15
|
+
return createHash('shake256', { outputLength: bytes })
|
|
16
|
+
.update(JSON.stringify(data) || 'null')
|
|
17
|
+
.digest('hex');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAiB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,OAA8B;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAa,EAAE,KAAK,GAAG,CAAC;IAC/C,OAAO,UAAU,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;SACnD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;SACtC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
|
package/src/lib/meta/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Audit, Group } from '@code-pushup/models';
|
|
2
|
-
import type { ESLintTarget } from '../config';
|
|
3
|
-
export {
|
|
2
|
+
import type { ESLintTarget } from '../config.js';
|
|
3
|
+
export { ruleIdToSlug } from './hash.js';
|
|
4
|
+
export { detectConfigVersion, type ConfigFormat } from './versions/index.js';
|
|
4
5
|
export declare function listAuditsAndGroups(targets: ESLintTarget[]): Promise<{
|
|
5
6
|
audits: Audit[];
|
|
6
7
|
groups: Group[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { groupsFromRuleCategories, groupsFromRuleTypes } from './groups.js';
|
|
2
|
+
import { listRules } from './rules.js';
|
|
3
|
+
import { ruleToAudit } from './transform.js';
|
|
4
|
+
export { ruleIdToSlug } from './hash.js';
|
|
5
|
+
export { detectConfigVersion } from './versions/index.js';
|
|
6
|
+
export async function listAuditsAndGroups(targets) {
|
|
7
|
+
const rules = await listRules(targets);
|
|
8
|
+
const audits = rules.map(ruleToAudit);
|
|
9
|
+
const groups = [
|
|
10
|
+
...groupsFromRuleTypes(rules),
|
|
11
|
+
...groupsFromRuleCategories(rules),
|
|
12
|
+
];
|
|
13
|
+
return { audits, groups };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,qBAAqB,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG;QACb,GAAG,mBAAmB,CAAC,KAAK,CAAC;QAC7B,GAAG,wBAAwB,CAAC,KAAK,CAAC;KACnC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
package/src/lib/meta/parse.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Linter, Rule } from 'eslint';
|
|
2
2
|
export type RuleData = {
|
|
3
|
-
|
|
3
|
+
id: string;
|
|
4
4
|
meta: Rule.RuleMetaData;
|
|
5
5
|
options: unknown[] | undefined;
|
|
6
6
|
};
|
|
@@ -10,3 +10,4 @@ export declare function parseRuleId(ruleId: string): {
|
|
|
10
10
|
};
|
|
11
11
|
export declare function isRuleOff(entry: Linter.RuleEntry<unknown[]>): boolean;
|
|
12
12
|
export declare function optionsFromRuleEntry(entry: Linter.RuleEntry<unknown[]>): unknown[];
|
|
13
|
+
export declare function resolveRuleOptions(rule: RuleData): unknown[] | undefined;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { toArray } from '@code-pushup/utils';
|
|
2
|
+
export function parseRuleId(ruleId) {
|
|
3
|
+
const i = ruleId.startsWith('@')
|
|
4
|
+
? ruleId.lastIndexOf('/')
|
|
5
|
+
: ruleId.indexOf('/');
|
|
6
|
+
if (i === -1) {
|
|
7
|
+
return { name: ruleId };
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
plugin: ruleId.slice(0, i),
|
|
11
|
+
name: ruleId.slice(i + 1),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function isRuleOff(entry) {
|
|
15
|
+
const level = Array.isArray(entry) ? entry[0] : entry;
|
|
16
|
+
switch (level) {
|
|
17
|
+
case 0:
|
|
18
|
+
case 'off':
|
|
19
|
+
return true;
|
|
20
|
+
case 1:
|
|
21
|
+
case 2:
|
|
22
|
+
case 'warn':
|
|
23
|
+
case 'error':
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function optionsFromRuleEntry(entry) {
|
|
28
|
+
return toArray(entry).slice(1);
|
|
29
|
+
}
|
|
30
|
+
export function resolveRuleOptions(rule) {
|
|
31
|
+
if (rule.options?.length) {
|
|
32
|
+
return rule.options;
|
|
33
|
+
}
|
|
34
|
+
return rule.meta.defaultOptions;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAQ7C,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAkC;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEtD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,CAAC;QACP,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;QACd,KAAK,CAAC,CAAC;QACP,KAAK,CAAC,CAAC;QACP,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAkC;IAElC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,CAAC"}
|
package/src/lib/meta/rules.d.ts
CHANGED
|
@@ -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 listRules(targets: ESLintTarget[]): Promise<RuleData[]>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsonHash } from './hash.js';
|
|
2
|
+
import { detectConfigVersion, selectRulesLoader } from './versions/index.js';
|
|
3
|
+
export async function listRules(targets) {
|
|
4
|
+
const version = await detectConfigVersion();
|
|
5
|
+
const loadRulesMap = selectRulesLoader(version);
|
|
6
|
+
const rulesMap = await targets.reduce(async (acc, target) => {
|
|
7
|
+
const map = await acc;
|
|
8
|
+
const rules = await loadRulesMap(target);
|
|
9
|
+
return rules.reduce(mergeRuleIntoMap, map);
|
|
10
|
+
}, Promise.resolve({}));
|
|
11
|
+
return Object.values(rulesMap).flatMap(Object.values);
|
|
12
|
+
}
|
|
13
|
+
function mergeRuleIntoMap(map, rule) {
|
|
14
|
+
return {
|
|
15
|
+
...map,
|
|
16
|
+
[rule.id]: {
|
|
17
|
+
...map[rule.id],
|
|
18
|
+
[jsonHash(rule.options)]: rule,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAuB;IACrD,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,EAAE,OAAO,CAAC,OAAO,CAAW,EAAE,CAAC,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAW,MAAM,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAa,EAAE,IAAc;IACrD,OAAO;QACL,GAAG,GAAG;QACN,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACT,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACf,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI;SAC/B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Audit } from '@code-pushup/models';
|
|
2
|
-
import type { RuleData } from './parse';
|
|
3
|
-
export declare function ruleToAudit(
|
|
2
|
+
import type { RuleData } from './parse.js';
|
|
3
|
+
export declare function ruleToAudit(rule: RuleData): Audit;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { truncateDescription, truncateTitle } from '@code-pushup/utils';
|
|
2
|
+
import { ruleToSlug } from './hash.js';
|
|
3
|
+
export function ruleToAudit(rule) {
|
|
4
|
+
const name = rule.id.split('/').at(-1) ?? rule.id;
|
|
5
|
+
const plugin = name === rule.id ? null : rule.id.slice(0, rule.id.lastIndexOf('/'));
|
|
6
|
+
const pluginContext = plugin ? `, from _${plugin}_ plugin` : '';
|
|
7
|
+
const lines = [
|
|
8
|
+
`ESLint rule **${name}**${pluginContext}.`,
|
|
9
|
+
...(rule.options?.length ? ['Custom options:'] : []),
|
|
10
|
+
...(rule.options?.map(option => ['```json', JSON.stringify(option, null, 2), '```'].join('\n')) ?? []),
|
|
11
|
+
];
|
|
12
|
+
return {
|
|
13
|
+
slug: ruleToSlug(rule),
|
|
14
|
+
title: truncateTitle(rule.meta.docs?.description ?? name),
|
|
15
|
+
description: truncateDescription(lines.join('\n\n')),
|
|
16
|
+
...(rule.meta.docs?.url && {
|
|
17
|
+
docsUrl: rule.meta.docs.url,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/meta/transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;IAClD,MAAM,MAAM,GACV,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhE,MAAM,KAAK,GAAa;QACtB,iBAAiB,IAAI,KAAK,aAAa,GAAG;QAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAC7B,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/D,IAAI,EAAE,CAAC;KACT,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC;QACzD,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;YACzB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC5B,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ConfigFormat } from './formats';
|
|
1
|
+
import type { ConfigFormat } from './formats.js';
|
|
2
2
|
export declare function detectConfigVersion(): Promise<ConfigFormat>;
|
|
@@ -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
|