@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-eslint/src/lib/meta/versions/legacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAiB,SAAS,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAC7C,QAAQ,EACR,QAAQ,GACK;IACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC5C,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;QACtB,GAAG,CAAC,MAAM,GAAG,CAAC;QACd,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAwB;KACtE,EACD,OAAO,CAAC,OAAO,CAAwB,EAAE,CAAC,CAC3C,CAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAC3D,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC;QAC9C,yEAAyE;QACzE;YACE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,kBAAkB,EAAE,EAAoC;SACpC;KACvB,CAAC,CAAC;IAEH,OAAO,OAAO;SACX,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAmB,EAAE;QACpC,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,yFAAyF;QACzF,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QAChD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;SACD,MAAM,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function filterProjectGraph(projectGraph, exclude = []) {
|
|
2
|
+
const filteredNodes = Object.entries(projectGraph.nodes).reduce((acc, [projectName, projectNode]) => exclude.includes(projectName)
|
|
3
|
+
? acc
|
|
4
|
+
: { ...acc, [projectName]: projectNode }, {});
|
|
5
|
+
const filteredDependencies = Object.entries(projectGraph.dependencies).reduce((acc, [key, deps]) => exclude.includes(key) ? acc : { ...acc, [key]: deps }, {});
|
|
6
|
+
return {
|
|
7
|
+
nodes: filteredNodes,
|
|
8
|
+
dependencies: filteredDependencies,
|
|
9
|
+
version: projectGraph.version,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=filter-project-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-project-graph.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/filter-project-graph.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,kBAAkB,CAChC,YAA0B,EAC1B,UAAoB,EAAE;IAEtB,MAAM,aAAa,GAA4C,MAAM,CAAC,OAAO,CAC3E,YAAY,CAAC,KAAK,CACnB,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,EAC5C,EAAE,CACH,CAAC;IACF,MAAM,oBAAoB,GACxB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CACnB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EACvD,EAAE,CACH,CAAC;IACJ,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,oBAAoB;QAClC,OAAO,EAAE,YAAY,CAAC,OAAO;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { filterProjectGraph } from './filter-project-graph.js';
|
|
2
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Finds all Nx projects in workspace and converts their lint configurations to Code PushUp ESLint plugin parameters.
|
|
5
|
+
*
|
|
6
|
+
* Allows excluding certain projects from the configuration using the `options.exclude` parameter.
|
|
7
|
+
*
|
|
8
|
+
* Use when you wish to automatically include every Nx project in a single Code PushUp project.
|
|
9
|
+
* If you prefer to include only a subset of your Nx monorepo, specify projects to exclude using the `exclude` option
|
|
10
|
+
* or consider using {@link eslintConfigFromNxProjectAndDeps} for finer control.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import eslintPlugin, {
|
|
14
|
+
* eslintConfigFromAllNxProjects,
|
|
15
|
+
* } from '@code-pushup/eslint-plugin';
|
|
16
|
+
*
|
|
17
|
+
* export default {
|
|
18
|
+
* plugins: [
|
|
19
|
+
* await eslintPlugin(
|
|
20
|
+
* await eslintConfigFromAllNxProjects({ exclude: ['server'] })
|
|
21
|
+
* )
|
|
22
|
+
* ]
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @param options - Configuration options to filter projects
|
|
26
|
+
* @param options.exclude - Array of project names to exclude from the ESLint configuration
|
|
27
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
28
|
+
*/
|
|
29
|
+
export async function eslintConfigFromAllNxProjects(options = {}) {
|
|
30
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
31
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
32
|
+
const filteredProjectGraph = filterProjectGraph(projectGraph, options.exclude);
|
|
33
|
+
return nxProjectsToConfig(filteredProjectGraph);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @deprecated
|
|
37
|
+
* Helper is renamed, please use `eslintConfigFromAllNxProjects` function instead.
|
|
38
|
+
*/
|
|
39
|
+
export const eslintConfigFromNxProjects = eslintConfigFromAllNxProjects;
|
|
40
|
+
//# sourceMappingURL=find-all-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-all-projects.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-all-projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,UAAkC,EAAE;IAEpC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,oBAAoB,GAAG,kBAAkB,CAC7C,YAAY,EACZ,OAAO,CAAC,OAAO,CAChB,CAAC;IACF,OAAO,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
2
|
+
import { findAllDependencies } from './traverse-graph.js';
|
|
3
|
+
/**
|
|
4
|
+
* Accepts a target Nx projects, finds projects it depends on, and converts lint configurations to Code PushUp ESLint plugin parameters.
|
|
5
|
+
*
|
|
6
|
+
* Use when you wish to include a targeted subset of your Nx monorepo in your Code PushUp project.
|
|
7
|
+
* If you prefer to include all Nx projects, refer to {@link eslintConfigFromAllNxProjects} instead.
|
|
8
|
+
* if you'd like to skip dependencies of the provided target project use {@link eslintConfigFromNxProject} instead.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import eslintPlugin, {
|
|
12
|
+
* eslintConfigFromNxProjectAndDeps,
|
|
13
|
+
* } from '@code-pushup/eslint-plugin';
|
|
14
|
+
*
|
|
15
|
+
* const projectName = 'backoffice'; // <-- name from project.json
|
|
16
|
+
*
|
|
17
|
+
* export default {
|
|
18
|
+
* plugins: [
|
|
19
|
+
* await eslintPlugin(
|
|
20
|
+
* await eslintConfigFromNxProjectAndDeps(projectName)
|
|
21
|
+
* )
|
|
22
|
+
* ]
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @param projectName Nx project serving as main entry point
|
|
26
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
27
|
+
*/
|
|
28
|
+
export async function eslintConfigFromNxProjectAndDeps(projectName) {
|
|
29
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
30
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
31
|
+
const dependencies = findAllDependencies(projectName, projectGraph);
|
|
32
|
+
return nxProjectsToConfig(projectGraph, project => !!project.name &&
|
|
33
|
+
(project.name === projectName || dependencies.has(project.name)));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=find-project-with-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-project-with-deps.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAmB;IAEnB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEpE,OAAO,kBAAkB,CACvB,YAAY,EACZ,OAAO,CAAC,EAAE,CACR,CAAC,CAAC,OAAO,CAAC,IAAI;QACd,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { nxProjectsToConfig } from './projects-to-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Accepts a target Nx project, converts its lint configuration to Code PushUp ESLint plugin parameters.
|
|
4
|
+
*
|
|
5
|
+
* Use when you wish to only have a single Nx project as your Code PushUp project, without any other dependencies.
|
|
6
|
+
* If you prefer to include all Nx projects, refer to {@link eslintConfigFromAllNxProjects} instead.
|
|
7
|
+
* If you'd like to auto include all dependencies of the provided target project use {@link eslintConfigFromNxProjectAndDeps} instead.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import eslintPlugin, {
|
|
11
|
+
* eslintConfigFromNxProject,
|
|
12
|
+
* } from '@code-pushup/eslint-plugin';
|
|
13
|
+
*
|
|
14
|
+
* const projectName = 'backoffice'; // <-- name from project.json
|
|
15
|
+
*
|
|
16
|
+
* export default {
|
|
17
|
+
* plugins: [
|
|
18
|
+
* await eslintPlugin(
|
|
19
|
+
* await eslintConfigFromNxProject(projectName)
|
|
20
|
+
* )
|
|
21
|
+
* ]
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* @param projectName Nx project name
|
|
25
|
+
* @returns ESLint config and patterns, intended to be passed to {@link eslintPlugin}
|
|
26
|
+
*/
|
|
27
|
+
export async function eslintConfigFromNxProject(projectName) {
|
|
28
|
+
const { createProjectGraphAsync } = await import('@nx/devkit');
|
|
29
|
+
const projectGraph = await createProjectGraphAsync({ exitOnError: false });
|
|
30
|
+
const [project] = await nxProjectsToConfig(projectGraph, ({ name }) => !!name && name === projectName);
|
|
31
|
+
if (!project) {
|
|
32
|
+
throw new Error(`Couldn't find Nx project named "${projectName}"`);
|
|
33
|
+
}
|
|
34
|
+
return project;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=find-project-without-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-project-without-deps.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB;IAEnB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,kBAAkB,CACxC,YAAY,EACZ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,WAAW,CAC7C,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,WAAW,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/src/lib/nx/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProjects, } from './find-all-projects.js';
|
|
2
|
+
export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps.js';
|
|
3
|
+
export { eslintConfigFromNxProject } from './find-project-without-deps.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProjects, } from './find-all-projects.js';
|
|
2
|
+
export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps.js';
|
|
3
|
+
export { eslintConfigFromNxProject } from './find-project-without-deps.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ProjectConfiguration, ProjectGraph } from '@nx/devkit';
|
|
2
|
-
import type { ESLintTarget } from '../config';
|
|
2
|
+
import type { ESLintTarget } from '../config.js';
|
|
3
3
|
export declare function nxProjectsToConfig(projectGraph: ProjectGraph, predicate?: (project: ProjectConfiguration) => boolean): Promise<ESLintTarget[]>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { detectConfigVersion } from '../meta/index.js';
|
|
2
|
+
import { findCodePushupEslintConfig, findEslintConfig, getLintFilePatterns, } from './utils.js';
|
|
3
|
+
export async function nxProjectsToConfig(projectGraph, predicate = () => true) {
|
|
4
|
+
// find Nx projects with lint target
|
|
5
|
+
const { readProjectsConfigurationFromProjectGraph } = await import('@nx/devkit');
|
|
6
|
+
const projectsConfiguration = readProjectsConfigurationFromProjectGraph(projectGraph);
|
|
7
|
+
const projects = Object.values(projectsConfiguration.projects)
|
|
8
|
+
.filter(project => 'lint' in (project.targets ?? {}))
|
|
9
|
+
.filter(predicate) // apply predicate
|
|
10
|
+
.sort((a, b) => a.root.localeCompare(b.root));
|
|
11
|
+
const format = await detectConfigVersion();
|
|
12
|
+
return Promise.all(projects.map(async (project) => ({
|
|
13
|
+
eslintrc: (await findCodePushupEslintConfig(project, format)) ??
|
|
14
|
+
(await findEslintConfig(project, format)),
|
|
15
|
+
patterns: getLintFilePatterns(project, format),
|
|
16
|
+
})));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=projects-to-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects-to-config.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/projects-to-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,YAAwD,GAAG,EAAE,CAAC,IAAI;IAElE,oCAAoC;IACpC,MAAM,EAAE,yCAAyC,EAAE,GAAG,MAAM,MAAM,CAChE,YAAY,CACb,CAAC;IACF,MAAM,qBAAqB,GACzB,yCAAyC,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC;SAC3D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;SACpD,MAAM,CAAC,SAAS,CAAC,CAAC,kBAAkB;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAE3C,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CACV,KAAK,EAAE,OAAO,EAAyB,EAAE,CAAC,CAAC;QACzC,QAAQ,EACN,CAAC,MAAM,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;KAC/C,CAAC,CACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function findAllDependencies(entry, projectGraph) {
|
|
2
|
+
const results = new Set();
|
|
3
|
+
const queue = [entry];
|
|
4
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
5
|
+
while (queue.length > 0) {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, functional/immutable-data
|
|
7
|
+
const source = queue.shift();
|
|
8
|
+
const dependencies = projectGraph.dependencies[source];
|
|
9
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
10
|
+
for (const { target } of dependencies ?? []) {
|
|
11
|
+
// skip duplicates (cycle in graph)
|
|
12
|
+
if (!results.has(target) && target !== entry) {
|
|
13
|
+
results.add(target);
|
|
14
|
+
// eslint-disable-next-line functional/immutable-data
|
|
15
|
+
queue.push(target);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return results;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=traverse-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse-graph.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/traverse-graph.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,YAA0B;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAEtB,yDAAyD;IACzD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,+FAA+F;QAC/F,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEvD,yDAAyD;QACzD,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;YAC5C,mCAAmC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,qDAAqD;gBACrD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/src/lib/nx/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ProjectConfiguration } from '@nx/devkit';
|
|
2
|
-
import type { ConfigFormat } from '../meta';
|
|
2
|
+
import type { ConfigFormat } from '../meta/index.js';
|
|
3
3
|
export declare function findCodePushupEslintConfig(project: ProjectConfiguration, format: ConfigFormat): Promise<string | undefined>;
|
|
4
4
|
export declare function findEslintConfig(project: ProjectConfiguration, format: ConfigFormat): Promise<string | undefined>;
|
|
5
5
|
export declare function getLintFilePatterns(project: ProjectConfiguration, format: ConfigFormat): string[];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileExists, toArray } from '@code-pushup/utils';
|
|
3
|
+
const ESLINT_CONFIG_EXTENSIONS = {
|
|
4
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats
|
|
5
|
+
flat: ['js', 'mjs', 'cjs'],
|
|
6
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files-deprecated
|
|
7
|
+
legacy: ['json', 'js', 'cjs', 'yml', 'yaml'],
|
|
8
|
+
};
|
|
9
|
+
const ESLINT_CONFIG_NAMES = {
|
|
10
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats
|
|
11
|
+
flat: ['eslint.config'],
|
|
12
|
+
// https://eslint.org/docs/latest/use/configure/configuration-files-deprecated
|
|
13
|
+
legacy: ['.eslintrc'],
|
|
14
|
+
};
|
|
15
|
+
const CP_ESLINT_CONFIG_NAMES = {
|
|
16
|
+
flat: [
|
|
17
|
+
'code-pushup.eslint.config',
|
|
18
|
+
'eslint.code-pushup.config',
|
|
19
|
+
'eslint.config.code-pushup',
|
|
20
|
+
'eslint.strict.config',
|
|
21
|
+
'eslint.config.strict',
|
|
22
|
+
],
|
|
23
|
+
legacy: ['code-pushup.eslintrc', '.eslintrc.code-pushup', '.eslintrc.strict'],
|
|
24
|
+
};
|
|
25
|
+
export async function findCodePushupEslintConfig(project, format) {
|
|
26
|
+
return findProjectFile(project, {
|
|
27
|
+
names: CP_ESLINT_CONFIG_NAMES[format],
|
|
28
|
+
extensions: ESLINT_CONFIG_EXTENSIONS[format],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function findEslintConfig(project, format) {
|
|
32
|
+
const options = project.targets?.['lint']?.options;
|
|
33
|
+
return (options?.eslintConfig ??
|
|
34
|
+
(await findProjectFile(project, {
|
|
35
|
+
names: ESLINT_CONFIG_NAMES[format],
|
|
36
|
+
extensions: ESLINT_CONFIG_EXTENSIONS[format],
|
|
37
|
+
})));
|
|
38
|
+
}
|
|
39
|
+
export function getLintFilePatterns(project, format) {
|
|
40
|
+
const options = project.targets?.['lint']?.options;
|
|
41
|
+
// lintFilePatterns defaults to ["{projectRoot}"] - https://github.com/nrwl/nx/pull/20313
|
|
42
|
+
const defaultPatterns = format === 'legacy'
|
|
43
|
+
? `${project.root}/**/*` // files not folder needed for legacy because rules detected with ESLint.calculateConfigForFile
|
|
44
|
+
: project.root;
|
|
45
|
+
const patterns = options?.lintFilePatterns == null
|
|
46
|
+
? [defaultPatterns]
|
|
47
|
+
: toArray(options.lintFilePatterns);
|
|
48
|
+
if (format === 'legacy') {
|
|
49
|
+
return [
|
|
50
|
+
...patterns,
|
|
51
|
+
// HACK: ESLint.calculateConfigForFile won't find rules included only for subsets of *.ts when globs used
|
|
52
|
+
// so we explicitly provide additional patterns used by @code-pushup/eslint-config to ensure those rules are included
|
|
53
|
+
// this workaround is only necessary for legacy configs (rules are detected more reliably in flat configs)
|
|
54
|
+
`${project.root}/*.spec.ts`, // jest/* and vitest/* rules
|
|
55
|
+
`${project.root}/*.cy.ts`, // cypress/* rules
|
|
56
|
+
`${project.root}/*.stories.ts`, // storybook/* rules
|
|
57
|
+
`${project.root}/.storybook/main.ts`, // storybook/no-uninstalled-addons rule
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
return patterns;
|
|
61
|
+
}
|
|
62
|
+
async function findProjectFile(project, file) {
|
|
63
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
64
|
+
for (const name of file.names) {
|
|
65
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
66
|
+
for (const ext of file.extensions) {
|
|
67
|
+
const filename = `./${project.root}/${name}.${ext}`;
|
|
68
|
+
if (await fileExists(path.join(process.cwd(), filename))) {
|
|
69
|
+
return filename;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/nx/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,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"}
|
package/src/lib/runner/lint.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ESLintTarget } from '../config';
|
|
2
|
-
import type { LinterOutput } from './types';
|
|
1
|
+
import type { ESLintTarget } from '../config.js';
|
|
2
|
+
import type { LinterOutput } from './types.js';
|
|
3
3
|
export declare function lint({ eslintrc, patterns, }: ESLintTarget): Promise<LinterOutput>;
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../packages/plugin-eslint/src/lib/runner/types.ts"],"names":[],"mappings":""}
|
package/src/lib/setup.d.ts
CHANGED
package/src/lib/setup.js
ADDED
|
@@ -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"}
|