| /** | |
|  * @fileoverview Shared functions to work with configs. | |
|  * @author Nicholas C. Zakas | |
|  */ | |
| 
 | |
| "use strict"; | |
| 
 | |
| //----------------------------------------------------------------------------- | |
| // Functions | |
| //----------------------------------------------------------------------------- | |
|  | |
| /** | |
|  * Parses a ruleId into its plugin and rule parts. | |
|  * @param {string} ruleId The rule ID to parse. | |
|  * @returns {{pluginName:string,ruleName:string}} The plugin and rule | |
|  *      parts of the ruleId; | |
|  */ | |
| function parseRuleId(ruleId) { | |
|     let pluginName, ruleName; | |
| 
 | |
|     // distinguish between core rules and plugin rules | |
|     if (ruleId.includes("/")) { | |
| 
 | |
|         // mimic scoped npm packages | |
|         if (ruleId.startsWith("@")) { | |
|             pluginName = ruleId.slice(0, ruleId.lastIndexOf("/")); | |
|         } else { | |
|             pluginName = ruleId.slice(0, ruleId.indexOf("/")); | |
|         } | |
| 
 | |
|         ruleName = ruleId.slice(pluginName.length + 1); | |
|     } else { | |
|         pluginName = "@"; | |
|         ruleName = ruleId; | |
|     } | |
| 
 | |
|     return { | |
|         pluginName, | |
|         ruleName | |
|     }; | |
| } | |
| 
 | |
| /** | |
|  * Retrieves a rule instance from a given config based on the ruleId. | |
|  * @param {string} ruleId The rule ID to look for. | |
|  * @param {FlatConfig} config The config to search. | |
|  * @returns {import("../shared/types").Rule|undefined} The rule if found | |
|  *      or undefined if not. | |
|  */ | |
| function getRuleFromConfig(ruleId, config) { | |
| 
 | |
|     const { pluginName, ruleName } = parseRuleId(ruleId); | |
| 
 | |
|     const plugin = config.plugins && config.plugins[pluginName]; | |
|     let rule = plugin && plugin.rules && plugin.rules[ruleName]; | |
| 
 | |
| 
 | |
|     // normalize function rules into objects | |
|     if (rule && typeof rule === "function") { | |
|         rule = { | |
|             create: rule | |
|         }; | |
|     } | |
| 
 | |
|     return rule; | |
| } | |
| 
 | |
| /** | |
|  * 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. | |
|  */ | |
| function getRuleOptionsSchema(rule) { | |
| 
 | |
|     if (!rule) { | |
|         return null; | |
|     } | |
| 
 | |
|     const schema = rule.schema || rule.meta && rule.meta.schema; | |
| 
 | |
|     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; | |
| } | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------- | |
| // Exports | |
| //----------------------------------------------------------------------------- | |
|  | |
| module.exports = { | |
|     parseRuleId, | |
|     getRuleFromConfig, | |
|     getRuleOptionsSchema | |
| };
 |