.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / selector-type-no-unknown / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const htmlTags = require("html-tags");
5 const isCustomElement = require("../../utils/isCustomElement");
6 const isKeyframeSelector = require("../../utils/isKeyframeSelector");
7 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
8 const isStandardSyntaxSelector = require("../../utils/isStandardSyntaxSelector");
9 const isStandardSyntaxTypeSelector = require("../../utils/isStandardSyntaxTypeSelector");
10 const keywordSets = require("../../reference/keywordSets");
11 const mathMLTags = require("mathml-tag-names");
12 const optionsMatches = require("../../utils/optionsMatches");
13 const parseSelector = require("../../utils/parseSelector");
14 const report = require("../../utils/report");
15 const ruleMessages = require("../../utils/ruleMessages");
16 const svgTags = require("svg-tags");
17 const validateOptions = require("../../utils/validateOptions");
18
19 const ruleName = "selector-type-no-unknown";
20
21 const messages = ruleMessages(ruleName, {
22   rejected: selector => `Unexpected unknown type selector "${selector}"`
23 });
24
25 const rule = function(actual, options) {
26   return (root, result) => {
27     const validOptions = validateOptions(
28       result,
29       ruleName,
30       { actual },
31       {
32         actual: options,
33         possible: {
34           ignore: ["custom-elements", "default-namespace"],
35           ignoreNamespaces: [_.isString],
36           ignoreTypes: [_.isString]
37         },
38         optional: true
39       }
40     );
41     if (!validOptions) {
42       return;
43     }
44
45     root.walkRules(rule => {
46       const selector = rule.selector,
47         selectors = rule.selectors;
48
49       if (!isStandardSyntaxRule(rule)) {
50         return;
51       }
52       if (!isStandardSyntaxSelector(selector)) {
53         return;
54       }
55       if (selectors.some(s => isKeyframeSelector(s))) {
56         return;
57       }
58
59       parseSelector(selector, result, rule, selectorTree => {
60         selectorTree.walkTags(tagNode => {
61           if (!isStandardSyntaxTypeSelector(tagNode)) {
62             return;
63           }
64
65           if (
66             optionsMatches(options, "ignore", "custom-elements") &&
67             isCustomElement(tagNode.value)
68           ) {
69             return;
70           }
71
72           if (
73             optionsMatches(options, "ignore", "default-namespace") &&
74             !(typeof tagNode.namespace === "string")
75           ) {
76             return;
77           }
78
79           if (optionsMatches(options, "ignoreNamespaces", tagNode.namespace)) {
80             return;
81           }
82
83           if (optionsMatches(options, "ignoreTypes", tagNode.value)) {
84             return;
85           }
86
87           const tagName = tagNode.value;
88           const tagNameLowerCase = tagName.toLowerCase();
89
90           if (
91             htmlTags.indexOf(tagNameLowerCase) !== -1 ||
92             svgTags.indexOf(tagNameLowerCase) !== -1 ||
93             keywordSets.nonStandardHtmlTags.has(tagNameLowerCase) ||
94             mathMLTags.indexOf(tagNameLowerCase) !== -1
95           ) {
96             return;
97           }
98
99           report({
100             message: messages.rejected(tagName),
101             node: rule,
102             index: tagNode.sourceIndex,
103             ruleName,
104             result
105           });
106         });
107       });
108     });
109   };
110 };
111
112 rule.ruleName = ruleName;
113 rule.messages = messages;
114 module.exports = rule;