UNPKG

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