3 const _ = require("lodash");
4 const beforeBlockString = require("../../utils/beforeBlockString");
5 const blockString = require("../../utils/blockString");
6 const hasBlock = require("../../utils/hasBlock");
7 const hasEmptyBlock = require("../../utils/hasEmptyBlock");
8 const optionsMatches = require("../../utils/optionsMatches");
9 const report = require("../../utils/report");
10 const ruleMessages = require("../../utils/ruleMessages");
11 const validateOptions = require("../../utils/validateOptions");
12 const whitespaceChecker = require("../../utils/whitespaceChecker");
14 const ruleName = "block-opening-brace-space-before";
16 const messages = ruleMessages(ruleName, {
17 expectedBefore: () => 'Expected single space before "{"',
18 rejectedBefore: () => 'Unexpected whitespace before "{"',
19 expectedBeforeSingleLine: () =>
20 'Expected single space before "{" of a single-line block',
21 rejectedBeforeSingleLine: () =>
22 'Unexpected whitespace before "{" of a single-line block',
23 expectedBeforeMultiLine: () =>
24 'Expected single space before "{" of a multi-line block',
25 rejectedBeforeMultiLine: () =>
26 'Unexpected whitespace before "{" of a multi-line block'
29 const rule = function(expectation, options) {
30 const checker = whitespaceChecker("space", expectation, messages);
31 return (root, result) => {
32 const validOptions = validateOptions(
49 ignoreAtRules: [_.isString]
58 // Check both kinds of statements: rules and at-rules
59 root.walkRules(check);
60 root.walkAtRules(check);
62 function check(statement) {
63 // Return early if blockless or has an empty block
64 if (!hasBlock(statement) || hasEmptyBlock(statement)) {
68 // Return early if at-rule is to be ignored
69 if (optionsMatches(options, "ignoreAtRules", statement.name)) {
73 const source = beforeBlockString(statement);
74 const beforeBraceNoRaw = beforeBlockString(statement, {
78 let index = beforeBraceNoRaw.length - 1;
79 if (beforeBraceNoRaw[index - 1] === "\r") {
86 lineCheckStr: blockString(statement),
101 rule.ruleName = ruleName;
102 rule.messages = messages;
103 module.exports = rule;