UNPKG

1.78 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
6const parseSelector = require('../../utils/parseSelector');
7const report = require('../../utils/report');
8const ruleMessages = require('../../utils/ruleMessages');
9const validateOptions = require('../../utils/validateOptions');
10
11const ruleName = 'selector-attribute-quotes';
12
13const messages = ruleMessages(ruleName, {
14 expected: (value) => `Expected quotes around "${value}"`,
15 rejected: (value) => `Unexpected quotes around "${value}"`,
16});
17
18function rule(expectation) {
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: expectation,
22 possible: ['always', 'never'],
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 if (!attributeNode.operator) {
41 return;
42 }
43
44 if (!attributeNode.quoted && expectation === 'always') {
45 complain(
46 messages.expected(attributeNode.value),
47 attributeNode.sourceIndex + attributeNode.offsetOf('value'),
48 );
49 }
50
51 if (attributeNode.quoted && expectation === 'never') {
52 complain(
53 messages.rejected(attributeNode.value),
54 attributeNode.sourceIndex + attributeNode.offsetOf('value'),
55 );
56 }
57 });
58 });
59
60 function complain(message, index) {
61 report({
62 message,
63 index,
64 result,
65 ruleName,
66 node: rule,
67 });
68 }
69 });
70 };
71}
72
73rule.ruleName = ruleName;
74rule.messages = messages;
75module.exports = rule;