index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.sassConditionalBraceSpaceAfterChecker = sassConditionalBraceSpaceAfterChecker;
  8. var _utils = require("../../utils");
  9. var _stylelint = require("stylelint");
  10. var ruleName = (0, _utils.namespace)("at-if-closing-brace-space-after");
  11. exports.ruleName = ruleName;
  12. var messages = _stylelint.utils.ruleMessages(ruleName, {
  13. expected: 'Expected single space after "}" of @if statement',
  14. rejected: 'Unexpected space 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, _, context) {
  22. return function (root, result) {
  23. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  24. actual: expectation,
  25. possible: ["always-intermediate", "never-intermediate"]
  26. });
  27. if (!validOptions) {
  28. return;
  29. }
  30. sassConditionalBraceSpaceAfterChecker({
  31. root: root,
  32. result: result,
  33. ruleName: ruleName,
  34. atRuleName: "if",
  35. expectation: expectation,
  36. messages: messages,
  37. context: context
  38. });
  39. };
  40. }
  41. /**
  42. * The core logic for this rule. Can be imported by other rules with similar
  43. * logic, namely at-else-closing-brace-space-after
  44. *
  45. * @param {Object} args -- Named arguments object
  46. * @param {PostCSS root} args.root
  47. * @param {PostCSS result} args.result
  48. * @param {String ruleName} args.ruleName - needed for `report` function
  49. * @param {String} args.atRuleName - the name of the at-rule to be checked, e.g. "if", "else"
  50. * @param {Object} args.messages - returned by stylelint.utils.ruleMessages
  51. * @return {undefined}
  52. */
  53. function sassConditionalBraceSpaceAfterChecker(_ref) {
  54. var root = _ref.root,
  55. result = _ref.result,
  56. ruleName = _ref.ruleName,
  57. atRuleName = _ref.atRuleName,
  58. expectation = _ref.expectation,
  59. messages = _ref.messages,
  60. context = _ref.context;
  61. function complain(node, message, index, fixValue) {
  62. if (context.fix) {
  63. node.next().raws.before = fixValue;
  64. return;
  65. }
  66. _stylelint.utils.report({
  67. result: result,
  68. ruleName: ruleName,
  69. node: node,
  70. message: message,
  71. index: index
  72. });
  73. }
  74. root.walkAtRules(function (atrule) {
  75. // Do nothing if it's not an @if
  76. if (atrule.name !== atRuleName) {
  77. return;
  78. }
  79. var nextNode = atrule.next();
  80. var hasSpaceAfter = nextNode && nextNode.raws.before === " ";
  81. var hasWhiteSpaceAfter = nextNode && nextNode.raws.before !== "";
  82. var reportIndex = atrule.toString().length;
  83. // When followed by an @else
  84. if (nextNode && nextNode.type === "atrule" && nextNode.name === "else") {
  85. // A single space is needed
  86. if (expectation === "always-intermediate" && !hasSpaceAfter) {
  87. complain(atrule, messages.expected, reportIndex, " ");
  88. } else if (expectation === "never-intermediate" && hasWhiteSpaceAfter) {
  89. // No whitespace is needed
  90. complain(atrule, messages.rejected, reportIndex, "");
  91. }
  92. }
  93. });
  94. }
  95. rule.ruleName = ruleName;
  96. rule.messages = messages;
  97. rule.meta = meta;