UNPKG

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