-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrule-empty-line-before.js
50 lines (40 loc) · 1.34 KB
/
rule-empty-line-before.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const stylelint = require("stylelint");
const ruleName = "crisp/rule-empty-line-before";
const messages = stylelint.utils.ruleMessages(ruleName, {
expected: "Expected an empty line before the rule",
});
const ruleFunction = (primaryOption, secondaryOptions, context) => {
return (root, result) => {
const validOptions = stylelint.utils.validateOptions(result, ruleName, {
actual: primaryOption,
possible: [true]
});
if (!validOptions) {
return;
}
root.walkRules((rule) => {
// Skip root-level rules and the first child of any rule
if (rule.parent.type === "root" || !rule.prev()) {
return;
}
let previousNode = rule.prev();
// Find the first relevant node (declaration, rule, or comment)
while (previousNode && previousNode.type !== "comment") {
if (previousNode.type === "decl" || previousNode.type === "rule") {
const hasEmptyLineBefore = /(\r?\n\s*\r?\n\s*)/.test(rule.raws.before);
if (!hasEmptyLineBefore) {
stylelint.utils.report({
ruleName,
result,
node: rule,
message: messages.expected
});
}
break;
}
previousNode = previousNode.prev();
}
});
};
};
module.exports = stylelint.createPlugin(ruleName, ruleFunction);