You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.1 KiB
147 lines
4.1 KiB
3 years ago
|
/**
|
||
|
* @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>
|
||
|
*/
|
||
|
"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<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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = { ExtractedConfig };
|