UNPKG

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