123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * @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
- };
|