checkNode.js 1.4 KB

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