UNPKG

2.14 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
7const isStandardSyntaxSelector = require('../../utils/isStandardSyntaxSelector');
8const keywordSets = require('../../reference/keywordSets');
9const optionsMatches = require('../../utils/optionsMatches');
10const parseSelector = require('../../utils/parseSelector');
11const postcss = require('postcss');
12const report = require('../../utils/report');
13const ruleMessages = require('../../utils/ruleMessages');
14const validateOptions = require('../../utils/validateOptions');
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((rule) => {
42 if (!isStandardSyntaxRule(rule)) {
43 return;
44 }
45
46 const selector = rule.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, rule, (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 (postcss.vendor.prefix(name) || keywordSets.pseudoElements.has(name.toLowerCase())) {
74 return;
75 }
76
77 report({
78 message: messages.rejected(value),
79 node: rule,
80 index: pseudoNode.sourceIndex,
81 ruleName,
82 result,
83 });
84 });
85 });
86 });
87 };
88}
89
90rule.ruleName = ruleName;
91rule.messages = messages;
92module.exports = rule;