.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / selector-pseudo-element-colon-notation / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
5 const keywordSets = require("../../reference/keywordSets");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const styleSearch = require("style-search");
9 const validateOptions = require("../../utils/validateOptions");
10
11 const ruleName = "selector-pseudo-element-colon-notation";
12
13 const messages = ruleMessages(ruleName, {
14   expected: q => `Expected ${q} colon pseudo-element notation`
15 });
16
17 const rule = function(expectation) {
18   return (root, result) => {
19     const validOptions = validateOptions(result, ruleName, {
20       actual: expectation,
21       possible: ["single", "double"]
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
33       // get out early if no pseudo elements or classes
34       if (selector.indexOf(":") === -1) {
35         return;
36       }
37
38       // match only level 1 and 2 pseudo elements
39       const pseudoElementsWithColons = _.toArray(
40         keywordSets.levelOneAndTwoPseudoElements
41       ).map(x => `:${x}`);
42       styleSearch(
43         { source: selector.toLowerCase(), target: pseudoElementsWithColons },
44         match => {
45           const prevCharIsColon = selector[match.startIndex - 1] === ":";
46
47           if (expectation === "single" && !prevCharIsColon) {
48             return;
49           }
50           if (expectation === "double" && prevCharIsColon) {
51             return;
52           }
53
54           report({
55             message: messages.expected(expectation),
56             node: rule,
57             index: match.startIndex,
58             result,
59             ruleName
60           });
61         }
62       );
63     });
64   };
65 };
66
67 rule.ruleName = ruleName;
68 rule.messages = messages;
69 module.exports = rule;