/** * @fileoverview Options configuration for optionator. * @author George Zahariev */ 'use strict'; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const optionator = require('optionator'); //------------------------------------------------------------------------------ // Typedefs //------------------------------------------------------------------------------ /** * The options object parsed by Optionator. * @typedef {Object} ParsedCLIOptions * @property {boolean} cache Only check changed files * @property {string} cacheFile Path to the cache file. Deprecated: use --cache-location * @property {string} [cacheLocation] Path to the cache file or directory * @property {"metadata" | "content"} cacheStrategy Strategy to use for detecting changed files in the cache * @property {boolean} [color] Force enabling/disabling of color * @property {string} [config] Use this configuration, overriding .eslintrc.* config options if present * @property {boolean} debug Output debugging information * @property {string[]} [env] Specify environments * @property {boolean} envInfo Output execution environment information * @property {boolean} errorOnUnmatchedPattern Prevent errors when pattern is unmatched * @property {boolean} eslintrc Disable use of configuration from .eslintrc.* * @property {string[]} [ext] Specify JavaScript file extensions * @property {string[]} [flag] Feature flags * @property {boolean} fix Automatically fix problems * @property {boolean} fixDryRun Automatically fix problems without saving the changes to the file system * @property {("directive" | "problem" | "suggestion" | "layout")[]} [fixType] Specify the types of fixes to apply (directive, problem, suggestion, layout) * @property {string} format Use a specific output format * @property {string[]} [global] Define global variables * @property {boolean} [help] Show help * @property {boolean} ignore Disable use of ignore files and patterns * @property {string} [ignorePath] Specify path of ignore file * @property {string[]} [ignorePattern] Patterns of files to ignore. In eslintrc mode, these are in addition to `.eslintignore` * @property {boolean} init Run config initialization wizard * @property {boolean} inlineConfig Prevent comments from changing config or rules * @property {number} maxWarnings Number of warnings to trigger nonzero exit code * @property {string} [outputFile] Specify file to write report to * @property {string} [parser] Specify the parser to be used * @property {Object} [parserOptions] Specify parser options * @property {string[]} [plugin] Specify plugins * @property {string} [printConfig] Print the configuration for the given file * @property {boolean | undefined} reportUnusedDisableDirectives Adds reported errors for unused eslint-disable and eslint-enable directives * @property {string | undefined} reportUnusedDisableDirectivesSeverity A severity string indicating if and how unused disable and enable directives should be tracked and reported. * @property {string} [resolvePluginsRelativeTo] A folder where plugins should be resolved from, CWD by default * @property {Object} [rule] Specify rules * @property {string[]} [rulesdir] Load additional rules from this directory. Deprecated: Use rules from plugins * @property {boolean} stdin Lint code provided on * @property {string} [stdinFilename] Specify filename to process STDIN as * @property {boolean} quiet Report errors only * @property {boolean} [version] Output the version number * @property {boolean} warnIgnored Show warnings when the file list includes ignored files * @property {boolean} [passOnNoPatterns=false] When set to true, missing patterns cause * the linting operation to short circuit and not report any failures. * @property {string[]} _ Positional filenames or patterns * @property {boolean} [stats] Report additional statistics * @property {boolean} [suppressAll] Suppress all error violations * @property {string[]} [suppressRule] Suppress specific rules * @property {string} [suppressionsLocation] Path to the suppressions file or directory * @property {boolean} [pruneSuppressions] Prune unused suppressions */ //------------------------------------------------------------------------------ // Initialization and Public Interface //------------------------------------------------------------------------------ // exports "parse(args)", "generateHelp()", and "generateHelpForOption(optionName)" /** * Creates the CLI options for ESLint. * @param {boolean} usingFlatConfig Indicates if flat config is being used. * @returns {Object} The optionator instance. */ module.exports = function (usingFlatConfig) { let lookupFlag; if (usingFlatConfig) { lookupFlag = { option: 'config-lookup', type: 'Boolean', default: 'true', description: 'Disable look up for eslint.config.js', }; } else { lookupFlag = { option: 'eslintrc', type: 'Boolean', default: 'true', description: 'Disable use of configuration from .eslintrc.*', }; } let envFlag; if (!usingFlatConfig) { envFlag = { option: 'env', type: '[String]', description: 'Specify environments', }; } let inspectConfigFlag; if (usingFlatConfig) { inspectConfigFlag = { option: 'inspect-config', type: 'Boolean', description: 'Open the config inspector with the current configuration', }; } let extFlag; if (!usingFlatConfig) { extFlag = { option: 'ext', type: '[String]', description: 'Specify JavaScript file extensions', }; } else { extFlag = { option: 'ext', type: '[String]', description: 'Specify additional file extensions to lint', }; } let resolvePluginsFlag; if (!usingFlatConfig) { resolvePluginsFlag = { option: 'resolve-plugins-relative-to', type: 'path::String', description: 'A folder where plugins should be resolved from, CWD by default', }; } let rulesDirFlag; if (!usingFlatConfig) { rulesDirFlag = { option: 'rulesdir', type: '[path::String]', description: 'Load additional rules from this directory. Deprecated: Use rules from plugins', }; } let ignorePathFlag; if (!usingFlatConfig) { ignorePathFlag = { option: 'ignore-path', type: 'path::String', description: 'Specify path of ignore file', }; } let statsFlag; if (usingFlatConfig) { statsFlag = { option: 'stats', type: 'Boolean', default: 'false', description: 'Add statistics to the lint report', }; } let warnIgnoredFlag; if (usingFlatConfig) { warnIgnoredFlag = { option: 'warn-ignored', type: 'Boolean', default: 'true', description: 'Suppress warnings when the file list includes ignored files', }; } let flagFlag; if (usingFlatConfig) { flagFlag = { option: 'flag', type: '[String]', description: 'Enable a feature flag', }; } let reportUnusedInlineConfigsFlag; if (usingFlatConfig) { reportUnusedInlineConfigsFlag = { option: 'report-unused-inline-configs', type: 'String', default: void 0, description: 'Adds reported errors for unused eslint inline config comments', enum: ['off', 'warn', 'error', '0', '1', '2'], }; } return optionator({ prepend: 'eslint [options] file.js [file.js] [dir]', defaults: { concatRepeatedArrays: true, mergeRepeatedObjects: true, }, options: [ { heading: 'Basic configuration', }, lookupFlag, { option: 'config', alias: 'c', type: 'path::String', description: usingFlatConfig ? 'Use this configuration instead of eslint.config.js, eslint.config.mjs, or eslint.config.cjs' : 'Use this configuration, overriding .eslintrc.* config options if present', }, inspectConfigFlag, envFlag, extFlag, { option: 'global', type: '[String]', description: 'Define global variables', }, { option: 'parser', type: 'String', description: 'Specify the parser to be used', }, { option: 'parser-options', type: 'Object', description: 'Specify parser options', }, resolvePluginsFlag, { heading: 'Specify Rules and Plugins', }, { option: 'plugin', type: '[String]', description: 'Specify plugins', }, { option: 'rule', type: 'Object', description: 'Specify rules', }, rulesDirFlag, { heading: 'Fix Problems', }, { option: 'fix', type: 'Boolean', default: false, description: 'Automatically fix problems', }, { option: 'fix-dry-run', type: 'Boolean', default: false, description: 'Automatically fix problems without saving the changes to the file system', }, { option: 'fix-type', type: 'Array', description: 'Specify the types of fixes to apply (directive, problem, suggestion, layout)', }, { heading: 'Ignore Files', }, ignorePathFlag, { option: 'ignore', type: 'Boolean', default: 'true', description: 'Disable use of ignore files and patterns', }, { option: 'ignore-pattern', type: '[String]', description: `Patterns of files to ignore${usingFlatConfig ? '' : ' (in addition to those in .eslintignore)'}`, concatRepeatedArrays: [ true, { oneValuePerFlag: true, }, ], }, { heading: 'Use stdin', }, { option: 'stdin', type: 'Boolean', default: 'false', description: 'Lint code provided on ', }, { option: 'stdin-filename', type: 'String', description: 'Specify filename to process STDIN as', }, { heading: 'Handle Warnings', }, { option: 'quiet', type: 'Boolean', default: 'false', description: 'Report errors only', }, { option: 'max-warnings', type: 'Int', default: '-1', description: 'Number of warnings to trigger nonzero exit code', }, { heading: 'Output', }, { option: 'output-file', alias: 'o', type: 'path::String', description: 'Specify file to write report to', }, { option: 'format', alias: 'f', type: 'String', default: 'stylish', description: 'Use a specific output format', }, { option: 'color', type: 'Boolean', alias: 'no-color', description: 'Force enabling/disabling of color', }, { heading: 'Inline configuration comments', }, { option: 'inline-config', type: 'Boolean', default: 'true', description: 'Prevent comments from changing config or rules', }, { option: 'report-unused-disable-directives', type: 'Boolean', default: void 0, description: 'Adds reported errors for unused eslint-disable and eslint-enable directives', }, { option: 'report-unused-disable-directives-severity', type: 'String', default: void 0, description: 'Chooses severity level for reporting unused eslint-disable and eslint-enable directives', enum: ['off', 'warn', 'error', '0', '1', '2'], }, reportUnusedInlineConfigsFlag, { heading: 'Caching', }, { option: 'cache', type: 'Boolean', default: 'false', description: 'Only check changed files', }, { option: 'cache-file', type: 'path::String', default: '.eslintcache', description: 'Path to the cache file. Deprecated: use --cache-location', }, { option: 'cache-location', type: 'path::String', description: 'Path to the cache file or directory', }, { option: 'cache-strategy', dependsOn: ['cache'], type: 'String', default: 'metadata', enum: ['metadata', 'content'], description: 'Strategy to use for detecting changed files in the cache', }, { heading: 'Suppressing Violations', }, { option: 'suppress-all', type: 'Boolean', default: 'false', description: 'Suppress all violations', }, { option: 'suppress-rule', type: '[String]', description: 'Suppress specific rules', }, { option: 'suppressions-location', type: 'path::String', description: 'Specify the location of the suppressions file', }, { option: 'prune-suppressions', type: 'Boolean', default: 'false', description: 'Prune unused suppressions', }, { heading: 'Miscellaneous', }, { option: 'init', type: 'Boolean', default: 'false', description: 'Run config initialization wizard', }, { option: 'env-info', type: 'Boolean', default: 'false', description: 'Output execution environment information', }, { option: 'error-on-unmatched-pattern', type: 'Boolean', default: 'true', description: 'Prevent errors when pattern is unmatched', }, { option: 'exit-on-fatal-error', type: 'Boolean', default: 'false', description: 'Exit with exit code 2 in case of fatal error', }, warnIgnoredFlag, { option: 'pass-on-no-patterns', type: 'Boolean', default: false, description: 'Exit with exit code 0 in case no file patterns are passed', }, { option: 'debug', type: 'Boolean', default: false, description: 'Output debugging information', }, { option: 'help', alias: 'h', type: 'Boolean', description: 'Show help', }, { option: 'version', alias: 'v', type: 'Boolean', description: 'Output the version number', }, { option: 'print-config', type: 'path::String', description: 'Print the configuration for the given file', }, statsFlag, flagFlag, ].filter((value) => !!value), }); };