UNPKG

2.23 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
6const isStandardSyntaxSelector = require('../../utils/isStandardSyntaxSelector');
7const keywordSets = require('../../reference/keywordSets');
8const parseSelector = require('../../utils/parseSelector');
9const report = require('../../utils/report');
10const ruleMessages = require('../../utils/ruleMessages');
11const validateOptions = require('../../utils/validateOptions');
12
13const ruleName = 'selector-pseudo-class-case';
14
15const messages = ruleMessages(ruleName, {
16 expected: (actual, expected) => `Expected "${actual}" to be "${expected}"`,
17});
18
19function rule(expectation, options, context) {
20 return (root, result) => {
21 const validOptions = validateOptions(result, ruleName, {
22 actual: expectation,
23 possible: ['lower', 'upper'],
24 });
25
26 if (!validOptions) {
27 return;
28 }
29
30 root.walkRules((rule) => {
31 if (!isStandardSyntaxRule(rule)) {
32 return;
33 }
34
35 const selector = rule.selector;
36
37 if (!selector.includes(':')) {
38 return;
39 }
40
41 const fixedSelector = parseSelector(
42 rule.raws.selector ? rule.raws.selector.raw : rule.selector,
43 result,
44 rule,
45 (selectorTree) => {
46 selectorTree.walkPseudos((pseudoNode) => {
47 const pseudo = pseudoNode.value;
48
49 if (!isStandardSyntaxSelector(pseudo)) {
50 return;
51 }
52
53 if (
54 pseudo.includes('::') ||
55 keywordSets.levelOneAndTwoPseudoElements.has(pseudo.toLowerCase().slice(1))
56 ) {
57 return;
58 }
59
60 const expectedPseudo =
61 expectation === 'lower' ? pseudo.toLowerCase() : pseudo.toUpperCase();
62
63 if (pseudo === expectedPseudo) {
64 return;
65 }
66
67 if (context.fix) {
68 pseudoNode.value = expectedPseudo;
69
70 return;
71 }
72
73 report({
74 message: messages.expected(pseudo, expectedPseudo),
75 node: rule,
76 index: pseudoNode.sourceIndex,
77 ruleName,
78 result,
79 });
80 });
81 },
82 );
83
84 if (context.fix) {
85 if (rule.raws.selector) {
86 rule.raws.selector.raw = fixedSelector;
87 } else {
88 rule.selector = fixedSelector;
89 }
90 }
91 });
92 };
93}
94
95rule.ruleName = ruleName;
96rule.messages = messages;
97module.exports = rule;