.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / selector-pseudo-element-case / index.js
1 "use strict";
2
3 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
4 const isStandardSyntaxSelector = require("../../utils/isStandardSyntaxSelector");
5 const keywordSets = require("../../reference/keywordSets");
6 const parseSelector = require("../../utils/parseSelector");
7 const report = require("../../utils/report");
8 const ruleMessages = require("../../utils/ruleMessages");
9 const validateOptions = require("../../utils/validateOptions");
10
11 const ruleName = "selector-pseudo-element-case";
12
13 const messages = ruleMessages(ruleName, {
14   expected: (actual, expected) => `Expected "${actual}" to be "${expected}"`
15 });
16
17 const rule = function(expectation) {
18   return (root, result) => {
19     const validOptions = validateOptions(result, ruleName, {
20       actual: expectation,
21       possible: ["lower", "upper"]
22     });
23     if (!validOptions) {
24       return;
25     }
26
27     root.walkRules(rule => {
28       if (!isStandardSyntaxRule(rule)) {
29         return;
30       }
31       const selector = rule.selector;
32       const startIndexPseudoElement = selector.indexOf(":");
33
34       if (startIndexPseudoElement === -1) {
35         return;
36       }
37
38       parseSelector(selector, result, rule, selectorTree => {
39         selectorTree.walkPseudos(pseudoNode => {
40           const pseudoElement = pseudoNode.value;
41
42           if (!isStandardSyntaxSelector(pseudoElement)) {
43             return;
44           }
45
46           if (
47             pseudoElement.indexOf("::") === -1 &&
48             !keywordSets.levelOneAndTwoPseudoElements.has(
49               pseudoElement.toLowerCase().slice(1)
50             )
51           ) {
52             return;
53           }
54
55           const expectedPseudoElement =
56             expectation === "lower"
57               ? pseudoElement.toLowerCase()
58               : pseudoElement.toUpperCase();
59
60           if (pseudoElement === expectedPseudoElement) {
61             return;
62           }
63
64           report({
65             message: messages.expected(pseudoElement, expectedPseudoElement),
66             node: rule,
67             index: pseudoNode.sourceIndex,
68             ruleName,
69             result
70           });
71         });
72       });
73     });
74   };
75 };
76
77 rule.ruleName = ruleName;
78 rule.messages = messages;
79 module.exports = rule;