An error occurred while loading the file. Please try again.
linebreak-style.js 3.40 KiB
/**
 * @fileoverview Rule to enforce a single linebreak style.
 * @author Erik Mueller
 */
"use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const astUtils = require("./utils/ast-utils");
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
    meta: {
        type: "layout",
        docs: {
            description: "enforce consistent linebreak style",
            category: "Stylistic Issues",
            recommended: false,
            url: "https://eslint.org/docs/rules/linebreak-style"
        fixable: "whitespace",
        schema: [
                enum: ["unix", "windows"]
        messages: {
            expectedLF: "Expected linebreaks to be 'LF' but found 'CRLF'.",
            expectedCRLF: "Expected linebreaks to be 'CRLF' but found 'LF'."
    create(context) {
        const sourceCode = context.getSourceCode();
        //--------------------------------------------------------------------------
        // Helpers
        //--------------------------------------------------------------------------
        /**
         * Builds a fix function that replaces text at the specified range in the source text.
         * @param {int[]} range The range to replace
         * @param {string} text The text to insert.
         * @returns {Function} Fixer function
         * @private
        function createFix(range, text) {
            return function(fixer) {
                return fixer.replaceTextRange(range, text);
        //--------------------------------------------------------------------------
        // Public
        //--------------------------------------------------------------------------
        return {
            Program: function checkForLinebreakStyle(node) {
                const linebreakStyle = context.options[0] || "unix",
                    expectedLF = linebreakStyle === "unix",
                    expectedLFChars = expectedLF ? "\n" : "\r\n",
source = sourceCode.getText(), pattern = astUtils.createGlobalLinebreakMatcher(); let match; let i = 0; while ((match = pattern.exec(source)) !== null) { i++; if (match[0] === expectedLFChars) { continue; } const index = match.index; const range = [index, index + match[0].length]; context.report({ node, loc: { start: { line: i, column: sourceCode.lines[i - 1].length }, end: { line: i + 1, column: 0 } }, messageId: expectedLF ? "expectedLF" : "expectedCRLF", fix: createFix(range, expectedLFChars) }); } } }; } };