@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.
Files changed (81) hide show
  1. package/package.json +8 -7
  2. package/src/bin.js +3 -0
  3. package/src/bin.js.map +1 -0
  4. package/src/index.d.ts +3 -3
  5. package/src/index.js +4 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/config.js +19 -0
  8. package/src/lib/config.js.map +1 -0
  9. package/src/lib/eslint-plugin.d.ts +1 -1
  10. package/src/lib/eslint-plugin.js +45 -0
  11. package/src/lib/eslint-plugin.js.map +1 -0
  12. package/src/lib/meta/groups.d.ts +1 -1
  13. package/src/lib/meta/groups.js +64 -0
  14. package/src/lib/meta/groups.js.map +1 -0
  15. package/src/lib/meta/hash.d.ts +2 -0
  16. package/src/lib/meta/hash.js +19 -0
  17. package/src/lib/meta/hash.js.map +1 -0
  18. package/src/lib/meta/index.d.ts +3 -2
  19. package/src/lib/meta/index.js +15 -0
  20. package/src/lib/meta/index.js.map +1 -0
  21. package/src/lib/meta/parse.d.ts +2 -1
  22. package/src/lib/meta/parse.js +36 -0
  23. package/src/lib/meta/parse.js.map +1 -0
  24. package/src/lib/meta/rules.d.ts +2 -2
  25. package/src/lib/meta/rules.js +22 -0
  26. package/src/lib/meta/rules.js.map +1 -0
  27. package/src/lib/meta/transform.d.ts +2 -2
  28. package/src/lib/meta/transform.js +21 -0
  29. package/src/lib/meta/transform.js.map +1 -0
  30. package/src/lib/meta/versions/detect.d.ts +1 -1
  31. package/src/lib/meta/versions/detect.js +22 -0
  32. package/src/lib/meta/versions/detect.js.map +1 -0
  33. package/src/lib/meta/versions/flat.d.ts +2 -2
  34. package/src/lib/meta/versions/flat.js +81 -0
  35. package/src/lib/meta/versions/flat.js.map +1 -0
  36. package/src/lib/meta/versions/formats.js +2 -0
  37. package/src/lib/meta/versions/formats.js.map +1 -0
  38. package/src/lib/meta/versions/index.d.ts +5 -5
  39. package/src/lib/meta/versions/index.js +12 -0
  40. package/src/lib/meta/versions/index.js.map +1 -0
  41. package/src/lib/meta/versions/legacy.d.ts +2 -2
  42. package/src/lib/meta/versions/legacy.js +36 -0
  43. package/src/lib/meta/versions/legacy.js.map +1 -0
  44. package/src/lib/nx/filter-project-graph.js +12 -0
  45. package/src/lib/nx/filter-project-graph.js.map +1 -0
  46. package/src/lib/nx/find-all-projects.d.ts +1 -1
  47. package/src/lib/nx/find-all-projects.js +40 -0
  48. package/src/lib/nx/find-all-projects.js.map +1 -0
  49. package/src/lib/nx/find-project-with-deps.d.ts +1 -1
  50. package/src/lib/nx/find-project-with-deps.js +35 -0
  51. package/src/lib/nx/find-project-with-deps.js.map +1 -0
  52. package/src/lib/nx/find-project-without-deps.d.ts +1 -1
  53. package/src/lib/nx/find-project-without-deps.js +36 -0
  54. package/src/lib/nx/find-project-without-deps.js.map +1 -0
  55. package/src/lib/nx/index.d.ts +3 -3
  56. package/src/lib/nx/index.js +4 -0
  57. package/src/lib/nx/index.js.map +1 -0
  58. package/src/lib/nx/projects-to-config.d.ts +1 -1
  59. package/src/lib/nx/projects-to-config.js +18 -0
  60. package/src/lib/nx/projects-to-config.js.map +1 -0
  61. package/src/lib/nx/traverse-graph.js +21 -0
  62. package/src/lib/nx/traverse-graph.js.map +1 -0
  63. package/src/lib/nx/utils.d.ts +1 -1
  64. package/src/lib/nx/utils.js +75 -0
  65. package/src/lib/nx/utils.js.map +1 -0
  66. package/src/lib/runner/index.d.ts +1 -1
  67. package/src/lib/runner/index.js +37 -0
  68. package/src/lib/runner/index.js.map +1 -0
  69. package/src/lib/runner/lint.d.ts +2 -2
  70. package/src/lib/runner/lint.js +49 -0
  71. package/src/lib/runner/lint.js.map +1 -0
  72. package/src/lib/runner/transform.d.ts +1 -1
  73. package/src/lib/runner/transform.js +74 -0
  74. package/src/lib/runner/transform.js.map +1 -0
  75. package/src/lib/runner/types.js +2 -0
  76. package/src/lib/runner/types.js.map +1 -0
  77. package/src/lib/setup.d.ts +1 -1
  78. package/src/lib/setup.js +17 -0
  79. package/src/lib/setup.js.map +1 -0
  80. package/bin.js +0 -1129
  81. package/index.js +0 -1413
