index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports["default"] = rule;
  6. exports.ruleName = exports.meta = exports.messages = void 0;
  7. exports.sassConditionalBraceNLAfterChecker = sassConditionalBraceNLAfterChecker;
  8. var _stylelint = require("stylelint");
  9. var _utils = require("../../utils");
  10. var ruleName = (0, _utils.namespace)("at-if-closing-brace-newline-after");
  11. exports.ruleName = ruleName;
  12. var messages = _stylelint.utils.ruleMessages(ruleName, {
  13. expected: 'Expected newline after "}" of @if statement',
  14. rejected: 'Unexpected newline after "}" of @if statement'
  15. });
  16. exports.messages = messages;
  17. var meta = {
  18. url: (0, _utils.ruleUrl)(ruleName)
  19. };
  20. exports.meta = meta;
  21. function rule(expectation, options, context) {
  22. return function (root, result) {
  23. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  24. actual: expectation,
  25. possible: ["always-last-in-chain"]
  26. }, {
  27. actual: options,
  28. possible: {
  29. disableFix: _utils.isBoolean
  30. },
  31. optional: true
  32. });
  33. if (!validOptions) {
  34. return;
  35. }
  36. sassConditionalBraceNLAfterChecker({
  37. root: root,
  38. result: result,
  39. ruleName: ruleName,
  40. atRuleName: "if",
  41. expectation: expectation,
  42. messages: messages,
  43. context: context,
  44. options: options
  45. });
  46. };
  47. }
  48. /**
  49. * The core logic for this rule. Can be imported by other rules with similar
  50. * logic, namely at-else-closing-brace-newline-after
  51. *
  52. * @param {Object} args -- Named arguments object
  53. * @param {PostCSS root} args.root
  54. * @param {PostCSS result} args.result
  55. * @param {String ruleName} args.ruleName - needed for `report` function
  56. * @param {String} args.atRuleName - the name of the at-rule to be checked, e.g. "if", "else"
  57. * @param {Object} args.messages - returned by stylelint.utils.ruleMessages
  58. * @return {undefined}
  59. */
  60. function sassConditionalBraceNLAfterChecker(_ref) {
  61. var root = _ref.root,
  62. result = _ref.result,
  63. ruleName = _ref.ruleName,
  64. atRuleName = _ref.atRuleName,
  65. expectation = _ref.expectation,
  66. messages = _ref.messages,
  67. context = _ref.context,
  68. options = _ref.options;
  69. var shouldFix = context.fix && (!options || options.disableFix !== true);
  70. function complain(node, message, index, fixValue) {
  71. if (shouldFix) {
  72. node.next().raws.before = fixValue;
  73. return;
  74. }
  75. _stylelint.utils.report({
  76. result: result,
  77. ruleName: ruleName,
  78. node: node,
  79. message: message,
  80. index: index
  81. });
  82. }
  83. root.walkAtRules(function (atrule) {
  84. // Do nothing if it's not an @if
  85. if (atrule.name !== atRuleName) {
  86. return;
  87. }
  88. var nextNode = atrule.next();
  89. if (!nextNode) {
  90. return;
  91. }
  92. var nextBefore = nextNode.raws.before;
  93. var hasNewLinesBeforeNext = nextBefore && !(0, _utils.isSingleLineString)(nextBefore);
  94. var reportIndex = atrule.toString().length;
  95. if (expectation === "always-last-in-chain") {
  96. // If followed by @else, no newline is needed
  97. if (nextNode.type === "atrule" && (nextNode.name === "else" || nextNode.name === "elseif")) {
  98. if (hasNewLinesBeforeNext) {
  99. complain(atrule, messages.rejected, reportIndex, " ");
  100. }
  101. } else {
  102. if (!hasNewLinesBeforeNext) {
  103. complain(atrule, messages.expected, reportIndex, context.newline);
  104. }
  105. }
  106. }
  107. });
  108. }
  109. rule.ruleName = ruleName;
  110. rule.messages = messages;
  111. rule.meta = meta;