| /* @flow */ |
| "use strict"; |
| |
| const normalizeRuleSettings = require("../normalizeRuleSettings"); |
| const requireRule = require("../requireRule"); |
| const Result = require("postcss/lib/result"); |
| const rules = require("../rules"); |
| |
| // Useful for third-party code (e.g. plugins) to run a PostCSS Root |
| // against a specific rule and do something with the warnings |
| module.exports = function( |
| options /*: { |
| ruleName: string, |
| ruleSettings: stylelint$configRuleSettings, |
| root: Object, |
| }*/, |
| callback /*: Function*/ |
| ) { |
| if (!options) |
| throw new Error( |
| "checkAgainstRule requires an options object with 'ruleName', 'ruleSettings', and 'root' properties" |
| ); |
| |
| if (!callback) throw new Error("checkAgainstRule requires a callback"); |
| |
| if (!options.ruleName) |
| throw new Error("checkAgainstRule requires a 'ruleName' option"); |
| |
| if (!rules.includes(options.ruleName)) |
| throw new Error(`Rule '${options.ruleName}' does not exist`); |
| |
| if (!options.ruleSettings) |
| throw new Error("checkAgainstRule requires a 'ruleSettings' option"); |
| |
| if (!options.root) |
| throw new Error("checkAgainstRule requires a 'root' option"); |
| |
| const settings = normalizeRuleSettings( |
| options.ruleSettings, |
| options.ruleName |
| ); |
| |
| if (!settings) { |
| return; |
| } |
| |
| const tmpPostcssResult = new Result(); |
| |
| requireRule(options.ruleName)(settings[0], settings[1], {})( |
| options.root, |
| tmpPostcssResult |
| ); |
| tmpPostcssResult.warnings().forEach(callback); |
| }; |