@@ -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,5 +1,5 @@
1
1
  import type { Audit, RunnerConfig } from '@code-pushup/models';
2
- import type { ESLintTarget } from '../config';
2
+ import type { ESLintTarget } from '../config.js';
3
3
  export declare const WORKDIR: string;
4
4
  export declare const RUNNER_OUTPUT_PATH: string;
5
5
  export declare const PLUGIN_CONFIG_PATH: string;
@@ -0,0 +1,37 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ensureDirectoryExists, filePathToCliArg, pluginWorkDir, readJsonFile, } from '@code-pushup/utils';
4
+ import { lint } from './lint.js';
5
+ import { lintResultsToAudits, mergeLinterOutputs } from './transform.js';
6
+ export const WORKDIR = pluginWorkDir('eslint');
7
+ export const RUNNER_OUTPUT_PATH = path.join(WORKDIR, 'runner-output.json');
8
+ export const PLUGIN_CONFIG_PATH = path.join(process.cwd(), WORKDIR, 'plugin-config.json');
9
+ export async function executeRunner() {
10
+ const { slugs, targets } = await readJsonFile(PLUGIN_CONFIG_PATH);
11
+ const linterOutputs = await targets.reduce(async (acc, target) => [...(await acc), await lint(target)], Promise.resolve([]));
12
+ const lintResults = mergeLinterOutputs(linterOutputs);
13
+ const failedAudits = lintResultsToAudits(lintResults);
14
+ const audits = slugs.map((slug) => failedAudits.find(audit => audit.slug === slug) ?? {
15
+ slug,
16
+ score: 1,
17
+ value: 0,
18
+ displayValue: 'passed',
19
+ details: { issues: [] },
20
+ });
21
+ await ensureDirectoryExists(path.dirname(RUNNER_OUTPUT_PATH));
22
+ await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(audits));
23
+ }
24
+ export async function createRunnerConfig(scriptPath, audits, targets) {
25
+ const config = {
26
+ targets,
27
+ slugs: audits.map(audit => audit.slug),
28
+ };
29
+ await ensureDirectoryExists(path.dirname(PLUGIN_CONFIG_PATH));
30
+ await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config));
31
+ return {
32
+ command: 'node',
33
+ args: [filePathToCliArg(scriptPath)],
34
+ outputFile: RUNNER_OUTPUT_PATH,
35
+ };
36
+ }
37
+ //# 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;AAE7B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzE,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CACzC,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,EACP,oBAAoB,CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GACtB,MAAM,YAAY,CAA2B,kBAAkB,CAAC,CAAC;IAEnE,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,kBAAkB,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,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,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,UAAU,EAAE,kBAAkB;KAC/B,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>;
@@ -0,0 +1,49 @@
1
+ import { platform } from 'node:os';
2
+ import { distinct, executeProcess, filePathToCliArg, toArray, } from '@code-pushup/utils';
3
+ import { setupESLint } from '../setup.js';
4
+ export async function lint({ eslintrc, patterns, }) {
5
+ const results = await executeLint({ eslintrc, patterns });
6
+ const eslint = await setupESLint(eslintrc);
7
+ const ruleOptionsPerFile = await loadRuleOptionsPerFile(eslint, results);
8
+ return { results, ruleOptionsPerFile };
9
+ }
10
+ async function executeLint({ eslintrc, patterns, }) {
11
+ // running as CLI because ESLint#lintFiles() runs out of memory
12
+ const { stdout } = await executeProcess({
13
+ command: 'npx',
14
+ args: [
15
+ 'eslint',
16
+ ...(eslintrc ? [`--config=${filePathToCliArg(eslintrc)}`] : []),
17
+ ...(typeof eslintrc === 'object' ? ['--no-eslintrc'] : []),
18
+ '--no-error-on-unmatched-pattern',
19
+ '--format=json',
20
+ ...toArray(patterns).map(pattern =>
21
+ // globs need to be escaped on Unix
22
+ platform() === 'win32' ? pattern : `'${pattern}'`),
23
+ ],
24
+ ignoreExitCode: true,
25
+ cwd: process.cwd(),
26
+ });
27
+ return JSON.parse(stdout);
28
+ }
29
+ function loadRuleOptionsPerFile(eslint, results) {
30
+ return results.reduce(async (acc, { filePath, messages }) => {
31
+ const filesMap = await acc;
32
+ const config = (await eslint.calculateConfigForFile(filePath));
33
+ const ruleIds = distinct(messages
34
+ .map(({ ruleId }) => ruleId)
35
+ .filter((ruleId) => ruleId != null));
36
+ const rulesMap = Object.fromEntries(ruleIds.map(ruleId => [
37
+ ruleId,
38
+ toArray(config.rules?.[ruleId] ?? []).slice(1),
39
+ ]));
40
+ return {
41
+ ...filesMap,
42
+ [filePath]: {
43
+ ...filesMap[filePath],
44
+ ...rulesMap,
45
+ },
46
+ };
47
+ }, Promise.resolve({}));
48
+ }
49
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/runner/lint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,OAAO,GACR,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EACzB,QAAQ,EACR,QAAQ,GACK;IACb,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EACzB,QAAQ,EACR,QAAQ,GACK;IACb,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC;QACtC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,QAAQ;YACR,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,iCAAiC;YACjC,eAAe;YACf,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACjC,mCAAmC;YACnC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAClD;SACF;QACD,cAAc,EAAE,IAAI;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAwB,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAc,EACd,OAA4B;IAE5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,sBAAsB,CACjD,QAAQ,CACT,CAAkB,CAAC;QACpB,MAAM,OAAO,GAAG,QAAQ,CACtB,QAAQ;aACL,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC;aAC3B,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CACxD,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,MAAM;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;SAC/C,CAAC,CACH,CAAC;QACF,OAAO;YACL,GAAG,QAAQ;YACX,CAAC,QAAQ,CAAC,EAAE;gBACV,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACrB,GAAG,QAAQ;aACZ;SACF,CAAC;IACJ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAqB,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { AuditOutput } from '@code-pushup/models';
2
- import type { LinterOutput } from './types';
2
+ import type { LinterOutput } from './types.js';
3
3
  export declare function mergeLinterOutputs(outputs: LinterOutput[]): LinterOutput;
