UNPKG

eslint-index

Version:

CLI for finding and managing rules in ESLint config files

98 lines (93 loc) 2.9 kB
/* eslint-disable global-require */ /* eslint-disable import/no-dynamic-require */ const fs = require('fs') const path = require('path') const _ = require('lodash') const yargs = require('yargs') const Constants = require('./constants') function coerceRules(rules) { const parsedRules = rules.map((rule) => { if (rule.endsWith('.js')) { const file = path.resolve(rule) const stats = fs.statSync(file) if (stats && stats.isFile()) { const module = require(file) return _.isArray(module) || _.isString(module) ? module : rule } else { return rule } } else { return rule } }) return _.uniq(_.flatten(parsedRules)) } const argv = yargs.usage('Usage: $0 <file> [options]') .example('$0 .eslintrc', 'List all available rules') .example('$0 .eslintrc --format number', 'Output the number of rules') .example('$0 .eslintrc --format table', 'Output rule group and status numbers in a table') .example('$0 .eslintrc --groups eslint react', 'List all available rules for "eslint" and "react"') .example('$0 .eslintrc --status omitted off', 'List rules that have been turned "off" or "omitted"') .example('$0 .eslintrc --exclude curly semi', 'List all available rules excluding "curly" and "semi"') .example('$0 .eslintrc --docs', 'Display links to rule docs alongside each rule') .demand(1, '.eslintrc config file required') .check((args) => { const file = _.first(args._) const stats = fs.statSync(file) if (stats && stats.isFile()) { return true } else { throw new Error(`${file} does not exist`) } }) .options({ format: { alias: 'f', type: 'string', choices: Constants.FORMATS, default: Constants.FORMAT_LIST, description: 'Format output as a list, table or number' }, groups: { alias: 'g', type: 'array', description: 'Filter rules by group such as "eslint" or "react"' }, status: { alias: 's', type: 'array', choices: Constants.STATUS_KEYS, description: 'Filter rules by status such as "omitted" or "error"' }, docs: { alias: 'd', type: 'boolean', description: 'Display links to rule docs alongside each rule' }, include: { alias: 'i', type: 'array', description: 'Filter rule ids to the output (can be a JS file that exports an array of rule ids)', coerce: coerceRules }, exclude: { alias: 'e', type: 'array', description: 'Reject rule ids from the output (can be a JS file that exports an array of rule ids)', coerce: coerceRules } }) .recommendCommands() .wrap(100) .strict() .help() .argv module.exports = { file: _.first(argv._), include: argv.include, exclude: argv.exclude, groups: argv.groups, status: argv.status, format: argv.format, docs: argv.docs }