UNPKG

2.31 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const ruleMessages = require('../../utils/ruleMessages');
6const selectorListCommaWhitespaceChecker = require('../selectorListCommaWhitespaceChecker');
7const validateOptions = require('../../utils/validateOptions');
8const whitespaceChecker = require('../../utils/whitespaceChecker');
9
10const ruleName = 'selector-list-comma-space-after';
11
12const messages = ruleMessages(ruleName, {
13 expectedAfter: () => 'Expected single space after ","',
14 rejectedAfter: () => 'Unexpected whitespace after ","',
15 expectedAfterSingleLine: () => 'Expected single space after "," in a single-line list',
16 rejectedAfterSingleLine: () => 'Unexpected whitespace after "," in a single-line list',
17});
18
19function rule(expectation, options, context) {
20 const checker = whitespaceChecker('space', expectation, messages);
21
22 return (root, result) => {
23 const validOptions = validateOptions(result, ruleName, {
24 actual: expectation,
25 possible: ['always', 'never', 'always-single-line', 'never-single-line'],
26 });
27
28 if (!validOptions) {
29 return;
30 }
31
32 let fixData;
33
34 selectorListCommaWhitespaceChecker({
35 root,
36 result,
37 locationChecker: checker.after,
38 checkedRuleName: ruleName,
39 fix: context.fix
40 ? (ruleNode, index) => {
41 fixData = fixData || new Map();
42 const commaIndices = fixData.get(ruleNode) || [];
43
44 commaIndices.push(index);
45 fixData.set(ruleNode, commaIndices);
46
47 return true;
48 }
49 : null,
50 });
51
52 if (fixData) {
53 fixData.forEach((commaIndices, ruleNode) => {
54 let selector = ruleNode.raws.selector ? ruleNode.raws.selector.raw : ruleNode.selector;
55
56 commaIndices
57 .sort((a, b) => b - a)
58 .forEach((index) => {
59 const beforeSelector = selector.slice(0, index + 1);
60 let afterSelector = selector.slice(index + 1);
61
62 if (expectation.startsWith('always')) {
63 afterSelector = afterSelector.replace(/^\s*/, ' ');
64 } else if (expectation.startsWith('never')) {
65 afterSelector = afterSelector.replace(/^\s*/, '');
66 }
67
68 selector = beforeSelector + afterSelector;
69 });
70
71 if (ruleNode.raws.selector) {
72 ruleNode.raws.selector.raw = selector;
73 } else {
74 ruleNode.selector = selector;
75 }
76 });
77 }
78 };
79}
80
81rule.ruleName = ruleName;
82rule.messages = messages;
83module.exports = rule;