UNPKG

2.04 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 report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const transformSelector = require('../../utils/transformSelector');
11const validateOptions = require('../../utils/validateOptions');
12
13const ruleName = 'selector-pseudo-element-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 transformSelector(result, rule, (selectorTree) => {
42 selectorTree.walkPseudos((pseudoNode) => {
43 const pseudoElement = pseudoNode.value;
44
45 if (!isStandardSyntaxSelector(pseudoElement)) {
46 return;
47 }
48
49 if (
50 !pseudoElement.includes('::') &&
51 !keywordSets.levelOneAndTwoPseudoElements.has(pseudoElement.toLowerCase().slice(1))
52 ) {
53 return;
54 }
55
56 const expectedPseudoElement =
57 expectation === 'lower' ? pseudoElement.toLowerCase() : pseudoElement.toUpperCase();
58
59 if (pseudoElement === expectedPseudoElement) {
60 return;
61 }
62
63 if (context.fix) {
64 pseudoNode.value = expectedPseudoElement;
65
66 return;
67 }
68
69 report({
70 message: messages.expected(pseudoElement, expectedPseudoElement),
71 node: rule,
72 index: pseudoNode.sourceIndex,
73 ruleName,
74 result,
75 });
76 });
77 });
78 });
79 };
80}
81
82rule.ruleName = ruleName;
83rule.messages = messages;
84module.exports = rule;