4
4
  export declare function lintResultsToAudits({ results, ruleOptionsPerFile, }: LinterOutput): AuditOutput[];
@@ -0,0 +1,74 @@
1
+ import { compareIssueSeverity, countOccurrences, objectToEntries, pluralizeToken, truncateIssueMessage, ui, } from '@code-pushup/utils';
2
+ import { ruleIdToSlug } from '../meta/index.js';
3
+ export function mergeLinterOutputs(outputs) {
4
+ return outputs.reduce((acc, { results, ruleOptionsPerFile }) => ({
5
+ results: [...acc.results, ...results],
6
+ ruleOptionsPerFile: { ...acc.ruleOptionsPerFile, ...ruleOptionsPerFile },
7
+ }), { results: [], ruleOptionsPerFile: {} });
8
+ }
9
+ export function lintResultsToAudits({ results, ruleOptionsPerFile, }) {
10
+ const issuesPerAudit = results
11
+ .flatMap(({ messages, filePath }) => messages.map((message) => ({ ...message, filePath })))
12
+ .reduce((acc, issue) => {
13
+ const { ruleId, message, filePath } = issue;
14
+ if (!ruleId) {
15
+ ui().logger.warning(`ESLint core error - ${message} (file: ${filePath})`);
16
+ return acc;
17
+ }
18
+ const options = ruleOptionsPerFile[filePath]?.[ruleId] ?? [];
19
+ const auditSlug = ruleIdToSlug(ruleId, options);
20
+ return { ...acc, [auditSlug]: [...(acc[auditSlug] ?? []), issue] };
21
+ }, {});
22
+ return Object.entries(issuesPerAudit).map(entry => toAudit(...entry));
23
+ }
24
+ function toAudit(slug, issues) {
25
+ const auditIssues = issues.map(convertIssue);
26
+ const severityCounts = countOccurrences(auditIssues.map(({ severity }) => severity));
27
+ const severities = objectToEntries(severityCounts);
28
+ const summaryText = severities
29
+ .toSorted((a, b) => -compareIssueSeverity(a[0], b[0]))
30
+ .map(([severity, count = 0]) => pluralizeToken(severity, count))
31
+ .join(', ');
32
+ return {
33
+ slug,
34
+ score: Number(auditIssues.length === 0),
35
+ value: auditIssues.length,
36
+ displayValue: summaryText,
37
+ details: {
38
+ issues: auditIssues,
39
+ },
40
+ };
41
+ }
42
+ function convertIssue(issue) {
43
+ return {
44
+ message: truncateIssueMessage(issue.message),
45
+ severity: convertSeverity(issue.severity),
46
+ source: {
47
+ file: issue.filePath,
48
+ ...(issue.line > 0 && {
49
+ position: {
50
+ startLine: issue.line,
51
+ ...(issue.column > 0 && { startColumn: issue.column }),
52
+ ...(issue.endLine &&
53
+ issue.endLine > 0 && {
54
+ endLine: issue.endLine,
55
+ }),
56
+ ...(issue.endColumn &&
57
+ issue.endColumn > 0 && { endColumn: issue.endColumn }),
58
+ },
59
+ }),
60
+ },
61
+ };
62
+ }
63
+ function convertSeverity(severity) {
64
+ switch (severity) {
65
+ case 2:
66
+ return 'error';
67
+ case 1:
68
+ return 'warning';
69
+ case 0:
70
+ // shouldn't happen
71
+ throw new Error(`Unexpected severity ${severity} in ESLint results`);
72
+ }
73
+ }
74
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/runner/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/runner/types.ts"],"names":[],"mappings":""}
@@ -1,3 +1,3 @@
1
1
  import { ESLint } from 'eslint';
