UNPKG

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