/** * @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 */ "use strict"; const { IgnorePattern } = require("./ignore-pattern"); // 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} */ this.env = {}; /** * Global variables. * @type {Record} */ 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} */ 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} */ 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; } } module.exports = { ExtractedConfig };