update socials section
This commit is contained in:
		
							
								
								
									
										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 }; | ||||
		Reference in New Issue
	
	Block a user