.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / selector-no-qualifying-type / index.js
1 "use strict";
2
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");
12
13 const ruleName = "selector-no-qualifying-type";
14
15 const messages = ruleMessages(ruleName, {
16   rejected: "Unexpected qualifying type selector"
17 });
18
19 const selectorCharacters = ["#", ".", "["];
20
21 function isSelectorCharacters(value) {
22   return selectorCharacters.some(char => value.indexOf(char) !== -1);
23 }
24
25 function getRightNodes(node) {
26   const result = [];
27   let rightNode = node;
28
29   while ((rightNode = rightNode.next())) {
30     if (rightNode.type === "combinator") {
31       break;
32     }
33     if (
34       rightNode.type !== "id" &&
35       rightNode.type !== "class" &&
36       rightNode.type !== "attribute"
37     ) {
38       continue;
39     }
40
41     result.push(rightNode);
42   }
43
44   return result;
45 }
46
47 const rule = function(enabled, options) {
48   return (root, result) => {
49     const validOptions = validateOptions(
50       result,
51       ruleName,
52       {
53         actual: enabled,
54         possible: [true, false]
55       },
56       {
57         actual: options,
58         possible: {
59           ignore: ["attribute", "class", "id"]
60         },
61         optional: true
62       }
63     );
64     if (!validOptions) {
65       return;
66     }
67
68     root.walkRules(rule => {
69       if (!isStandardSyntaxRule(rule)) {
70         return;
71       }
72       if (isKeyframeRule(rule)) {
73         return;
74       }
75       // Increasing performance
76       if (!isStandardSyntaxSelector(rule.selector)) {
77         return;
78       }
79       if (!isSelectorCharacters(rule.selector)) {
80         return;
81       }
82
83       function checkSelector(selectorAST) {
84         selectorAST.walkTags(selector => {
85           const selectorParent = selector.parent;
86
87           if (selectorParent.nodes.length === 1) {
88             return;
89           }
90
91           const selectorNodes = getRightNodes(selector);
92           const index = selector.sourceIndex;
93
94           selectorNodes.forEach(selectorNode => {
95             if (
96               selectorNode.type === "id" &&
97               !optionsMatches(options, "ignore", "id")
98             ) {
99               complain(index);
100             }
101
102             if (
103               selectorNode.type === "class" &&
104               !optionsMatches(options, "ignore", "class")
105             ) {
106               complain(index);
107             }
108
109             if (
110               selectorNode.type === "attribute" &&
111               !optionsMatches(options, "ignore", "attribute")
112             ) {
113               complain(index);
114             }
115           });
116         });
117       }
118
119       resolvedNestedSelector(rule.selector, rule).forEach(resolvedSelector => {
120         if (!isStandardSyntaxSelector(resolvedSelector)) {
121           return;
122         }
123
124         parseSelector(resolvedSelector, result, rule, checkSelector);
125       });
126
127       function complain(index) {
128         report({
129           ruleName,
130           result,
131           node: rule,
132           message: messages.rejected,
133           index
134         });
135       }
136     });
137   };
138 };
139
140 rule.ruleName = ruleName;
141 rule.messages = messages;
142 module.exports = rule;