update socials section
This commit is contained in:
		
							
								
								
									
										1078
									
								
								node_modules/eslint/lib/cli-engine/cli-engine.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1078
									
								
								node_modules/eslint/lib/cli-engine/cli-engine.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										547
									
								
								node_modules/eslint/lib/cli-engine/file-enumerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										547
									
								
								node_modules/eslint/lib/cli-engine/file-enumerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,547 @@ | ||||
| /** | ||||
|  * @fileoverview `FileEnumerator` class. | ||||
|  * | ||||
|  * `FileEnumerator` class has two responsibilities: | ||||
|  * | ||||
|  * 1. Find target files by processing glob patterns. | ||||
|  * 2. Tie each target file and appropriate configuration. | ||||
|  * | ||||
|  * It provides a method: | ||||
|  * | ||||
|  * - `iterateFiles(patterns)` | ||||
|  *     Iterate files which are matched by given patterns together with the | ||||
|  *     corresponded configuration. This is for `CLIEngine#executeOnFiles()`. | ||||
|  *     While iterating files, it loads the configuration file of each directory | ||||
|  *     before iterate files on the directory, so we can use the configuration | ||||
|  *     files to determine target files. | ||||
|  * | ||||
|  * @example | ||||
|  * const enumerator = new FileEnumerator(); | ||||
|  * const linter = new Linter(); | ||||
|  * | ||||
|  * for (const { config, filePath } of enumerator.iterateFiles(["*.js"])) { | ||||
|  *     const code = fs.readFileSync(filePath, "utf8"); | ||||
|  *     const messages = linter.verify(code, config, filePath); | ||||
|  * | ||||
|  *     console.log(messages); | ||||
|  * } | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const fs = require("fs"); | ||||
| const path = require("path"); | ||||
| const getGlobParent = require("glob-parent"); | ||||
| const isGlob = require("is-glob"); | ||||
| const escapeRegExp = require("escape-string-regexp"); | ||||
| const { Minimatch } = require("minimatch"); | ||||
|  | ||||
| const { | ||||
|     Legacy: { | ||||
|         IgnorePattern, | ||||
|         CascadingConfigArrayFactory | ||||
|     } | ||||
| } = require("@eslint/eslintrc"); | ||||
| const debug = require("debug")("eslint:file-enumerator"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const minimatchOpts = { dot: true, matchBase: true }; | ||||
| const dotfilesPattern = /(?:(?:^\.)|(?:[/\\]\.))[^/\\.].*/u; | ||||
| const NONE = 0; | ||||
| const IGNORED_SILENTLY = 1; | ||||
| const IGNORED = 2; | ||||
|  | ||||
| // For VSCode intellisense | ||||
| /** @typedef {ReturnType<CascadingConfigArrayFactory.getConfigArrayForFile>} ConfigArray */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} FileEnumeratorOptions | ||||
|  * @property {CascadingConfigArrayFactory} [configArrayFactory] The factory for config arrays. | ||||
|  * @property {string} [cwd] The base directory to start lookup. | ||||
|  * @property {string[]} [extensions] The extensions to match files for directory patterns. | ||||
|  * @property {boolean} [globInputPaths] Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file. | ||||
|  * @property {boolean} [ignore] The flag to check ignored files. | ||||
|  * @property {string[]} [rulePaths] The value of `--rulesdir` option. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} FileAndConfig | ||||
|  * @property {string} filePath The path to a target file. | ||||
|  * @property {ConfigArray} config The config entries of that file. | ||||
|  * @property {boolean} ignored If `true` then this file should be ignored and warned because it was directly specified. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} FileEntry | ||||
|  * @property {string} filePath The path to a target file. | ||||
|  * @property {ConfigArray} config The config entries of that file. | ||||
|  * @property {NONE|IGNORED_SILENTLY|IGNORED} flag The flag. | ||||
|  * - `NONE` means the file is a target file. | ||||
|  * - `IGNORED_SILENTLY` means the file should be ignored silently. | ||||
|  * - `IGNORED` means the file should be ignored and warned because it was directly specified. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} FileEnumeratorInternalSlots | ||||
|  * @property {CascadingConfigArrayFactory} configArrayFactory The factory for config arrays. | ||||
|  * @property {string} cwd The base directory to start lookup. | ||||
|  * @property {RegExp|null} extensionRegExp The RegExp to test if a string ends with specific file extensions. | ||||
|  * @property {boolean} globInputPaths Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file. | ||||
|  * @property {boolean} ignoreFlag The flag to check ignored files. | ||||
|  * @property {(filePath:string, dot:boolean) => boolean} defaultIgnores The default predicate function to ignore files. | ||||
|  */ | ||||
|  | ||||
| /** @type {WeakMap<FileEnumerator, FileEnumeratorInternalSlots>} */ | ||||
| const internalSlotsMap = new WeakMap(); | ||||
|  | ||||
| /** | ||||
|  * Check if a string is a glob pattern or not. | ||||
|  * @param {string} pattern A glob pattern. | ||||
|  * @returns {boolean} `true` if the string is a glob pattern. | ||||
|  */ | ||||
| function isGlobPattern(pattern) { | ||||
|     return isGlob(path.sep === "\\" ? pattern.replace(/\\/gu, "/") : pattern); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get stats of a given path. | ||||
|  * @param {string} filePath The path to target file. | ||||
|  * @throws {Error} As may be thrown by `fs.statSync`. | ||||
|  * @returns {fs.Stats|null} The stats. | ||||
|  * @private | ||||
|  */ | ||||
| function statSafeSync(filePath) { | ||||
|     try { | ||||
|         return fs.statSync(filePath); | ||||
|     } catch (error) { | ||||
|  | ||||
|         /* c8 ignore next */ | ||||
|         if (error.code !== "ENOENT") { | ||||
|             throw error; | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get filenames in a given path to a directory. | ||||
|  * @param {string} directoryPath The path to target directory. | ||||
|  * @throws {Error} As may be thrown by `fs.readdirSync`. | ||||
|  * @returns {import("fs").Dirent[]} The filenames. | ||||
|  * @private | ||||
|  */ | ||||
| function readdirSafeSync(directoryPath) { | ||||
|     try { | ||||
|         return fs.readdirSync(directoryPath, { withFileTypes: true }); | ||||
|     } catch (error) { | ||||
|  | ||||
|         /* c8 ignore next */ | ||||
|         if (error.code !== "ENOENT") { | ||||
|             throw error; | ||||
|         } | ||||
|         return []; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create a `RegExp` object to detect extensions. | ||||
|  * @param {string[] | null} extensions The extensions to create. | ||||
|  * @returns {RegExp | null} The created `RegExp` object or null. | ||||
|  */ | ||||
| function createExtensionRegExp(extensions) { | ||||
|     if (extensions) { | ||||
|         const normalizedExts = extensions.map(ext => escapeRegExp( | ||||
|             ext.startsWith(".") | ||||
|                 ? ext.slice(1) | ||||
|                 : ext | ||||
|         )); | ||||
|  | ||||
|         return new RegExp( | ||||
|             `.\\.(?:${normalizedExts.join("|")})$`, | ||||
|             "u" | ||||
|         ); | ||||
|     } | ||||
|     return null; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The error type when no files match a glob. | ||||
|  */ | ||||
| class NoFilesFoundError extends Error { | ||||
|  | ||||
|     /** | ||||
|      * @param {string} pattern The glob pattern which was not found. | ||||
|      * @param {boolean} globDisabled If `true` then the pattern was a glob pattern, but glob was disabled. | ||||
|      */ | ||||
|     constructor(pattern, globDisabled) { | ||||
|         super(`No files matching '${pattern}' were found${globDisabled ? " (glob was disabled)" : ""}.`); | ||||
|         this.messageTemplate = "file-not-found"; | ||||
|         this.messageData = { pattern, globDisabled }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The error type when there are files matched by a glob, but all of them have been ignored. | ||||
|  */ | ||||
| class AllFilesIgnoredError extends Error { | ||||
|  | ||||
|     /** | ||||
|      * @param {string} pattern The glob pattern which was not found. | ||||
|      */ | ||||
|     constructor(pattern) { | ||||
|         super(`All files matched by '${pattern}' are ignored.`); | ||||
|         this.messageTemplate = "all-files-ignored"; | ||||
|         this.messageData = { pattern }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * This class provides the functionality that enumerates every file which is | ||||
|  * matched by given glob patterns and that configuration. | ||||
|  */ | ||||
| class FileEnumerator { | ||||
|  | ||||
|     /** | ||||
|      * Initialize this enumerator. | ||||
|      * @param {FileEnumeratorOptions} options The options. | ||||
|      */ | ||||
|     constructor({ | ||||
|         cwd = process.cwd(), | ||||
|         configArrayFactory = new CascadingConfigArrayFactory({ | ||||
|             cwd, | ||||
|             getEslintRecommendedConfig: () => require("@eslint/js").configs.recommended, | ||||
|             getEslintAllConfig: () => require("@eslint/js").configs.all | ||||
|         }), | ||||
|         extensions = null, | ||||
|         globInputPaths = true, | ||||
|         errorOnUnmatchedPattern = true, | ||||
|         ignore = true | ||||
|     } = {}) { | ||||
|         internalSlotsMap.set(this, { | ||||
|             configArrayFactory, | ||||
|             cwd, | ||||
|             defaultIgnores: IgnorePattern.createDefaultIgnore(cwd), | ||||
|             extensionRegExp: createExtensionRegExp(extensions), | ||||
|             globInputPaths, | ||||
|             errorOnUnmatchedPattern, | ||||
|             ignoreFlag: ignore | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if a given file is target or not. | ||||
|      * @param {string} filePath The path to a candidate file. | ||||
|      * @param {ConfigArray} [providedConfig] Optional. The configuration for the file. | ||||
|      * @returns {boolean} `true` if the file is a target. | ||||
|      */ | ||||
|     isTargetPath(filePath, providedConfig) { | ||||
|         const { | ||||
|             configArrayFactory, | ||||
|             extensionRegExp | ||||
|         } = internalSlotsMap.get(this); | ||||
|  | ||||
|         // If `--ext` option is present, use it. | ||||
|         if (extensionRegExp) { | ||||
|             return extensionRegExp.test(filePath); | ||||
|         } | ||||
|  | ||||
|         // `.js` file is target by default. | ||||
|         if (filePath.endsWith(".js")) { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         // use `overrides[].files` to check additional targets. | ||||
|         const config = | ||||
|             providedConfig || | ||||
|             configArrayFactory.getConfigArrayForFile( | ||||
|                 filePath, | ||||
|                 { ignoreNotFoundError: true } | ||||
|             ); | ||||
|  | ||||
|         return config.isAdditionalTargetPath(filePath); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate files which are matched by given glob patterns. | ||||
|      * @param {string|string[]} patternOrPatterns The glob patterns to iterate files. | ||||
|      * @throws {NoFilesFoundError|AllFilesIgnoredError} On an unmatched pattern. | ||||
|      * @returns {IterableIterator<FileAndConfig>} The found files. | ||||
|      */ | ||||
|     *iterateFiles(patternOrPatterns) { | ||||
|         const { globInputPaths, errorOnUnmatchedPattern } = internalSlotsMap.get(this); | ||||
|         const patterns = Array.isArray(patternOrPatterns) | ||||
|             ? patternOrPatterns | ||||
|             : [patternOrPatterns]; | ||||
|  | ||||
|         debug("Start to iterate files: %o", patterns); | ||||
|  | ||||
|         // The set of paths to remove duplicate. | ||||
|         const set = new Set(); | ||||
|  | ||||
|         for (const pattern of patterns) { | ||||
|             let foundRegardlessOfIgnored = false; | ||||
|             let found = false; | ||||
|  | ||||
|             // Skip empty string. | ||||
|             if (!pattern) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // Iterate files of this pattern. | ||||
|             for (const { config, filePath, flag } of this._iterateFiles(pattern)) { | ||||
|                 foundRegardlessOfIgnored = true; | ||||
|                 if (flag === IGNORED_SILENTLY) { | ||||
|                     continue; | ||||
|                 } | ||||
|                 found = true; | ||||
|  | ||||
|                 // Remove duplicate paths while yielding paths. | ||||
|                 if (!set.has(filePath)) { | ||||
|                     set.add(filePath); | ||||
|                     yield { | ||||
|                         config, | ||||
|                         filePath, | ||||
|                         ignored: flag === IGNORED | ||||
|                     }; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Raise an error if any files were not found. | ||||
|             if (errorOnUnmatchedPattern) { | ||||
|                 if (!foundRegardlessOfIgnored) { | ||||
|                     throw new NoFilesFoundError( | ||||
|                         pattern, | ||||
|                         !globInputPaths && isGlob(pattern) | ||||
|                     ); | ||||
|                 } | ||||
|                 if (!found) { | ||||
|                     throw new AllFilesIgnoredError(pattern); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         debug(`Complete iterating files: ${JSON.stringify(patterns)}`); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate files which are matched by a given glob pattern. | ||||
|      * @param {string} pattern The glob pattern to iterate files. | ||||
|      * @returns {IterableIterator<FileEntry>} The found files. | ||||
|      */ | ||||
|     _iterateFiles(pattern) { | ||||
|         const { cwd, globInputPaths } = internalSlotsMap.get(this); | ||||
|         const absolutePath = path.resolve(cwd, pattern); | ||||
|         const isDot = dotfilesPattern.test(pattern); | ||||
|         const stat = statSafeSync(absolutePath); | ||||
|  | ||||
|         if (stat && stat.isDirectory()) { | ||||
|             return this._iterateFilesWithDirectory(absolutePath, isDot); | ||||
|         } | ||||
|         if (stat && stat.isFile()) { | ||||
|             return this._iterateFilesWithFile(absolutePath); | ||||
|         } | ||||
|         if (globInputPaths && isGlobPattern(pattern)) { | ||||
|             return this._iterateFilesWithGlob(pattern, isDot); | ||||
|         } | ||||
|  | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate a file which is matched by a given path. | ||||
|      * @param {string} filePath The path to the target file. | ||||
|      * @returns {IterableIterator<FileEntry>} The found files. | ||||
|      * @private | ||||
|      */ | ||||
|     _iterateFilesWithFile(filePath) { | ||||
|         debug(`File: ${filePath}`); | ||||
|  | ||||
|         const { configArrayFactory } = internalSlotsMap.get(this); | ||||
|         const config = configArrayFactory.getConfigArrayForFile(filePath); | ||||
|         const ignored = this._isIgnoredFile(filePath, { config, direct: true }); | ||||
|         const flag = ignored ? IGNORED : NONE; | ||||
|  | ||||
|         return [{ config, filePath, flag }]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate files in a given path. | ||||
|      * @param {string} directoryPath The path to the target directory. | ||||
|      * @param {boolean} dotfiles If `true` then it doesn't skip dot files by default. | ||||
|      * @returns {IterableIterator<FileEntry>} The found files. | ||||
|      * @private | ||||
|      */ | ||||
|     _iterateFilesWithDirectory(directoryPath, dotfiles) { | ||||
|         debug(`Directory: ${directoryPath}`); | ||||
|  | ||||
|         return this._iterateFilesRecursive( | ||||
|             directoryPath, | ||||
|             { dotfiles, recursive: true, selector: null } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate files which are matched by a given glob pattern. | ||||
|      * @param {string} pattern The glob pattern to iterate files. | ||||
|      * @param {boolean} dotfiles If `true` then it doesn't skip dot files by default. | ||||
|      * @returns {IterableIterator<FileEntry>} The found files. | ||||
|      * @private | ||||
|      */ | ||||
|     _iterateFilesWithGlob(pattern, dotfiles) { | ||||
|         debug(`Glob: ${pattern}`); | ||||
|  | ||||
|         const { cwd } = internalSlotsMap.get(this); | ||||
|         const directoryPath = path.resolve(cwd, getGlobParent(pattern)); | ||||
|         const absolutePath = path.resolve(cwd, pattern); | ||||
|         const globPart = absolutePath.slice(directoryPath.length + 1); | ||||
|  | ||||
|         /* | ||||
|          * recursive if there are `**` or path separators in the glob part. | ||||
|          * Otherwise, patterns such as `src/*.js`, it doesn't need recursive. | ||||
|          */ | ||||
|         const recursive = /\*\*|\/|\\/u.test(globPart); | ||||
|         const selector = new Minimatch(absolutePath, minimatchOpts); | ||||
|  | ||||
|         debug(`recursive? ${recursive}`); | ||||
|  | ||||
|         return this._iterateFilesRecursive( | ||||
|             directoryPath, | ||||
|             { dotfiles, recursive, selector } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Iterate files in a given path. | ||||
|      * @param {string} directoryPath The path to the target directory. | ||||
|      * @param {Object} options The options to iterate files. | ||||
|      * @param {boolean} [options.dotfiles] If `true` then it doesn't skip dot files by default. | ||||
|      * @param {boolean} [options.recursive] If `true` then it dives into sub directories. | ||||
|      * @param {InstanceType<Minimatch>} [options.selector] The matcher to choose files. | ||||
|      * @returns {IterableIterator<FileEntry>} The found files. | ||||
|      * @private | ||||
|      */ | ||||
|     *_iterateFilesRecursive(directoryPath, options) { | ||||
|         debug(`Enter the directory: ${directoryPath}`); | ||||
|         const { configArrayFactory } = internalSlotsMap.get(this); | ||||
|  | ||||
|         /** @type {ConfigArray|null} */ | ||||
|         let config = null; | ||||
|  | ||||
|         // Enumerate the files of this directory. | ||||
|         for (const entry of readdirSafeSync(directoryPath)) { | ||||
|             const filePath = path.join(directoryPath, entry.name); | ||||
|             const fileInfo = entry.isSymbolicLink() ? statSafeSync(filePath) : entry; | ||||
|  | ||||
|             if (!fileInfo) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // Check if the file is matched. | ||||
|             if (fileInfo.isFile()) { | ||||
|                 if (!config) { | ||||
|                     config = configArrayFactory.getConfigArrayForFile( | ||||
|                         filePath, | ||||
|  | ||||
|                         /* | ||||
|                          * We must ignore `ConfigurationNotFoundError` at this | ||||
|                          * point because we don't know if target files exist in | ||||
|                          * this directory. | ||||
|                          */ | ||||
|                         { ignoreNotFoundError: true } | ||||
|                     ); | ||||
|                 } | ||||
|                 const matched = options.selector | ||||
|  | ||||
|                     // Started with a glob pattern; choose by the pattern. | ||||
|                     ? options.selector.match(filePath) | ||||
|  | ||||
|                     // Started with a directory path; choose by file extensions. | ||||
|                     : this.isTargetPath(filePath, config); | ||||
|  | ||||
|                 if (matched) { | ||||
|                     const ignored = this._isIgnoredFile(filePath, { ...options, config }); | ||||
|                     const flag = ignored ? IGNORED_SILENTLY : NONE; | ||||
|  | ||||
|                     debug(`Yield: ${entry.name}${ignored ? " but ignored" : ""}`); | ||||
|                     yield { | ||||
|                         config: configArrayFactory.getConfigArrayForFile(filePath), | ||||
|                         filePath, | ||||
|                         flag | ||||
|                     }; | ||||
|                 } else { | ||||
|                     debug(`Didn't match: ${entry.name}`); | ||||
|                 } | ||||
|  | ||||
|             // Dive into the sub directory. | ||||
|             } else if (options.recursive && fileInfo.isDirectory()) { | ||||
|                 if (!config) { | ||||
|                     config = configArrayFactory.getConfigArrayForFile( | ||||
|                         filePath, | ||||
|                         { ignoreNotFoundError: true } | ||||
|                     ); | ||||
|                 } | ||||
|                 const ignored = this._isIgnoredFile( | ||||
|                     filePath + path.sep, | ||||
|                     { ...options, config } | ||||
|                 ); | ||||
|  | ||||
|                 if (!ignored) { | ||||
|                     yield* this._iterateFilesRecursive(filePath, options); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         debug(`Leave the directory: ${directoryPath}`); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if a given file should be ignored. | ||||
|      * @param {string} filePath The path to a file to check. | ||||
|      * @param {Object} options Options | ||||
|      * @param {ConfigArray} [options.config] The config for this file. | ||||
|      * @param {boolean} [options.dotfiles] If `true` then this is not ignore dot files by default. | ||||
|      * @param {boolean} [options.direct] If `true` then this is a direct specified file. | ||||
|      * @returns {boolean} `true` if the file should be ignored. | ||||
|      * @private | ||||
|      */ | ||||
|     _isIgnoredFile(filePath, { | ||||
|         config: providedConfig, | ||||
|         dotfiles = false, | ||||
|         direct = false | ||||
|     }) { | ||||
|         const { | ||||
|             configArrayFactory, | ||||
|             defaultIgnores, | ||||
|             ignoreFlag | ||||
|         } = internalSlotsMap.get(this); | ||||
|  | ||||
|         if (ignoreFlag) { | ||||
|             const config = | ||||
|                 providedConfig || | ||||
|                 configArrayFactory.getConfigArrayForFile( | ||||
|                     filePath, | ||||
|                     { ignoreNotFoundError: true } | ||||
|                 ); | ||||
|             const ignores = | ||||
|                 config.extractConfig(filePath).ignores || defaultIgnores; | ||||
|  | ||||
|             return ignores(filePath, dotfiles); | ||||
|         } | ||||
|  | ||||
|         return !direct && defaultIgnores(filePath, dotfiles); | ||||
|     } | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = { FileEnumerator }; | ||||
							
								
								
									
										60
									
								
								node_modules/eslint/lib/cli-engine/formatters/checkstyle.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								node_modules/eslint/lib/cli-engine/formatters/checkstyle.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /** | ||||
|  * @fileoverview CheckStyle XML reporter | ||||
|  * @author Ian Christian Myers | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| const xmlEscape = require("../xml-escape"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns the severity of warning or error | ||||
|  * @param {Object} message message object to examine | ||||
|  * @returns {string} severity level | ||||
|  * @private | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "error"; | ||||
|     } | ||||
|     return "warning"; | ||||
|  | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = ""; | ||||
|  | ||||
|     output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; | ||||
|     output += "<checkstyle version=\"4.3\">"; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         output += `<file name="${xmlEscape(result.filePath)}">`; | ||||
|  | ||||
|         messages.forEach(message => { | ||||
|             output += [ | ||||
|                 `<error line="${xmlEscape(message.line || 0)}"`, | ||||
|                 `column="${xmlEscape(message.column || 0)}"`, | ||||
|                 `severity="${xmlEscape(getMessageType(message))}"`, | ||||
|                 `message="${xmlEscape(message.message)}${message.ruleId ? ` (${message.ruleId})` : ""}"`, | ||||
|                 `source="${message.ruleId ? xmlEscape(`eslint.rules.${message.ruleId}`) : ""}" />` | ||||
|             ].join(" "); | ||||
|         }); | ||||
|  | ||||
|         output += "</file>"; | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     output += "</checkstyle>"; | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										60
									
								
								node_modules/eslint/lib/cli-engine/formatters/compact.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								node_modules/eslint/lib/cli-engine/formatters/compact.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /** | ||||
|  * @fileoverview Compact reporter | ||||
|  * @author Nicholas C. Zakas | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns the severity of warning or error | ||||
|  * @param {Object} message message object to examine | ||||
|  * @returns {string} severity level | ||||
|  * @private | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "Error"; | ||||
|     } | ||||
|     return "Warning"; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = "", | ||||
|         total = 0; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|  | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         total += messages.length; | ||||
|  | ||||
|         messages.forEach(message => { | ||||
|  | ||||
|             output += `${result.filePath}: `; | ||||
|             output += `line ${message.line || 0}`; | ||||
|             output += `, col ${message.column || 0}`; | ||||
|             output += `, ${getMessageType(message)}`; | ||||
|             output += ` - ${message.message}`; | ||||
|             output += message.ruleId ? ` (${message.ruleId})` : ""; | ||||
|             output += "\n"; | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     if (total > 0) { | ||||
|         output += `\n${total} problem${total !== 1 ? "s" : ""}`; | ||||
|     } | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										46
									
								
								node_modules/eslint/lib/cli-engine/formatters/formatters-meta.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								node_modules/eslint/lib/cli-engine/formatters/formatters-meta.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| [ | ||||
|     { | ||||
|         "name": "checkstyle", | ||||
|         "description": "Outputs results to the [Checkstyle](https://checkstyle.sourceforge.io/) format." | ||||
|     }, | ||||
|     { | ||||
|         "name": "compact", | ||||
|         "description": "Human-readable output format. Mimics the default output of JSHint." | ||||
|     }, | ||||
|     { | ||||
|         "name": "html", | ||||
|         "description": "Outputs results to HTML. The `html` formatter is useful for visual presentation in the browser." | ||||
|     }, | ||||
|     { | ||||
|         "name": "jslint-xml", | ||||
|         "description": "Outputs results to format compatible with the [JSLint Jenkins plugin](https://plugins.jenkins.io/jslint/)." | ||||
|     }, | ||||
|     { | ||||
|         "name": "json-with-metadata", | ||||
|         "description": "Outputs JSON-serialized results. The `json-with-metadata` provides the same linting results as the [`json`](#json) formatter with additional metadata about the rules applied. The linting results are included in the `results` property and the rules metadata is included in the `metadata` property.\n\nAlternatively, you can use the [ESLint Node.js API](../../integrate/nodejs-api) to programmatically use ESLint." | ||||
|     }, | ||||
|     { | ||||
|         "name": "json", | ||||
|         "description": "Outputs JSON-serialized results. The `json` formatter is useful when you want to programmatically work with the CLI's linting results.\n\nAlternatively, you can use the [ESLint Node.js API](../../integrate/nodejs-api) to programmatically use ESLint." | ||||
|     }, | ||||
|     { | ||||
|         "name": "junit", | ||||
|         "description": "Outputs results to format compatible with the [JUnit Jenkins plugin](https://plugins.jenkins.io/junit/)." | ||||
|     }, | ||||
|     { | ||||
|         "name": "stylish", | ||||
|         "description": "Human-readable output format. This is the default formatter." | ||||
|     }, | ||||
|     { | ||||
|         "name": "tap", | ||||
|         "description": "Outputs results to the [Test Anything Protocol (TAP)](https://testanything.org/) specification format." | ||||
|     }, | ||||
|     { | ||||
|         "name": "unix", | ||||
|         "description": "Outputs results to a format similar to many commands in UNIX-like systems. Parsable with tools such as [grep](https://www.gnu.org/software/grep/manual/grep.html), [sed](https://www.gnu.org/software/sed/manual/sed.html), and [awk](https://www.gnu.org/software/gawk/manual/gawk.html)." | ||||
|     }, | ||||
|     { | ||||
|         "name": "visualstudio", | ||||
|         "description": "Outputs results to format compatible with the integrated terminal of the [Visual Studio](https://visualstudio.microsoft.com/) IDE. When using Visual Studio, you can click on the linting results in the integrated terminal to go to the issue in the source code." | ||||
|     } | ||||
| ] | ||||
							
								
								
									
										351
									
								
								node_modules/eslint/lib/cli-engine/formatters/html.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										351
									
								
								node_modules/eslint/lib/cli-engine/formatters/html.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,351 @@ | ||||
| /** | ||||
|  * @fileoverview HTML reporter | ||||
|  * @author Julian Laval | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const encodeHTML = (function() { | ||||
|     const encodeHTMLRules = { | ||||
|         "&": "&", | ||||
|         "<": "<", | ||||
|         ">": ">", | ||||
|         '"': """, | ||||
|         "'": "'" | ||||
|     }; | ||||
|     const matchHTML = /[&<>"']/ug; | ||||
|  | ||||
|     return function(code) { | ||||
|         return code | ||||
|             ? code.toString().replace(matchHTML, m => encodeHTMLRules[m] || m) | ||||
|             : ""; | ||||
|     }; | ||||
| }()); | ||||
|  | ||||
| /** | ||||
|  * Get the final HTML document. | ||||
|  * @param {Object} it data for the document. | ||||
|  * @returns {string} HTML document. | ||||
|  */ | ||||
| function pageTemplate(it) { | ||||
|     const { reportColor, reportSummary, date, results } = it; | ||||
|  | ||||
|     return ` | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|     <head> | ||||
|         <meta charset="UTF-8"> | ||||
|         <title>ESLint Report</title> | ||||
|         <link rel="icon" type="image/png" sizes="any" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAHaAAAB2gGFomX7AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABD1JREFUWMPFl11sk2UUx3/nbYtjxS1MF7MLMTECMgSTtSSyrQkLhAj7UBPnDSEGoxegGzMwojhXVpmTAA5iYpSoMQa8GBhFOrMFk03buei6yRAlcmOM0SEmU9d90b19jxcM1o5+sGnsc/e+z/l6ztf/HFFVMnns6QieeOCHBePGsHM+wrOtvLG2C4WRVDSSygNV7sCjlspxwDnPB44aols/DXk+mbMBmx/6OseITF1CuOtfevkPh2Uu+/jbdX8lujSScRlT5r7/QDlAfsRmfzmpnkQ/H3H13gf6bBrBn1uqK8WylgEnU8eZmk1repbfchJG1TyKyIKEwuBHFd3lD3naY3O1siiwXsVoBV2VgM1ht/QQUJk2ByqKghsQziYQ8ifKgexIXmuyzC4r67Y7R+xPAfuB/Nn3Cpva+0s7khpQVtZtd4bt51BWxtBYAiciprG7c7D4SixzU9PYalDL6110Ifb/w8W9eY7JqFeFHbO8fPGyLHwwFHJNJTSgwtVTB9oaw9BlQ+tO93vOxypoaQnfEYlI43SeCHDC4TDq9+51/h5fxr33q0ZfV9g04wat9Q943rjJgCp3952W2i8Bi6eDvdsfKj0cK/DYMRyXL4/sUJUmIHd2zYMezsvLaamp4WpcWN3BXSiHpuMwbGbZlnZ8tXY4rgosy+G7oRwQ0cAsd28YGgqfU5UjCZQDLALxDg+Hv/P5Rqvj4hwrS8izXzWb4spwc1GgENFnkpWRzxeuB+ssUHgLdb9UVdt8vpGdKQpze7n7y1U3DBChNRUuqOo9c+0+qpKKxyZqtAIYla7gY4JszAAQri93BSsMRZoyBcUC+w3Q3AyOA4sNhAOZ0q7Iq0b2vUNvK5zPgP+/H8+Zetdoa6uOikhdGurxebwvJY8Iz3V1rTMNAH+opEuQj5KTT/qA1yC+wyUjBm12OidaUtCcPNNX2h0Hx2JG69VulANZAJZJwfU7rzd/FHixuXniTdM0m4GtSQT7bTartqEh9yfImUEzkwKZmTwmo5a5JwkYBfcDL01/RkR5y8iWhtPBknB8ZxwtU9UjwOrrKCeizzc25nTGg1F/turEHoU9wMLpDvWKf8DTmNCAKnd/tqUTF4ElMXJ+A5rWDJS+41WsGWzALhJ+ErBWrLj9g+pqojHxlXJX8HGUg0BsR/x1yhxf3jm4cSzpQFLp6tmi6PEE7g1ZhtZ91ufpSZUAFa6gC+UoQslNaSmypT1U8mHKiUgEKS8KfgF4EpYunFI16tsHin+OG0LcgQK7yj7g6cSzpva2D3hKVNG0Y3mVO1BkqfSlmJrHBQ4uvM12gJHc6ETW8HZVfMRmXvyxxNC1Z/o839zyXlDuCr4nsC11J+MXueaVJWn6yPv+/pJtc9oLTNN4AeTvNGByd3rlhE2x9s5pLwDoHCy+grDzWmOZ95lUtLYj5Bma126Y8eX0/zj/ADxGyViSg4BXAAAAAElFTkSuQmCC"> | ||||
|         <link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgMjk0LjgyNSAyNTguOTgyJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPg0KPHBhdGggZmlsbD0nIzgwODBGMicgZD0nTTk3LjAyMSw5OS4wMTZsNDguNDMyLTI3Ljk2MmMxLjIxMi0wLjcsMi43MDYtMC43LDMuOTE4LDBsNDguNDMzLDI3Ljk2MiBjMS4yMTEsMC43LDEuOTU5LDEuOTkzLDEuOTU5LDMuMzkzdjU1LjkyNGMwLDEuMzk5LTAuNzQ4LDIuNjkzLTEuOTU5LDMuMzk0bC00OC40MzMsMjcuOTYyYy0xLjIxMiwwLjctMi43MDYsMC43LTMuOTE4LDAgbC00OC40MzItMjcuOTYyYy0xLjIxMi0wLjctMS45NTktMS45OTQtMS45NTktMy4zOTR2LTU1LjkyNEM5NS4wNjMsMTAxLjAwOSw5NS44MSw5OS43MTYsOTcuMDIxLDk5LjAxNicvPg0KPHBhdGggZmlsbD0nIzRCMzJDMycgZD0nTTI3My4zMzYsMTI0LjQ4OEwyMTUuNDY5LDIzLjgxNmMtMi4xMDItMy42NC01Ljk4NS02LjMyNS0xMC4xODgtNi4zMjVIODkuNTQ1IGMtNC4yMDQsMC04LjA4OCwyLjY4NS0xMC4xOSw2LjMyNWwtNTcuODY3LDEwMC40NWMtMi4xMDIsMy42NDEtMi4xMDIsOC4yMzYsMCwxMS44NzdsNTcuODY3LDk5Ljg0NyBjMi4xMDIsMy42NCw1Ljk4Niw1LjUwMSwxMC4xOSw1LjUwMWgxMTUuNzM1YzQuMjAzLDAsOC4wODctMS44MDUsMTAuMTg4LTUuNDQ2bDU3Ljg2Ny0xMDAuMDEgQzI3NS40MzksMTMyLjM5NiwyNzUuNDM5LDEyOC4xMjgsMjczLjMzNiwxMjQuNDg4IE0yMjUuNDE5LDE3Mi44OThjMCwxLjQ4LTAuODkxLDIuODQ5LTIuMTc0LDMuNTlsLTczLjcxLDQyLjUyNyBjLTEuMjgyLDAuNzQtMi44ODgsMC43NC00LjE3LDBsLTczLjc2Ny00Mi41MjdjLTEuMjgyLTAuNzQxLTIuMTc5LTIuMTA5LTIuMTc5LTMuNTlWODcuODQzYzAtMS40ODEsMC44ODQtMi44NDksMi4xNjctMy41OSBsNzMuNzA3LTQyLjUyN2MxLjI4Mi0wLjc0MSwyLjg4Ni0wLjc0MSw0LjE2OCwwbDczLjc3Miw0Mi41MjdjMS4yODMsMC43NDEsMi4xODYsMi4xMDksMi4xODYsMy41OVYxNzIuODk4eicvPg0KPC9zdmc+"> | ||||
|         <style> | ||||
|             body { | ||||
|                 font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; | ||||
|                 font-size: 16px; | ||||
|                 font-weight: normal; | ||||
|                 margin: 0; | ||||
|                 padding: 0; | ||||
|                 color: #333; | ||||
|             } | ||||
|  | ||||
|             #overview { | ||||
|                 padding: 20px 30px; | ||||
|             } | ||||
|  | ||||
|             td, | ||||
|             th { | ||||
|                 padding: 5px 10px; | ||||
|             } | ||||
|  | ||||
|             h1 { | ||||
|                 margin: 0; | ||||
|             } | ||||
|  | ||||
|             table { | ||||
|                 margin: 30px; | ||||
|                 width: calc(100% - 60px); | ||||
|                 max-width: 1000px; | ||||
|                 border-radius: 5px; | ||||
|                 border: 1px solid #ddd; | ||||
|                 border-spacing: 0; | ||||
|             } | ||||
|  | ||||
|             th { | ||||
|                 font-weight: 400; | ||||
|                 font-size: medium; | ||||
|                 text-align: left; | ||||
|                 cursor: pointer; | ||||
|             } | ||||
|  | ||||
|             td.clr-1, | ||||
|             td.clr-2, | ||||
|             th span { | ||||
|                 font-weight: 700; | ||||
|             } | ||||
|  | ||||
|             th span { | ||||
|                 float: right; | ||||
|                 margin-left: 20px; | ||||
|             } | ||||
|  | ||||
|             th span::after { | ||||
|                 content: ""; | ||||
|                 clear: both; | ||||
|                 display: block; | ||||
|             } | ||||
|  | ||||
|             tr:last-child td { | ||||
|                 border-bottom: none; | ||||
|             } | ||||
|  | ||||
|             tr td:first-child, | ||||
|             tr td:last-child { | ||||
|                 color: #9da0a4; | ||||
|             } | ||||
|  | ||||
|             #overview.bg-0, | ||||
|             tr.bg-0 th { | ||||
|                 color: #468847; | ||||
|                 background: #dff0d8; | ||||
|                 border-bottom: 1px solid #d6e9c6; | ||||
|             } | ||||
|  | ||||
|             #overview.bg-1, | ||||
|             tr.bg-1 th { | ||||
|                 color: #f0ad4e; | ||||
|                 background: #fcf8e3; | ||||
|                 border-bottom: 1px solid #fbeed5; | ||||
|             } | ||||
|  | ||||
|             #overview.bg-2, | ||||
|             tr.bg-2 th { | ||||
|                 color: #b94a48; | ||||
|                 background: #f2dede; | ||||
|                 border-bottom: 1px solid #eed3d7; | ||||
|             } | ||||
|  | ||||
|             td { | ||||
|                 border-bottom: 1px solid #ddd; | ||||
|             } | ||||
|  | ||||
|             td.clr-1 { | ||||
|                 color: #f0ad4e; | ||||
|             } | ||||
|  | ||||
|             td.clr-2 { | ||||
|                 color: #b94a48; | ||||
|             } | ||||
|  | ||||
|             td a { | ||||
|                 color: #3a33d1; | ||||
|                 text-decoration: none; | ||||
|             } | ||||
|  | ||||
|             td a:hover { | ||||
|                 color: #272296; | ||||
|                 text-decoration: underline; | ||||
|             } | ||||
|         </style> | ||||
|     </head> | ||||
|     <body> | ||||
|         <div id="overview" class="bg-${reportColor}"> | ||||
|             <h1>ESLint Report</h1> | ||||
|             <div> | ||||
|                 <span>${reportSummary}</span> - Generated on ${date} | ||||
|             </div> | ||||
|         </div> | ||||
|         <table> | ||||
|             <tbody> | ||||
|                 ${results} | ||||
|             </tbody> | ||||
|         </table> | ||||
|         <script type="text/javascript"> | ||||
|             var groups = document.querySelectorAll("tr[data-group]"); | ||||
|             for (i = 0; i < groups.length; i++) { | ||||
|                 groups[i].addEventListener("click", function() { | ||||
|                     var inGroup = document.getElementsByClassName(this.getAttribute("data-group")); | ||||
|                     this.innerHTML = (this.innerHTML.indexOf("+") > -1) ? this.innerHTML.replace("+", "-") : this.innerHTML.replace("-", "+"); | ||||
|                     for (var j = 0; j < inGroup.length; j++) { | ||||
|                         inGroup[j].style.display = (inGroup[j].style.display !== "none") ? "none" : "table-row"; | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|         </script> | ||||
|     </body> | ||||
| </html> | ||||
| `.trimStart(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Given a word and a count, append an s if count is not one. | ||||
|  * @param {string} word A word in its singular form. | ||||
|  * @param {int} count A number controlling whether word should be pluralized. | ||||
|  * @returns {string} The original word with an s on the end if count is not one. | ||||
|  */ | ||||
| function pluralize(word, count) { | ||||
|     return (count === 1 ? word : `${word}s`); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Renders text along the template of x problems (x errors, x warnings) | ||||
|  * @param {string} totalErrors Total errors | ||||
|  * @param {string} totalWarnings Total warnings | ||||
|  * @returns {string} The formatted string, pluralized where necessary | ||||
|  */ | ||||
| function renderSummary(totalErrors, totalWarnings) { | ||||
|     const totalProblems = totalErrors + totalWarnings; | ||||
|     let renderedText = `${totalProblems} ${pluralize("problem", totalProblems)}`; | ||||
|  | ||||
|     if (totalProblems !== 0) { | ||||
|         renderedText += ` (${totalErrors} ${pluralize("error", totalErrors)}, ${totalWarnings} ${pluralize("warning", totalWarnings)})`; | ||||
|     } | ||||
|     return renderedText; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get the color based on whether there are errors/warnings... | ||||
|  * @param {string} totalErrors Total errors | ||||
|  * @param {string} totalWarnings Total warnings | ||||
|  * @returns {int} The color code (0 = green, 1 = yellow, 2 = red) | ||||
|  */ | ||||
| function renderColor(totalErrors, totalWarnings) { | ||||
|     if (totalErrors !== 0) { | ||||
|         return 2; | ||||
|     } | ||||
|     if (totalWarnings !== 0) { | ||||
|         return 1; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get HTML (table row) describing a single message. | ||||
|  * @param {Object} it data for the message. | ||||
|  * @returns {string} HTML (table row) describing the message. | ||||
|  */ | ||||
| function messageTemplate(it) { | ||||
|     const { | ||||
|         parentIndex, | ||||
|         lineNumber, | ||||
|         columnNumber, | ||||
|         severityNumber, | ||||
|         severityName, | ||||
|         message, | ||||
|         ruleUrl, | ||||
|         ruleId | ||||
|     } = it; | ||||
|  | ||||
|     return ` | ||||
| <tr style="display: none;" class="f-${parentIndex}"> | ||||
|     <td>${lineNumber}:${columnNumber}</td> | ||||
|     <td class="clr-${severityNumber}">${severityName}</td> | ||||
|     <td>${encodeHTML(message)}</td> | ||||
|     <td> | ||||
|         <a href="${ruleUrl ? ruleUrl : ""}" target="_blank" rel="noopener noreferrer">${ruleId ? ruleId : ""}</a> | ||||
|     </td> | ||||
| </tr> | ||||
| `.trimStart(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get HTML (table rows) describing the messages. | ||||
|  * @param {Array} messages Messages. | ||||
|  * @param {int} parentIndex Index of the parent HTML row. | ||||
|  * @param {Object} rulesMeta Dictionary containing metadata for each rule executed by the analysis. | ||||
|  * @returns {string} HTML (table rows) describing the messages. | ||||
|  */ | ||||
| function renderMessages(messages, parentIndex, rulesMeta) { | ||||
|  | ||||
|     /** | ||||
|      * Get HTML (table row) describing a message. | ||||
|      * @param {Object} message Message. | ||||
|      * @returns {string} HTML (table row) describing a message. | ||||
|      */ | ||||
|     return messages.map(message => { | ||||
|         const lineNumber = message.line || 0; | ||||
|         const columnNumber = message.column || 0; | ||||
|         let ruleUrl; | ||||
|  | ||||
|         if (rulesMeta) { | ||||
|             const meta = rulesMeta[message.ruleId]; | ||||
|  | ||||
|             if (meta && meta.docs && meta.docs.url) { | ||||
|                 ruleUrl = meta.docs.url; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return messageTemplate({ | ||||
|             parentIndex, | ||||
|             lineNumber, | ||||
|             columnNumber, | ||||
|             severityNumber: message.severity, | ||||
|             severityName: message.severity === 1 ? "Warning" : "Error", | ||||
|             message: message.message, | ||||
|             ruleId: message.ruleId, | ||||
|             ruleUrl | ||||
|         }); | ||||
|     }).join("\n"); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get HTML (table row) describing the result for a single file. | ||||
|  * @param {Object} it data for the file. | ||||
|  * @returns {string} HTML (table row) describing the result for the file. | ||||
|  */ | ||||
| function resultTemplate(it) { | ||||
|     const { color, index, filePath, summary } = it; | ||||
|  | ||||
|     return ` | ||||
| <tr class="bg-${color}" data-group="f-${index}"> | ||||
|     <th colspan="4"> | ||||
|         [+] ${encodeHTML(filePath)} | ||||
|         <span>${encodeHTML(summary)}</span> | ||||
|     </th> | ||||
| </tr> | ||||
| `.trimStart(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Render the results. | ||||
|  * @param {Array} results Test results. | ||||
|  * @param {Object} rulesMeta Dictionary containing metadata for each rule executed by the analysis. | ||||
|  * @returns {string} HTML string describing the results. | ||||
|  */ | ||||
| function renderResults(results, rulesMeta) { | ||||
|     return results.map((result, index) => resultTemplate({ | ||||
|         index, | ||||
|         color: renderColor(result.errorCount, result.warningCount), | ||||
|         filePath: result.filePath, | ||||
|         summary: renderSummary(result.errorCount, result.warningCount) | ||||
|     }) + renderMessages(result.messages, index, rulesMeta)).join("\n"); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results, data) { | ||||
|     let totalErrors, | ||||
|         totalWarnings; | ||||
|  | ||||
|     const metaData = data ? data.rulesMeta : {}; | ||||
|  | ||||
|     totalErrors = 0; | ||||
|     totalWarnings = 0; | ||||
|  | ||||
|     // Iterate over results to get totals | ||||
|     results.forEach(result => { | ||||
|         totalErrors += result.errorCount; | ||||
|         totalWarnings += result.warningCount; | ||||
|     }); | ||||
|  | ||||
|     return pageTemplate({ | ||||
|         date: new Date(), | ||||
|         reportColor: renderColor(totalErrors, totalWarnings), | ||||
|         reportSummary: renderSummary(totalErrors, totalWarnings), | ||||
|         results: renderResults(results, metaData) | ||||
|     }); | ||||
| }; | ||||
							
								
								
									
										41
									
								
								node_modules/eslint/lib/cli-engine/formatters/jslint-xml.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								node_modules/eslint/lib/cli-engine/formatters/jslint-xml.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| /** | ||||
|  * @fileoverview JSLint XML reporter | ||||
|  * @author Ian Christian Myers | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| const xmlEscape = require("../xml-escape"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = ""; | ||||
|  | ||||
|     output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; | ||||
|     output += "<jslint>"; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         output += `<file name="${result.filePath}">`; | ||||
|  | ||||
|         messages.forEach(message => { | ||||
|             output += [ | ||||
|                 `<issue line="${message.line}"`, | ||||
|                 `char="${message.column}"`, | ||||
|                 `evidence="${xmlEscape(message.source || "")}"`, | ||||
|                 `reason="${xmlEscape(message.message || "")}${message.ruleId ? ` (${message.ruleId})` : ""}" />` | ||||
|             ].join(" "); | ||||
|         }); | ||||
|  | ||||
|         output += "</file>"; | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     output += "</jslint>"; | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										16
									
								
								node_modules/eslint/lib/cli-engine/formatters/json-with-metadata.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								node_modules/eslint/lib/cli-engine/formatters/json-with-metadata.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| /** | ||||
|  * @fileoverview JSON reporter, including rules metadata | ||||
|  * @author Chris Meyer | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results, data) { | ||||
|     return JSON.stringify({ | ||||
|         results, | ||||
|         metadata: data | ||||
|     }); | ||||
| }; | ||||
							
								
								
									
										13
									
								
								node_modules/eslint/lib/cli-engine/formatters/json.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								node_modules/eslint/lib/cli-engine/formatters/json.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| /** | ||||
|  * @fileoverview JSON reporter | ||||
|  * @author Burak Yigit Kaya aka BYK | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|     return JSON.stringify(results); | ||||
| }; | ||||
							
								
								
									
										82
									
								
								node_modules/eslint/lib/cli-engine/formatters/junit.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								node_modules/eslint/lib/cli-engine/formatters/junit.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| /** | ||||
|  * @fileoverview jUnit Reporter | ||||
|  * @author Jamund Ferguson | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| const xmlEscape = require("../xml-escape"); | ||||
| const path = require("path"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns the severity of warning or error | ||||
|  * @param {Object} message message object to examine | ||||
|  * @returns {string} severity level | ||||
|  * @private | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "Error"; | ||||
|     } | ||||
|     return "Warning"; | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Returns a full file path without extension | ||||
|  * @param {string} filePath input file path | ||||
|  * @returns {string} file path without extension | ||||
|  * @private | ||||
|  */ | ||||
| function pathWithoutExt(filePath) { | ||||
|     return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath))); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = ""; | ||||
|  | ||||
|     output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; | ||||
|     output += "<testsuites>\n"; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|  | ||||
|         const messages = result.messages; | ||||
|         const classname = pathWithoutExt(result.filePath); | ||||
|  | ||||
|         if (messages.length > 0) { | ||||
|             output += `<testsuite package="org.eslint" time="0" tests="${messages.length}" errors="${messages.length}" name="${result.filePath}">\n`; | ||||
|             messages.forEach(message => { | ||||
|                 const type = message.fatal ? "error" : "failure"; | ||||
|  | ||||
|                 output += `<testcase time="0" name="org.eslint.${message.ruleId || "unknown"}" classname="${classname}">`; | ||||
|                 output += `<${type} message="${xmlEscape(message.message || "")}">`; | ||||
|                 output += "<![CDATA["; | ||||
|                 output += `line ${message.line || 0}, col `; | ||||
|                 output += `${message.column || 0}, ${getMessageType(message)}`; | ||||
|                 output += ` - ${xmlEscape(message.message || "")}`; | ||||
|                 output += (message.ruleId ? ` (${message.ruleId})` : ""); | ||||
|                 output += "]]>"; | ||||
|                 output += `</${type}>`; | ||||
|                 output += "</testcase>\n"; | ||||
|             }); | ||||
|             output += "</testsuite>\n"; | ||||
|         } else { | ||||
|             output += `<testsuite package="org.eslint" time="0" tests="1" errors="0" name="${result.filePath}">\n`; | ||||
|             output += `<testcase time="0" name="${result.filePath}" classname="${classname}" />\n`; | ||||
|             output += "</testsuite>\n"; | ||||
|         } | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     output += "</testsuites>\n"; | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										101
									
								
								node_modules/eslint/lib/cli-engine/formatters/stylish.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								node_modules/eslint/lib/cli-engine/formatters/stylish.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| /** | ||||
|  * @fileoverview Stylish reporter | ||||
|  * @author Sindre Sorhus | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| const chalk = require("chalk"), | ||||
|     stripAnsi = require("strip-ansi"), | ||||
|     table = require("text-table"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Given a word and a count, append an s if count is not one. | ||||
|  * @param {string} word A word in its singular form. | ||||
|  * @param {int} count A number controlling whether word should be pluralized. | ||||
|  * @returns {string} The original word with an s on the end if count is not one. | ||||
|  */ | ||||
| function pluralize(word, count) { | ||||
|     return (count === 1 ? word : `${word}s`); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = "\n", | ||||
|         errorCount = 0, | ||||
|         warningCount = 0, | ||||
|         fixableErrorCount = 0, | ||||
|         fixableWarningCount = 0, | ||||
|         summaryColor = "yellow"; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         if (messages.length === 0) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         errorCount += result.errorCount; | ||||
|         warningCount += result.warningCount; | ||||
|         fixableErrorCount += result.fixableErrorCount; | ||||
|         fixableWarningCount += result.fixableWarningCount; | ||||
|  | ||||
|         output += `${chalk.underline(result.filePath)}\n`; | ||||
|  | ||||
|         output += `${table( | ||||
|             messages.map(message => { | ||||
|                 let messageType; | ||||
|  | ||||
|                 if (message.fatal || message.severity === 2) { | ||||
|                     messageType = chalk.red("error"); | ||||
|                     summaryColor = "red"; | ||||
|                 } else { | ||||
|                     messageType = chalk.yellow("warning"); | ||||
|                 } | ||||
|  | ||||
|                 return [ | ||||
|                     "", | ||||
|                     message.line || 0, | ||||
|                     message.column || 0, | ||||
|                     messageType, | ||||
|                     message.message.replace(/([^ ])\.$/u, "$1"), | ||||
|                     chalk.dim(message.ruleId || "") | ||||
|                 ]; | ||||
|             }), | ||||
|             { | ||||
|                 align: ["", "r", "l"], | ||||
|                 stringLength(str) { | ||||
|                     return stripAnsi(str).length; | ||||
|                 } | ||||
|             } | ||||
|         ).split("\n").map(el => el.replace(/(\d+)\s+(\d+)/u, (m, p1, p2) => chalk.dim(`${p1}:${p2}`))).join("\n")}\n\n`; | ||||
|     }); | ||||
|  | ||||
|     const total = errorCount + warningCount; | ||||
|  | ||||
|     if (total > 0) { | ||||
|         output += chalk[summaryColor].bold([ | ||||
|             "\u2716 ", total, pluralize(" problem", total), | ||||
|             " (", errorCount, pluralize(" error", errorCount), ", ", | ||||
|             warningCount, pluralize(" warning", warningCount), ")\n" | ||||
|         ].join("")); | ||||
|  | ||||
|         if (fixableErrorCount > 0 || fixableWarningCount > 0) { | ||||
|             output += chalk[summaryColor].bold([ | ||||
|                 "  ", fixableErrorCount, pluralize(" error", fixableErrorCount), " and ", | ||||
|                 fixableWarningCount, pluralize(" warning", fixableWarningCount), | ||||
|                 " potentially fixable with the `--fix` option.\n" | ||||
|             ].join("")); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Resets output color, for prevent change on top level | ||||
|     return total > 0 ? chalk.reset(output) : ""; | ||||
| }; | ||||
							
								
								
									
										95
									
								
								node_modules/eslint/lib/cli-engine/formatters/tap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								node_modules/eslint/lib/cli-engine/formatters/tap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| /** | ||||
|  * @fileoverview TAP reporter | ||||
|  * @author Jonathan Kingston | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| const yaml = require("js-yaml"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns a canonical error level string based upon the error message passed in. | ||||
|  * @param {Object} message Individual error message provided by eslint | ||||
|  * @returns {string} Error level string | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "error"; | ||||
|     } | ||||
|     return "warning"; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Takes in a JavaScript object and outputs a TAP diagnostics string | ||||
|  * @param {Object} diagnostic JavaScript object to be embedded as YAML into output. | ||||
|  * @returns {string} diagnostics string with YAML embedded - TAP version 13 compliant | ||||
|  */ | ||||
| function outputDiagnostics(diagnostic) { | ||||
|     const prefix = "  "; | ||||
|     let output = `${prefix}---\n`; | ||||
|  | ||||
|     output += prefix + yaml.dump(diagnostic).split("\n").join(`\n${prefix}`); | ||||
|     output += "...\n"; | ||||
|     return output; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|     let output = `TAP version 13\n1..${results.length}\n`; | ||||
|  | ||||
|     results.forEach((result, id) => { | ||||
|         const messages = result.messages; | ||||
|         let testResult = "ok"; | ||||
|         let diagnostics = {}; | ||||
|  | ||||
|         if (messages.length > 0) { | ||||
|             messages.forEach(message => { | ||||
|                 const severity = getMessageType(message); | ||||
|                 const diagnostic = { | ||||
|                     message: message.message, | ||||
|                     severity, | ||||
|                     data: { | ||||
|                         line: message.line || 0, | ||||
|                         column: message.column || 0, | ||||
|                         ruleId: message.ruleId || "" | ||||
|                     } | ||||
|                 }; | ||||
|  | ||||
|                 // This ensures a warning message is not flagged as error | ||||
|                 if (severity === "error") { | ||||
|                     testResult = "not ok"; | ||||
|                 } | ||||
|  | ||||
|                 /* | ||||
|                  * If we have multiple messages place them under a messages key | ||||
|                  * The first error will be logged as message key | ||||
|                  * This is to adhere to TAP 13 loosely defined specification of having a message key | ||||
|                  */ | ||||
|                 if ("message" in diagnostics) { | ||||
|                     if (typeof diagnostics.messages === "undefined") { | ||||
|                         diagnostics.messages = []; | ||||
|                     } | ||||
|                     diagnostics.messages.push(diagnostic); | ||||
|                 } else { | ||||
|                     diagnostics = diagnostic; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         output += `${testResult} ${id + 1} - ${result.filePath}\n`; | ||||
|  | ||||
|         // If we have an error include diagnostics | ||||
|         if (messages.length > 0) { | ||||
|             output += outputDiagnostics(diagnostics); | ||||
|         } | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										58
									
								
								node_modules/eslint/lib/cli-engine/formatters/unix.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								node_modules/eslint/lib/cli-engine/formatters/unix.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /** | ||||
|  * @fileoverview unix-style formatter. | ||||
|  * @author oshi-shinobu | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns a canonical error level string based upon the error message passed in. | ||||
|  * @param {Object} message Individual error message provided by eslint | ||||
|  * @returns {string} Error level string | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "Error"; | ||||
|     } | ||||
|     return "Warning"; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = "", | ||||
|         total = 0; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|  | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         total += messages.length; | ||||
|  | ||||
|         messages.forEach(message => { | ||||
|  | ||||
|             output += `${result.filePath}:`; | ||||
|             output += `${message.line || 0}:`; | ||||
|             output += `${message.column || 0}:`; | ||||
|             output += ` ${message.message} `; | ||||
|             output += `[${getMessageType(message)}${message.ruleId ? `/${message.ruleId}` : ""}]`; | ||||
|             output += "\n"; | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     if (total > 0) { | ||||
|         output += `\n${total} problem${total !== 1 ? "s" : ""}`; | ||||
|     } | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										63
									
								
								node_modules/eslint/lib/cli-engine/formatters/visualstudio.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								node_modules/eslint/lib/cli-engine/formatters/visualstudio.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /** | ||||
|  * @fileoverview Visual Studio compatible formatter | ||||
|  * @author Ronald Pijnacker | ||||
|  */ | ||||
|  | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helper Functions | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns the severity of warning or error | ||||
|  * @param {Object} message message object to examine | ||||
|  * @returns {string} severity level | ||||
|  * @private | ||||
|  */ | ||||
| function getMessageType(message) { | ||||
|     if (message.fatal || message.severity === 2) { | ||||
|         return "error"; | ||||
|     } | ||||
|     return "warning"; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = function(results) { | ||||
|  | ||||
|     let output = "", | ||||
|         total = 0; | ||||
|  | ||||
|     results.forEach(result => { | ||||
|  | ||||
|         const messages = result.messages; | ||||
|  | ||||
|         total += messages.length; | ||||
|  | ||||
|         messages.forEach(message => { | ||||
|  | ||||
|             output += result.filePath; | ||||
|             output += `(${message.line || 0}`; | ||||
|             output += message.column ? `,${message.column}` : ""; | ||||
|             output += `): ${getMessageType(message)}`; | ||||
|             output += message.ruleId ? ` ${message.ruleId}` : ""; | ||||
|             output += ` : ${message.message}`; | ||||
|             output += "\n"; | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     if (total === 0) { | ||||
|         output += "no problems"; | ||||
|     } else { | ||||
|         output += `\n${total} problem${total !== 1 ? "s" : ""}`; | ||||
|     } | ||||
|  | ||||
|     return output; | ||||
| }; | ||||
							
								
								
									
										35
									
								
								node_modules/eslint/lib/cli-engine/hash.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								node_modules/eslint/lib/cli-engine/hash.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| /** | ||||
|  * @fileoverview Defining the hashing function in one place. | ||||
|  * @author Michael Ficarra | ||||
|  */ | ||||
|  | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const murmur = require("imurmurhash"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Private | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * hash the given string | ||||
|  * @param {string} str the string to hash | ||||
|  * @returns {string} the hash | ||||
|  */ | ||||
| function hash(str) { | ||||
|     return murmur(str).result().toString(36); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| module.exports = hash; | ||||
							
								
								
									
										7
									
								
								node_modules/eslint/lib/cli-engine/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								node_modules/eslint/lib/cli-engine/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| "use strict"; | ||||
|  | ||||
| const { CLIEngine } = require("./cli-engine"); | ||||
|  | ||||
| module.exports = { | ||||
|     CLIEngine | ||||
| }; | ||||
							
								
								
									
										203
									
								
								node_modules/eslint/lib/cli-engine/lint-result-cache.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								node_modules/eslint/lib/cli-engine/lint-result-cache.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | ||||
| /** | ||||
|  * @fileoverview Utility for caching lint results. | ||||
|  * @author Kevin Partington | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Requirements | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| const assert = require("assert"); | ||||
| const fs = require("fs"); | ||||
| const fileEntryCache = require("file-entry-cache"); | ||||
| const stringify = require("json-stable-stringify-without-jsonify"); | ||||
| const pkg = require("../../package.json"); | ||||
| const hash = require("./hash"); | ||||
|  | ||||
| const debug = require("debug")("eslint:lint-result-cache"); | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| const configHashCache = new WeakMap(); | ||||
| const nodeVersion = process && process.version; | ||||
|  | ||||
| const validCacheStrategies = ["metadata", "content"]; | ||||
| const invalidCacheStrategyErrorMessage = `Cache strategy must be one of: ${validCacheStrategies | ||||
|     .map(strategy => `"${strategy}"`) | ||||
|     .join(", ")}`; | ||||
|  | ||||
| /** | ||||
|  * Tests whether a provided cacheStrategy is valid | ||||
|  * @param {string} cacheStrategy The cache strategy to use | ||||
|  * @returns {boolean} true if `cacheStrategy` is one of `validCacheStrategies`; false otherwise | ||||
|  */ | ||||
| function isValidCacheStrategy(cacheStrategy) { | ||||
|     return ( | ||||
|         validCacheStrategies.includes(cacheStrategy) | ||||
|     ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Calculates the hash of the config | ||||
|  * @param {ConfigArray} config The config. | ||||
|  * @returns {string} The hash of the config | ||||
|  */ | ||||
| function hashOfConfigFor(config) { | ||||
|     if (!configHashCache.has(config)) { | ||||
|         configHashCache.set(config, hash(`${pkg.version}_${nodeVersion}_${stringify(config)}`)); | ||||
|     } | ||||
|  | ||||
|     return configHashCache.get(config); | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Public Interface | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * Lint result cache. This wraps around the file-entry-cache module, | ||||
|  * transparently removing properties that are difficult or expensive to | ||||
|  * serialize and adding them back in on retrieval. | ||||
|  */ | ||||
| class LintResultCache { | ||||
|  | ||||
|     /** | ||||
|      * Creates a new LintResultCache instance. | ||||
|      * @param {string} cacheFileLocation The cache file location. | ||||
|      * @param {"metadata" | "content"} cacheStrategy The cache strategy to use. | ||||
|      */ | ||||
|     constructor(cacheFileLocation, cacheStrategy) { | ||||
|         assert(cacheFileLocation, "Cache file location is required"); | ||||
|         assert(cacheStrategy, "Cache strategy is required"); | ||||
|         assert( | ||||
|             isValidCacheStrategy(cacheStrategy), | ||||
|             invalidCacheStrategyErrorMessage | ||||
|         ); | ||||
|  | ||||
|         debug(`Caching results to ${cacheFileLocation}`); | ||||
|  | ||||
|         const useChecksum = cacheStrategy === "content"; | ||||
|  | ||||
|         debug( | ||||
|             `Using "${cacheStrategy}" strategy to detect changes` | ||||
|         ); | ||||
|  | ||||
|         this.fileEntryCache = fileEntryCache.create( | ||||
|             cacheFileLocation, | ||||
|             void 0, | ||||
|             useChecksum | ||||
|         ); | ||||
|         this.cacheFileLocation = cacheFileLocation; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Retrieve cached lint results for a given file path, if present in the | ||||
|      * cache. If the file is present and has not been changed, rebuild any | ||||
|      * missing result information. | ||||
|      * @param {string} filePath The file for which to retrieve lint results. | ||||
|      * @param {ConfigArray} config The config of the file. | ||||
|      * @returns {Object|null} The rebuilt lint results, or null if the file is | ||||
|      *   changed or not in the filesystem. | ||||
|      */ | ||||
|     getCachedLintResults(filePath, config) { | ||||
|  | ||||
|         /* | ||||
|          * Cached lint results are valid if and only if: | ||||
|          * 1. The file is present in the filesystem | ||||
|          * 2. The file has not changed since the time it was previously linted | ||||
|          * 3. The ESLint configuration has not changed since the time the file | ||||
|          *    was previously linted | ||||
|          * If any of these are not true, we will not reuse the lint results. | ||||
|          */ | ||||
|         const fileDescriptor = this.fileEntryCache.getFileDescriptor(filePath); | ||||
|         const hashOfConfig = hashOfConfigFor(config); | ||||
|         const changed = | ||||
|             fileDescriptor.changed || | ||||
|             fileDescriptor.meta.hashOfConfig !== hashOfConfig; | ||||
|  | ||||
|         if (fileDescriptor.notFound) { | ||||
|             debug(`File not found on the file system: ${filePath}`); | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         if (changed) { | ||||
|             debug(`Cache entry not found or no longer valid: ${filePath}`); | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         const cachedResults = fileDescriptor.meta.results; | ||||
|  | ||||
|         // Just in case, not sure if this can ever happen. | ||||
|         if (!cachedResults) { | ||||
|             return cachedResults; | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * Shallow clone the object to ensure that any properties added or modified afterwards | ||||
|          * will not be accidentally stored in the cache file when `reconcile()` is called. | ||||
|          * https://github.com/eslint/eslint/issues/13507 | ||||
|          * All intentional changes to the cache file must be done through `setCachedLintResults()`. | ||||
|          */ | ||||
|         const results = { ...cachedResults }; | ||||
|  | ||||
|         // If source is present but null, need to reread the file from the filesystem. | ||||
|         if (results.source === null) { | ||||
|             debug(`Rereading cached result source from filesystem: ${filePath}`); | ||||
|             results.source = fs.readFileSync(filePath, "utf-8"); | ||||
|         } | ||||
|  | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Set the cached lint results for a given file path, after removing any | ||||
|      * information that will be both unnecessary and difficult to serialize. | ||||
|      * Avoids caching results with an "output" property (meaning fixes were | ||||
|      * applied), to prevent potentially incorrect results if fixes are not | ||||
|      * written to disk. | ||||
|      * @param {string} filePath The file for which to set lint results. | ||||
|      * @param {ConfigArray} config The config of the file. | ||||
|      * @param {Object} result The lint result to be set for the file. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     setCachedLintResults(filePath, config, result) { | ||||
|         if (result && Object.prototype.hasOwnProperty.call(result, "output")) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const fileDescriptor = this.fileEntryCache.getFileDescriptor(filePath); | ||||
|  | ||||
|         if (fileDescriptor && !fileDescriptor.notFound) { | ||||
|             debug(`Updating cached result: ${filePath}`); | ||||
|  | ||||
|             // Serialize the result, except that we want to remove the file source if present. | ||||
|             const resultToSerialize = Object.assign({}, result); | ||||
|  | ||||
|             /* | ||||
|              * Set result.source to null. | ||||
|              * In `getCachedLintResults`, if source is explicitly null, we will | ||||
|              * read the file from the filesystem to set the value again. | ||||
|              */ | ||||
|             if (Object.prototype.hasOwnProperty.call(resultToSerialize, "source")) { | ||||
|                 resultToSerialize.source = null; | ||||
|             } | ||||
|  | ||||
|             fileDescriptor.meta.results = resultToSerialize; | ||||
|             fileDescriptor.meta.hashOfConfig = hashOfConfigFor(config); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Persists the in-memory cache to disk. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     reconcile() { | ||||
|         debug(`Persisting cached results: ${this.cacheFileLocation}`); | ||||
|         this.fileEntryCache.reconcile(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| module.exports = LintResultCache; | ||||
							
								
								
									
										46
									
								
								node_modules/eslint/lib/cli-engine/load-rules.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								node_modules/eslint/lib/cli-engine/load-rules.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| /** | ||||
|  * @fileoverview Module for loading rules from files and directories. | ||||
|  * @author Michael Ficarra | ||||
|  */ | ||||
|  | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const fs = require("fs"), | ||||
|     path = require("path"); | ||||
|  | ||||
| const rulesDirCache = {}; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Load all rule modules from specified directory. | ||||
|  * @param {string} relativeRulesDir Path to rules directory, may be relative. | ||||
|  * @param {string} cwd Current working directory | ||||
|  * @returns {Object} Loaded rule modules. | ||||
|  */ | ||||
| module.exports = function(relativeRulesDir, cwd) { | ||||
|     const rulesDir = path.resolve(cwd, relativeRulesDir); | ||||
|  | ||||
|     // cache will help performance as IO operation are expensive | ||||
|     if (rulesDirCache[rulesDir]) { | ||||
|         return rulesDirCache[rulesDir]; | ||||
|     } | ||||
|  | ||||
|     const rules = Object.create(null); | ||||
|  | ||||
|     fs.readdirSync(rulesDir).forEach(file => { | ||||
|         if (path.extname(file) !== ".js") { | ||||
|             return; | ||||
|         } | ||||
|         rules[file.slice(0, -3)] = require(path.join(rulesDir, file)); | ||||
|     }); | ||||
|     rulesDirCache[rulesDir] = rules; | ||||
|  | ||||
|     return rules; | ||||
| }; | ||||
							
								
								
									
										34
									
								
								node_modules/eslint/lib/cli-engine/xml-escape.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/eslint/lib/cli-engine/xml-escape.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /** | ||||
|  * @fileoverview XML character escaper | ||||
|  * @author George Chung | ||||
|  */ | ||||
| "use strict"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Returns the escaped value for a character | ||||
|  * @param {string} s string to examine | ||||
|  * @returns {string} severity level | ||||
|  * @private | ||||
|  */ | ||||
| module.exports = function(s) { | ||||
|     return (`${s}`).replace(/[<>&"'\x00-\x1F\x7F\u0080-\uFFFF]/gu, c => { // eslint-disable-line no-control-regex -- Converting controls to entities | ||||
|         switch (c) { | ||||
|             case "<": | ||||
|                 return "<"; | ||||
|             case ">": | ||||
|                 return ">"; | ||||
|             case "&": | ||||
|                 return "&"; | ||||
|             case "\"": | ||||
|                 return """; | ||||
|             case "'": | ||||
|                 return "'"; | ||||
|             default: | ||||
|                 return `&#${c.charCodeAt(0)};`; | ||||
|         } | ||||
|     }); | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user