3 const blockString = require("../../utils/blockString");
4 const nextNonCommentNode = require("../../utils/nextNonCommentNode");
5 const rawNodeString = require("../../utils/rawNodeString");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const validateOptions = require("../../utils/validateOptions");
9 const whitespaceChecker = require("../../utils/whitespaceChecker");
11 const ruleName = "declaration-block-semicolon-newline-after";
13 const messages = ruleMessages(ruleName, {
14 expectedAfter: () => 'Expected newline after ";"',
15 expectedAfterMultiLine: () =>
16 'Expected newline after ";" in a multi-line declaration block',
17 rejectedAfterMultiLine: () =>
18 'Unexpected newline after ";" in a multi-line declaration block'
21 const rule = function(expectation) {
22 const checker = whitespaceChecker("newline", expectation, messages);
24 return (root, result) => {
25 const validOptions = validateOptions(result, ruleName, {
27 possible: ["always", "always-multi-line", "never-multi-line"]
33 root.walkDecls(decl => {
34 // Ignore last declaration if there's no trailing semicolon
35 const parentRule = decl.parent;
36 if (!parentRule.raws.semicolon && parentRule.last === decl) {
40 const nextNode = decl.next();
45 // Allow end-of-line comment
46 const nodeToCheck = nextNonCommentNode(nextNode);
51 checker.afterOneOnly({
52 source: rawNodeString(nodeToCheck),
54 lineCheckStr: blockString(parentRule),
59 index: decl.toString().length + 1,
69 rule.ruleName = ruleName;
70 rule.messages = messages;
71 module.exports = rule;