UNPKG

2.5 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-newline-before';
11
12const messages = ruleMessages(ruleName, {
13 expectedBefore: () => 'Expected newline before ","',
14 expectedBeforeMultiLine: () => 'Expected newline before "," in a multi-line list',
15 rejectedBeforeMultiLine: () => 'Unexpected whitespace before "," in a multi-line list',
16});
17
18function rule(expectation, options, context) {
19 const checker = whitespaceChecker('newline', expectation, messages);
20
21 return (root, result) => {
22 const validOptions = validateOptions(result, ruleName, {
23 actual: expectation,
24 possible: ['always', 'always-multi-line', 'never-multi-line'],
25 });
26
27 if (!validOptions) {
28 return;
29 }
30
31 let fixData;
32
33 selectorListCommaWhitespaceChecker({
34 root,
35 result,
36 locationChecker: checker.beforeAllowingIndentation,
37 checkedRuleName: ruleName,
38 fix: context.fix
39 ? (ruleNode, index) => {
40 fixData = fixData || new Map();
41 const commaIndices = fixData.get(ruleNode) || [];
42
43 commaIndices.push(index);
44 fixData.set(ruleNode, commaIndices);
45
46 return true;
47 }
48 : null,
49 });
50
51 if (fixData) {
52 fixData.forEach((commaIndices, ruleNode) => {
53 let selector = ruleNode.raws.selector ? ruleNode.raws.selector.raw : ruleNode.selector;
54
55 commaIndices
56 .sort((a, b) => b - a)
57 .forEach((index) => {
58 let beforeSelector = selector.slice(0, index);
59 const afterSelector = selector.slice(index);
60
61 if (expectation.startsWith('always')) {
62 const spaceIndex = beforeSelector.search(/\s+$/);
63
64 if (spaceIndex >= 0) {
65 beforeSelector =
66 beforeSelector.slice(0, spaceIndex) +
67 context.newline +
68 beforeSelector.slice(spaceIndex);
69 } else {
70 beforeSelector += context.newline;
71 }
72 } else if (expectation === 'never-multi-line') {
73 beforeSelector = beforeSelector.replace(/\s*$/, '');
74 }
75
76 selector = beforeSelector + afterSelector;
77 });
78
79 if (ruleNode.raws.selector) {
80 ruleNode.raws.selector.raw = selector;
81 } else {
82 ruleNode.selector = selector;
83 }
84 });
85 }
86 };
87}
88
89rule.ruleName = ruleName;
90rule.messages = messages;
91module.exports = rule;