UNPKG

@code-pushup/eslint-plugin

Version:

Code PushUp plugin for detecting problems in source code using ESLint.📋

113 lines • 3.86 kB
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