UNPKG

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