@code-pushup/eslint-plugin 0.76.0 → 0.77.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 +4 -3
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/constants.d.ts +1 -0
- package/src/lib/constants.js +2 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/eslint-plugin.js +2 -1
- package/src/lib/eslint-plugin.js.map +1 -1
- package/src/lib/runner/index.d.ts +6 -1
- package/src/lib/runner/index.js +21 -0
- package/src/lib/runner/index.js.map +1 -1
- package/src/lib/runner/utils.d.ts +3 -0
- package/src/lib/runner/utils.js +27 -0
- package/src/lib/runner/utils.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.77.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Code PushUp plugin for detecting problems in source code using ESLint.📋",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-eslint#readme",
|
|
@@ -38,8 +38,9 @@
|
|
|
38
38
|
},
|
|
39
39
|
"type": "module",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"
|
|
42
|
-
"@code-pushup/
|
|
41
|
+
"glob": "^11.0.0",
|
|
42
|
+
"@code-pushup/utils": "0.77.0",
|
|
43
|
+
"@code-pushup/models": "0.77.0",
|
|
43
44
|
"yargs": "^17.7.2",
|
|
44
45
|
"zod": "^4.0.5"
|
|
45
46
|
},
|
package/src/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { eslintPlugin } from './lib/eslint-plugin.js';
|
|
2
2
|
export default eslintPlugin;
|
|
3
3
|
export type { ESLintPluginConfig } from './lib/config.js';
|
|
4
|
+
export { ESLINT_PLUGIN_SLUG } from './lib/constants.js';
|
|
4
5
|
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProject, eslintConfigFromNxProjectAndDeps, eslintConfigFromNxProjects, } from './lib/nx/index.js';
|
package/src/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { eslintPlugin } from './lib/eslint-plugin.js';
|
|
2
2
|
export default eslintPlugin;
|
|
3
|
+
export { ESLINT_PLUGIN_SLUG } from './lib/constants.js';
|
|
3
4
|
export { eslintConfigFromAllNxProjects, eslintConfigFromNxProject, eslintConfigFromNxProjectAndDeps, eslintConfigFromNxProjects, } from './lib/nx/index.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAe,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAe,YAAY,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ESLINT_PLUGIN_SLUG = "eslint";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC"}
|
package/src/lib/eslint-plugin.js
CHANGED
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { parseSchema } from '@code-pushup/utils';
|
|
5
5
|
import { eslintPluginConfigSchema, eslintPluginOptionsSchema, } from './config.js';
|
|
6
|
+
import { ESLINT_PLUGIN_SLUG } from './constants.js';
|
|
6
7
|
import { listAuditsAndGroups } from './meta/index.js';
|
|
7
8
|
import { createRunnerConfig } from './runner/index.js';
|
|
8
9
|
/**
|
|
@@ -39,7 +40,7 @@ export async function eslintPlugin(config, options) {
|
|
|
39
40
|
const runnerScriptPath = path.join(fileURLToPath(path.dirname(import.meta.url)), '..', 'bin.js');
|
|
40
41
|
const packageJson = createRequire(import.meta.url)('../../package.json');
|
|
41
42
|
return {
|
|
42
|
-
slug:
|
|
43
|
+
slug: ESLINT_PLUGIN_SLUG,
|
|
43
44
|
title: 'ESLint',
|
|
44
45
|
icon: 'eslint',
|
|
45
46
|
description: 'Official Code PushUp ESLint plugin',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-plugin.js","sourceRoot":"","sources":["../../../src/lib/eslint-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAGL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0B,EAC1B,OAA6B;IAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,wBAAwB,EAAE,MAAM,EAAE;QAC5D,UAAU,EAAE,sBAAsB;KACnC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO;QAC1B,CAAC,CAAC,WAAW,CAAC,yBAAyB,EAAE,OAAO,EAAE;YAC9C,UAAU,EAAE,uBAAuB;SACpC,CAAC,CAAC,MAAM;QACX,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE5E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,QAAQ,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"eslint-plugin.js","sourceRoot":"","sources":["../../../src/lib/eslint-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAGL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0B,EAC1B,OAA6B;IAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,wBAAwB,EAAE,MAAM,EAAE;QAC5D,UAAU,EAAE,sBAAsB;KACnC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO;QAC1B,CAAC,CAAC,WAAW,CAAC,yBAAyB,EAAE,OAAO,EAAE;YAC9C,UAAU,EAAE,uBAAuB;SACpC,CAAC,CAAC,MAAM;QACX,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE5E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,QAAQ,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,0DAA0D;QACnE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAE5B,MAAM;QACN,MAAM;QAEN,MAAM,EAAE,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { Audit, RunnerConfig, RunnerFilesPaths } from '@code-pushup/models';
|
|
1
|
+
import type { Audit, AuditOutputs, PluginArtifactOptions, RunnerConfig, RunnerFilesPaths } from '@code-pushup/models';
|
|
2
2
|
import type { ESLintTarget } from '../config.js';
|
|
3
3
|
export declare function executeRunner({ runnerConfigPath, runnerOutputPath, }: RunnerFilesPaths): Promise<void>;
|
|
4
4
|
export declare function createRunnerConfig(scriptPath: string, audits: Audit[], targets: ESLintTarget[]): Promise<RunnerConfig>;
|
|
5
|
+
export declare function generateAuditOutputs(options: {
|
|
6
|
+
audits: Audit[];
|
|
7
|
+
targets: ESLintTarget[];
|
|
8
|
+
artifacts?: PluginArtifactOptions;
|
|
9
|
+
}): Promise<AuditOutputs>;
|
package/src/lib/runner/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { asyncSequential, createRunnerFiles, ensureDirectoryExists, filePathToCliArg, objectToCliArgs, readJsonFile, ui, } from '@code-pushup/utils';
|
|
4
4
|
import { lint } from './lint.js';
|
|
5
5
|
import { lintResultsToAudits, mergeLinterOutputs } from './transform.js';
|
|
6
|
+
import { loadArtifacts } from './utils.js';
|
|
6
7
|
export async function executeRunner({ runnerConfigPath, runnerOutputPath, }) {
|
|
7
8
|
const { slugs, targets } = await readJsonFile(runnerConfigPath);
|
|
8
9
|
ui().logger.log(`ESLint plugin executing ${targets.length} lint targets`);
|
|
@@ -35,4 +36,24 @@ export async function createRunnerConfig(scriptPath, audits, targets) {
|
|
|
35
36
|
outputFile: runnerOutputPath,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
export async function generateAuditOutputs(options) {
|
|
40
|
+
const { audits, targets, artifacts } = options;
|
|
41
|
+
const config = {
|
|
42
|
+
targets,
|
|
43
|
+
slugs: audits.map(audit => audit.slug),
|
|
44
|
+
};
|
|
45
|
+
ui().logger.log(`ESLint plugin executing ${targets.length} lint targets`);
|
|
46
|
+
const linterOutputs = artifacts
|
|
47
|
+
? await loadArtifacts(artifacts)
|
|
48
|
+
: await asyncSequential(targets, lint);
|
|
49
|
+
const lintResults = mergeLinterOutputs(linterOutputs);
|
|
50
|
+
const failedAudits = lintResultsToAudits(lintResults);
|
|
51
|
+
return config.slugs.map((slug) => failedAudits.find(audit => audit.slug === slug) ?? {
|
|
52
|
+
slug,
|
|
53
|
+
score: 1,
|
|
54
|
+
value: 0,
|
|
55
|
+
displayValue: 'passed',
|
|
56
|
+
details: { issues: [] },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
38
59
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/runner/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { glob } from 'glob';
|
|
2
|
+
import { executeProcess, readJsonFile } from '@code-pushup/utils';
|
|
3
|
+
export async function loadArtifacts(artifacts) {
|
|
4
|
+
if (artifacts.generateArtifactsCommand) {
|
|
5
|
+
const { command, args = [] } = typeof artifacts.generateArtifactsCommand === 'string'
|
|
6
|
+
? { command: artifacts.generateArtifactsCommand }
|
|
7
|
+
: artifacts.generateArtifactsCommand;
|
|
8
|
+
await executeProcess({
|
|
9
|
+
command,
|
|
10
|
+
args,
|
|
11
|
+
ignoreExitCode: true,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
const initialArtifactPaths = Array.isArray(artifacts.artifactsPaths)
|
|
15
|
+
? artifacts.artifactsPaths
|
|
16
|
+
: [artifacts.artifactsPaths];
|
|
17
|
+
const artifactPaths = await glob(initialArtifactPaths);
|
|
18
|
+
return await Promise.all(artifactPaths.map(async (artifactPath) => {
|
|
19
|
+
// ESLint CLI outputs raw ESLint.LintResult[], but we need LinterOutput format
|
|
20
|
+
const results = await readJsonFile(artifactPath);
|
|
21
|
+
return {
|
|
22
|
+
results,
|
|
23
|
+
ruleOptionsPerFile: {}, // TODO
|
|
24
|
+
};
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/lib/runner/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAgC;IAEhC,IAAI,SAAS,CAAC,wBAAwB,EAAE,CAAC;QACvC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAC1B,OAAO,SAAS,CAAC,wBAAwB,KAAK,QAAQ;YACpD,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,wBAAwB,EAAE;YACjD,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAEzC,MAAM,cAAc,CAAC;YACnB,OAAO;YACP,IAAI;YACJ,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC;QAClE,CAAC,CAAC,SAAS,CAAC,cAAc;QAC1B,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE/B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEvD,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,aAAa,CAAC,GAAG,CAAC,KAAK,EAAC,YAAY,EAAC,EAAE;QACrC,8EAA8E;QAC9E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAsB,YAAY,CAAC,CAAC;QACtE,OAAO;YACL,OAAO;YACP,kBAAkB,EAAE,EAAE,EAAE,OAAO;SAChC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|