index.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. let stylelint = require('stylelint');
  2. let sortNodeProperties = require('postcss-sorting/lib/properties-order/sortNodeProperties');
  3. let { namespace, getContainingNode, isRuleWithNodes } = require('../../utils');
  4. let checkNode = require('./checkNode');
  5. let ruleName = namespace('properties-alphabetical-order');
  6. let messages = stylelint.utils.ruleMessages(ruleName, {
  7. expected: (first, second) => `Expected ${first} to come before ${second}`,
  8. });
  9. function rule(actual, options, context = {}) {
  10. return function ruleBody(root, result) {
  11. let validOptions = stylelint.utils.validateOptions(result, ruleName, {
  12. actual,
  13. possible: Boolean,
  14. });
  15. if (!validOptions) {
  16. return;
  17. }
  18. let processedParents = [];
  19. root.walk(function processRulesAndAtrules(input) {
  20. let node = getContainingNode(input);
  21. // Avoid warnings duplication, caused by interfering in `root.walk()` algorigthm with `getContainingNode()`
  22. if (processedParents.includes(node)) {
  23. return;
  24. }
  25. processedParents.push(node);
  26. if (isRuleWithNodes(node)) {
  27. if (context.fix) {
  28. sortNodeProperties(node, { order: 'alphabetical' });
  29. } else {
  30. checkNode(node, result, ruleName, messages);
  31. }
  32. }
  33. });
  34. };
  35. }
  36. rule.ruleName = ruleName;
  37. rule.messages = messages;
  38. module.exports = rule;