.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / selector-pseudo-element-no-unknown / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
5 const isStandardSyntaxSelector = require("../../utils/isStandardSyntaxSelector");
6 const keywordSets = require("../../reference/keywordSets");
7 const optionsMatches = require("../../utils/optionsMatches");
8 const parseSelector = require("../../utils/parseSelector");
9 const postcss = require("postcss");
10 const report = require("../../utils/report");
11 const ruleMessages = require("../../utils/ruleMessages");
12 const validateOptions = require("../../utils/validateOptions");
13
14 const ruleName = "selector-pseudo-element-no-unknown";
15
16 const messages = ruleMessages(ruleName, {
17   rejected: selector =>
18     `Unexpected unknown pseudo-element selector "${selector}"`
19 });
20
21 const rule = function(actual, options) {
22   return (root, result) => {
23     const validOptions = validateOptions(
24       result,
25       ruleName,
26       { actual },
27       {
28         actual: options,
29         possible: {
30           ignorePseudoElements: [_.isString]
31         },
32         optional: true
33       }
34     );
35     if (!validOptions) {
36       return;
37     }
38
39     root.walkRules(rule => {
40       if (!isStandardSyntaxRule(rule)) {
41         return;
42       }
43       const selector = rule.selector;
44
45       // Return early before parse if no pseudos for performance
46
47       if (selector.indexOf(":") === -1) {
48         return;
49       }
50
51       parseSelector(selector, result, rule, selectorTree => {
52         selectorTree.walkPseudos(pseudoNode => {
53           const value = pseudoNode.value;
54
55           if (!isStandardSyntaxSelector(value)) {
56             return;
57           }
58
59           // Ignore pseudo-classes
60           if (value.slice(0, 2) !== "::") {
61             return;
62           }
63
64           if (
65             optionsMatches(
66               options,
67               "ignorePseudoElements",
68               pseudoNode.value.slice(2)
69             )
70           ) {
71             return;
72           }
73
74           const name = value.slice(2);
75
76           if (
77             postcss.vendor.prefix(name) ||
78             keywordSets.pseudoElements.has(name.toLowerCase())
79           ) {
80             return;
81           }
82
83           report({
84             message: messages.rejected(value),
85             node: rule,
86             index: pseudoNode.sourceIndex,
87             ruleName,
88             result
89           });
90         });
91       });
92     });
93   };
94 };
95
96 rule.ruleName = ruleName;
97 rule.messages = messages;
98 module.exports = rule;