index.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. var _stylelint = require("stylelint");
  8. var _optionsMatches = _interopRequireDefault(require("stylelint/lib/utils/optionsMatches"));
  9. var _utils = require("../../utils");
  10. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
  11. var ruleName = (0, _utils.namespace)("selector-no-redundant-nesting-selector");
  12. exports.ruleName = ruleName;
  13. var messages = _stylelint.utils.ruleMessages(ruleName, {
  14. rejected: "Unnecessary nesting selector (&)"
  15. });
  16. exports.messages = messages;
  17. var meta = {
  18. url: (0, _utils.ruleUrl)(ruleName)
  19. };
  20. exports.meta = meta;
  21. function rule(actual, options) {
  22. return function (root, result) {
  23. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  24. actual: actual
  25. }, {
  26. actual: options,
  27. possible: {
  28. ignoreKeywords: [_utils.isString, _utils.isRegExp]
  29. },
  30. optional: true
  31. });
  32. if (!validOptions) {
  33. return;
  34. }
  35. root.walkRules(/&/, function (rule) {
  36. (0, _utils.parseSelector)(rule.selector, result, rule, function (fullSelector) {
  37. // "Ampersand followed by a combinator followed by non-combinator non-ampersand and not the selector end"
  38. fullSelector.walkNesting(function (node) {
  39. var prev = node.prev();
  40. if (prev || (0, _utils.hasNestedSibling)(node)) {
  41. return;
  42. }
  43. var next = node.next();
  44. if (!next && node.parent.parent.nodes.length > 1) {
  45. return;
  46. }
  47. if (next && next.type !== "combinator") {
  48. return;
  49. }
  50. var nextNext = next ? next.next() : null;
  51. if ((0, _utils.isType)(nextNext, "tag") && (0, _optionsMatches["default"])(options, "ignoreKeywords", nextNext.value.trim()) || (0, _utils.isType)(nextNext, "combinator")) {
  52. return;
  53. }
  54. _stylelint.utils.report({
  55. ruleName: ruleName,
  56. result: result,
  57. node: rule,
  58. message: messages.rejected,
  59. index: node.sourceIndex
  60. });
  61. });
  62. });
  63. });
  64. };
  65. }
  66. rule.ruleName = ruleName;
  67. rule.messages = messages;
  68. rule.meta = meta;