stylelint
Version:
A mighty, modern CSS linter.
120 lines (97 loc) • 3.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.messages = exports.ruleName = undefined;
var _utils = require("../../utils");
var _postcssResolveNestedSelector = require("postcss-resolve-nested-selector");
var _postcssResolveNestedSelector2 = _interopRequireDefault(_postcssResolveNestedSelector);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ruleName = exports.ruleName = "selector-no-qualifying-type";
var messages = exports.messages = (0, _utils.ruleMessages)(ruleName, {
rejected: "Unexpected qualifying type selector"
});
var selectorCharacters = ["#", ".", "["];
function isSelectorCharacters(value) {
return selectorCharacters.some(function (char) {
return value.indexOf(char) !== -1;
});
}
function getRightNodes(node) {
var result = [];
var rightNode = node;
while (rightNode = rightNode.next()) {
if (rightNode.type === "combinator") {
break;
}
if (rightNode.type !== "id" && rightNode.type !== "class" && rightNode.type !== "attribute") {
continue;
}
result.push(rightNode);
}
return result;
}
exports.default = function (enabled, options) {
return function (root, result) {
var validOptions = (0, _utils.validateOptions)(result, ruleName, {
actual: enabled,
possible: [true, false]
}, {
actual: options,
possible: {
ignore: ["attribute", "class", "id"]
},
optional: true
});
if (!validOptions) {
return;
}
root.walkRules(function (rule) {
if (!(0, _utils.isStandardSyntaxRule)(rule)) {
return;
}
if ((0, _utils.isKeyframeRule)(rule)) {
return;
}
if (!(0, _utils.isStandardSyntaxSelector)(rule.selector)) {
return;
}
if (!isSelectorCharacters(rule.selector)) {
return;
}
function checkSelector(selectorAST) {
selectorAST.walkTags(function (selector) {
var selectorParent = selector.parent;
if (selectorParent.nodes.length === 1) {
return;
}
var selectorNodes = getRightNodes(selector);
var index = selector.sourceIndex;
selectorNodes.forEach(function (selectorNode) {
if (selectorNode.type === "id" && !(0, _utils.optionsMatches)(options, "ignore", "id")) {
complain(index);
}
if (selectorNode.type === "class" && !(0, _utils.optionsMatches)(options, "ignore", "class")) {
complain(index);
}
if (selectorNode.type === "attribute" && !(0, _utils.optionsMatches)(options, "ignore", "attribute")) {
complain(index);
}
});
});
}
(0, _postcssResolveNestedSelector2.default)(rule.selector, rule).forEach(function (resolvedSelector) {
(0, _utils.parseSelector)(resolvedSelector, result, rule, checkSelector);
});
function complain(index) {
(0, _utils.report)({
ruleName: ruleName,
result: result,
node: rule,
message: messages.rejected,
index: index
});
}
});
};
};