/** | |
* @fileoverview Config file operations. This file must be usable in the browser, | |
* so no Node-specific code can be here. | |
* @author Nicholas C. Zakas | |
*/ | |
//------------------------------------------------------------------------------ | |
// Private | |
//------------------------------------------------------------------------------ | |
const RULE_SEVERITY_STRINGS = ["off", "warn", "error"], | |
RULE_SEVERITY = RULE_SEVERITY_STRINGS.reduce((map, value, index) => { | |
map[value] = index; | |
return map; | |
}, {}), | |
VALID_SEVERITIES = [0, 1, 2, "off", "warn", "error"]; | |
//------------------------------------------------------------------------------ | |
// Public Interface | |
//------------------------------------------------------------------------------ | |
/** | |
* Normalizes the severity value of a rule's configuration to a number | |
* @param {(number|string|[number, ...*]|[string, ...*])} ruleConfig A rule's configuration value, generally | |
* received from the user. A valid config value is either 0, 1, 2, the string "off" (treated the same as 0), | |
* the string "warn" (treated the same as 1), the string "error" (treated the same as 2), or an array | |
* whose first element is one of the above values. Strings are matched case-insensitively. | |
* @returns {(0|1|2)} The numeric severity value if the config value was valid, otherwise 0. | |
*/ | |
function getRuleSeverity(ruleConfig) { | |
const severityValue = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig; | |
if (severityValue === 0 || severityValue === 1 || severityValue === 2) { | |
return severityValue; | |
} | |
if (typeof severityValue === "string") { | |
return RULE_SEVERITY[severityValue.toLowerCase()] || 0; | |
} | |
return 0; | |
} | |
/** | |
* Converts old-style severity settings (0, 1, 2) into new-style | |
* severity settings (off, warn, error) for all rules. Assumption is that severity | |
* values have already been validated as correct. | |
* @param {Object} config The config object to normalize. | |
* @returns {void} | |
*/ | |
function normalizeToStrings(config) { | |
if (config.rules) { | |
Object.keys(config.rules).forEach(ruleId => { | |
const ruleConfig = config.rules[ruleId]; | |
if (typeof ruleConfig === "number") { | |
config.rules[ruleId] = RULE_SEVERITY_STRINGS[ruleConfig] || RULE_SEVERITY_STRINGS[0]; | |
} else if (Array.isArray(ruleConfig) && typeof ruleConfig[0] === "number") { | |
ruleConfig[0] = RULE_SEVERITY_STRINGS[ruleConfig[0]] || RULE_SEVERITY_STRINGS[0]; | |
} | |
}); | |
} | |
} | |
/** | |
* Determines if the severity for the given rule configuration represents an error. | |
* @param {int|string|Array} ruleConfig The configuration for an individual rule. | |
* @returns {boolean} True if the rule represents an error, false if not. | |
*/ | |
function isErrorSeverity(ruleConfig) { | |
return getRuleSeverity(ruleConfig) === 2; | |
} | |
/** | |
* Checks whether a given config has valid severity or not. | |
* @param {number|string|Array} ruleConfig The configuration for an individual rule. | |
* @returns {boolean} `true` if the configuration has valid severity. | |
*/ | |
function isValidSeverity(ruleConfig) { | |
let severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig; | |
if (typeof severity === "string") { | |
severity = severity.toLowerCase(); | |
} | |
return VALID_SEVERITIES.indexOf(severity) !== -1; | |
} | |
/** | |
* Checks whether every rule of a given config has valid severity or not. | |
* @param {Object} config The configuration for rules. | |
* @returns {boolean} `true` if the configuration has valid severity. | |
*/ | |
function isEverySeverityValid(config) { | |
return Object.keys(config).every(ruleId => isValidSeverity(config[ruleId])); | |
} | |
/** | |
* Normalizes a value for a global in a config | |
* @param {(boolean|string|null)} configuredValue The value given for a global in configuration or in | |
* a global directive comment | |
* @returns {("readable"|"writeable"|"off")} The value normalized as a string | |
* @throws Error if global value is invalid | |
*/ | |
function normalizeConfigGlobal(configuredValue) { | |
switch (configuredValue) { | |
case "off": | |
return "off"; | |
case true: | |
case "true": | |
case "writeable": | |
case "writable": | |
return "writable"; | |
case null: | |
case false: | |
case "false": | |
case "readable": | |
case "readonly": | |
return "readonly"; | |
default: | |
throw new Error(`'${configuredValue}' is not a valid configuration for a global (use 'readonly', 'writable', or 'off')`); | |
} | |
} | |
export { | |
getRuleSeverity, | |
normalizeToStrings, | |
isErrorSeverity, | |
isValidSeverity, | |
isEverySeverityValid, | |
normalizeConfigGlobal | |
}; | |