3 const isKeyframeRule = require("../../utils/isKeyframeRule");
4 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
5 const isStandardSyntaxSelector = require("../../utils/isStandardSyntaxSelector");
6 const optionsMatches = require("../../utils/optionsMatches");
7 const parseSelector = require("../../utils/parseSelector");
8 const report = require("../../utils/report");
9 const resolvedNestedSelector = require("postcss-resolve-nested-selector");
10 const ruleMessages = require("../../utils/ruleMessages");
11 const validateOptions = require("../../utils/validateOptions");
13 const ruleName = "selector-no-qualifying-type";
15 const messages = ruleMessages(ruleName, {
16 rejected: "Unexpected qualifying type selector"
19 const selectorCharacters = ["#", ".", "["];
21 function isSelectorCharacters(value) {
22 return selectorCharacters.some(char => value.indexOf(char) !== -1);
25 function getRightNodes(node) {
29 while ((rightNode = rightNode.next())) {
30 if (rightNode.type === "combinator") {
34 rightNode.type !== "id" &&
35 rightNode.type !== "class" &&
36 rightNode.type !== "attribute"
41 result.push(rightNode);
47 const rule = function(enabled, options) {
48 return (root, result) => {
49 const validOptions = validateOptions(
54 possible: [true, false]
59 ignore: ["attribute", "class", "id"]
68 root.walkRules(rule => {
69 if (!isStandardSyntaxRule(rule)) {
72 if (isKeyframeRule(rule)) {
75 // Increasing performance
76 if (!isStandardSyntaxSelector(rule.selector)) {
79 if (!isSelectorCharacters(rule.selector)) {
83 function checkSelector(selectorAST) {
84 selectorAST.walkTags(selector => {
85 const selectorParent = selector.parent;
87 if (selectorParent.nodes.length === 1) {
91 const selectorNodes = getRightNodes(selector);
92 const index = selector.sourceIndex;
94 selectorNodes.forEach(selectorNode => {
96 selectorNode.type === "id" &&
97 !optionsMatches(options, "ignore", "id")
103 selectorNode.type === "class" &&
104 !optionsMatches(options, "ignore", "class")
110 selectorNode.type === "attribute" &&
111 !optionsMatches(options, "ignore", "attribute")
119 resolvedNestedSelector(rule.selector, rule).forEach(resolvedSelector => {
120 if (!isStandardSyntaxSelector(resolvedSelector)) {
124 parseSelector(resolvedSelector, result, rule, checkSelector);
127 function complain(index) {
132 message: messages.rejected,
140 rule.ruleName = ruleName;
141 rule.messages = messages;
142 module.exports = rule;