3 const _ = require("lodash");
4 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
5 const parseSelector = require("../../utils/parseSelector");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const validateOptions = require("../../utils/validateOptions");
10 const ruleName = "selector-attribute-operator-whitelist";
12 const messages = ruleMessages(ruleName, {
13 rejected: operator => `Unexpected operator "${operator}"`
16 const rule = function(whitelistInput) {
17 const whitelist = [].concat(whitelistInput);
18 return (root, result) => {
19 const validOptions = validateOptions(result, ruleName, {
21 possible: [_.isString]
27 root.walkRules(rule => {
28 if (!isStandardSyntaxRule(rule)) {
32 rule.selector.indexOf("[") === -1 ||
33 rule.selector.indexOf("=") === -1
38 parseSelector(rule.selector, result, rule, selectorTree => {
39 selectorTree.walkAttributes(attributeNode => {
40 const operator = attributeNode.operator;
42 if (!operator || (operator && whitelist.indexOf(operator) !== -1)) {
47 message: messages.rejected(operator),
50 attributeNode.sourceIndex + attributeNode.offsetOf("operator"),
60 rule.primaryOptionArray = true;
62 rule.ruleName = ruleName;
63 rule.messages = messages;
64 module.exports = rule;