68 lines
2.0 KiB
Plaintext
68 lines
2.0 KiB
Plaintext
import { $ as warnDeprecation, c as hasLinesAndGetLocFromIndex, f as createRule, u as isTextSourceCode } from "../utils.js";
|
|
var eol_last_default = createRule({
|
|
name: "eol-last",
|
|
meta: {
|
|
type: "layout",
|
|
docs: { description: "Require or disallow newline at the end of files" },
|
|
fixable: "whitespace",
|
|
schema: [{
|
|
type: "string",
|
|
enum: [
|
|
"always",
|
|
"never",
|
|
"unix",
|
|
"windows"
|
|
]
|
|
}],
|
|
defaultOptions: ["always"],
|
|
messages: {
|
|
missing: "Newline required at end of file but not found.",
|
|
unexpected: "Newline not allowed at end of file."
|
|
}
|
|
},
|
|
create(context, [mode]) {
|
|
const sourceCode = context.sourceCode;
|
|
if (!isTextSourceCode(sourceCode) || !hasLinesAndGetLocFromIndex(sourceCode)) return {};
|
|
const src = sourceCode.text;
|
|
const LF = "\n";
|
|
const CRLF = `\r${LF}`;
|
|
const endsWithNewline = src.endsWith(LF);
|
|
if (!src.length) return {};
|
|
let appendCRLF = false;
|
|
if (mode === "unix") {
|
|
warnDeprecation("option(\"unix\")", "\"always\" and \"@stylistic/eslint-plugin/rules/linebreak-style\"", "eol-last");
|
|
mode = "always";
|
|
}
|
|
if (mode === "windows") {
|
|
warnDeprecation("option(\"windows\")", "\"always\" and \"@stylistic/eslint-plugin/rules/linebreak-style\"", "eol-last");
|
|
mode = "always";
|
|
appendCRLF = true;
|
|
}
|
|
if (mode === "always" && !endsWithNewline) context.report({
|
|
loc: sourceCode.getLocFromIndex(src.length),
|
|
messageId: "missing",
|
|
fix(fixer) {
|
|
return fixer.insertTextAfterRange([0, src.length], appendCRLF ? CRLF : LF);
|
|
}
|
|
});
|
|
else if (mode === "never" && endsWithNewline) {
|
|
const startLoc = sourceCode.getLocFromIndex(src.length - (src.endsWith(CRLF) ? 2 : 1));
|
|
const endLoc = sourceCode.getLocFromIndex(src.length);
|
|
context.report({
|
|
loc: {
|
|
start: startLoc,
|
|
end: endLoc
|
|
},
|
|
messageId: "unexpected",
|
|
fix(fixer) {
|
|
const start = /(?:\r?\n)+$/u.exec(src).index;
|
|
const end = src.length;
|
|
return fixer.replaceTextRange([start, end], "");
|
|
}
|
|
});
|
|
}
|
|
return {};
|
|
}
|
|
});
|
|
export { eol_last_default as t };
|