checkEmptyLineBefore.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. let stylelint = require('stylelint');
  2. let _ = require('lodash');
  3. let addEmptyLineBefore = require('./addEmptyLineBefore');
  4. let hasEmptyLineBefore = require('./hasEmptyLineBefore');
  5. let removeEmptyLinesBefore = require('./removeEmptyLinesBefore');
  6. let ruleName = require('./ruleName');
  7. let messages = require('./messages');
  8. module.exports = function checkEmptyLineBefore({
  9. firstPropData,
  10. secondPropData,
  11. propsCount,
  12. lastKnownSeparatedGroup,
  13. context,
  14. emptyLineBeforeUnspecified,
  15. emptyLineMinimumPropertyThreshold,
  16. isFixEnabled,
  17. primaryOption,
  18. result,
  19. }) {
  20. let firstPropIsSpecified = Boolean(firstPropData.orderData);
  21. let secondPropIsSpecified = Boolean(secondPropData.orderData);
  22. // Check newlines between groups
  23. let firstPropGroup = firstPropIsSpecified
  24. ? firstPropData.orderData.separatedGroup
  25. : lastKnownSeparatedGroup;
  26. let secondPropGroup = secondPropIsSpecified
  27. ? secondPropData.orderData.separatedGroup
  28. : lastKnownSeparatedGroup;
  29. // eslint-disable-next-line no-param-reassign
  30. lastKnownSeparatedGroup = secondPropGroup;
  31. let startOfSpecifiedGroup = secondPropIsSpecified && firstPropGroup !== secondPropGroup;
  32. let startOfUnspecifiedGroup = firstPropIsSpecified && !secondPropIsSpecified;
  33. if (startOfSpecifiedGroup || startOfUnspecifiedGroup) {
  34. // Get an array of just the property groups, remove any solo properties
  35. let groups = _.reject(primaryOption, _.isString);
  36. let emptyLineBefore = _.get(groups[secondPropGroup - 2], 'emptyLineBefore');
  37. if (startOfUnspecifiedGroup) {
  38. emptyLineBefore = emptyLineBeforeUnspecified;
  39. }
  40. // Threshold logic
  41. let belowEmptyLineThreshold = propsCount < emptyLineMinimumPropertyThreshold;
  42. let emptyLineThresholdInsertLines =
  43. emptyLineBefore === 'threshold' && !belowEmptyLineThreshold;
  44. let emptyLineThresholdRemoveLines =
  45. emptyLineBefore === 'threshold' && belowEmptyLineThreshold;
  46. if (
  47. (emptyLineBefore === 'always' || emptyLineThresholdInsertLines) &&
  48. !hasEmptyLineBefore(secondPropData.node)
  49. ) {
  50. if (isFixEnabled) {
  51. addEmptyLineBefore(secondPropData.node, context.newline);
  52. } else {
  53. stylelint.utils.report({
  54. message: messages.expectedEmptyLineBefore(secondPropData.name),
  55. node: secondPropData.node,
  56. result,
  57. ruleName,
  58. });
  59. }
  60. } else if (
  61. (emptyLineBefore === 'never' || emptyLineThresholdRemoveLines) &&
  62. hasEmptyLineBefore(secondPropData.node)
  63. ) {
  64. if (isFixEnabled) {
  65. removeEmptyLinesBefore(secondPropData.node, context.newline);
  66. } else {
  67. stylelint.utils.report({
  68. message: messages.rejectedEmptyLineBefore(secondPropData.name),
  69. node: secondPropData.node,
  70. result,
  71. ruleName,
  72. });
  73. }
  74. }
  75. }
  76. // Check newlines between properties inside a group
  77. if (
  78. firstPropIsSpecified &&
  79. secondPropIsSpecified &&
  80. firstPropData.orderData.groupPosition === secondPropData.orderData.groupPosition
  81. ) {
  82. if (
  83. secondPropData.orderData.noEmptyLineBeforeInsideGroup &&
  84. hasEmptyLineBefore(secondPropData.node)
  85. ) {
  86. if (isFixEnabled) {
  87. removeEmptyLinesBefore(secondPropData.node, context.newline);
  88. } else {
  89. stylelint.utils.report({
  90. message: messages.rejectedEmptyLineBefore(secondPropData.name),
  91. node: secondPropData.node,
  92. result,
  93. ruleName,
  94. });
  95. }
  96. }
  97. }
  98. };