update socials section
This commit is contained in:
		
							
								
								
									
										532
									
								
								node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,532 @@ | ||||
| /** | ||||
|  * @fileoverview `CascadingConfigArrayFactory` class. | ||||
|  * | ||||
|  * `CascadingConfigArrayFactory` class has a responsibility: | ||||
|  * | ||||
|  * 1. Handles cascading of config files. | ||||
|  * | ||||
|  * It provides two methods: | ||||
|  * | ||||
|  * - `getConfigArrayForFile(filePath)` | ||||
|  *     Get the corresponded configuration of a given file. This method doesn't | ||||
|  *     throw even if the given file didn't exist. | ||||
|  * - `clearCache()` | ||||
|  *     Clear the internal cache. You have to call this method when | ||||
|  *     `additionalPluginPool` was updated if `baseConfig` or `cliConfig` depends | ||||
|  *     on the additional plugins. (`CLIEngine#addPlugin()` method calls this.) | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import debugOrig from "debug"; | ||||
| import os from "os"; | ||||
| import path from "path"; | ||||
|  | ||||
| import { ConfigArrayFactory } from "./config-array-factory.js"; | ||||
| import { | ||||
|     ConfigArray, | ||||
|     ConfigDependency, | ||||
|     IgnorePattern | ||||
| } from "./config-array/index.js"; | ||||
| import ConfigValidator from "./shared/config-validator.js"; | ||||
| import { emitDeprecationWarning } from "./shared/deprecation-warnings.js"; | ||||
|  | ||||
| const debug = debugOrig("eslintrc:cascading-config-array-factory"); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| // Define types for VSCode IntelliSense. | ||||
| /** @typedef {import("./shared/types").ConfigData} ConfigData */ | ||||
| /** @typedef {import("./shared/types").Parser} Parser */ | ||||
| /** @typedef {import("./shared/types").Plugin} Plugin */ | ||||
| /** @typedef {import("./shared/types").Rule} Rule */ | ||||
| /** @typedef {ReturnType<ConfigArrayFactory["create"]>} ConfigArray */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} CascadingConfigArrayFactoryOptions | ||||
|  * @property {Map<string,Plugin>} [additionalPluginPool] The map for additional plugins. | ||||
|  * @property {ConfigData} [baseConfig] The config by `baseConfig` option. | ||||
|  * @property {ConfigData} [cliConfig] The config by CLI options (`--env`, `--global`, `--ignore-pattern`, `--parser`, `--parser-options`, `--plugin`, and `--rule`). CLI options overwrite the setting in config files. | ||||
|  * @property {string} [cwd] The base directory to start lookup. | ||||
|  * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`. | ||||
|  * @property {string[]} [rulePaths] The value of `--rulesdir` option. | ||||
|  * @property {string} [specificConfigPath] The value of `--config` option. | ||||
|  * @property {boolean} [useEslintrc] if `false` then it doesn't load config files. | ||||
|  * @property {Function} loadRules The function to use to load rules. | ||||
|  * @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint. | ||||
|  * @property {Object} [resolver=ModuleResolver] The module resolver object. | ||||
|  * @property {string} eslintAllPath The path to the definitions for eslint:all. | ||||
|  * @property {Function} getEslintAllConfig Returns the config data for eslint:all. | ||||
|  * @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended. | ||||
|  * @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} CascadingConfigArrayFactoryInternalSlots | ||||
|  * @property {ConfigArray} baseConfigArray The config array of `baseConfig` option. | ||||
|  * @property {ConfigData} baseConfigData The config data of `baseConfig` option. This is used to reset `baseConfigArray`. | ||||
|  * @property {ConfigArray} cliConfigArray The config array of CLI options. | ||||
|  * @property {ConfigData} cliConfigData The config data of CLI options. This is used to reset `cliConfigArray`. | ||||
|  * @property {ConfigArrayFactory} configArrayFactory The factory for config arrays. | ||||
|  * @property {Map<string, ConfigArray>} configCache The cache from directory paths to config arrays. | ||||
|  * @property {string} cwd The base directory to start lookup. | ||||
|  * @property {WeakMap<ConfigArray, ConfigArray>} finalizeCache The cache from config arrays to finalized config arrays. | ||||
|  * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`. | ||||
|  * @property {string[]|null} rulePaths The value of `--rulesdir` option. This is used to reset `baseConfigArray`. | ||||
|  * @property {string|null} specificConfigPath The value of `--config` option. This is used to reset `cliConfigArray`. | ||||
|  * @property {boolean} useEslintrc if `false` then it doesn't load config files. | ||||
|  * @property {Function} loadRules The function to use to load rules. | ||||
|  * @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint. | ||||
|  * @property {Object} [resolver=ModuleResolver] The module resolver object. | ||||
|  * @property {string} eslintAllPath The path to the definitions for eslint:all. | ||||
|  * @property {Function} getEslintAllConfig Returns the config data for eslint:all. | ||||
|  * @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended. | ||||
|  * @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended. | ||||
|  */ | ||||
|  | ||||
| /** @type {WeakMap<CascadingConfigArrayFactory, CascadingConfigArrayFactoryInternalSlots>} */ | ||||
| const internalSlotsMap = new WeakMap(); | ||||
|  | ||||
| /** | ||||
|  * Create the config array from `baseConfig` and `rulePaths`. | ||||
|  * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots. | ||||
|  * @returns {ConfigArray} The config array of the base configs. | ||||
|  */ | ||||
| function createBaseConfigArray({ | ||||
|     configArrayFactory, | ||||
|     baseConfigData, | ||||
|     rulePaths, | ||||
|     cwd, | ||||
|     loadRules | ||||
| }) { | ||||
|     const baseConfigArray = configArrayFactory.create( | ||||
|         baseConfigData, | ||||
|         { name: "BaseConfig" } | ||||
|     ); | ||||
|  | ||||
|     /* | ||||
|      * Create the config array element for the default ignore patterns. | ||||
|      * This element has `ignorePattern` property that ignores the default | ||||
|      * patterns in the current working directory. | ||||
|      */ | ||||
|     baseConfigArray.unshift(configArrayFactory.create( | ||||
|         { ignorePatterns: IgnorePattern.DefaultPatterns }, | ||||
|         { name: "DefaultIgnorePattern" } | ||||
|     )[0]); | ||||
|  | ||||
|     /* | ||||
|      * Load rules `--rulesdir` option as a pseudo plugin. | ||||
|      * Use a pseudo plugin to define rules of `--rulesdir`, so we can validate | ||||
|      * the rule's options with only information in the config array. | ||||
|      */ | ||||
|     if (rulePaths && rulePaths.length > 0) { | ||||
|         baseConfigArray.push({ | ||||
|             type: "config", | ||||
|             name: "--rulesdir", | ||||
|             filePath: "", | ||||
|             plugins: { | ||||
|                 "": new ConfigDependency({ | ||||
|                     definition: { | ||||
|                         rules: rulePaths.reduce( | ||||
|                             (map, rulesPath) => Object.assign( | ||||
|                                 map, | ||||
|                                 loadRules(rulesPath, cwd) | ||||
|                             ), | ||||
|                             {} | ||||
|                         ) | ||||
|                     }, | ||||
|                     filePath: "", | ||||
|                     id: "", | ||||
|                     importerName: "--rulesdir", | ||||
|                     importerPath: "" | ||||
|                 }) | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     return baseConfigArray; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create the config array from CLI options. | ||||
|  * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots. | ||||
|  * @returns {ConfigArray} The config array of the base configs. | ||||
|  */ | ||||
| function createCLIConfigArray({ | ||||
|     cliConfigData, | ||||
|     configArrayFactory, | ||||
|     cwd, | ||||
|     ignorePath, | ||||
|     specificConfigPath | ||||
| }) { | ||||
|     const cliConfigArray = configArrayFactory.create( | ||||
|         cliConfigData, | ||||
|         { name: "CLIOptions" } | ||||
|     ); | ||||
|  | ||||
|     cliConfigArray.unshift( | ||||
|         ...(ignorePath | ||||
|             ? configArrayFactory.loadESLintIgnore(ignorePath) | ||||
|             : configArrayFactory.loadDefaultESLintIgnore()) | ||||
|     ); | ||||
|  | ||||
|     if (specificConfigPath) { | ||||
|         cliConfigArray.unshift( | ||||
|             ...configArrayFactory.loadFile( | ||||
|                 specificConfigPath, | ||||
|                 { name: "--config", basePath: cwd } | ||||
|             ) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     return cliConfigArray; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The error type when there are files matched by a glob, but all of them have been ignored. | ||||
|  */ | ||||
| class ConfigurationNotFoundError extends Error { | ||||
|  | ||||
|     // eslint-disable-next-line jsdoc/require-description | ||||
|     /** | ||||
|      * @param {string} directoryPath The directory path. | ||||
|      */ | ||||
|     constructor(directoryPath) { | ||||
|         super(`No ESLint configuration found in ${directoryPath}.`); | ||||
|         this.messageTemplate = "no-config-found"; | ||||
|         this.messageData = { directoryPath }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * This class provides the functionality that enumerates every file which is | ||||
|  * matched by given glob patterns and that configuration. | ||||
|  */ | ||||
| class CascadingConfigArrayFactory { | ||||
|  | ||||
|     /** | ||||
|      * Initialize this enumerator. | ||||
|      * @param {CascadingConfigArrayFactoryOptions} options The options. | ||||
|      */ | ||||
|     constructor({ | ||||
|         additionalPluginPool = new Map(), | ||||
|         baseConfig: baseConfigData = null, | ||||
|         cliConfig: cliConfigData = null, | ||||
|         cwd = process.cwd(), | ||||
|         ignorePath, | ||||
|         resolvePluginsRelativeTo, | ||||
|         rulePaths = [], | ||||
|         specificConfigPath = null, | ||||
|         useEslintrc = true, | ||||
|         builtInRules = new Map(), | ||||
|         loadRules, | ||||
|         resolver, | ||||
|         eslintRecommendedPath, | ||||
|         getEslintRecommendedConfig, | ||||
|         eslintAllPath, | ||||
|         getEslintAllConfig | ||||
|     } = {}) { | ||||
|         const configArrayFactory = new ConfigArrayFactory({ | ||||
|             additionalPluginPool, | ||||
|             cwd, | ||||
|             resolvePluginsRelativeTo, | ||||
|             builtInRules, | ||||
|             resolver, | ||||
|             eslintRecommendedPath, | ||||
|             getEslintRecommendedConfig, | ||||
|             eslintAllPath, | ||||
|             getEslintAllConfig | ||||
|         }); | ||||
|  | ||||
|         internalSlotsMap.set(this, { | ||||
|             baseConfigArray: createBaseConfigArray({ | ||||
|                 baseConfigData, | ||||
|                 configArrayFactory, | ||||
|                 cwd, | ||||
|                 rulePaths, | ||||
|                 loadRules | ||||
|             }), | ||||
|             baseConfigData, | ||||
|             cliConfigArray: createCLIConfigArray({ | ||||
|                 cliConfigData, | ||||
|                 configArrayFactory, | ||||
|                 cwd, | ||||
|                 ignorePath, | ||||
|                 specificConfigPath | ||||
|             }), | ||||
|             cliConfigData, | ||||
|             configArrayFactory, | ||||
|             configCache: new Map(), | ||||
|             cwd, | ||||
|             finalizeCache: new WeakMap(), | ||||
|             ignorePath, | ||||
|             rulePaths, | ||||
|             specificConfigPath, | ||||
|             useEslintrc, | ||||
|             builtInRules, | ||||
|             loadRules | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * The path to the current working directory. | ||||
|      * This is used by tests. | ||||
|      * @type {string} | ||||
|      */ | ||||
|     get cwd() { | ||||
|         const { cwd } = internalSlotsMap.get(this); | ||||
|  | ||||
|         return cwd; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the config array of a given file. | ||||
|      * If `filePath` was not given, it returns the config which contains only | ||||
|      * `baseConfigData` and `cliConfigData`. | ||||
|      * @param {string} [filePath] The file path to a file. | ||||
|      * @param {Object} [options] The options. | ||||
|      * @param {boolean} [options.ignoreNotFoundError] If `true` then it doesn't throw `ConfigurationNotFoundError`. | ||||
|      * @returns {ConfigArray} The config array of the file. | ||||
|      */ | ||||
|     getConfigArrayForFile(filePath, { ignoreNotFoundError = false } = {}) { | ||||
|         const { | ||||
|             baseConfigArray, | ||||
|             cliConfigArray, | ||||
|             cwd | ||||
|         } = internalSlotsMap.get(this); | ||||
|  | ||||
|         if (!filePath) { | ||||
|             return new ConfigArray(...baseConfigArray, ...cliConfigArray); | ||||
|         } | ||||
|  | ||||
|         const directoryPath = path.dirname(path.resolve(cwd, filePath)); | ||||
|  | ||||
|         debug(`Load config files for ${directoryPath}.`); | ||||
|  | ||||
|         return this._finalizeConfigArray( | ||||
|             this._loadConfigInAncestors(directoryPath), | ||||
|             directoryPath, | ||||
|             ignoreNotFoundError | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Set the config data to override all configs. | ||||
|      * Require to call `clearCache()` method after this method is called. | ||||
|      * @param {ConfigData} configData The config data to override all configs. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     setOverrideConfig(configData) { | ||||
|         const slots = internalSlotsMap.get(this); | ||||
|  | ||||
|         slots.cliConfigData = configData; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Clear config cache. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     clearCache() { | ||||
|         const slots = internalSlotsMap.get(this); | ||||
|  | ||||
|         slots.baseConfigArray = createBaseConfigArray(slots); | ||||
|         slots.cliConfigArray = createCLIConfigArray(slots); | ||||
|         slots.configCache.clear(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Load and normalize config files from the ancestor directories. | ||||
|      * @param {string} directoryPath The path to a leaf directory. | ||||
|      * @param {boolean} configsExistInSubdirs `true` if configurations exist in subdirectories. | ||||
|      * @returns {ConfigArray} The loaded config. | ||||
|      * @private | ||||
|      */ | ||||
|     _loadConfigInAncestors(directoryPath, configsExistInSubdirs = false) { | ||||
|         const { | ||||
|             baseConfigArray, | ||||
|             configArrayFactory, | ||||
|             configCache, | ||||
|             cwd, | ||||
|             useEslintrc | ||||
|         } = internalSlotsMap.get(this); | ||||
|  | ||||
|         if (!useEslintrc) { | ||||
|             return baseConfigArray; | ||||
|         } | ||||
|  | ||||
|         let configArray = configCache.get(directoryPath); | ||||
|  | ||||
|         // Hit cache. | ||||
|         if (configArray) { | ||||
|             debug(`Cache hit: ${directoryPath}.`); | ||||
|             return configArray; | ||||
|         } | ||||
|         debug(`No cache found: ${directoryPath}.`); | ||||
|  | ||||
|         const homePath = os.homedir(); | ||||
|  | ||||
|         // Consider this is root. | ||||
|         if (directoryPath === homePath && cwd !== homePath) { | ||||
|             debug("Stop traversing because of considered root."); | ||||
|             if (configsExistInSubdirs) { | ||||
|                 const filePath = ConfigArrayFactory.getPathToConfigFileInDirectory(directoryPath); | ||||
|  | ||||
|                 if (filePath) { | ||||
|                     emitDeprecationWarning( | ||||
|                         filePath, | ||||
|                         "ESLINT_PERSONAL_CONFIG_SUPPRESS" | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|             return this._cacheConfig(directoryPath, baseConfigArray); | ||||
|         } | ||||
|  | ||||
|         // Load the config on this directory. | ||||
|         try { | ||||
|             configArray = configArrayFactory.loadInDirectory(directoryPath); | ||||
|         } catch (error) { | ||||
|             /* istanbul ignore next */ | ||||
|             if (error.code === "EACCES") { | ||||
|                 debug("Stop traversing because of 'EACCES' error."); | ||||
|                 return this._cacheConfig(directoryPath, baseConfigArray); | ||||
|             } | ||||
|             throw error; | ||||
|         } | ||||
|  | ||||
|         if (configArray.length > 0 && configArray.isRoot()) { | ||||
|             debug("Stop traversing because of 'root:true'."); | ||||
|             configArray.unshift(...baseConfigArray); | ||||
|             return this._cacheConfig(directoryPath, configArray); | ||||
|         } | ||||
|  | ||||
|         // Load from the ancestors and merge it. | ||||
|         const parentPath = path.dirname(directoryPath); | ||||
|         const parentConfigArray = parentPath && parentPath !== directoryPath | ||||
|             ? this._loadConfigInAncestors( | ||||
|                 parentPath, | ||||
|                 configsExistInSubdirs || configArray.length > 0 | ||||
|             ) | ||||
|             : baseConfigArray; | ||||
|  | ||||
|         if (configArray.length > 0) { | ||||
|             configArray.unshift(...parentConfigArray); | ||||
|         } else { | ||||
|             configArray = parentConfigArray; | ||||
|         } | ||||
|  | ||||
|         // Cache and return. | ||||
|         return this._cacheConfig(directoryPath, configArray); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Freeze and cache a given config. | ||||
|      * @param {string} directoryPath The path to a directory as a cache key. | ||||
|      * @param {ConfigArray} configArray The config array as a cache value. | ||||
|      * @returns {ConfigArray} The `configArray` (frozen). | ||||
|      */ | ||||
|     _cacheConfig(directoryPath, configArray) { | ||||
|         const { configCache } = internalSlotsMap.get(this); | ||||
|  | ||||
|         Object.freeze(configArray); | ||||
|         configCache.set(directoryPath, configArray); | ||||
|  | ||||
|         return configArray; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Finalize a given config array. | ||||
|      * Concatenate `--config` and other CLI options. | ||||
|      * @param {ConfigArray} configArray The parent config array. | ||||
|      * @param {string} directoryPath The path to the leaf directory to find config files. | ||||
|      * @param {boolean} ignoreNotFoundError If `true` then it doesn't throw `ConfigurationNotFoundError`. | ||||
|      * @returns {ConfigArray} The loaded config. | ||||
|      * @private | ||||
|      */ | ||||
|     _finalizeConfigArray(configArray, directoryPath, ignoreNotFoundError) { | ||||
|         const { | ||||
|             cliConfigArray, | ||||
|             configArrayFactory, | ||||
|             finalizeCache, | ||||
|             useEslintrc, | ||||
|             builtInRules | ||||
|         } = internalSlotsMap.get(this); | ||||
|  | ||||
|         let finalConfigArray = finalizeCache.get(configArray); | ||||
|  | ||||
|         if (!finalConfigArray) { | ||||
|             finalConfigArray = configArray; | ||||
|  | ||||
|             // Load the personal config if there are no regular config files. | ||||
|             if ( | ||||
|                 useEslintrc && | ||||
|                 configArray.every(c => !c.filePath) && | ||||
|                 cliConfigArray.every(c => !c.filePath) // `--config` option can be a file. | ||||
|             ) { | ||||
|                 const homePath = os.homedir(); | ||||
|  | ||||
|                 debug("Loading the config file of the home directory:", homePath); | ||||
|  | ||||
|                 const personalConfigArray = configArrayFactory.loadInDirectory( | ||||
|                     homePath, | ||||
|                     { name: "PersonalConfig" } | ||||
|                 ); | ||||
|  | ||||
|                 if ( | ||||
|                     personalConfigArray.length > 0 && | ||||
|                     !directoryPath.startsWith(homePath) | ||||
|                 ) { | ||||
|                     const lastElement = | ||||
|                         personalConfigArray[personalConfigArray.length - 1]; | ||||
|  | ||||
|                     emitDeprecationWarning( | ||||
|                         lastElement.filePath, | ||||
|                         "ESLINT_PERSONAL_CONFIG_LOAD" | ||||
|                     ); | ||||
|                 } | ||||
|  | ||||
|                 finalConfigArray = finalConfigArray.concat(personalConfigArray); | ||||
|             } | ||||
|  | ||||
|             // Apply CLI options. | ||||
|             if (cliConfigArray.length > 0) { | ||||
|                 finalConfigArray = finalConfigArray.concat(cliConfigArray); | ||||
|             } | ||||
|  | ||||
|             // Validate rule settings and environments. | ||||
|             const validator = new ConfigValidator({ | ||||
|                 builtInRules | ||||
|             }); | ||||
|  | ||||
|             validator.validateConfigArray(finalConfigArray); | ||||
|  | ||||
|             // Cache it. | ||||
|             Object.freeze(finalConfigArray); | ||||
|             finalizeCache.set(configArray, finalConfigArray); | ||||
|  | ||||
|             debug( | ||||
|                 "Configuration was determined: %o on %s", | ||||
|                 finalConfigArray, | ||||
|                 directoryPath | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         // At least one element (the default ignore patterns) exists. | ||||
|         if (!ignoreNotFoundError && useEslintrc && finalConfigArray.length <= 1) { | ||||
|             throw new ConfigurationNotFoundError(directoryPath); | ||||
|         } | ||||
|  | ||||
|         return finalConfigArray; | ||||
|     } | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| export { CascadingConfigArrayFactory }; | ||||
							
								
								
									
										1151
									
								
								node_modules/@eslint/eslintrc/lib/config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1151
									
								
								node_modules/@eslint/eslintrc/lib/config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										523
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-array.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										523
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-array.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,523 @@ | ||||
| /** | ||||
|  * @fileoverview `ConfigArray` class. | ||||
|  * | ||||
|  * `ConfigArray` class expresses the full of a configuration. It has the entry | ||||
|  * config file, base config files that were extended, loaded parsers, and loaded | ||||
|  * plugins. | ||||
|  * | ||||
|  * `ConfigArray` class provides three properties and two methods. | ||||
|  * | ||||
|  * - `pluginEnvironments` | ||||
|  * - `pluginProcessors` | ||||
|  * - `pluginRules` | ||||
|  *      The `Map` objects that contain the members of all plugins that this | ||||
|  *      config array contains. Those map objects don't have mutation methods. | ||||
|  *      Those keys are the member ID such as `pluginId/memberName`. | ||||
|  * - `isRoot()` | ||||
|  *      If `true` then this configuration has `root:true` property. | ||||
|  * - `extractConfig(filePath)` | ||||
|  *      Extract the final configuration for a given file. This means merging | ||||
|  *      every config array element which that `criteria` property matched. The | ||||
|  *      `filePath` argument must be an absolute path. | ||||
|  * | ||||
|  * `ConfigArrayFactory` provides the loading logic of config files. | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import { ExtractedConfig } from "./extracted-config.js"; | ||||
| import { IgnorePattern } from "./ignore-pattern.js"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| // Define types for VSCode IntelliSense. | ||||
| /** @typedef {import("../../shared/types").Environment} Environment */ | ||||
| /** @typedef {import("../../shared/types").GlobalConf} GlobalConf */ | ||||
| /** @typedef {import("../../shared/types").RuleConf} RuleConf */ | ||||
| /** @typedef {import("../../shared/types").Rule} Rule */ | ||||
| /** @typedef {import("../../shared/types").Plugin} Plugin */ | ||||
| /** @typedef {import("../../shared/types").Processor} Processor */ | ||||
| /** @typedef {import("./config-dependency").DependentParser} DependentParser */ | ||||
| /** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */ | ||||
| /** @typedef {import("./override-tester")["OverrideTester"]} OverrideTester */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} ConfigArrayElement | ||||
|  * @property {string} name The name of this config element. | ||||
|  * @property {string} filePath The path to the source file of this config element. | ||||
|  * @property {InstanceType<OverrideTester>|null} criteria The tester for the `files` and `excludedFiles` of this config element. | ||||
|  * @property {Record<string, boolean>|undefined} env The environment settings. | ||||
|  * @property {Record<string, GlobalConf>|undefined} globals The global variable settings. | ||||
|  * @property {IgnorePattern|undefined} ignorePattern The ignore patterns. | ||||
|  * @property {boolean|undefined} noInlineConfig The flag that disables directive comments. | ||||
|  * @property {DependentParser|undefined} parser The parser loader. | ||||
|  * @property {Object|undefined} parserOptions The parser options. | ||||
|  * @property {Record<string, DependentPlugin>|undefined} plugins The plugin loaders. | ||||
|  * @property {string|undefined} processor The processor name to refer plugin's processor. | ||||
|  * @property {boolean|undefined} reportUnusedDisableDirectives The flag to report unused `eslint-disable` comments. | ||||
|  * @property {boolean|undefined} root The flag to express root. | ||||
|  * @property {Record<string, RuleConf>|undefined} rules The rule settings | ||||
|  * @property {Object|undefined} settings The shared settings. | ||||
|  * @property {"config" | "ignore" | "implicit-processor"} type The element type. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} ConfigArrayInternalSlots | ||||
|  * @property {Map<string, ExtractedConfig>} cache The cache to extract configs. | ||||
|  * @property {ReadonlyMap<string, Environment>|null} envMap The map from environment ID to environment definition. | ||||
|  * @property {ReadonlyMap<string, Processor>|null} processorMap The map from processor ID to environment definition. | ||||
|  * @property {ReadonlyMap<string, Rule>|null} ruleMap The map from rule ID to rule definition. | ||||
|  */ | ||||
|  | ||||
| /** @type {WeakMap<ConfigArray, ConfigArrayInternalSlots>} */ | ||||
| const internalSlotsMap = new class extends WeakMap { | ||||
|     get(key) { | ||||
|         let value = super.get(key); | ||||
|  | ||||
|         if (!value) { | ||||
|             value = { | ||||
|                 cache: new Map(), | ||||
|                 envMap: null, | ||||
|                 processorMap: null, | ||||
|                 ruleMap: null | ||||
|             }; | ||||
|             super.set(key, value); | ||||
|         } | ||||
|  | ||||
|         return value; | ||||
|     } | ||||
| }(); | ||||
|  | ||||
| /** | ||||
|  * Get the indices which are matched to a given file. | ||||
|  * @param {ConfigArrayElement[]} elements The elements. | ||||
|  * @param {string} filePath The path to a target file. | ||||
|  * @returns {number[]} The indices. | ||||
|  */ | ||||
| function getMatchedIndices(elements, filePath) { | ||||
|     const indices = []; | ||||
|  | ||||
|     for (let i = elements.length - 1; i >= 0; --i) { | ||||
|         const element = elements[i]; | ||||
|  | ||||
|         if (!element.criteria || (filePath && element.criteria.test(filePath))) { | ||||
|             indices.push(i); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return indices; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Check if a value is a non-null object. | ||||
|  * @param {any} x The value to check. | ||||
|  * @returns {boolean} `true` if the value is a non-null object. | ||||
|  */ | ||||
| function isNonNullObject(x) { | ||||
|     return typeof x === "object" && x !== null; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Merge two objects. | ||||
|  * | ||||
|  * Assign every property values of `y` to `x` if `x` doesn't have the property. | ||||
|  * If `x`'s property value is an object, it does recursive. | ||||
|  * @param {Object} target The destination to merge | ||||
|  * @param {Object|undefined} source The source to merge. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function mergeWithoutOverwrite(target, source) { | ||||
|     if (!isNonNullObject(source)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     for (const key of Object.keys(source)) { | ||||
|         if (key === "__proto__") { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (isNonNullObject(target[key])) { | ||||
|             mergeWithoutOverwrite(target[key], source[key]); | ||||
|         } else if (target[key] === void 0) { | ||||
|             if (isNonNullObject(source[key])) { | ||||
|                 target[key] = Array.isArray(source[key]) ? [] : {}; | ||||
|                 mergeWithoutOverwrite(target[key], source[key]); | ||||
|             } else if (source[key] !== void 0) { | ||||
|                 target[key] = source[key]; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The error for plugin conflicts. | ||||
|  */ | ||||
| class PluginConflictError extends Error { | ||||
|  | ||||
|     /** | ||||
|      * Initialize this error object. | ||||
|      * @param {string} pluginId The plugin ID. | ||||
|      * @param {{filePath:string, importerName:string}[]} plugins The resolved plugins. | ||||
|      */ | ||||
|     constructor(pluginId, plugins) { | ||||
|         super(`Plugin "${pluginId}" was conflicted between ${plugins.map(p => `"${p.importerName}"`).join(" and ")}.`); | ||||
|         this.messageTemplate = "plugin-conflict"; | ||||
|         this.messageData = { pluginId, plugins }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Merge plugins. | ||||
|  * `target`'s definition is prior to `source`'s. | ||||
|  * @param {Record<string, DependentPlugin>} target The destination to merge | ||||
|  * @param {Record<string, DependentPlugin>|undefined} source The source to merge. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function mergePlugins(target, source) { | ||||
|     if (!isNonNullObject(source)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     for (const key of Object.keys(source)) { | ||||
|         if (key === "__proto__") { | ||||
|             continue; | ||||
|         } | ||||
|         const targetValue = target[key]; | ||||
|         const sourceValue = source[key]; | ||||
|  | ||||
|         // Adopt the plugin which was found at first. | ||||
|         if (targetValue === void 0) { | ||||
|             if (sourceValue.error) { | ||||
|                 throw sourceValue.error; | ||||
|             } | ||||
|             target[key] = sourceValue; | ||||
|         } else if (sourceValue.filePath !== targetValue.filePath) { | ||||
|             throw new PluginConflictError(key, [ | ||||
|                 { | ||||
|                     filePath: targetValue.filePath, | ||||
|                     importerName: targetValue.importerName | ||||
|                 }, | ||||
|                 { | ||||
|                     filePath: sourceValue.filePath, | ||||
|                     importerName: sourceValue.importerName | ||||
|                 } | ||||
|             ]); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Merge rule configs. | ||||
|  * `target`'s definition is prior to `source`'s. | ||||
|  * @param {Record<string, Array>} target The destination to merge | ||||
|  * @param {Record<string, RuleConf>|undefined} source The source to merge. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function mergeRuleConfigs(target, source) { | ||||
|     if (!isNonNullObject(source)) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     for (const key of Object.keys(source)) { | ||||
|         if (key === "__proto__") { | ||||
|             continue; | ||||
|         } | ||||
|         const targetDef = target[key]; | ||||
|         const sourceDef = source[key]; | ||||
|  | ||||
|         // Adopt the rule config which was found at first. | ||||
|         if (targetDef === void 0) { | ||||
|             if (Array.isArray(sourceDef)) { | ||||
|                 target[key] = [...sourceDef]; | ||||
|             } else { | ||||
|                 target[key] = [sourceDef]; | ||||
|             } | ||||
|  | ||||
|         /* | ||||
|          * If the first found rule config is severity only and the current rule | ||||
|          * config has options, merge the severity and the options. | ||||
|          */ | ||||
|         } else if ( | ||||
|             targetDef.length === 1 && | ||||
|             Array.isArray(sourceDef) && | ||||
|             sourceDef.length >= 2 | ||||
|         ) { | ||||
|             targetDef.push(...sourceDef.slice(1)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create the extracted config. | ||||
|  * @param {ConfigArray} instance The config elements. | ||||
|  * @param {number[]} indices The indices to use. | ||||
|  * @returns {ExtractedConfig} The extracted config. | ||||
|  */ | ||||
| function createConfig(instance, indices) { | ||||
|     const config = new ExtractedConfig(); | ||||
|     const ignorePatterns = []; | ||||
|  | ||||
|     // Merge elements. | ||||
|     for (const index of indices) { | ||||
|         const element = instance[index]; | ||||
|  | ||||
|         // Adopt the parser which was found at first. | ||||
|         if (!config.parser && element.parser) { | ||||
|             if (element.parser.error) { | ||||
|                 throw element.parser.error; | ||||
|             } | ||||
|             config.parser = element.parser; | ||||
|         } | ||||
|  | ||||
|         // Adopt the processor which was found at first. | ||||
|         if (!config.processor && element.processor) { | ||||
|             config.processor = element.processor; | ||||
|         } | ||||
|  | ||||
|         // Adopt the noInlineConfig which was found at first. | ||||
|         if (config.noInlineConfig === void 0 && element.noInlineConfig !== void 0) { | ||||
|             config.noInlineConfig = element.noInlineConfig; | ||||
|             config.configNameOfNoInlineConfig = element.name; | ||||
|         } | ||||
|  | ||||
|         // Adopt the reportUnusedDisableDirectives which was found at first. | ||||
|         if (config.reportUnusedDisableDirectives === void 0 && element.reportUnusedDisableDirectives !== void 0) { | ||||
|             config.reportUnusedDisableDirectives = element.reportUnusedDisableDirectives; | ||||
|         } | ||||
|  | ||||
|         // Collect ignorePatterns | ||||
|         if (element.ignorePattern) { | ||||
|             ignorePatterns.push(element.ignorePattern); | ||||
|         } | ||||
|  | ||||
|         // Merge others. | ||||
|         mergeWithoutOverwrite(config.env, element.env); | ||||
|         mergeWithoutOverwrite(config.globals, element.globals); | ||||
|         mergeWithoutOverwrite(config.parserOptions, element.parserOptions); | ||||
|         mergeWithoutOverwrite(config.settings, element.settings); | ||||
|         mergePlugins(config.plugins, element.plugins); | ||||
|         mergeRuleConfigs(config.rules, element.rules); | ||||
|     } | ||||
|  | ||||
|     // Create the predicate function for ignore patterns. | ||||
|     if (ignorePatterns.length > 0) { | ||||
|         config.ignores = IgnorePattern.createIgnore(ignorePatterns.reverse()); | ||||
|     } | ||||
|  | ||||
|     return config; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Collect definitions. | ||||
|  * @template T, U | ||||
|  * @param {string} pluginId The plugin ID for prefix. | ||||
|  * @param {Record<string,T>} defs The definitions to collect. | ||||
|  * @param {Map<string, U>} map The map to output. | ||||
|  * @param {function(T): U} [normalize] The normalize function for each value. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function collect(pluginId, defs, map, normalize) { | ||||
|     if (defs) { | ||||
|         const prefix = pluginId && `${pluginId}/`; | ||||
|  | ||||
|         for (const [key, value] of Object.entries(defs)) { | ||||
|             map.set( | ||||
|                 `${prefix}${key}`, | ||||
|                 normalize ? normalize(value) : value | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Normalize a rule definition. | ||||
|  * @param {Function|Rule} rule The rule definition to normalize. | ||||
|  * @returns {Rule} The normalized rule definition. | ||||
|  */ | ||||
| function normalizePluginRule(rule) { | ||||
|     return typeof rule === "function" ? { create: rule } : rule; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Delete the mutation methods from a given map. | ||||
|  * @param {Map<any, any>} map The map object to delete. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function deleteMutationMethods(map) { | ||||
|     Object.defineProperties(map, { | ||||
|         clear: { configurable: true, value: void 0 }, | ||||
|         delete: { configurable: true, value: void 0 }, | ||||
|         set: { configurable: true, value: void 0 } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array. | ||||
|  * @param {ConfigArrayElement[]} elements The config elements. | ||||
|  * @param {ConfigArrayInternalSlots} slots The internal slots. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function initPluginMemberMaps(elements, slots) { | ||||
|     const processed = new Set(); | ||||
|  | ||||
|     slots.envMap = new Map(); | ||||
|     slots.processorMap = new Map(); | ||||
|     slots.ruleMap = new Map(); | ||||
|  | ||||
|     for (const element of elements) { | ||||
|         if (!element.plugins) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         for (const [pluginId, value] of Object.entries(element.plugins)) { | ||||
|             const plugin = value.definition; | ||||
|  | ||||
|             if (!plugin || processed.has(pluginId)) { | ||||
|                 continue; | ||||
|             } | ||||
|             processed.add(pluginId); | ||||
|  | ||||
|             collect(pluginId, plugin.environments, slots.envMap); | ||||
|             collect(pluginId, plugin.processors, slots.processorMap); | ||||
|             collect(pluginId, plugin.rules, slots.ruleMap, normalizePluginRule); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     deleteMutationMethods(slots.envMap); | ||||
|     deleteMutationMethods(slots.processorMap); | ||||
|     deleteMutationMethods(slots.ruleMap); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array. | ||||
|  * @param {ConfigArray} instance The config elements. | ||||
|  * @returns {ConfigArrayInternalSlots} The extracted config. | ||||
|  */ | ||||
| function ensurePluginMemberMaps(instance) { | ||||
|     const slots = internalSlotsMap.get(instance); | ||||
|  | ||||
|     if (!slots.ruleMap) { | ||||
|         initPluginMemberMaps(instance, slots); | ||||
|     } | ||||
|  | ||||
|     return slots; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * The Config Array. | ||||
|  * | ||||
|  * `ConfigArray` instance contains all settings, parsers, and plugins. | ||||
|  * You need to call `ConfigArray#extractConfig(filePath)` method in order to | ||||
|  * extract, merge and get only the config data which is related to an arbitrary | ||||
|  * file. | ||||
|  * @extends {Array<ConfigArrayElement>} | ||||
|  */ | ||||
| class ConfigArray extends Array { | ||||
|  | ||||
|     /** | ||||
|      * Get the plugin environments. | ||||
|      * The returned map cannot be mutated. | ||||
|      * @type {ReadonlyMap<string, Environment>} The plugin environments. | ||||
|      */ | ||||
|     get pluginEnvironments() { | ||||
|         return ensurePluginMemberMaps(this).envMap; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the plugin processors. | ||||
|      * The returned map cannot be mutated. | ||||
|      * @type {ReadonlyMap<string, Processor>} The plugin processors. | ||||
|      */ | ||||
|     get pluginProcessors() { | ||||
|         return ensurePluginMemberMaps(this).processorMap; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the plugin rules. | ||||
|      * The returned map cannot be mutated. | ||||
|      * @returns {ReadonlyMap<string, Rule>} The plugin rules. | ||||
|      */ | ||||
|     get pluginRules() { | ||||
|         return ensurePluginMemberMaps(this).ruleMap; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if this config has `root` flag. | ||||
|      * @returns {boolean} `true` if this config array is root. | ||||
|      */ | ||||
|     isRoot() { | ||||
|         for (let i = this.length - 1; i >= 0; --i) { | ||||
|             const root = this[i].root; | ||||
|  | ||||
|             if (typeof root === "boolean") { | ||||
|                 return root; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Extract the config data which is related to a given file. | ||||
|      * @param {string} filePath The absolute path to the target file. | ||||
|      * @returns {ExtractedConfig} The extracted config data. | ||||
|      */ | ||||
|     extractConfig(filePath) { | ||||
|         const { cache } = internalSlotsMap.get(this); | ||||
|         const indices = getMatchedIndices(this, filePath); | ||||
|         const cacheKey = indices.join(","); | ||||
|  | ||||
|         if (!cache.has(cacheKey)) { | ||||
|             cache.set(cacheKey, createConfig(this, indices)); | ||||
|         } | ||||
|  | ||||
|         return cache.get(cacheKey); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if a given path is an additional lint target. | ||||
|      * @param {string} filePath The absolute path to the target file. | ||||
|      * @returns {boolean} `true` if the file is an additional lint target. | ||||
|      */ | ||||
|     isAdditionalTargetPath(filePath) { | ||||
|         for (const { criteria, type } of this) { | ||||
|             if ( | ||||
|                 type === "config" && | ||||
|                 criteria && | ||||
|                 !criteria.endsWithWildcard && | ||||
|                 criteria.test(filePath) | ||||
|             ) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get the used extracted configs. | ||||
|  * CLIEngine will use this method to collect used deprecated rules. | ||||
|  * @param {ConfigArray} instance The config array object to get. | ||||
|  * @returns {ExtractedConfig[]} The used extracted configs. | ||||
|  * @private | ||||
|  */ | ||||
| function getUsedExtractedConfigs(instance) { | ||||
|     const { cache } = internalSlotsMap.get(instance); | ||||
|  | ||||
|     return Array.from(cache.values()); | ||||
| } | ||||
|  | ||||
|  | ||||
| export { | ||||
|     ConfigArray, | ||||
|     getUsedExtractedConfigs | ||||
| }; | ||||
							
								
								
									
										124
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| /** | ||||
|  * @fileoverview `ConfigDependency` class. | ||||
|  * | ||||
|  * `ConfigDependency` class expresses a loaded parser or plugin. | ||||
|  * | ||||
|  * If the parser or plugin was loaded successfully, it has `definition` property | ||||
|  * and `filePath` property. Otherwise, it has `error` property. | ||||
|  * | ||||
|  * When `JSON.stringify()` converted a `ConfigDependency` object to a JSON, it | ||||
|  * omits `definition` property. | ||||
|  * | ||||
|  * `ConfigArrayFactory` creates `ConfigDependency` objects when it loads parsers | ||||
|  * or plugins. | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| import util from "util"; | ||||
|  | ||||
| /** | ||||
|  * The class is to store parsers or plugins. | ||||
|  * This class hides the loaded object from `JSON.stringify()` and `console.log`. | ||||
|  * @template T | ||||
|  */ | ||||
| class ConfigDependency { | ||||
|  | ||||
|     /** | ||||
|      * Initialize this instance. | ||||
|      * @param {Object} data The dependency data. | ||||
|      * @param {T} [data.definition] The dependency if the loading succeeded. | ||||
|      * @param {T} [data.original] The original, non-normalized dependency if the loading succeeded. | ||||
|      * @param {Error} [data.error] The error object if the loading failed. | ||||
|      * @param {string} [data.filePath] The actual path to the dependency if the loading succeeded. | ||||
|      * @param {string} data.id The ID of this dependency. | ||||
|      * @param {string} data.importerName The name of the config file which loads this dependency. | ||||
|      * @param {string} data.importerPath The path to the config file which loads this dependency. | ||||
|      */ | ||||
|     constructor({ | ||||
|         definition = null, | ||||
|         original = null, | ||||
|         error = null, | ||||
|         filePath = null, | ||||
|         id, | ||||
|         importerName, | ||||
|         importerPath | ||||
|     }) { | ||||
|  | ||||
|         /** | ||||
|          * The loaded dependency if the loading succeeded. | ||||
|          * @type {T|null} | ||||
|          */ | ||||
|         this.definition = definition; | ||||
|  | ||||
|         /** | ||||
|          * The original dependency as loaded directly from disk if the loading succeeded. | ||||
|          * @type {T|null} | ||||
|          */ | ||||
|         this.original = original; | ||||
|  | ||||
|         /** | ||||
|          * The error object if the loading failed. | ||||
|          * @type {Error|null} | ||||
|          */ | ||||
|         this.error = error; | ||||
|  | ||||
|         /** | ||||
|          * The loaded dependency if the loading succeeded. | ||||
|          * @type {string|null} | ||||
|          */ | ||||
|         this.filePath = filePath; | ||||
|  | ||||
|         /** | ||||
|          * The ID of this dependency. | ||||
|          * @type {string} | ||||
|          */ | ||||
|         this.id = id; | ||||
|  | ||||
|         /** | ||||
|          * The name of the config file which loads this dependency. | ||||
|          * @type {string} | ||||
|          */ | ||||
|         this.importerName = importerName; | ||||
|  | ||||
|         /** | ||||
|          * The path to the config file which loads this dependency. | ||||
|          * @type {string} | ||||
|          */ | ||||
|         this.importerPath = importerPath; | ||||
|     } | ||||
|  | ||||
|     // eslint-disable-next-line jsdoc/require-description | ||||
|     /** | ||||
|      * @returns {Object} a JSON compatible object. | ||||
|      */ | ||||
|     toJSON() { | ||||
|         const obj = this[util.inspect.custom](); | ||||
|  | ||||
|         // Display `error.message` (`Error#message` is unenumerable). | ||||
|         if (obj.error instanceof Error) { | ||||
|             obj.error = { ...obj.error, message: obj.error.message }; | ||||
|         } | ||||
|  | ||||
|         return obj; | ||||
|     } | ||||
|  | ||||
|     // eslint-disable-next-line jsdoc/require-description | ||||
|     /** | ||||
|      * @returns {Object} an object to display by `console.log()`. | ||||
|      */ | ||||
|     [util.inspect.custom]() { | ||||
|         const { | ||||
|             definition: _ignore1, // eslint-disable-line no-unused-vars | ||||
|             original: _ignore2, // eslint-disable-line no-unused-vars | ||||
|             ...obj | ||||
|         } = this; | ||||
|  | ||||
|         return obj; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** @typedef {ConfigDependency<import("../../shared/types").Parser>} DependentParser */ | ||||
| /** @typedef {ConfigDependency<import("../../shared/types").Plugin>} DependentPlugin */ | ||||
|  | ||||
| export { ConfigDependency }; | ||||
							
								
								
									
										145
									
								
								node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| /** | ||||
|  * @fileoverview `ExtractedConfig` class. | ||||
|  * | ||||
|  * `ExtractedConfig` class expresses a final configuration for a specific file. | ||||
|  * | ||||
|  * It provides one method. | ||||
|  * | ||||
|  * - `toCompatibleObjectAsConfigFileContent()` | ||||
|  *      Convert this configuration to the compatible object as the content of | ||||
|  *      config files. It converts the loaded parser and plugins to strings. | ||||
|  *      `CLIEngine#getConfigForFile(filePath)` method uses this method. | ||||
|  * | ||||
|  * `ConfigArray#extractConfig(filePath)` creates a `ExtractedConfig` instance. | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| import { IgnorePattern } from "./ignore-pattern.js"; | ||||
|  | ||||
| // For VSCode intellisense | ||||
| /** @typedef {import("../../shared/types").ConfigData} ConfigData */ | ||||
| /** @typedef {import("../../shared/types").GlobalConf} GlobalConf */ | ||||
| /** @typedef {import("../../shared/types").SeverityConf} SeverityConf */ | ||||
| /** @typedef {import("./config-dependency").DependentParser} DependentParser */ | ||||
| /** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */ | ||||
|  | ||||
| /** | ||||
|  * Check if `xs` starts with `ys`. | ||||
|  * @template T | ||||
|  * @param {T[]} xs The array to check. | ||||
|  * @param {T[]} ys The array that may be the first part of `xs`. | ||||
|  * @returns {boolean} `true` if `xs` starts with `ys`. | ||||
|  */ | ||||
| function startsWith(xs, ys) { | ||||
|     return xs.length >= ys.length && ys.every((y, i) => y === xs[i]); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The class for extracted config data. | ||||
|  */ | ||||
| class ExtractedConfig { | ||||
|     constructor() { | ||||
|  | ||||
|         /** | ||||
|          * The config name what `noInlineConfig` setting came from. | ||||
|          * @type {string} | ||||
|          */ | ||||
|         this.configNameOfNoInlineConfig = ""; | ||||
|  | ||||
|         /** | ||||
|          * Environments. | ||||
|          * @type {Record<string, boolean>} | ||||
|          */ | ||||
|         this.env = {}; | ||||
|  | ||||
|         /** | ||||
|          * Global variables. | ||||
|          * @type {Record<string, GlobalConf>} | ||||
|          */ | ||||
|         this.globals = {}; | ||||
|  | ||||
|         /** | ||||
|          * The glob patterns that ignore to lint. | ||||
|          * @type {(((filePath:string, dot?:boolean) => boolean) & { basePath:string; patterns:string[] }) | undefined} | ||||
|          */ | ||||
|         this.ignores = void 0; | ||||
|  | ||||
|         /** | ||||
|          * The flag that disables directive comments. | ||||
|          * @type {boolean|undefined} | ||||
|          */ | ||||
|         this.noInlineConfig = void 0; | ||||
|  | ||||
|         /** | ||||
|          * Parser definition. | ||||
|          * @type {DependentParser|null} | ||||
|          */ | ||||
|         this.parser = null; | ||||
|  | ||||
|         /** | ||||
|          * Options for the parser. | ||||
|          * @type {Object} | ||||
|          */ | ||||
|         this.parserOptions = {}; | ||||
|  | ||||
|         /** | ||||
|          * Plugin definitions. | ||||
|          * @type {Record<string, DependentPlugin>} | ||||
|          */ | ||||
|         this.plugins = {}; | ||||
|  | ||||
|         /** | ||||
|          * Processor ID. | ||||
|          * @type {string|null} | ||||
|          */ | ||||
|         this.processor = null; | ||||
|  | ||||
|         /** | ||||
|          * The flag that reports unused `eslint-disable` directive comments. | ||||
|          * @type {boolean|undefined} | ||||
|          */ | ||||
|         this.reportUnusedDisableDirectives = void 0; | ||||
|  | ||||
|         /** | ||||
|          * Rule settings. | ||||
|          * @type {Record<string, [SeverityConf, ...any[]]>} | ||||
|          */ | ||||
|         this.rules = {}; | ||||
|  | ||||
|         /** | ||||
|          * Shared settings. | ||||
|          * @type {Object} | ||||
|          */ | ||||
|         this.settings = {}; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Convert this config to the compatible object as a config file content. | ||||
|      * @returns {ConfigData} The converted object. | ||||
|      */ | ||||
|     toCompatibleObjectAsConfigFileContent() { | ||||
|         const { | ||||
|             /* eslint-disable no-unused-vars */ | ||||
|             configNameOfNoInlineConfig: _ignore1, | ||||
|             processor: _ignore2, | ||||
|             /* eslint-enable no-unused-vars */ | ||||
|             ignores, | ||||
|             ...config | ||||
|         } = this; | ||||
|  | ||||
|         config.parser = config.parser && config.parser.filePath; | ||||
|         config.plugins = Object.keys(config.plugins).filter(Boolean).reverse(); | ||||
|         config.ignorePatterns = ignores ? ignores.patterns : []; | ||||
|  | ||||
|         // Strip the default patterns from `ignorePatterns`. | ||||
|         if (startsWith(config.ignorePatterns, IgnorePattern.DefaultPatterns)) { | ||||
|             config.ignorePatterns = | ||||
|                 config.ignorePatterns.slice(IgnorePattern.DefaultPatterns.length); | ||||
|         } | ||||
|  | ||||
|         return config; | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { ExtractedConfig }; | ||||
							
								
								
									
										238
									
								
								node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,238 @@ | ||||
| /** | ||||
|  * @fileoverview `IgnorePattern` class. | ||||
|  * | ||||
|  * `IgnorePattern` class has the set of glob patterns and the base path. | ||||
|  * | ||||
|  * It provides two static methods. | ||||
|  * | ||||
|  * - `IgnorePattern.createDefaultIgnore(cwd)` | ||||
|  *      Create the default predicate function. | ||||
|  * - `IgnorePattern.createIgnore(ignorePatterns)` | ||||
|  *      Create the predicate function from multiple `IgnorePattern` objects. | ||||
|  * | ||||
|  * It provides two properties and a method. | ||||
|  * | ||||
|  * - `patterns` | ||||
|  *      The glob patterns that ignore to lint. | ||||
|  * - `basePath` | ||||
|  *      The base path of the glob patterns. If absolute paths existed in the | ||||
|  *      glob patterns, those are handled as relative paths to the base path. | ||||
|  * - `getPatternsRelativeTo(basePath)` | ||||
|  *      Get `patterns` as modified for a given base path. It modifies the | ||||
|  *      absolute paths in the patterns as prepending the difference of two base | ||||
|  *      paths. | ||||
|  * | ||||
|  * `ConfigArrayFactory` creates `IgnorePattern` objects when it processes | ||||
|  * `ignorePatterns` properties. | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import assert from "assert"; | ||||
| import path from "path"; | ||||
| import ignore from "ignore"; | ||||
| import debugOrig from "debug"; | ||||
|  | ||||
| const debug = debugOrig("eslintrc:ignore-pattern"); | ||||
|  | ||||
| /** @typedef {ReturnType<import("ignore").default>} Ignore */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Helpers | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Get the path to the common ancestor directory of given paths. | ||||
|  * @param {string[]} sourcePaths The paths to calculate the common ancestor. | ||||
|  * @returns {string} The path to the common ancestor directory. | ||||
|  */ | ||||
| function getCommonAncestorPath(sourcePaths) { | ||||
|     let result = sourcePaths[0]; | ||||
|  | ||||
|     for (let i = 1; i < sourcePaths.length; ++i) { | ||||
|         const a = result; | ||||
|         const b = sourcePaths[i]; | ||||
|  | ||||
|         // Set the shorter one (it's the common ancestor if one includes the other). | ||||
|         result = a.length < b.length ? a : b; | ||||
|  | ||||
|         // Set the common ancestor. | ||||
|         for (let j = 0, lastSepPos = 0; j < a.length && j < b.length; ++j) { | ||||
|             if (a[j] !== b[j]) { | ||||
|                 result = a.slice(0, lastSepPos); | ||||
|                 break; | ||||
|             } | ||||
|             if (a[j] === path.sep) { | ||||
|                 lastSepPos = j; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     let resolvedResult = result || path.sep; | ||||
|  | ||||
|     // if Windows common ancestor is root of drive must have trailing slash to be absolute. | ||||
|     if (resolvedResult && resolvedResult.endsWith(":") && process.platform === "win32") { | ||||
|         resolvedResult += path.sep; | ||||
|     } | ||||
|     return resolvedResult; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Make relative path. | ||||
|  * @param {string} from The source path to get relative path. | ||||
|  * @param {string} to The destination path to get relative path. | ||||
|  * @returns {string} The relative path. | ||||
|  */ | ||||
| function relative(from, to) { | ||||
|     const relPath = path.relative(from, to); | ||||
|  | ||||
|     if (path.sep === "/") { | ||||
|         return relPath; | ||||
|     } | ||||
|     return relPath.split(path.sep).join("/"); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Get the trailing slash if existed. | ||||
|  * @param {string} filePath The path to check. | ||||
|  * @returns {string} The trailing slash if existed. | ||||
|  */ | ||||
| function dirSuffix(filePath) { | ||||
|     const isDir = ( | ||||
|         filePath.endsWith(path.sep) || | ||||
|         (process.platform === "win32" && filePath.endsWith("/")) | ||||
|     ); | ||||
|  | ||||
|     return isDir ? "/" : ""; | ||||
| } | ||||
|  | ||||
| const DefaultPatterns = Object.freeze(["/**/node_modules/*"]); | ||||
| const DotPatterns = Object.freeze([".*", "!.eslintrc.*", "!../"]); | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| class IgnorePattern { | ||||
|  | ||||
|     /** | ||||
|      * The default patterns. | ||||
|      * @type {string[]} | ||||
|      */ | ||||
|     static get DefaultPatterns() { | ||||
|         return DefaultPatterns; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Create the default predicate function. | ||||
|      * @param {string} cwd The current working directory. | ||||
|      * @returns {((filePath:string, dot:boolean) => boolean) & {basePath:string; patterns:string[]}} | ||||
|      * The preficate function. | ||||
|      * The first argument is an absolute path that is checked. | ||||
|      * The second argument is the flag to not ignore dotfiles. | ||||
|      * If the predicate function returned `true`, it means the path should be ignored. | ||||
|      */ | ||||
|     static createDefaultIgnore(cwd) { | ||||
|         return this.createIgnore([new IgnorePattern(DefaultPatterns, cwd)]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Create the predicate function from multiple `IgnorePattern` objects. | ||||
|      * @param {IgnorePattern[]} ignorePatterns The list of ignore patterns. | ||||
|      * @returns {((filePath:string, dot?:boolean) => boolean) & {basePath:string; patterns:string[]}} | ||||
|      * The preficate function. | ||||
|      * The first argument is an absolute path that is checked. | ||||
|      * The second argument is the flag to not ignore dotfiles. | ||||
|      * If the predicate function returned `true`, it means the path should be ignored. | ||||
|      */ | ||||
|     static createIgnore(ignorePatterns) { | ||||
|         debug("Create with: %o", ignorePatterns); | ||||
|  | ||||
|         const basePath = getCommonAncestorPath(ignorePatterns.map(p => p.basePath)); | ||||
|         const patterns = [].concat( | ||||
|             ...ignorePatterns.map(p => p.getPatternsRelativeTo(basePath)) | ||||
|         ); | ||||
|         const ig = ignore({ allowRelativePaths: true }).add([...DotPatterns, ...patterns]); | ||||
|         const dotIg = ignore({ allowRelativePaths: true }).add(patterns); | ||||
|  | ||||
|         debug("  processed: %o", { basePath, patterns }); | ||||
|  | ||||
|         return Object.assign( | ||||
|             (filePath, dot = false) => { | ||||
|                 assert(path.isAbsolute(filePath), "'filePath' should be an absolute path."); | ||||
|                 const relPathRaw = relative(basePath, filePath); | ||||
|                 const relPath = relPathRaw && (relPathRaw + dirSuffix(filePath)); | ||||
|                 const adoptedIg = dot ? dotIg : ig; | ||||
|                 const result = relPath !== "" && adoptedIg.ignores(relPath); | ||||
|  | ||||
|                 debug("Check", { filePath, dot, relativePath: relPath, result }); | ||||
|                 return result; | ||||
|             }, | ||||
|             { basePath, patterns } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Initialize a new `IgnorePattern` instance. | ||||
|      * @param {string[]} patterns The glob patterns that ignore to lint. | ||||
|      * @param {string} basePath The base path of `patterns`. | ||||
|      */ | ||||
|     constructor(patterns, basePath) { | ||||
|         assert(path.isAbsolute(basePath), "'basePath' should be an absolute path."); | ||||
|  | ||||
|         /** | ||||
|          * The glob patterns that ignore to lint. | ||||
|          * @type {string[]} | ||||
|          */ | ||||
|         this.patterns = patterns; | ||||
|  | ||||
|         /** | ||||
|          * The base path of `patterns`. | ||||
|          * @type {string} | ||||
|          */ | ||||
|         this.basePath = basePath; | ||||
|  | ||||
|         /** | ||||
|          * If `true` then patterns which don't start with `/` will match the paths to the outside of `basePath`. Defaults to `false`. | ||||
|          * | ||||
|          * It's set `true` for `.eslintignore`, `package.json`, and `--ignore-path` for backward compatibility. | ||||
|          * It's `false` as-is for `ignorePatterns` property in config files. | ||||
|          * @type {boolean} | ||||
|          */ | ||||
|         this.loose = false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get `patterns` as modified for a given base path. It modifies the | ||||
|      * absolute paths in the patterns as prepending the difference of two base | ||||
|      * paths. | ||||
|      * @param {string} newBasePath The base path. | ||||
|      * @returns {string[]} Modifired patterns. | ||||
|      */ | ||||
|     getPatternsRelativeTo(newBasePath) { | ||||
|         assert(path.isAbsolute(newBasePath), "'newBasePath' should be an absolute path."); | ||||
|         const { basePath, loose, patterns } = this; | ||||
|  | ||||
|         if (newBasePath === basePath) { | ||||
|             return patterns; | ||||
|         } | ||||
|         const prefix = `/${relative(newBasePath, basePath)}`; | ||||
|  | ||||
|         return patterns.map(pattern => { | ||||
|             const negative = pattern.startsWith("!"); | ||||
|             const head = negative ? "!" : ""; | ||||
|             const body = negative ? pattern.slice(1) : pattern; | ||||
|  | ||||
|             if (body.startsWith("/") || body.startsWith("../")) { | ||||
|                 return `${head}${prefix}${body}`; | ||||
|             } | ||||
|             return loose ? pattern : `${head}${prefix}/**/${body}`; | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { IgnorePattern }; | ||||
							
								
								
									
										19
									
								
								node_modules/@eslint/eslintrc/lib/config-array/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/@eslint/eslintrc/lib/config-array/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| /** | ||||
|  * @fileoverview `ConfigArray` class. | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| import { ConfigArray, getUsedExtractedConfigs } from "./config-array.js"; | ||||
| import { ConfigDependency } from "./config-dependency.js"; | ||||
| import { ExtractedConfig } from "./extracted-config.js"; | ||||
| import { IgnorePattern } from "./ignore-pattern.js"; | ||||
| import { OverrideTester } from "./override-tester.js"; | ||||
|  | ||||
| export { | ||||
|     ConfigArray, | ||||
|     ConfigDependency, | ||||
|     ExtractedConfig, | ||||
|     IgnorePattern, | ||||
|     OverrideTester, | ||||
|     getUsedExtractedConfigs | ||||
| }; | ||||
							
								
								
									
										225
									
								
								node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,225 @@ | ||||
| /** | ||||
|  * @fileoverview `OverrideTester` class. | ||||
|  * | ||||
|  * `OverrideTester` class handles `files` property and `excludedFiles` property | ||||
|  * of `overrides` config. | ||||
|  * | ||||
|  * It provides one method. | ||||
|  * | ||||
|  * - `test(filePath)` | ||||
|  *      Test if a file path matches the pair of `files` property and | ||||
|  *      `excludedFiles` property. The `filePath` argument must be an absolute | ||||
|  *      path. | ||||
|  * | ||||
|  * `ConfigArrayFactory` creates `OverrideTester` objects when it processes | ||||
|  * `overrides` properties. | ||||
|  * | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| import assert from "assert"; | ||||
| import path from "path"; | ||||
| import util from "util"; | ||||
| import minimatch from "minimatch"; | ||||
|  | ||||
| const { Minimatch } = minimatch; | ||||
|  | ||||
| const minimatchOpts = { dot: true, matchBase: true }; | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Pattern | ||||
|  * @property {InstanceType<Minimatch>[] | null} includes The positive matchers. | ||||
|  * @property {InstanceType<Minimatch>[] | null} excludes The negative matchers. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Normalize a given pattern to an array. | ||||
|  * @param {string|string[]|undefined} patterns A glob pattern or an array of glob patterns. | ||||
|  * @returns {string[]|null} Normalized patterns. | ||||
|  * @private | ||||
|  */ | ||||
| function normalizePatterns(patterns) { | ||||
|     if (Array.isArray(patterns)) { | ||||
|         return patterns.filter(Boolean); | ||||
|     } | ||||
|     if (typeof patterns === "string" && patterns) { | ||||
|         return [patterns]; | ||||
|     } | ||||
|     return []; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Create the matchers of given patterns. | ||||
|  * @param {string[]} patterns The patterns. | ||||
|  * @returns {InstanceType<Minimatch>[] | null} The matchers. | ||||
|  */ | ||||
| function toMatcher(patterns) { | ||||
|     if (patterns.length === 0) { | ||||
|         return null; | ||||
|     } | ||||
|     return patterns.map(pattern => { | ||||
|         if (/^\.[/\\]/u.test(pattern)) { | ||||
|             return new Minimatch( | ||||
|                 pattern.slice(2), | ||||
|  | ||||
|                 // `./*.js` should not match with `subdir/foo.js` | ||||
|                 { ...minimatchOpts, matchBase: false } | ||||
|             ); | ||||
|         } | ||||
|         return new Minimatch(pattern, minimatchOpts); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Convert a given matcher to string. | ||||
|  * @param {Pattern} matchers The matchers. | ||||
|  * @returns {string} The string expression of the matcher. | ||||
|  */ | ||||
| function patternToJson({ includes, excludes }) { | ||||
|     return { | ||||
|         includes: includes && includes.map(m => m.pattern), | ||||
|         excludes: excludes && excludes.map(m => m.pattern) | ||||
|     }; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * The class to test given paths are matched by the patterns. | ||||
|  */ | ||||
| class OverrideTester { | ||||
|  | ||||
|     /** | ||||
|      * Create a tester with given criteria. | ||||
|      * If there are no criteria, returns `null`. | ||||
|      * @param {string|string[]} files The glob patterns for included files. | ||||
|      * @param {string|string[]} excludedFiles The glob patterns for excluded files. | ||||
|      * @param {string} basePath The path to the base directory to test paths. | ||||
|      * @returns {OverrideTester|null} The created instance or `null`. | ||||
|      */ | ||||
|     static create(files, excludedFiles, basePath) { | ||||
|         const includePatterns = normalizePatterns(files); | ||||
|         const excludePatterns = normalizePatterns(excludedFiles); | ||||
|         let endsWithWildcard = false; | ||||
|  | ||||
|         if (includePatterns.length === 0) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         // Rejects absolute paths or relative paths to parents. | ||||
|         for (const pattern of includePatterns) { | ||||
|             if (path.isAbsolute(pattern) || pattern.includes("..")) { | ||||
|                 throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`); | ||||
|             } | ||||
|             if (pattern.endsWith("*")) { | ||||
|                 endsWithWildcard = true; | ||||
|             } | ||||
|         } | ||||
|         for (const pattern of excludePatterns) { | ||||
|             if (path.isAbsolute(pattern) || pattern.includes("..")) { | ||||
|                 throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         const includes = toMatcher(includePatterns); | ||||
|         const excludes = toMatcher(excludePatterns); | ||||
|  | ||||
|         return new OverrideTester( | ||||
|             [{ includes, excludes }], | ||||
|             basePath, | ||||
|             endsWithWildcard | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Combine two testers by logical and. | ||||
|      * If either of the testers was `null`, returns the other tester. | ||||
|      * The `basePath` property of the two must be the same value. | ||||
|      * @param {OverrideTester|null} a A tester. | ||||
|      * @param {OverrideTester|null} b Another tester. | ||||
|      * @returns {OverrideTester|null} Combined tester. | ||||
|      */ | ||||
|     static and(a, b) { | ||||
|         if (!b) { | ||||
|             return a && new OverrideTester( | ||||
|                 a.patterns, | ||||
|                 a.basePath, | ||||
|                 a.endsWithWildcard | ||||
|             ); | ||||
|         } | ||||
|         if (!a) { | ||||
|             return new OverrideTester( | ||||
|                 b.patterns, | ||||
|                 b.basePath, | ||||
|                 b.endsWithWildcard | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         assert.strictEqual(a.basePath, b.basePath); | ||||
|         return new OverrideTester( | ||||
|             a.patterns.concat(b.patterns), | ||||
|             a.basePath, | ||||
|             a.endsWithWildcard || b.endsWithWildcard | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Initialize this instance. | ||||
|      * @param {Pattern[]} patterns The matchers. | ||||
|      * @param {string} basePath The base path. | ||||
|      * @param {boolean} endsWithWildcard If `true` then a pattern ends with `*`. | ||||
|      */ | ||||
|     constructor(patterns, basePath, endsWithWildcard = false) { | ||||
|  | ||||
|         /** @type {Pattern[]} */ | ||||
|         this.patterns = patterns; | ||||
|  | ||||
|         /** @type {string} */ | ||||
|         this.basePath = basePath; | ||||
|  | ||||
|         /** @type {boolean} */ | ||||
|         this.endsWithWildcard = endsWithWildcard; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test if a given path is matched or not. | ||||
|      * @param {string} filePath The absolute path to the target file. | ||||
|      * @returns {boolean} `true` if the path was matched. | ||||
|      */ | ||||
|     test(filePath) { | ||||
|         if (typeof filePath !== "string" || !path.isAbsolute(filePath)) { | ||||
|             throw new Error(`'filePath' should be an absolute path, but got ${filePath}.`); | ||||
|         } | ||||
|         const relativePath = path.relative(this.basePath, filePath); | ||||
|  | ||||
|         return this.patterns.every(({ includes, excludes }) => ( | ||||
|             (!includes || includes.some(m => m.match(relativePath))) && | ||||
|             (!excludes || !excludes.some(m => m.match(relativePath))) | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     // eslint-disable-next-line jsdoc/require-description | ||||
|     /** | ||||
|      * @returns {Object} a JSON compatible object. | ||||
|      */ | ||||
|     toJSON() { | ||||
|         if (this.patterns.length === 1) { | ||||
|             return { | ||||
|                 ...patternToJson(this.patterns[0]), | ||||
|                 basePath: this.basePath | ||||
|             }; | ||||
|         } | ||||
|         return { | ||||
|             AND: this.patterns.map(patternToJson), | ||||
|             basePath: this.basePath | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     // eslint-disable-next-line jsdoc/require-description | ||||
|     /** | ||||
|      * @returns {Object} an object to display by `console.log()`. | ||||
|      */ | ||||
|     [util.inspect.custom]() { | ||||
|         return this.toJSON(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { OverrideTester }; | ||||
							
								
								
									
										318
									
								
								node_modules/@eslint/eslintrc/lib/flat-compat.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								node_modules/@eslint/eslintrc/lib/flat-compat.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,318 @@ | ||||
| /** | ||||
|  * @fileoverview Compatibility class for flat config. | ||||
|  * @author Nicholas C. Zakas | ||||
|  */ | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Requirements | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| import createDebug from "debug"; | ||||
| import path from "path"; | ||||
|  | ||||
| import environments from "../conf/environments.js"; | ||||
| import { ConfigArrayFactory } from "./config-array-factory.js"; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| /** @typedef {import("../../shared/types").Environment} Environment */ | ||||
| /** @typedef {import("../../shared/types").Processor} Processor */ | ||||
|  | ||||
| const debug = createDebug("eslintrc:flat-compat"); | ||||
| const cafactory = Symbol("cafactory"); | ||||
|  | ||||
| /** | ||||
|  * Translates an ESLintRC-style config object into a flag-config-style config | ||||
|  * object. | ||||
|  * @param {Object} eslintrcConfig An ESLintRC-style config object. | ||||
|  * @param {Object} options Options to help translate the config. | ||||
|  * @param {string} options.resolveConfigRelativeTo To the directory to resolve | ||||
|  *      configs from. | ||||
|  * @param {string} options.resolvePluginsRelativeTo The directory to resolve | ||||
|  *      plugins from. | ||||
|  * @param {ReadOnlyMap<string,Environment>} options.pluginEnvironments A map of plugin environment | ||||
|  *      names to objects. | ||||
|  * @param {ReadOnlyMap<string,Processor>} options.pluginProcessors A map of plugin processor | ||||
|  *      names to objects. | ||||
|  * @returns {Object} A flag-config-style config object. | ||||
|  */ | ||||
| function translateESLintRC(eslintrcConfig, { | ||||
|     resolveConfigRelativeTo, | ||||
|     resolvePluginsRelativeTo, | ||||
|     pluginEnvironments, | ||||
|     pluginProcessors | ||||
| }) { | ||||
|  | ||||
|     const flatConfig = {}; | ||||
|     const configs = []; | ||||
|     const languageOptions = {}; | ||||
|     const linterOptions = {}; | ||||
|     const keysToCopy = ["settings", "rules", "processor"]; | ||||
|     const languageOptionsKeysToCopy = ["globals", "parser", "parserOptions"]; | ||||
|     const linterOptionsKeysToCopy = ["noInlineConfig", "reportUnusedDisableDirectives"]; | ||||
|  | ||||
|     // copy over simple translations | ||||
|     for (const key of keysToCopy) { | ||||
|         if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") { | ||||
|             flatConfig[key] = eslintrcConfig[key]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // copy over languageOptions | ||||
|     for (const key of languageOptionsKeysToCopy) { | ||||
|         if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") { | ||||
|  | ||||
|             // create the languageOptions key in the flat config | ||||
|             flatConfig.languageOptions = languageOptions; | ||||
|  | ||||
|             if (key === "parser") { | ||||
|                 debug(`Resolving parser '${languageOptions[key]}' relative to ${resolveConfigRelativeTo}`); | ||||
|  | ||||
|                 if (eslintrcConfig[key].error) { | ||||
|                     throw eslintrcConfig[key].error; | ||||
|                 } | ||||
|  | ||||
|                 languageOptions[key] = eslintrcConfig[key].definition; | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // clone any object values that are in the eslintrc config | ||||
|             if (eslintrcConfig[key] && typeof eslintrcConfig[key] === "object") { | ||||
|                 languageOptions[key] = { | ||||
|                     ...eslintrcConfig[key] | ||||
|                 }; | ||||
|             } else { | ||||
|                 languageOptions[key] = eslintrcConfig[key]; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // copy over linterOptions | ||||
|     for (const key of linterOptionsKeysToCopy) { | ||||
|         if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") { | ||||
|             flatConfig.linterOptions = linterOptions; | ||||
|             linterOptions[key] = eslintrcConfig[key]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // move ecmaVersion a level up | ||||
|     if (languageOptions.parserOptions) { | ||||
|  | ||||
|         if ("ecmaVersion" in languageOptions.parserOptions) { | ||||
|             languageOptions.ecmaVersion = languageOptions.parserOptions.ecmaVersion; | ||||
|             delete languageOptions.parserOptions.ecmaVersion; | ||||
|         } | ||||
|  | ||||
|         if ("sourceType" in languageOptions.parserOptions) { | ||||
|             languageOptions.sourceType = languageOptions.parserOptions.sourceType; | ||||
|             delete languageOptions.parserOptions.sourceType; | ||||
|         } | ||||
|  | ||||
|         // check to see if we even need parserOptions anymore and remove it if not | ||||
|         if (Object.keys(languageOptions.parserOptions).length === 0) { | ||||
|             delete languageOptions.parserOptions; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // overrides | ||||
|     if (eslintrcConfig.criteria) { | ||||
|         flatConfig.files = [absoluteFilePath => eslintrcConfig.criteria.test(absoluteFilePath)]; | ||||
|     } | ||||
|  | ||||
|     // translate plugins | ||||
|     if (eslintrcConfig.plugins && typeof eslintrcConfig.plugins === "object") { | ||||
|         debug(`Translating plugins: ${eslintrcConfig.plugins}`); | ||||
|  | ||||
|         flatConfig.plugins = {}; | ||||
|  | ||||
|         for (const pluginName of Object.keys(eslintrcConfig.plugins)) { | ||||
|  | ||||
|             debug(`Translating plugin: ${pluginName}`); | ||||
|             debug(`Resolving plugin '${pluginName} relative to ${resolvePluginsRelativeTo}`); | ||||
|  | ||||
|             const { original: plugin, error } = eslintrcConfig.plugins[pluginName]; | ||||
|  | ||||
|             if (error) { | ||||
|                 throw error; | ||||
|             } | ||||
|  | ||||
|             flatConfig.plugins[pluginName] = plugin; | ||||
|  | ||||
|             // create a config for any processors | ||||
|             if (plugin.processors) { | ||||
|                 for (const processorName of Object.keys(plugin.processors)) { | ||||
|                     if (processorName.startsWith(".")) { | ||||
|                         debug(`Assigning processor: ${pluginName}/${processorName}`); | ||||
|  | ||||
|                         configs.unshift({ | ||||
|                             files: [`**/*${processorName}`], | ||||
|                             processor: pluginProcessors.get(`${pluginName}/${processorName}`) | ||||
|                         }); | ||||
|                     } | ||||
|  | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // translate env - must come after plugins | ||||
|     if (eslintrcConfig.env && typeof eslintrcConfig.env === "object") { | ||||
|         for (const envName of Object.keys(eslintrcConfig.env)) { | ||||
|  | ||||
|             // only add environments that are true | ||||
|             if (eslintrcConfig.env[envName]) { | ||||
|                 debug(`Translating environment: ${envName}`); | ||||
|  | ||||
|                 if (environments.has(envName)) { | ||||
|  | ||||
|                     // built-in environments should be defined first | ||||
|                     configs.unshift(...translateESLintRC({ | ||||
|                         criteria: eslintrcConfig.criteria, | ||||
|                         ...environments.get(envName) | ||||
|                     }, { | ||||
|                         resolveConfigRelativeTo, | ||||
|                         resolvePluginsRelativeTo | ||||
|                     })); | ||||
|                 } else if (pluginEnvironments.has(envName)) { | ||||
|  | ||||
|                     // if the environment comes from a plugin, it should come after the plugin config | ||||
|                     configs.push(...translateESLintRC({ | ||||
|                         criteria: eslintrcConfig.criteria, | ||||
|                         ...pluginEnvironments.get(envName) | ||||
|                     }, { | ||||
|                         resolveConfigRelativeTo, | ||||
|                         resolvePluginsRelativeTo | ||||
|                     })); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // only add if there are actually keys in the config | ||||
|     if (Object.keys(flatConfig).length > 0) { | ||||
|         configs.push(flatConfig); | ||||
|     } | ||||
|  | ||||
|     return configs; | ||||
| } | ||||
|  | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Exports | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| /** | ||||
|  * A compatibility class for working with configs. | ||||
|  */ | ||||
| class FlatCompat { | ||||
|  | ||||
|     constructor({ | ||||
|         baseDirectory = process.cwd(), | ||||
|         resolvePluginsRelativeTo = baseDirectory, | ||||
|         recommendedConfig, | ||||
|         allConfig | ||||
|     } = {}) { | ||||
|         this.baseDirectory = baseDirectory; | ||||
|         this.resolvePluginsRelativeTo = resolvePluginsRelativeTo; | ||||
|         this[cafactory] = new ConfigArrayFactory({ | ||||
|             cwd: baseDirectory, | ||||
|             resolvePluginsRelativeTo, | ||||
|             getEslintAllConfig: () => { | ||||
|  | ||||
|                 if (!allConfig) { | ||||
|                     throw new TypeError("Missing parameter 'allConfig' in FlatCompat constructor."); | ||||
|                 } | ||||
|  | ||||
|                 return allConfig; | ||||
|             }, | ||||
|             getEslintRecommendedConfig: () => { | ||||
|  | ||||
|                 if (!recommendedConfig) { | ||||
|                     throw new TypeError("Missing parameter 'recommendedConfig' in FlatCompat constructor."); | ||||
|                 } | ||||
|  | ||||
|                 return recommendedConfig; | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Translates an ESLintRC-style config into a flag-config-style config. | ||||
|      * @param {Object} eslintrcConfig The ESLintRC-style config object. | ||||
|      * @returns {Object} A flag-config-style config object. | ||||
|      */ | ||||
|     config(eslintrcConfig) { | ||||
|         const eslintrcArray = this[cafactory].create(eslintrcConfig, { | ||||
|             basePath: this.baseDirectory | ||||
|         }); | ||||
|  | ||||
|         const flatArray = []; | ||||
|         let hasIgnorePatterns = false; | ||||
|  | ||||
|         eslintrcArray.forEach(configData => { | ||||
|             if (configData.type === "config") { | ||||
|                 hasIgnorePatterns = hasIgnorePatterns || configData.ignorePattern; | ||||
|                 flatArray.push(...translateESLintRC(configData, { | ||||
|                     resolveConfigRelativeTo: path.join(this.baseDirectory, "__placeholder.js"), | ||||
|                     resolvePluginsRelativeTo: path.join(this.resolvePluginsRelativeTo, "__placeholder.js"), | ||||
|                     pluginEnvironments: eslintrcArray.pluginEnvironments, | ||||
|                     pluginProcessors: eslintrcArray.pluginProcessors | ||||
|                 })); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         // combine ignorePatterns to emulate ESLintRC behavior better | ||||
|         if (hasIgnorePatterns) { | ||||
|             flatArray.unshift({ | ||||
|                 ignores: [filePath => { | ||||
|  | ||||
|                     // Compute the final config for this file. | ||||
|                     // This filters config array elements by `files`/`excludedFiles` then merges the elements. | ||||
|                     const finalConfig = eslintrcArray.extractConfig(filePath); | ||||
|  | ||||
|                     // Test the `ignorePattern` properties of the final config. | ||||
|                     return Boolean(finalConfig.ignores) && finalConfig.ignores(filePath); | ||||
|                 }] | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         return flatArray; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Translates the `env` section of an ESLintRC-style config. | ||||
|      * @param {Object} envConfig The `env` section of an ESLintRC config. | ||||
|      * @returns {Object[]} An array of flag-config objects representing the environments. | ||||
|      */ | ||||
|     env(envConfig) { | ||||
|         return this.config({ | ||||
|             env: envConfig | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Translates the `extends` section of an ESLintRC-style config. | ||||
|      * @param {...string} configsToExtend The names of the configs to load. | ||||
|      * @returns {Object[]} An array of flag-config objects representing the config. | ||||
|      */ | ||||
|     extends(...configsToExtend) { | ||||
|         return this.config({ | ||||
|             extends: configsToExtend | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Translates the `plugins` section of an ESLintRC-style config. | ||||
|      * @param {...string} plugins The names of the plugins to load. | ||||
|      * @returns {Object[]} An array of flag-config objects representing the plugins. | ||||
|      */ | ||||
|     plugins(...plugins) { | ||||
|         return this.config({ | ||||
|             plugins | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { FlatCompat }; | ||||
							
								
								
									
										29
									
								
								node_modules/@eslint/eslintrc/lib/index-universal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								node_modules/@eslint/eslintrc/lib/index-universal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| /** | ||||
|  * @fileoverview Package exports for @eslint/eslintrc | ||||
|  * @author Nicholas C. Zakas | ||||
|  */ | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import * as ConfigOps from "./shared/config-ops.js"; | ||||
| import ConfigValidator from "./shared/config-validator.js"; | ||||
| import * as naming from "./shared/naming.js"; | ||||
| import environments from "../conf/environments.js"; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Exports | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| const Legacy = { | ||||
|     environments, | ||||
|  | ||||
|     // shared | ||||
|     ConfigOps, | ||||
|     ConfigValidator, | ||||
|     naming | ||||
| }; | ||||
|  | ||||
| export { | ||||
|     Legacy | ||||
| }; | ||||
							
								
								
									
										56
									
								
								node_modules/@eslint/eslintrc/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								node_modules/@eslint/eslintrc/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /** | ||||
|  * @fileoverview Package exports for @eslint/eslintrc | ||||
|  * @author Nicholas C. Zakas | ||||
|  */ | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import { | ||||
|     ConfigArrayFactory, | ||||
|     createContext as createConfigArrayFactoryContext | ||||
| } from "./config-array-factory.js"; | ||||
|  | ||||
| import { CascadingConfigArrayFactory } from "./cascading-config-array-factory.js"; | ||||
| import * as ModuleResolver from "./shared/relative-module-resolver.js"; | ||||
| import { ConfigArray, getUsedExtractedConfigs } from "./config-array/index.js"; | ||||
| import { ConfigDependency } from "./config-array/config-dependency.js"; | ||||
| import { ExtractedConfig } from "./config-array/extracted-config.js"; | ||||
| import { IgnorePattern } from "./config-array/ignore-pattern.js"; | ||||
| import { OverrideTester } from "./config-array/override-tester.js"; | ||||
| import * as ConfigOps from "./shared/config-ops.js"; | ||||
| import ConfigValidator from "./shared/config-validator.js"; | ||||
| import * as naming from "./shared/naming.js"; | ||||
| import { FlatCompat } from "./flat-compat.js"; | ||||
| import environments from "../conf/environments.js"; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Exports | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| const Legacy = { | ||||
|     ConfigArray, | ||||
|     createConfigArrayFactoryContext, | ||||
|     CascadingConfigArrayFactory, | ||||
|     ConfigArrayFactory, | ||||
|     ConfigDependency, | ||||
|     ExtractedConfig, | ||||
|     IgnorePattern, | ||||
|     OverrideTester, | ||||
|     getUsedExtractedConfigs, | ||||
|     environments, | ||||
|  | ||||
|     // shared | ||||
|     ConfigOps, | ||||
|     ConfigValidator, | ||||
|     ModuleResolver, | ||||
|     naming | ||||
| }; | ||||
|  | ||||
| export { | ||||
|  | ||||
|     Legacy, | ||||
|  | ||||
|     FlatCompat | ||||
|  | ||||
| }; | ||||
							
								
								
									
										191
									
								
								node_modules/@eslint/eslintrc/lib/shared/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								node_modules/@eslint/eslintrc/lib/shared/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | ||||
| /** | ||||
|  * @fileoverview The instance of Ajv validator. | ||||
|  * @author Evgeny Poberezkin | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import Ajv from "ajv"; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| /* | ||||
|  * Copied from ajv/lib/refs/json-schema-draft-04.json | ||||
|  * The MIT License (MIT) | ||||
|  * Copyright (c) 2015-2017 Evgeny Poberezkin | ||||
|  */ | ||||
| const metaSchema = { | ||||
|     id: "http://json-schema.org/draft-04/schema#", | ||||
|     $schema: "http://json-schema.org/draft-04/schema#", | ||||
|     description: "Core schema meta-schema", | ||||
|     definitions: { | ||||
|         schemaArray: { | ||||
|             type: "array", | ||||
|             minItems: 1, | ||||
|             items: { $ref: "#" } | ||||
|         }, | ||||
|         positiveInteger: { | ||||
|             type: "integer", | ||||
|             minimum: 0 | ||||
|         }, | ||||
|         positiveIntegerDefault0: { | ||||
|             allOf: [{ $ref: "#/definitions/positiveInteger" }, { default: 0 }] | ||||
|         }, | ||||
|         simpleTypes: { | ||||
|             enum: ["array", "boolean", "integer", "null", "number", "object", "string"] | ||||
|         }, | ||||
|         stringArray: { | ||||
|             type: "array", | ||||
|             items: { type: "string" }, | ||||
|             minItems: 1, | ||||
|             uniqueItems: true | ||||
|         } | ||||
|     }, | ||||
|     type: "object", | ||||
|     properties: { | ||||
|         id: { | ||||
|             type: "string" | ||||
|         }, | ||||
|         $schema: { | ||||
|             type: "string" | ||||
|         }, | ||||
|         title: { | ||||
|             type: "string" | ||||
|         }, | ||||
|         description: { | ||||
|             type: "string" | ||||
|         }, | ||||
|         default: { }, | ||||
|         multipleOf: { | ||||
|             type: "number", | ||||
|             minimum: 0, | ||||
|             exclusiveMinimum: true | ||||
|         }, | ||||
|         maximum: { | ||||
|             type: "number" | ||||
|         }, | ||||
|         exclusiveMaximum: { | ||||
|             type: "boolean", | ||||
|             default: false | ||||
|         }, | ||||
|         minimum: { | ||||
|             type: "number" | ||||
|         }, | ||||
|         exclusiveMinimum: { | ||||
|             type: "boolean", | ||||
|             default: false | ||||
|         }, | ||||
|         maxLength: { $ref: "#/definitions/positiveInteger" }, | ||||
|         minLength: { $ref: "#/definitions/positiveIntegerDefault0" }, | ||||
|         pattern: { | ||||
|             type: "string", | ||||
|             format: "regex" | ||||
|         }, | ||||
|         additionalItems: { | ||||
|             anyOf: [ | ||||
|                 { type: "boolean" }, | ||||
|                 { $ref: "#" } | ||||
|             ], | ||||
|             default: { } | ||||
|         }, | ||||
|         items: { | ||||
|             anyOf: [ | ||||
|                 { $ref: "#" }, | ||||
|                 { $ref: "#/definitions/schemaArray" } | ||||
|             ], | ||||
|             default: { } | ||||
|         }, | ||||
|         maxItems: { $ref: "#/definitions/positiveInteger" }, | ||||
|         minItems: { $ref: "#/definitions/positiveIntegerDefault0" }, | ||||
|         uniqueItems: { | ||||
|             type: "boolean", | ||||
|             default: false | ||||
|         }, | ||||
|         maxProperties: { $ref: "#/definitions/positiveInteger" }, | ||||
|         minProperties: { $ref: "#/definitions/positiveIntegerDefault0" }, | ||||
|         required: { $ref: "#/definitions/stringArray" }, | ||||
|         additionalProperties: { | ||||
|             anyOf: [ | ||||
|                 { type: "boolean" }, | ||||
|                 { $ref: "#" } | ||||
|             ], | ||||
|             default: { } | ||||
|         }, | ||||
|         definitions: { | ||||
|             type: "object", | ||||
|             additionalProperties: { $ref: "#" }, | ||||
|             default: { } | ||||
|         }, | ||||
|         properties: { | ||||
|             type: "object", | ||||
|             additionalProperties: { $ref: "#" }, | ||||
|             default: { } | ||||
|         }, | ||||
|         patternProperties: { | ||||
|             type: "object", | ||||
|             additionalProperties: { $ref: "#" }, | ||||
|             default: { } | ||||
|         }, | ||||
|         dependencies: { | ||||
|             type: "object", | ||||
|             additionalProperties: { | ||||
|                 anyOf: [ | ||||
|                     { $ref: "#" }, | ||||
|                     { $ref: "#/definitions/stringArray" } | ||||
|                 ] | ||||
|             } | ||||
|         }, | ||||
|         enum: { | ||||
|             type: "array", | ||||
|             minItems: 1, | ||||
|             uniqueItems: true | ||||
|         }, | ||||
|         type: { | ||||
|             anyOf: [ | ||||
|                 { $ref: "#/definitions/simpleTypes" }, | ||||
|                 { | ||||
|                     type: "array", | ||||
|                     items: { $ref: "#/definitions/simpleTypes" }, | ||||
|                     minItems: 1, | ||||
|                     uniqueItems: true | ||||
|                 } | ||||
|             ] | ||||
|         }, | ||||
|         format: { type: "string" }, | ||||
|         allOf: { $ref: "#/definitions/schemaArray" }, | ||||
|         anyOf: { $ref: "#/definitions/schemaArray" }, | ||||
|         oneOf: { $ref: "#/definitions/schemaArray" }, | ||||
|         not: { $ref: "#" } | ||||
|     }, | ||||
|     dependencies: { | ||||
|         exclusiveMaximum: ["maximum"], | ||||
|         exclusiveMinimum: ["minimum"] | ||||
|     }, | ||||
|     default: { } | ||||
| }; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| export default (additionalOptions = {}) => { | ||||
|     const ajv = new Ajv({ | ||||
|         meta: false, | ||||
|         useDefaults: true, | ||||
|         validateSchema: false, | ||||
|         missingRefs: "ignore", | ||||
|         verbose: true, | ||||
|         schemaId: "auto", | ||||
|         ...additionalOptions | ||||
|     }); | ||||
|  | ||||
|     ajv.addMetaSchema(metaSchema); | ||||
|     // eslint-disable-next-line no-underscore-dangle | ||||
|     ajv._opts.defaultMeta = metaSchema.id; | ||||
|  | ||||
|     return ajv; | ||||
| }; | ||||
							
								
								
									
										135
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-ops.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-ops.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| /** | ||||
|  * @fileoverview Config file operations. This file must be usable in the browser, | ||||
|  * so no Node-specific code can be here. | ||||
|  * @author Nicholas C. Zakas | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Private | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| const RULE_SEVERITY_STRINGS = ["off", "warn", "error"], | ||||
|     RULE_SEVERITY = RULE_SEVERITY_STRINGS.reduce((map, value, index) => { | ||||
|         map[value] = index; | ||||
|         return map; | ||||
|     }, {}), | ||||
|     VALID_SEVERITIES = [0, 1, 2, "off", "warn", "error"]; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| /** | ||||
|  * Normalizes the severity value of a rule's configuration to a number | ||||
|  * @param {(number|string|[number, ...*]|[string, ...*])} ruleConfig A rule's configuration value, generally | ||||
|  * received from the user. A valid config value is either 0, 1, 2, the string "off" (treated the same as 0), | ||||
|  * the string "warn" (treated the same as 1), the string "error" (treated the same as 2), or an array | ||||
|  * whose first element is one of the above values. Strings are matched case-insensitively. | ||||
|  * @returns {(0|1|2)} The numeric severity value if the config value was valid, otherwise 0. | ||||
|  */ | ||||
| function getRuleSeverity(ruleConfig) { | ||||
|     const severityValue = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig; | ||||
|  | ||||
|     if (severityValue === 0 || severityValue === 1 || severityValue === 2) { | ||||
|         return severityValue; | ||||
|     } | ||||
|  | ||||
|     if (typeof severityValue === "string") { | ||||
|         return RULE_SEVERITY[severityValue.toLowerCase()] || 0; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Converts old-style severity settings (0, 1, 2) into new-style | ||||
|  * severity settings (off, warn, error) for all rules. Assumption is that severity | ||||
|  * values have already been validated as correct. | ||||
|  * @param {Object} config The config object to normalize. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function normalizeToStrings(config) { | ||||
|  | ||||
|     if (config.rules) { | ||||
|         Object.keys(config.rules).forEach(ruleId => { | ||||
|             const ruleConfig = config.rules[ruleId]; | ||||
|  | ||||
|             if (typeof ruleConfig === "number") { | ||||
|                 config.rules[ruleId] = RULE_SEVERITY_STRINGS[ruleConfig] || RULE_SEVERITY_STRINGS[0]; | ||||
|             } else if (Array.isArray(ruleConfig) && typeof ruleConfig[0] === "number") { | ||||
|                 ruleConfig[0] = RULE_SEVERITY_STRINGS[ruleConfig[0]] || RULE_SEVERITY_STRINGS[0]; | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Determines if the severity for the given rule configuration represents an error. | ||||
|  * @param {int|string|Array} ruleConfig The configuration for an individual rule. | ||||
|  * @returns {boolean} True if the rule represents an error, false if not. | ||||
|  */ | ||||
| function isErrorSeverity(ruleConfig) { | ||||
|     return getRuleSeverity(ruleConfig) === 2; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Checks whether a given config has valid severity or not. | ||||
|  * @param {number|string|Array} ruleConfig The configuration for an individual rule. | ||||
|  * @returns {boolean} `true` if the configuration has valid severity. | ||||
|  */ | ||||
| function isValidSeverity(ruleConfig) { | ||||
|     let severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig; | ||||
|  | ||||
|     if (typeof severity === "string") { | ||||
|         severity = severity.toLowerCase(); | ||||
|     } | ||||
|     return VALID_SEVERITIES.indexOf(severity) !== -1; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Checks whether every rule of a given config has valid severity or not. | ||||
|  * @param {Object} config The configuration for rules. | ||||
|  * @returns {boolean} `true` if the configuration has valid severity. | ||||
|  */ | ||||
| function isEverySeverityValid(config) { | ||||
|     return Object.keys(config).every(ruleId => isValidSeverity(config[ruleId])); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Normalizes a value for a global in a config | ||||
|  * @param {(boolean|string|null)} configuredValue The value given for a global in configuration or in | ||||
|  * a global directive comment | ||||
|  * @returns {("readable"|"writeable"|"off")} The value normalized as a string | ||||
|  * @throws Error if global value is invalid | ||||
|  */ | ||||
| function normalizeConfigGlobal(configuredValue) { | ||||
|     switch (configuredValue) { | ||||
|         case "off": | ||||
|             return "off"; | ||||
|  | ||||
|         case true: | ||||
|         case "true": | ||||
|         case "writeable": | ||||
|         case "writable": | ||||
|             return "writable"; | ||||
|  | ||||
|         case null: | ||||
|         case false: | ||||
|         case "false": | ||||
|         case "readable": | ||||
|         case "readonly": | ||||
|             return "readonly"; | ||||
|  | ||||
|         default: | ||||
|             throw new Error(`'${configuredValue}' is not a valid configuration for a global (use 'readonly', 'writable', or 'off')`); | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { | ||||
|     getRuleSeverity, | ||||
|     normalizeToStrings, | ||||
|     isErrorSeverity, | ||||
|     isValidSeverity, | ||||
|     isEverySeverityValid, | ||||
|     normalizeConfigGlobal | ||||
| }; | ||||
							
								
								
									
										325
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-validator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-validator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,325 @@ | ||||
| /** | ||||
|  * @fileoverview Validates configs. | ||||
|  * @author Brandon Mills | ||||
|  */ | ||||
|  | ||||
| /* eslint class-methods-use-this: "off" */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import util from "util"; | ||||
| import * as ConfigOps from "./config-ops.js"; | ||||
| import { emitDeprecationWarning } from "./deprecation-warnings.js"; | ||||
| import ajvOrig from "./ajv.js"; | ||||
| import configSchema from "../../conf/config-schema.js"; | ||||
| import BuiltInEnvironments from "../../conf/environments.js"; | ||||
|  | ||||
| const ajv = ajvOrig(); | ||||
|  | ||||
| const ruleValidators = new WeakMap(); | ||||
| const noop = Function.prototype; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Private | ||||
| //------------------------------------------------------------------------------ | ||||
| let validateSchema; | ||||
| const severityMap = { | ||||
|     error: 2, | ||||
|     warn: 1, | ||||
|     off: 0 | ||||
| }; | ||||
|  | ||||
| const validated = new WeakSet(); | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Exports | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| export default class ConfigValidator { | ||||
|     constructor({ builtInRules = new Map() } = {}) { | ||||
|         this.builtInRules = builtInRules; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets a complete options schema for a rule. | ||||
|      * @param {{create: Function, schema: (Array|null)}} rule A new-style rule object | ||||
|      * @returns {Object} JSON Schema for the rule's options. | ||||
|      */ | ||||
|     getRuleOptionsSchema(rule) { | ||||
|         if (!rule) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         const schema = rule.schema || rule.meta && rule.meta.schema; | ||||
|  | ||||
|         // Given a tuple of schemas, insert warning level at the beginning | ||||
|         if (Array.isArray(schema)) { | ||||
|             if (schema.length) { | ||||
|                 return { | ||||
|                     type: "array", | ||||
|                     items: schema, | ||||
|                     minItems: 0, | ||||
|                     maxItems: schema.length | ||||
|                 }; | ||||
|             } | ||||
|             return { | ||||
|                 type: "array", | ||||
|                 minItems: 0, | ||||
|                 maxItems: 0 | ||||
|             }; | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // Given a full schema, leave it alone | ||||
|         return schema || null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a rule's severity and returns the severity value. Throws an error if the severity is invalid. | ||||
|      * @param {options} options The given options for the rule. | ||||
|      * @returns {number|string} The rule's severity value | ||||
|      */ | ||||
|     validateRuleSeverity(options) { | ||||
|         const severity = Array.isArray(options) ? options[0] : options; | ||||
|         const normSeverity = typeof severity === "string" ? severityMap[severity.toLowerCase()] : severity; | ||||
|  | ||||
|         if (normSeverity === 0 || normSeverity === 1 || normSeverity === 2) { | ||||
|             return normSeverity; | ||||
|         } | ||||
|  | ||||
|         throw new Error(`\tSeverity should be one of the following: 0 = off, 1 = warn, 2 = error (you passed '${util.inspect(severity).replace(/'/gu, "\"").replace(/\n/gu, "")}').\n`); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates the non-severity options passed to a rule, based on its schema. | ||||
|      * @param {{create: Function}} rule The rule to validate | ||||
|      * @param {Array} localOptions The options for the rule, excluding severity | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateRuleSchema(rule, localOptions) { | ||||
|         if (!ruleValidators.has(rule)) { | ||||
|             const schema = this.getRuleOptionsSchema(rule); | ||||
|  | ||||
|             if (schema) { | ||||
|                 ruleValidators.set(rule, ajv.compile(schema)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         const validateRule = ruleValidators.get(rule); | ||||
|  | ||||
|         if (validateRule) { | ||||
|             validateRule(localOptions); | ||||
|             if (validateRule.errors) { | ||||
|                 throw new Error(validateRule.errors.map( | ||||
|                     error => `\tValue ${JSON.stringify(error.data)} ${error.message}.\n` | ||||
|                 ).join("")); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a rule's options against its schema. | ||||
|      * @param {{create: Function}|null} rule The rule that the config is being validated for | ||||
|      * @param {string} ruleId The rule's unique name. | ||||
|      * @param {Array|number} options The given options for the rule. | ||||
|      * @param {string|null} source The name of the configuration source to report in any errors. If null or undefined, | ||||
|      * no source is prepended to the message. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateRuleOptions(rule, ruleId, options, source = null) { | ||||
|         try { | ||||
|             const severity = this.validateRuleSeverity(options); | ||||
|  | ||||
|             if (severity !== 0) { | ||||
|                 this.validateRuleSchema(rule, Array.isArray(options) ? options.slice(1) : []); | ||||
|             } | ||||
|         } catch (err) { | ||||
|             const enhancedMessage = `Configuration for rule "${ruleId}" is invalid:\n${err.message}`; | ||||
|  | ||||
|             if (typeof source === "string") { | ||||
|                 throw new Error(`${source}:\n\t${enhancedMessage}`); | ||||
|             } else { | ||||
|                 throw new Error(enhancedMessage); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates an environment object | ||||
|      * @param {Object} environment The environment config object to validate. | ||||
|      * @param {string} source The name of the configuration source to report in any errors. | ||||
|      * @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded environments. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateEnvironment( | ||||
|         environment, | ||||
|         source, | ||||
|         getAdditionalEnv = noop | ||||
|     ) { | ||||
|  | ||||
|         // not having an environment is ok | ||||
|         if (!environment) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Object.keys(environment).forEach(id => { | ||||
|             const env = getAdditionalEnv(id) || BuiltInEnvironments.get(id) || null; | ||||
|  | ||||
|             if (!env) { | ||||
|                 const message = `${source}:\n\tEnvironment key "${id}" is unknown\n`; | ||||
|  | ||||
|                 throw new Error(message); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a rules config object | ||||
|      * @param {Object} rulesConfig The rules config object to validate. | ||||
|      * @param {string} source The name of the configuration source to report in any errors. | ||||
|      * @param {function(ruleId:string): Object} getAdditionalRule A map from strings to loaded rules | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateRules( | ||||
|         rulesConfig, | ||||
|         source, | ||||
|         getAdditionalRule = noop | ||||
|     ) { | ||||
|         if (!rulesConfig) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Object.keys(rulesConfig).forEach(id => { | ||||
|             const rule = getAdditionalRule(id) || this.builtInRules.get(id) || null; | ||||
|  | ||||
|             this.validateRuleOptions(rule, id, rulesConfig[id], source); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates a `globals` section of a config file | ||||
|      * @param {Object} globalsConfig The `globals` section | ||||
|      * @param {string|null} source The name of the configuration source to report in the event of an error. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateGlobals(globalsConfig, source = null) { | ||||
|         if (!globalsConfig) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Object.entries(globalsConfig) | ||||
|             .forEach(([configuredGlobal, configuredValue]) => { | ||||
|                 try { | ||||
|                     ConfigOps.normalizeConfigGlobal(configuredValue); | ||||
|                 } catch (err) { | ||||
|                     throw new Error(`ESLint configuration of global '${configuredGlobal}' in ${source} is invalid:\n${err.message}`); | ||||
|                 } | ||||
|             }); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validate `processor` configuration. | ||||
|      * @param {string|undefined} processorName The processor name. | ||||
|      * @param {string} source The name of config file. | ||||
|      * @param {function(id:string): Processor} getProcessor The getter of defined processors. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateProcessor(processorName, source, getProcessor) { | ||||
|         if (processorName && !getProcessor(processorName)) { | ||||
|             throw new Error(`ESLint configuration of processor in '${source}' is invalid: '${processorName}' was not found.`); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Formats an array of schema validation errors. | ||||
|      * @param {Array} errors An array of error messages to format. | ||||
|      * @returns {string} Formatted error message | ||||
|      */ | ||||
|     formatErrors(errors) { | ||||
|         return errors.map(error => { | ||||
|             if (error.keyword === "additionalProperties") { | ||||
|                 const formattedPropertyPath = error.dataPath.length ? `${error.dataPath.slice(1)}.${error.params.additionalProperty}` : error.params.additionalProperty; | ||||
|  | ||||
|                 return `Unexpected top-level property "${formattedPropertyPath}"`; | ||||
|             } | ||||
|             if (error.keyword === "type") { | ||||
|                 const formattedField = error.dataPath.slice(1); | ||||
|                 const formattedExpectedType = Array.isArray(error.schema) ? error.schema.join("/") : error.schema; | ||||
|                 const formattedValue = JSON.stringify(error.data); | ||||
|  | ||||
|                 return `Property "${formattedField}" is the wrong type (expected ${formattedExpectedType} but got \`${formattedValue}\`)`; | ||||
|             } | ||||
|  | ||||
|             const field = error.dataPath[0] === "." ? error.dataPath.slice(1) : error.dataPath; | ||||
|  | ||||
|             return `"${field}" ${error.message}. Value: ${JSON.stringify(error.data)}`; | ||||
|         }).map(message => `\t- ${message}.\n`).join(""); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates the top level properties of the config object. | ||||
|      * @param {Object} config The config object to validate. | ||||
|      * @param {string} source The name of the configuration source to report in any errors. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateConfigSchema(config, source = null) { | ||||
|         validateSchema = validateSchema || ajv.compile(configSchema); | ||||
|  | ||||
|         if (!validateSchema(config)) { | ||||
|             throw new Error(`ESLint configuration in ${source} is invalid:\n${this.formatErrors(validateSchema.errors)}`); | ||||
|         } | ||||
|  | ||||
|         if (Object.hasOwnProperty.call(config, "ecmaFeatures")) { | ||||
|             emitDeprecationWarning(source, "ESLINT_LEGACY_ECMAFEATURES"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validates an entire config object. | ||||
|      * @param {Object} config The config object to validate. | ||||
|      * @param {string} source The name of the configuration source to report in any errors. | ||||
|      * @param {function(ruleId:string): Object} [getAdditionalRule] A map from strings to loaded rules. | ||||
|      * @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded envs. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validate(config, source, getAdditionalRule, getAdditionalEnv) { | ||||
|         this.validateConfigSchema(config, source); | ||||
|         this.validateRules(config.rules, source, getAdditionalRule); | ||||
|         this.validateEnvironment(config.env, source, getAdditionalEnv); | ||||
|         this.validateGlobals(config.globals, source); | ||||
|  | ||||
|         for (const override of config.overrides || []) { | ||||
|             this.validateRules(override.rules, source, getAdditionalRule); | ||||
|             this.validateEnvironment(override.env, source, getAdditionalEnv); | ||||
|             this.validateGlobals(config.globals, source); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Validate config array object. | ||||
|      * @param {ConfigArray} configArray The config array to validate. | ||||
|      * @returns {void} | ||||
|      */ | ||||
|     validateConfigArray(configArray) { | ||||
|         const getPluginEnv = Map.prototype.get.bind(configArray.pluginEnvironments); | ||||
|         const getPluginProcessor = Map.prototype.get.bind(configArray.pluginProcessors); | ||||
|         const getPluginRule = Map.prototype.get.bind(configArray.pluginRules); | ||||
|  | ||||
|         // Validate. | ||||
|         for (const element of configArray) { | ||||
|             if (validated.has(element)) { | ||||
|                 continue; | ||||
|             } | ||||
|             validated.add(element); | ||||
|  | ||||
|             this.validateEnvironment(element.env, element.name, getPluginEnv); | ||||
|             this.validateGlobals(element.globals, element.name); | ||||
|             this.validateProcessor(element.processor, element.name, getPluginProcessor); | ||||
|             this.validateRules(element.rules, element.name, getPluginRule); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										63
									
								
								node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /** | ||||
|  * @fileoverview Provide the function that emits deprecation warnings. | ||||
|  * @author Toru Nagashima <http://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Requirements | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| import path from "path"; | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Private | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| // Defitions for deprecation warnings. | ||||
| const deprecationWarningMessages = { | ||||
|     ESLINT_LEGACY_ECMAFEATURES: | ||||
|         "The 'ecmaFeatures' config file property is deprecated and has no effect.", | ||||
|     ESLINT_PERSONAL_CONFIG_LOAD: | ||||
|         "'~/.eslintrc.*' config files have been deprecated. " + | ||||
|         "Please use a config file per project or the '--config' option.", | ||||
|     ESLINT_PERSONAL_CONFIG_SUPPRESS: | ||||
|         "'~/.eslintrc.*' config files have been deprecated. " + | ||||
|         "Please remove it or add 'root:true' to the config files in your " + | ||||
|         "projects in order to avoid loading '~/.eslintrc.*' accidentally." | ||||
| }; | ||||
|  | ||||
| const sourceFileErrorCache = new Set(); | ||||
|  | ||||
| /** | ||||
|  * Emits a deprecation warning containing a given filepath. A new deprecation warning is emitted | ||||
|  * for each unique file path, but repeated invocations with the same file path have no effect. | ||||
|  * No warnings are emitted if the `--no-deprecation` or `--no-warnings` Node runtime flags are active. | ||||
|  * @param {string} source The name of the configuration source to report the warning for. | ||||
|  * @param {string} errorCode The warning message to show. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| function emitDeprecationWarning(source, errorCode) { | ||||
|     const cacheKey = JSON.stringify({ source, errorCode }); | ||||
|  | ||||
|     if (sourceFileErrorCache.has(cacheKey)) { | ||||
|         return; | ||||
|     } | ||||
|     sourceFileErrorCache.add(cacheKey); | ||||
|  | ||||
|     const rel = path.relative(process.cwd(), source); | ||||
|     const message = deprecationWarningMessages[errorCode]; | ||||
|  | ||||
|     process.emitWarning( | ||||
|         `${message} (found in "${rel}")`, | ||||
|         "DeprecationWarning", | ||||
|         errorCode | ||||
|     ); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| export { | ||||
|     emitDeprecationWarning | ||||
| }; | ||||
							
								
								
									
										96
									
								
								node_modules/@eslint/eslintrc/lib/shared/naming.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								node_modules/@eslint/eslintrc/lib/shared/naming.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| /** | ||||
|  * @fileoverview Common helpers for naming of plugins, formatters and configs | ||||
|  */ | ||||
|  | ||||
| const NAMESPACE_REGEX = /^@.*\//iu; | ||||
|  | ||||
| /** | ||||
|  * Brings package name to correct format based on prefix | ||||
|  * @param {string} name The name of the package. | ||||
|  * @param {string} prefix Can be either "eslint-plugin", "eslint-config" or "eslint-formatter" | ||||
|  * @returns {string} Normalized name of the package | ||||
|  * @private | ||||
|  */ | ||||
| function normalizePackageName(name, prefix) { | ||||
|     let normalizedName = name; | ||||
|  | ||||
|     /** | ||||
|      * On Windows, name can come in with Windows slashes instead of Unix slashes. | ||||
|      * Normalize to Unix first to avoid errors later on. | ||||
|      * https://github.com/eslint/eslint/issues/5644 | ||||
|      */ | ||||
|     if (normalizedName.includes("\\")) { | ||||
|         normalizedName = normalizedName.replace(/\\/gu, "/"); | ||||
|     } | ||||
|  | ||||
|     if (normalizedName.charAt(0) === "@") { | ||||
|  | ||||
|         /** | ||||
|          * it's a scoped package | ||||
|          * package name is the prefix, or just a username | ||||
|          */ | ||||
|         const scopedPackageShortcutRegex = new RegExp(`^(@[^/]+)(?:/(?:${prefix})?)?$`, "u"), | ||||
|             scopedPackageNameRegex = new RegExp(`^${prefix}(-|$)`, "u"); | ||||
|  | ||||
|         if (scopedPackageShortcutRegex.test(normalizedName)) { | ||||
|             normalizedName = normalizedName.replace(scopedPackageShortcutRegex, `$1/${prefix}`); | ||||
|         } else if (!scopedPackageNameRegex.test(normalizedName.split("/")[1])) { | ||||
|  | ||||
|             /** | ||||
|              * for scoped packages, insert the prefix after the first / unless | ||||
|              * the path is already @scope/eslint or @scope/eslint-xxx-yyy | ||||
|              */ | ||||
|             normalizedName = normalizedName.replace(/^@([^/]+)\/(.*)$/u, `@$1/${prefix}-$2`); | ||||
|         } | ||||
|     } else if (!normalizedName.startsWith(`${prefix}-`)) { | ||||
|         normalizedName = `${prefix}-${normalizedName}`; | ||||
|     } | ||||
|  | ||||
|     return normalizedName; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Removes the prefix from a fullname. | ||||
|  * @param {string} fullname The term which may have the prefix. | ||||
|  * @param {string} prefix The prefix to remove. | ||||
|  * @returns {string} The term without prefix. | ||||
|  */ | ||||
| function getShorthandName(fullname, prefix) { | ||||
|     if (fullname[0] === "@") { | ||||
|         let matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, "u").exec(fullname); | ||||
|  | ||||
|         if (matchResult) { | ||||
|             return matchResult[1]; | ||||
|         } | ||||
|  | ||||
|         matchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, "u").exec(fullname); | ||||
|         if (matchResult) { | ||||
|             return `${matchResult[1]}/${matchResult[2]}`; | ||||
|         } | ||||
|     } else if (fullname.startsWith(`${prefix}-`)) { | ||||
|         return fullname.slice(prefix.length + 1); | ||||
|     } | ||||
|  | ||||
|     return fullname; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Gets the scope (namespace) of a term. | ||||
|  * @param {string} term The term which may have the namespace. | ||||
|  * @returns {string} The namespace of the term if it has one. | ||||
|  */ | ||||
| function getNamespaceFromTerm(term) { | ||||
|     const match = term.match(NAMESPACE_REGEX); | ||||
|  | ||||
|     return match ? match[0] : ""; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // Public Interface | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| export { | ||||
|     normalizePackageName, | ||||
|     getShorthandName, | ||||
|     getNamespaceFromTerm | ||||
| }; | ||||
							
								
								
									
										42
									
								
								node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| /** | ||||
|  * Utility for resolving a module relative to another module | ||||
|  * @author Teddy Katz | ||||
|  */ | ||||
|  | ||||
| import Module from "module"; | ||||
|  | ||||
| /* | ||||
|  * `Module.createRequire` is added in v12.2.0. It supports URL as well. | ||||
|  * We only support the case where the argument is a filepath, not a URL. | ||||
|  */ | ||||
| const createRequire = Module.createRequire; | ||||
|  | ||||
| /** | ||||
|  * Resolves a Node module relative to another module | ||||
|  * @param {string} moduleName The name of a Node module, or a path to a Node module. | ||||
|  * @param {string} relativeToPath An absolute path indicating the module that `moduleName` should be resolved relative to. This must be | ||||
|  * a file rather than a directory, but the file need not actually exist. | ||||
|  * @returns {string} The absolute path that would result from calling `require.resolve(moduleName)` in a file located at `relativeToPath` | ||||
|  */ | ||||
| function resolve(moduleName, relativeToPath) { | ||||
|     try { | ||||
|         return createRequire(relativeToPath).resolve(moduleName); | ||||
|     } catch (error) { | ||||
|  | ||||
|         // This `if` block is for older Node.js than 12.0.0. We can remove this block in the future. | ||||
|         if ( | ||||
|             typeof error === "object" && | ||||
|             error !== null && | ||||
|             error.code === "MODULE_NOT_FOUND" && | ||||
|             !error.requireStack && | ||||
|             error.message.includes(moduleName) | ||||
|         ) { | ||||
|             error.message += `\nRequire stack:\n- ${relativeToPath}`; | ||||
|         } | ||||
|         throw error; | ||||
|     } | ||||
| } | ||||
|  | ||||
| export { | ||||
|     resolve | ||||
| }; | ||||
							
								
								
									
										149
									
								
								node_modules/@eslint/eslintrc/lib/shared/types.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								node_modules/@eslint/eslintrc/lib/shared/types.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | ||||
| /** | ||||
|  * @fileoverview Define common types for input completion. | ||||
|  * @author Toru Nagashima <https://github.com/mysticatea> | ||||
|  */ | ||||
|  | ||||
| /** @type {any} */ | ||||
| export default {}; | ||||
|  | ||||
| /** @typedef {boolean | "off" | "readable" | "readonly" | "writable" | "writeable"} GlobalConf */ | ||||
| /** @typedef {0 | 1 | 2 | "off" | "warn" | "error"} SeverityConf */ | ||||
| /** @typedef {SeverityConf | [SeverityConf, ...any[]]} RuleConf */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} EcmaFeatures | ||||
|  * @property {boolean} [globalReturn] Enabling `return` statements at the top-level. | ||||
|  * @property {boolean} [jsx] Enabling JSX syntax. | ||||
|  * @property {boolean} [impliedStrict] Enabling strict mode always. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} ParserOptions | ||||
|  * @property {EcmaFeatures} [ecmaFeatures] The optional features. | ||||
|  * @property {3|5|6|7|8|9|10|11|12|2015|2016|2017|2018|2019|2020|2021} [ecmaVersion] The ECMAScript version (or revision number). | ||||
|  * @property {"script"|"module"} [sourceType] The source code type. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} ConfigData | ||||
|  * @property {Record<string, boolean>} [env] The environment settings. | ||||
|  * @property {string | string[]} [extends] The path to other config files or the package name of shareable configs. | ||||
|  * @property {Record<string, GlobalConf>} [globals] The global variable settings. | ||||
|  * @property {string | string[]} [ignorePatterns] The glob patterns that ignore to lint. | ||||
|  * @property {boolean} [noInlineConfig] The flag that disables directive comments. | ||||
|  * @property {OverrideConfigData[]} [overrides] The override settings per kind of files. | ||||
|  * @property {string} [parser] The path to a parser or the package name of a parser. | ||||
|  * @property {ParserOptions} [parserOptions] The parser options. | ||||
|  * @property {string[]} [plugins] The plugin specifiers. | ||||
|  * @property {string} [processor] The processor specifier. | ||||
|  * @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments. | ||||
|  * @property {boolean} [root] The root flag. | ||||
|  * @property {Record<string, RuleConf>} [rules] The rule settings. | ||||
|  * @property {Object} [settings] The shared settings. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} OverrideConfigData | ||||
|  * @property {Record<string, boolean>} [env] The environment settings. | ||||
|  * @property {string | string[]} [excludedFiles] The glob pattarns for excluded files. | ||||
|  * @property {string | string[]} [extends] The path to other config files or the package name of shareable configs. | ||||
|  * @property {string | string[]} files The glob patterns for target files. | ||||
|  * @property {Record<string, GlobalConf>} [globals] The global variable settings. | ||||
|  * @property {boolean} [noInlineConfig] The flag that disables directive comments. | ||||
|  * @property {OverrideConfigData[]} [overrides] The override settings per kind of files. | ||||
|  * @property {string} [parser] The path to a parser or the package name of a parser. | ||||
|  * @property {ParserOptions} [parserOptions] The parser options. | ||||
|  * @property {string[]} [plugins] The plugin specifiers. | ||||
|  * @property {string} [processor] The processor specifier. | ||||
|  * @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments. | ||||
|  * @property {Record<string, RuleConf>} [rules] The rule settings. | ||||
|  * @property {Object} [settings] The shared settings. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} ParseResult | ||||
|  * @property {Object} ast The AST. | ||||
|  * @property {ScopeManager} [scopeManager] The scope manager of the AST. | ||||
|  * @property {Record<string, any>} [services] The services that the parser provides. | ||||
|  * @property {Record<string, string[]>} [visitorKeys] The visitor keys of the AST. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Parser | ||||
|  * @property {(text:string, options:ParserOptions) => Object} parse The definition of global variables. | ||||
|  * @property {(text:string, options:ParserOptions) => ParseResult} [parseForESLint] The parser options that will be enabled under this environment. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Environment | ||||
|  * @property {Record<string, GlobalConf>} [globals] The definition of global variables. | ||||
|  * @property {ParserOptions} [parserOptions] The parser options that will be enabled under this environment. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} LintMessage | ||||
|  * @property {number} column The 1-based column number. | ||||
|  * @property {number} [endColumn] The 1-based column number of the end location. | ||||
|  * @property {number} [endLine] The 1-based line number of the end location. | ||||
|  * @property {boolean} fatal If `true` then this is a fatal error. | ||||
|  * @property {{range:[number,number], text:string}} [fix] Information for autofix. | ||||
|  * @property {number} line The 1-based line number. | ||||
|  * @property {string} message The error message. | ||||
|  * @property {string|null} ruleId The ID of the rule which makes this message. | ||||
|  * @property {0|1|2} severity The severity of this message. | ||||
|  * @property {Array<{desc?: string, messageId?: string, fix: {range: [number, number], text: string}}>} [suggestions] Information for suggestions. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} SuggestionResult | ||||
|  * @property {string} desc A short description. | ||||
|  * @property {string} [messageId] Id referencing a message for the description. | ||||
|  * @property {{ text: string, range: number[] }} fix fix result info | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Processor | ||||
|  * @property {(text:string, filename:string) => Array<string | { text:string, filename:string }>} [preprocess] The function to extract code blocks. | ||||
|  * @property {(messagesList:LintMessage[][], filename:string) => LintMessage[]} [postprocess] The function to merge messages. | ||||
|  * @property {boolean} [supportsAutofix] If `true` then it means the processor supports autofix. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} RuleMetaDocs | ||||
|  * @property {string} category The category of the rule. | ||||
|  * @property {string} description The description of the rule. | ||||
|  * @property {boolean} recommended If `true` then the rule is included in `eslint:recommended` preset. | ||||
|  * @property {string} url The URL of the rule documentation. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} RuleMeta | ||||
|  * @property {boolean} [deprecated] If `true` then the rule has been deprecated. | ||||
|  * @property {RuleMetaDocs} docs The document information of the rule. | ||||
|  * @property {"code"|"whitespace"} [fixable] The autofix type. | ||||
|  * @property {Record<string,string>} [messages] The messages the rule reports. | ||||
|  * @property {string[]} [replacedBy] The IDs of the alternative rules. | ||||
|  * @property {Array|Object} schema The option schema of the rule. | ||||
|  * @property {"problem"|"suggestion"|"layout"} type The rule type. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Rule | ||||
|  * @property {Function} create The factory of the rule. | ||||
|  * @property {RuleMeta} meta The meta data of the rule. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @typedef {Object} Plugin | ||||
|  * @property {Record<string, ConfigData>} [configs] The definition of plugin configs. | ||||
|  * @property {Record<string, Environment>} [environments] The definition of plugin environments. | ||||
|  * @property {Record<string, Processor>} [processors] The definition of plugin processors. | ||||
|  * @property {Record<string, Function | Rule>} [rules] The definition of plugin rules. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Information of deprecated rules. | ||||
|  * @typedef {Object} DeprecatedRuleInfo | ||||
|  * @property {string} ruleId The rule ID. | ||||
|  * @property {string[]} replacedBy The rule IDs that replace this deprecated rule. | ||||
|  */ | ||||
		Reference in New Issue
	
	Block a user