UNPKG

1.68 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
5const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
6const parseSelector = require('../../utils/parseSelector');
7const postcss = require('postcss');
8const report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const validateOptions = require('../../utils/validateOptions');
11
12const ruleName = 'selector-pseudo-class-whitelist';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (selector) => `Unexpected pseudo-class "${selector}"`,
16});
17
18function rule(whitelist) {
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: whitelist,
22 possible: [_.isString, _.isRegExp],
23 });
24
25 if (!validOptions) {
26 return;
27 }
28
29 root.walkRules((rule) => {
30 if (!isStandardSyntaxRule(rule)) {
31 return;
32 }
33
34 const selector = rule.selector;
35
36 if (!selector.includes(':')) {
37 return;
38 }
39
40 parseSelector(selector, result, rule, (selectorTree) => {
41 selectorTree.walkPseudos((pseudoNode) => {
42 const value = pseudoNode.value;
43
44 // Ignore pseudo-elements
45 if (value.slice(0, 2) === '::') {
46 return;
47 }
48
49 const name = value.slice(1);
50
51 if (matchesStringOrRegExp(postcss.vendor.unprefixed(name), whitelist)) {
52 return;
53 }
54
55 report({
56 index: pseudoNode.sourceIndex,
57 message: messages.rejected(name),
58 node: rule,
59 result,
60 ruleName,
61 });
62 });
63 });
64 });
65 };
66}
67
68rule.primaryOptionArray = true;
69
70rule.ruleName = ruleName;
71rule.messages = messages;
72module.exports = rule;