checkNode.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. let stylelint = require('stylelint');
  2. let _ = require('lodash');
  3. let postcss = require('postcss');
  4. let checkAlphabeticalOrder = require('../checkAlphabeticalOrder');
  5. let { isStandardSyntaxProperty, isCustomProperty } = require('../../utils');
  6. // eslint-disable-next-line max-params
  7. module.exports = function checkNode(node, result, ruleName, messages) {
  8. let allPropData = [];
  9. node.each(function processEveryNode(child) {
  10. if (child.type !== 'decl') {
  11. return;
  12. }
  13. let { prop } = child;
  14. if (!isStandardSyntaxProperty(prop)) {
  15. return;
  16. }
  17. if (isCustomProperty(prop)) {
  18. return;
  19. }
  20. let unprefixedPropName = postcss.vendor.unprefixed(prop);
  21. // Hack to allow -moz-osx-font-smoothing to be understood
  22. // just like -webkit-font-smoothing
  23. if (unprefixedPropName.startsWith('osx-')) {
  24. unprefixedPropName = unprefixedPropName.slice(4);
  25. }
  26. let propData = {
  27. name: prop,
  28. unprefixedName: unprefixedPropName,
  29. index: allPropData.length,
  30. node: child,
  31. };
  32. let previousPropData = _.last(allPropData);
  33. allPropData.push(propData);
  34. // Skip first decl
  35. if (!previousPropData) {
  36. return;
  37. }
  38. let isCorrectOrder = checkAlphabeticalOrder(previousPropData, propData);
  39. if (isCorrectOrder) {
  40. return;
  41. }
  42. stylelint.utils.report({
  43. message: messages.expected(propData.name, previousPropData.name),
  44. node: child,
  45. result,
  46. ruleName,
  47. });
  48. });
  49. };