/** | |
* @fileoverview Shared functions to work with configs. | |
* @author Nicholas C. Zakas | |
*/ | |
; | |
//----------------------------------------------------------------------------- | |
// 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 | |
}; | |