@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.
Files changed (83) hide show
  1. package/README.md +36 -0
  2. package/package.json +9 -7
  3. package/src/bin.js +6 -0
  4. package/src/bin.js.map +1 -0
  5. package/src/index.d.ts +3 -3
  6. package/src/index.js +4 -0
  7. package/src/index.js.map +1 -0
  8. package/src/lib/config.d.ts +59 -0
  9. package/src/lib/config.js +40 -0
  10. package/src/lib/config.js.map +1 -0
  11. package/src/lib/eslint-plugin.d.ts +3 -2
  12. package/src/lib/eslint-plugin.js +54 -0
  13. package/src/lib/eslint-plugin.js.map +1 -0
  14. package/src/lib/meta/groups.d.ts +8 -1
  15. package/src/lib/meta/groups.js +112 -0
  16. package/src/lib/meta/groups.js.map +1 -0
  17. package/src/lib/meta/hash.d.ts +2 -0
  18. package/src/lib/meta/hash.js +19 -0
  19. package/src/lib/meta/hash.js.map +1 -0
  20. package/src/lib/meta/index.d.ts +4 -3
  21. package/src/lib/meta/index.js +19 -0
  22. package/src/lib/meta/index.js.map +1 -0
  23. package/src/lib/meta/parse.d.ts +2 -1
  24. package/src/lib/meta/parse.js +36 -0
  25. package/src/lib/meta/parse.js.map +1 -0
  26. package/src/lib/meta/rules.d.ts +3 -2
  27. package/src/lib/meta/rules.js +26 -0
  28. package/src/lib/meta/rules.js.map +1 -0
  29. package/src/lib/meta/transform.d.ts +2 -2
  30. package/src/lib/meta/transform.js +21 -0
  31. package/src/lib/meta/transform.js.map +1 -0
  32. package/src/lib/meta/versions/detect.d.ts +1 -1
  33. package/src/lib/meta/versions/detect.js +22 -0
  34. package/src/lib/meta/versions/detect.js.map +1 -0
  35. package/src/lib/meta/versions/flat.d.ts +2 -2
  36. package/src/lib/meta/versions/flat.js +81 -0
  37. package/src/lib/meta/versions/flat.js.map +1 -0
  38. package/src/lib/meta/versions/formats.js +2 -0
  39. package/src/lib/meta/versions/formats.js.map +1 -0
  40. package/src/lib/meta/versions/index.d.ts +5 -5
  41. package/src/lib/meta/versions/index.js +12 -0
  42. package/src/lib/meta/versions/index.js.map +1 -0
  43. package/src/lib/meta/versions/legacy.d.ts +2 -2
  44. package/src/lib/meta/versions/legacy.js +36 -0
  45. package/src/lib/meta/versions/legacy.js.map +1 -0
  46. package/src/lib/nx/filter-project-graph.js +12 -0
  47. package/src/lib/nx/filter-project-graph.js.map +1 -0
  48. package/src/lib/nx/find-all-projects.d.ts +1 -1
  49. package/src/lib/nx/find-all-projects.js +40 -0
  50. package/src/lib/nx/find-all-projects.js.map +1 -0
  51. package/src/lib/nx/find-project-with-deps.d.ts +1 -1
  52. package/src/lib/nx/find-project-with-deps.js +35 -0
  53. package/src/lib/nx/find-project-with-deps.js.map +1 -0
  54. package/src/lib/nx/find-project-without-deps.d.ts +1 -1
  55. package/src/lib/nx/find-project-without-deps.js +36 -0
  56. package/src/lib/nx/find-project-without-deps.js.map +1 -0
  57. package/src/lib/nx/index.d.ts +3 -3
  58. package/src/lib/nx/index.js +4 -0
  59. package/src/lib/nx/index.js.map +1 -0
  60. package/src/lib/nx/projects-to-config.d.ts +1 -1
  61. package/src/lib/nx/projects-to-config.js +18 -0
  62. package/src/lib/nx/projects-to-config.js.map +1 -0
  63. package/src/lib/nx/traverse-graph.js +21 -0
  64. package/src/lib/nx/traverse-graph.js.map +1 -0
  65. package/src/lib/nx/utils.d.ts +1 -1
  66. package/src/lib/nx/utils.js +75 -0
  67. package/src/lib/nx/utils.js.map +1 -0
  68. package/src/lib/runner/index.d.ts +3 -6
  69. package/src/lib/runner/index.js +38 -0
  70. package/src/lib/runner/index.js.map +1 -0
  71. package/src/lib/runner/lint.d.ts +2 -2
  72. package/src/lib/runner/lint.js +49 -0
  73. package/src/lib/runner/lint.js.map +1 -0
  74. package/src/lib/runner/transform.d.ts +1 -1
  75. package/src/lib/runner/transform.js +74 -0
  76. package/src/lib/runner/transform.js.map +1 -0
  77. package/src/lib/runner/types.js +2 -0
  78. package/src/lib/runner/types.js.map +1 -0
  79. package/src/lib/setup.d.ts +1 -1
  80. package/src/lib/setup.js +17 -0
  81. package/src/lib/setup.js.map +1 -0
  82. package/bin.js +0 -1129
  83. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formats.js.map
@@ -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"}
@@ -1,4 +1,4 @@
1
- import type { ESLintTarget } from '../config';
1
+ import type { ESLintTarget } from '../config.js';
2
2
  /**
3
3
  * Finds all Nx projects in workspace and converts their lint configurations to Code PushUp ESLint plugin parameters.
4
4
  *
@@ -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"}
@@ -1,4 +1,4 @@
1
- import type { ESLintTarget } from '../config';
1
+ import type { ESLintTarget } from '../config.js';
2
2
  /**
3
3
  * Accepts a target Nx projects, finds projects it depends on, and converts lint configurations to Code PushUp ESLint plugin parameters.
4
4
  *
@@ -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"}
@@ -1,4 +1,4 @@
1
- import type { ESLintTarget } from '../config';
1
+ import type { ESLintTarget } from '../config.js';
2
2
  /**
3
3
  * Accepts a target Nx project, converts its lint configuration to Code PushUp ESLint plugin parameters.
4
4
  *
@@ -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"}
@@ -1,3 +1,3 @@
1
- export { eslintConfigFromNxProjects, eslintConfigFromAllNxProjects, } from './find-all-projects';
2
- export { eslintConfigFromNxProject } from './find-project-without-deps';
3
- export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps';
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"}
@@ -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 const WORKDIR: string;
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"}
@@ -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>;