stylelint
Version:
A mighty, modern CSS linter.
78 lines (68 loc) • 1.93 kB
JavaScript
"use strict";
const isOnlyWhitespace = require("../../utils/isOnlyWhitespace");
const optionsMatches = require("../../utils/optionsMatches");
const report = require("../../utils/report");
const ruleMessages = require("../../utils/ruleMessages");
const styleSearch = require("style-search");
const validateOptions = require("../../utils/validateOptions");
const ruleName = "no-eol-whitespace";
const messages = ruleMessages(ruleName, {
rejected: "Unexpected whitespace at end of line"
});
const whitespacesToReject = new Set([" ", "\t"]);
const rule = function(on, options) {
return (root, result) => {
const validOptions = validateOptions(
result,
ruleName,
{
actual: on
},
{
optional: true,
actual: options,
possible: {
ignore: ["empty-lines"]
}
}
);
if (!validOptions) {
return;
}
const rootString = root.toString();
styleSearch(
{
source: rootString,
target: ["\n", "\r"],
comments: "check"
},
match => {
// If the character before newline is not whitespace, ignore
if (!whitespacesToReject.has(rootString[match.startIndex - 1])) {
return;
}
if (optionsMatches(options, "ignore", "empty-lines")) {
// If there is only whitespace between the previous newline and
// this newline, ignore
const lineBefore = rootString.substring(
match.startIndex + 1,
rootString.lastIndexOf("\n", match.startIndex - 1)
);
if (isOnlyWhitespace(lineBefore)) {
return;
}
}
report({
message: messages.rejected,
node: root,
index: match.startIndex - 1,
result,
ruleName
});
}
);
};
};
rule.ruleName = ruleName;
rule.messages = messages;
module.exports = rule;