checkNodeForOrder.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const stylelint = require('stylelint');
  2. const sortNodeProperties = require('postcss-sorting/lib/properties-order/sortNodeProperties');
  3. const { isProperty } = require('../../utils');
  4. const checkOrder = require('./checkOrder');
  5. const getNodeData = require('./getNodeData');
  6. const createFlatOrder = require('./createFlatOrder');
  7. const ruleName = require('./ruleName');
  8. const messages = require('./messages');
  9. module.exports = function checkNodeForOrder({
  10. node,
  11. isFixEnabled,
  12. primaryOption,
  13. unspecified,
  14. result,
  15. expectedOrder,
  16. }) {
  17. if (isFixEnabled) {
  18. let allPropertiesData = getAllPropertiesData(node);
  19. let shouldFixOrder = false;
  20. // Check if there order violation to avoid running re-ordering unnecessery
  21. allPropertiesData.forEach(function checkEveryPropForOrder2(propertyData, index) {
  22. // Skip first decl
  23. if (index === 0) {
  24. return;
  25. }
  26. // return early if we know there is a violation and auto fix should be applied
  27. if (shouldFixOrder) {
  28. return;
  29. }
  30. let previousPropertyData = allPropertiesData[index - 1];
  31. let checkedOrder = checkOrder({
  32. firstPropertyData: previousPropertyData,
  33. secondPropertyData: propertyData,
  34. unspecified,
  35. allPropertiesData: allPropertiesData.slice(0, index),
  36. });
  37. if (!checkedOrder.isCorrect) {
  38. shouldFixOrder = true;
  39. }
  40. });
  41. if (shouldFixOrder) {
  42. sortNodeProperties(node, {
  43. order: createFlatOrder(primaryOption),
  44. unspecifiedPropertiesPosition: unspecified === 'ignore' ? 'bottom' : unspecified,
  45. });
  46. }
  47. }
  48. getAllPropertiesData(node).forEach((propertyData, index, listOfProperties) => {
  49. // Skip first decl
  50. if (index === 0) {
  51. return;
  52. }
  53. const previousPropertyData = listOfProperties[index - 1];
  54. const checkedOrder = checkOrder({
  55. firstPropertyData: previousPropertyData,
  56. secondPropertyData: propertyData,
  57. unspecified,
  58. allPropertiesData: listOfProperties.slice(0, index),
  59. });
  60. if (!checkedOrder.isCorrect) {
  61. const { orderData } = checkedOrder.secondNode;
  62. stylelint.utils.report({
  63. message: messages.expected(
  64. checkedOrder.secondNode.name,
  65. checkedOrder.firstNode.name,
  66. orderData && orderData.groupName
  67. ),
  68. node: checkedOrder.secondNode.node,
  69. result,
  70. ruleName,
  71. });
  72. }
  73. });
  74. function getAllPropertiesData(inputNode) {
  75. return inputNode.nodes
  76. .filter((item) => isProperty(item))
  77. .map((item) => getNodeData(item, expectedOrder));
  78. }
  79. };