443 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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 <STDIN>
 | |
|  * @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
 | |
|  */
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // 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"
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     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"
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     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 <STDIN>"
 | |
|             },
 | |
|             {
 | |
|                 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"]
 | |
|             },
 | |
|             {
 | |
|                 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: "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)
 | |
|     });
 | |
| };
 |