UNPKG

1.53 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
5const parseSelector = require('../../utils/parseSelector');
6const report = require('../../utils/report');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9
10const ruleName = 'selector-attribute-operator-blacklist';
11
12const messages = ruleMessages(ruleName, {
13 rejected: (operator) => `Unexpected operator "${operator}"`,
14});
15
16function rule(blacklistInput) {
17 const blacklist = [].concat(blacklistInput);
18
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: blacklist,
22 possible: [_.isString],
23 });
24
25 if (!validOptions) {
26 return;
27 }
28
29 root.walkRules((rule) => {
30 if (!isStandardSyntaxRule(rule)) {
31 return;
32 }
33
34 if (!rule.selector.includes('[') || !rule.selector.includes('=')) {
35 return;
36 }
37
38 parseSelector(rule.selector, result, rule, (selectorTree) => {
39 selectorTree.walkAttributes((attributeNode) => {
40 const operator = attributeNode.operator;
41
42 if (!operator || (operator && !blacklist.includes(operator))) {
43 return;
44 }
45
46 report({
47 message: messages.rejected(operator),
48 node: rule,
49 index: attributeNode.sourceIndex + attributeNode.offsetOf('operator'),
50 result,
51 ruleName,
52 });
53 });
54 });
55 });
56 };
57}
58
59rule.primaryOptionArray = true;
60
61rule.ruleName = ruleName;
62rule.messages = messages;
63module.exports = rule;