checkAgainstRule.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. const normalizeRuleSettings = require('../normalizeRuleSettings');
  3. const Result = require('postcss/lib/result');
  4. const rules = require('../rules');
  5. /**
  6. * Useful for third-party code (e.g. plugins) to run a PostCSS Root
  7. * against a specific rule and do something with the warnings
  8. * @param {{
  9. ruleName: string,
  10. ruleSettings: import('stylelint').StylelintConfigRuleSettings,
  11. root: import('postcss').Root,
  12. }} options
  13. * @param {Function} callback
  14. * @returns {void}
  15. */
  16. module.exports = function (options, callback) {
  17. if (!options)
  18. throw new Error(
  19. "checkAgainstRule requires an options object with 'ruleName', 'ruleSettings', and 'root' properties",
  20. );
  21. if (!callback) throw new Error('checkAgainstRule requires a callback');
  22. if (!options.ruleName) throw new Error("checkAgainstRule requires a 'ruleName' option");
  23. if (!Object.keys(rules).includes(options.ruleName))
  24. throw new Error(`Rule '${options.ruleName}' does not exist`);
  25. if (!options.ruleSettings) throw new Error("checkAgainstRule requires a 'ruleSettings' option");
  26. if (!options.root) throw new Error("checkAgainstRule requires a 'root' option");
  27. const settings = normalizeRuleSettings(options.ruleSettings, options.ruleName);
  28. if (!settings) {
  29. return;
  30. }
  31. const tmpPostcssResult = new Result();
  32. rules[options.ruleName](settings[0], settings[1], {})(options.root, tmpPostcssResult);
  33. tmpPostcssResult.warnings().forEach(callback);
  34. };