2
- import type { ESLintTarget } from './config';
2
+ import type { ESLintTarget } from './config.js';
3
3
  export declare function setupESLint(eslintrc: ESLintTarget['eslintrc']): Promise<ESLint>;
@@ -0,0 +1,17 @@
1
+ import { ESLint } from 'eslint';
2
+ export async function setupESLint(eslintrc) {
3
+ const eslintConstructor = await loadESLint();
4
+ return new eslintConstructor({
5
+ overrideConfigFile: eslintrc,
6
+ errorOnUnmatchedPattern: false,
7
+ });
8
+ }
9
+ async function loadESLint() {
10
+ const eslint = await import('eslint');
11
+ // loadESLint added to public API in v9, selects ESLint or LegacyESLint based on environment
12
+ if ('loadESLint' in eslint && typeof eslint.loadESLint === 'function') {
13
+ return (await eslint.loadESLint());
14
+ }
15
+ return ESLint;
16
+ }
17
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../packages/plugin-eslint/src/lib/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAkC;IAClE,MAAM,iBAAiB,GAAG,MAAM,UAAU,EAAE,CAAC;IAC7C,OAAO,IAAI,iBAAiB,CAAC;QAC3B,kBAAkB,EAAE,QAAQ;QAC5B,uBAAuB,EAAE,KAAK;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,4FAA4F;IAC5F,IAAI,YAAY,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACtE,OAAO,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAkB,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}