UNPKG

1.77 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 = 'value-list-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.walkDecls((decl) => {
35 const value = decl.raws.value ? decl.raws.value.raw : decl.value;
36
37 if (context.fix) {
38 const newValueString = value
39 .replace(new RegExp(violatedLFNewLinesRegex, 'gm'), allowedLFNewLinesString)
40 .replace(new RegExp(violatedCRLFNewLinesRegex, 'gm'), allowedCRLFNewLinesString);
41
42 if (decl.raws.value) {
43 decl.raws.value.raw = newValueString;
44 } else {
45 decl.value = newValueString;
46 }
47 } else if (violatedLFNewLinesRegex.test(value) || violatedCRLFNewLinesRegex.test(value)) {
48 report({
49 message: messages.expected(max),
50 node: decl,
51 index: 0,
52 result,
53 ruleName,
54 });
55 }
56 });
57 };
58}
59
60rule.ruleName = ruleName;
61rule.messages = messages;
62module.exports = rule;