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");
19 const ruleName = "selector-type-no-unknown";
21 const messages = ruleMessages(ruleName, {
22 rejected: selector => `Unexpected unknown type selector "${selector}"`
25 const rule = function(actual, options) {
26 return (root, result) => {
27 const validOptions = validateOptions(
34 ignore: ["custom-elements", "default-namespace"],
35 ignoreNamespaces: [_.isString],
36 ignoreTypes: [_.isString]
45 root.walkRules(rule => {
46 const selector = rule.selector,
47 selectors = rule.selectors;
49 if (!isStandardSyntaxRule(rule)) {
52 if (!isStandardSyntaxSelector(selector)) {
55 if (selectors.some(s => isKeyframeSelector(s))) {
59 parseSelector(selector, result, rule, selectorTree => {
60 selectorTree.walkTags(tagNode => {
61 if (!isStandardSyntaxTypeSelector(tagNode)) {
66 optionsMatches(options, "ignore", "custom-elements") &&
67 isCustomElement(tagNode.value)
73 optionsMatches(options, "ignore", "default-namespace") &&
74 !(typeof tagNode.namespace === "string")
79 if (optionsMatches(options, "ignoreNamespaces", tagNode.namespace)) {
83 if (optionsMatches(options, "ignoreTypes", tagNode.value)) {
87 const tagName = tagNode.value;
88 const tagNameLowerCase = tagName.toLowerCase();
91 htmlTags.indexOf(tagNameLowerCase) !== -1 ||
92 svgTags.indexOf(tagNameLowerCase) !== -1 ||
93 keywordSets.nonStandardHtmlTags.has(tagNameLowerCase) ||
94 mathMLTags.indexOf(tagNameLowerCase) !== -1
100 message: messages.rejected(tagName),
102 index: tagNode.sourceIndex,
112 rule.ruleName = ruleName;
113 rule.messages = messages;
114 module.exports = rule;