index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. let stylelint = require('stylelint');
  2. let postcssSorting = require('postcss-sorting');
  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(
  12. result,
  13. ruleName,
  14. {
  15. actual,
  16. possible: Boolean,
  17. },
  18. {
  19. actual: options,
  20. possible: {
  21. disableFix: Boolean,
  22. },
  23. optional: true,
  24. }
  25. );
  26. if (!validOptions) {
  27. return;
  28. }
  29. let disableFix = options.disableFix || false;
  30. if (context.fix && !disableFix) {
  31. postcssSorting({ 'properties-order': 'alphabetical' })(root);
  32. return;
  33. }
  34. let processedParents = [];
  35. root.walk(function processRulesAndAtrules(input) {
  36. let node = getContainingNode(input);
  37. // Avoid warnings duplication, caused by interfering in `root.walk()` algorigthm with `getContainingNode()`
  38. if (processedParents.includes(node)) {
  39. return;
  40. }
  41. processedParents.push(node);
  42. if (isRuleWithNodes(node)) {
  43. checkNode(node, result, ruleName, messages);
  44. }
  45. });
  46. };
  47. }
  48. rule.ruleName = ruleName;
  49. rule.messages = messages;
  50. module.exports = rule;