2 * @fileoverview Flat Config Array
3 * @author Nicholas C. Zakas
8 //-----------------------------------------------------------------------------
10 //-----------------------------------------------------------------------------
12 const { ConfigArray, ConfigArraySymbol } = require("@humanwhocodes/config-array");
13 const { flatConfigSchema } = require("./flat-config-schema");
14 const { RuleValidator } = require("./rule-validator");
15 const { defaultConfig } = require("./default-config");
16 const recommendedConfig = require("../../conf/eslint-recommended");
17 const allConfig = require("../../conf/eslint-all");
19 //-----------------------------------------------------------------------------
21 //-----------------------------------------------------------------------------
23 const ruleValidator = new RuleValidator();
26 * Splits a plugin identifier in the form a/b/c into two parts: a/b and c.
27 * @param {string} identifier The identifier to parse.
28 * @returns {{objectName: string, pluginName: string}} The parts of the plugin
31 function splitPluginIdentifier(identifier) {
32 const parts = identifier.split("/");
35 objectName: parts.pop(),
36 pluginName: parts.join("/")
40 //-----------------------------------------------------------------------------
42 //-----------------------------------------------------------------------------
45 * Represents an array containing configuration information for ESLint.
47 class FlatConfigArray extends ConfigArray {
50 * Creates a new instance.
51 * @param {*[]} configs An array of configuration information.
52 * @param {{basePath: string, baseConfig: FlatConfig}} options The options
53 * to use for the config array instance.
55 constructor(configs, { basePath, baseConfig = defaultConfig }) {
58 schema: flatConfigSchema
61 this.unshift(baseConfig);
64 /* eslint-disable class-methods-use-this */
66 * Replaces a config with another config to allow us to put strings
67 * in the config array that will be replaced by objects before
69 * @param {Object} config The config to preprocess.
70 * @returns {Object} The preprocessed config.
72 [ConfigArraySymbol.preprocessConfig](config) {
73 if (config === "eslint:recommended") {
74 return recommendedConfig;
77 if (config === "eslint:all") {
85 * Finalizes the config by replacing plugin references with their objects
86 * and validating rule option schemas.
87 * @param {Object} config The config to finalize.
88 * @returns {Object} The finalized config.
89 * @throws {TypeError} If the config is invalid.
91 [ConfigArraySymbol.finalizeConfig](config) {
93 const { plugins, languageOptions, processor } = config;
96 if (languageOptions && languageOptions.parser && typeof languageOptions.parser === "string") {
97 const { pluginName, objectName: parserName } = splitPluginIdentifier(languageOptions.parser);
99 if (!plugins || !plugins[pluginName] || !plugins[pluginName].parsers || !plugins[pluginName].parsers[parserName]) {
100 throw new TypeError(`Key "parser": Could not find "${parserName}" in plugin "${pluginName}".`);
103 languageOptions.parser = plugins[pluginName].parsers[parserName];
106 // Check processor value
107 if (processor && typeof processor === "string") {
108 const { pluginName, objectName: processorName } = splitPluginIdentifier(processor);
110 if (!plugins || !plugins[pluginName] || !plugins[pluginName].processors || !plugins[pluginName].processors[processorName]) {
111 throw new TypeError(`Key "processor": Could not find "${processorName}" in plugin "${pluginName}".`);
114 config.processor = plugins[pluginName].processors[processorName];
117 ruleValidator.validate(config);
121 /* eslint-enable class-methods-use-this */
125 exports.FlatConfigArray = FlatConfigArray;