diff options
Diffstat (limited to 'assets/node_modules/stylelint/lib/rules/selector-type-no-unknown/index.js')
-rw-r--r-- | assets/node_modules/stylelint/lib/rules/selector-type-no-unknown/index.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/assets/node_modules/stylelint/lib/rules/selector-type-no-unknown/index.js b/assets/node_modules/stylelint/lib/rules/selector-type-no-unknown/index.js new file mode 100644 index 0000000..31df041 --- /dev/null +++ b/assets/node_modules/stylelint/lib/rules/selector-type-no-unknown/index.js @@ -0,0 +1,113 @@ +'use strict'; + +const _ = require('lodash'); +const htmlTags = require('html-tags'); +const isCustomElement = require('../../utils/isCustomElement'); +const isKeyframeSelector = require('../../utils/isKeyframeSelector'); +const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); +const isStandardSyntaxTypeSelector = require('../../utils/isStandardSyntaxTypeSelector'); +const keywordSets = require('../../reference/keywordSets'); +const mathMLTags = require('mathml-tag-names'); +const optionsMatches = require('../../utils/optionsMatches'); +const parseSelector = require('../../utils/parseSelector'); +const report = require('../../utils/report'); +const ruleMessages = require('../../utils/ruleMessages'); +const svgTags = require('svg-tags'); +const validateOptions = require('../../utils/validateOptions'); + +const ruleName = 'selector-type-no-unknown'; + +const messages = ruleMessages(ruleName, { + rejected: (selector) => `Unexpected unknown type selector "${selector}"`, +}); + +function rule(actual, options) { + return (root, result) => { + const validOptions = validateOptions( + result, + ruleName, + { actual }, + { + actual: options, + possible: { + ignore: ['custom-elements', 'default-namespace'], + ignoreNamespaces: [_.isString, _.isRegExp], + ignoreTypes: [_.isString, _.isRegExp], + }, + optional: true, + }, + ); + + if (!validOptions) { + return; + } + + root.walkRules((rule) => { + const selector = rule.selector; + const selectors = rule.selectors; + + if (!isStandardSyntaxRule(rule)) { + return; + } + + if (selectors.some((s) => isKeyframeSelector(s))) { + return; + } + + parseSelector(selector, result, rule, (selectorTree) => { + selectorTree.walkTags((tagNode) => { + if (!isStandardSyntaxTypeSelector(tagNode)) { + return; + } + + if ( + optionsMatches(options, 'ignore', 'custom-elements') && + isCustomElement(tagNode.value) + ) { + return; + } + + if ( + optionsMatches(options, 'ignore', 'default-namespace') && + !(typeof tagNode.namespace === 'string') + ) { + return; + } + + if (optionsMatches(options, 'ignoreNamespaces', tagNode.namespace)) { + return; + } + + if (optionsMatches(options, 'ignoreTypes', tagNode.value)) { + return; + } + + const tagName = tagNode.value; + const tagNameLowerCase = tagName.toLowerCase(); + + if ( + htmlTags.includes(tagNameLowerCase) || + // SVG tags are case-sensitive + svgTags.includes(tagName) || + keywordSets.nonStandardHtmlTags.has(tagNameLowerCase) || + mathMLTags.includes(tagNameLowerCase) + ) { + return; + } + + report({ + message: messages.rejected(tagName), + node: rule, + index: tagNode.sourceIndex, + ruleName, + result, + }); + }); + }); + }); + }; +} + +rule.ruleName = ruleName; +rule.messages = messages; +module.exports = rule; |