This repository has been archived on 2020-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
2020-11-01 22:46:04 +00:00

110 lines
2.4 KiB
JavaScript

// @ts-nocheck
'use strict';
const _ = require('lodash');
const postcss = require('postcss');
const report = require('../../utils/report');
const ruleMessages = require('../../utils/ruleMessages');
const validateOptions = require('../../utils/validateOptions');
const ruleName = 'linebreaks';
const messages = ruleMessages(ruleName, {
expected: (linebreak) => `Expected linebreak to be ${linebreak}`,
});
function rule(actual, secondary, context) {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual,
possible: ['unix', 'windows'],
});
if (!validOptions) {
return;
}
const shouldHaveCR = actual === 'windows';
if (context.fix) {
const propertiesToUpdate = ['selector', 'raws.before', 'raws.after', 'value', 'text'];
root.walk((node) => {
propertiesToUpdate.forEach((property) => {
const fixedData = fixData(_.get(node, property), shouldHaveCR);
_.set(node, property, fixedData);
});
});
root.raws.after = fixData(root.raws.after, shouldHaveCR);
} else {
const lines = root.source.input.css.split('\n');
for (let i = 0; i < lines.length; i++) {
let line = lines[i];
if (i < lines.length - 1 && !line.includes('\r')) {
line += '\n';
}
if (hasError(line, shouldHaveCR)) {
const lineNum = i + 1;
const colNum = line.length;
reportNewlineError(shouldHaveCR, lineNum, colNum, actual, result);
}
}
}
function hasError(dataToCheck, shouldHaveCR) {
const hasNewlineToVerify = /[\r\n]/.test(dataToCheck);
const hasCR = hasNewlineToVerify ? /\r/.test(dataToCheck) : false;
return hasNewlineToVerify && hasCR !== shouldHaveCR;
}
function fixData(data, shouldHaveCR) {
if (data) {
let result = data.replace(/\r/g, '');
if (shouldHaveCR) {
result = result.replace(/\n/g, '\r\n');
}
return result;
}
return data;
}
function createReportNode(line, column) {
// Creating a node manually helps us to point to empty lines.
return postcss.rule({
source: {
start: {
line,
column,
},
},
});
}
function reportNewlineError(shouldHaveCR, lineNum, colNum, actual, result) {
const reportNode = createReportNode(lineNum, colNum);
report({
message: messages.expected(actual),
node: reportNode,
result,
ruleName,
});
}
};
}
rule.ruleName = ruleName;
rule.messages = messages;
module.exports = rule;