@code-pushup/eslint-plugin
Version:
Code PushUp plugin for detecting problems in source code using ESLint.📋
49 lines • 1.93 kB
JavaScript
import { platform } from 'node:os';
import { distinct, executeProcess, filePathToCliArg, toArray, } from '@code-pushup/utils';
import { setupESLint } from '../setup.js';
export async function lint({ eslintrc, patterns, }) {
const results = await executeLint({ eslintrc, patterns });
const eslint = await setupESLint(eslintrc);
const ruleOptionsPerFile = await loadRuleOptionsPerFile(eslint, results);
return { results, ruleOptionsPerFile };
}
async function executeLint({ eslintrc, patterns, }) {
// running as CLI because ESLint#lintFiles() runs out of memory
const { stdout } = await executeProcess({
command: 'npx',
args: [
'eslint',
...(eslintrc ? [`--config=${filePathToCliArg(eslintrc)}`] : []),
...(typeof eslintrc === 'object' ? ['--no-eslintrc'] : []),
'--no-error-on-unmatched-pattern',
'--format=json',
...toArray(patterns).map(pattern =>
// globs need to be escaped on Unix
platform() === 'win32' ? pattern : `'${pattern}'`),
],
ignoreExitCode: true,
cwd: process.cwd(),
});
return JSON.parse(stdout);
}
function loadRuleOptionsPerFile(eslint, results) {
return results.reduce(async (acc, { filePath, messages }) => {
const filesMap = await acc;
const config = (await eslint.calculateConfigForFile(filePath));
const ruleIds = distinct(messages
.map(({ ruleId }) => ruleId)
.filter((ruleId) => ruleId != null));
const rulesMap = Object.fromEntries(ruleIds.map(ruleId => [
ruleId,
toArray(config.rules?.[ruleId] ?? []).slice(1),
]));
return {
...filesMap,
[filePath]: {
...filesMap[filePath],
...rulesMap,
},
};
}, Promise.resolve({}));
}
//# sourceMappingURL=lint.js.map