UNPKG

1.82 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const report = require('../../utils/report');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9
10const ruleName = 'selector-max-empty-lines';
11
12const messages = ruleMessages(ruleName, {
13 expected: (max) => `Expected no more than ${max} empty ${max === 1 ? 'line' : 'lines'}`,
14});
15
16function rule(max, options, context) {
17 const maxAdjacentNewlines = max + 1;
18
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: max,
22 possible: _.isNumber,
23 });
24
25 if (!validOptions) {
26 return;
27 }
28
29 const violatedCRLFNewLinesRegex = new RegExp(`(?:\r\n){${maxAdjacentNewlines + 1},}`);
30 const violatedLFNewLinesRegex = new RegExp(`\n{${maxAdjacentNewlines + 1},}`);
31 const allowedLFNewLinesString = context.fix ? '\n'.repeat(maxAdjacentNewlines) : '';
32 const allowedCRLFNewLinesString = context.fix ? '\r\n'.repeat(maxAdjacentNewlines) : '';
33
34 root.walkRules((rule) => {
35 const selector = rule.raws.selector ? rule.raws.selector.raw : rule.selector;
36
37 if (context.fix) {
38 const newSelectorString = selector
39 .replace(new RegExp(violatedLFNewLinesRegex, 'gm'), allowedLFNewLinesString)
40 .replace(new RegExp(violatedCRLFNewLinesRegex, 'gm'), allowedCRLFNewLinesString);
41
42 if (rule.raws.selector) {
43 rule.raws.selector.raw = newSelectorString;
44 } else {
45 rule.selector = newSelectorString;
46 }
47 } else if (
48 violatedLFNewLinesRegex.test(selector) ||
49 violatedCRLFNewLinesRegex.test(selector)
50 ) {
51 report({
52 message: messages.expected(max),
53 node: rule,
54 index: 0,
55 result,
56 ruleName,
57 });
58 }
59 });
60 };
61}
62
63rule.ruleName = ruleName;
64rule.messages = messages;
65module.exports = rule;