@code-pushup/eslint-plugin
Version:
Code PushUp plugin for detecting problems in source code using ESLint.📋
113 lines • 3.86 kB
JavaScript
import { readdir } from 'node:fs/promises';
import { createRequire } from 'node:module';
import path from 'node:path';
import { answerArray, answerBoolean, answerString, directoryExists, hasDependency, readJsonFile, singleQuote, } from '@code-pushup/utils';
import { DEFAULT_PATTERN, ESLINT_PLUGIN_SLUG, ESLINT_PLUGIN_TITLE, } from './constants.js';
const { name: PACKAGE_NAME } = createRequire(import.meta.url)('../../package.json');
const ESLINT_CONFIG_PATTERN = /^(\.eslintrc(\.\w+)?|eslint\.config\.\w+)$/;
const ESLINT_CATEGORIES = [
{
slug: 'bug-prevention',
title: 'Bug prevention',
description: 'Lint rules that find **potential bugs** in your code.',
refs: [
{
type: 'group',
plugin: ESLINT_PLUGIN_SLUG,
slug: 'problems',
weight: 1,
},
],
},
{
slug: 'code-style',
title: 'Code style',
description: 'Lint rules that promote **good practices** and consistency in your code.',
refs: [
{
type: 'group',
plugin: ESLINT_PLUGIN_SLUG,
slug: 'suggestions',
weight: 1,
},
],
},
];
export const eslintSetupBinding = {
slug: ESLINT_PLUGIN_SLUG,
title: ESLINT_PLUGIN_TITLE,
packageName: PACKAGE_NAME,
isRecommended,
prompts: async (targetDir) => [
{
key: 'eslint.eslintrc',
message: 'Path to ESLint config:',
type: 'input',
default: (await detectEslintConfig(targetDir)) ?? '',
},
{
key: 'eslint.patterns',
message: 'File patterns to lint:',
type: 'input',
default: (await directoryExists(path.join(targetDir, 'src')))
? 'src'
: DEFAULT_PATTERN,
},
{
key: 'eslint.categories',
message: 'Add categories?',
type: 'confirm',
default: true,
},
],
generateConfig: ({ answers }) => {
const options = parseAnswers(answers);
return {
imports: [
{ moduleSpecifier: PACKAGE_NAME, defaultImport: 'eslintPlugin' },
],
pluginInit: formatPluginInit(options),
...(options.categories ? { categories: ESLINT_CATEGORIES } : {}),
};
},
};
function parseAnswers(answers) {
return {
eslintrc: answerString(answers, 'eslint.eslintrc'),
patterns: answerArray(answers, 'eslint.patterns'),
categories: answerBoolean(answers, 'eslint.categories'),
};
}
function formatPluginInit({ eslintrc, patterns }) {
const useCustomEslintrc = eslintrc !== '' && !ESLINT_CONFIG_PATTERN.test(eslintrc);
const customPatterns = patterns
.filter(s => s !== '' && s !== DEFAULT_PATTERN)
.map(singleQuote);
const body = [
useCustomEslintrc ? `eslintrc: ${singleQuote(eslintrc)}` : '',
customPatterns.length === 1 ? `patterns: ${customPatterns[0]}` : '',
customPatterns.length > 1 ? `patterns: [${customPatterns.join(', ')}]` : '',
]
.filter(Boolean)
.join(', ');
return body
? [`await eslintPlugin({ ${body} }),`]
: ['await eslintPlugin(),'];
}
async function isRecommended(targetDir) {
if (await detectEslintConfig(targetDir)) {
return true;
}
try {
const packageJson = await readJsonFile(path.join(targetDir, 'package.json'));
return hasDependency(packageJson, 'eslint');
}
catch {
return false;
}
}
async function detectEslintConfig(targetDir) {
const files = await readdir(targetDir, { encoding: 'utf8' });
return files.find(file => ESLINT_CONFIG_PATTERN.test(file));
}
//# sourceMappingURL=binding.js.map