|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // @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));
-
- _.set(node, property, fixedData);
- });
- });
-
- root.raws.after = fixData(root.raws.after);
- } 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)) {
- const lineNum = i + 1;
- const colNum = line.length;
-
- reportNewlineError(lineNum, colNum);
- }
- }
- }
-
- function hasError(dataToCheck) {
- const hasNewlineToVerify = /[\r\n]/.test(dataToCheck);
- const hasCR = hasNewlineToVerify ? /\r/.test(dataToCheck) : false;
-
- return hasNewlineToVerify && hasCR !== shouldHaveCR;
- }
-
- function fixData(data) {
- if (data) {
- let res = data.replace(/\r/g, '');
-
- if (shouldHaveCR) {
- res = res.replace(/\n/g, '\r\n');
- }
-
- return res;
- }
-
- return data;
- }
-
- function reportNewlineError(line, column) {
- // Creating a node manually helps us to point to empty lines.
- const node = postcss.rule({
- source: {
- start: { line, column },
- },
- });
-
- report({
- message: messages.expected(actual),
- node,
- result,
- ruleName,
- });
- }
- };
- }
-
- rule.ruleName = ruleName;
- rule.messages = messages;
- module.exports = rule;
|