UNPKG

1.67 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-element-blacklist';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (selector) => `Unexpected pseudo-element "${selector}"`,
16});
17
18function rule(blacklist) {
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: blacklist,
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-classes
45 if (value[1] !== ':') {
46 return;
47 }
48
49 const name = value.slice(2);
50
51 if (!matchesStringOrRegExp(postcss.vendor.unprefixed(name), blacklist)) {
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;