123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // @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;
|