| /** |
| * @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: { |
| line: i, |
| column: sourceCode.lines[i - 1].length |
| }, |
| messageId: expectedLF ? "expectedLF" : "expectedCRLF", |
| fix: createFix(range, expectedLFChars) |
| }); |
| } |
| } |
| }; |
| } |
| }; |