.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / block-closing-brace-space-before / index.js
1 "use strict";
2
3 const blockString = require("../../utils/blockString");
4 const hasBlock = require("../../utils/hasBlock");
5 const hasEmptyBlock = require("../../utils/hasEmptyBlock");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const validateOptions = require("../../utils/validateOptions");
9 const whitespaceChecker = require("../../utils/whitespaceChecker");
10
11 const ruleName = "block-closing-brace-space-before";
12
13 const messages = ruleMessages(ruleName, {
14   expectedBefore: () => 'Expected single space before "}"',
15   rejectedBefore: () => 'Unexpected whitespace before "}"',
16   expectedBeforeSingleLine: () =>
17     'Expected single space before "}" of a single-line block',
18   rejectedBeforeSingleLine: () =>
19     'Unexpected whitespace before "}" of a single-line block',
20   expectedBeforeMultiLine: () =>
21     'Expected single space before "}" of a multi-line block',
22   rejectedBeforeMultiLine: () =>
23     'Unexpected whitespace before "}" of a multi-line block'
24 });
25
26 const rule = function(expectation) {
27   const checker = whitespaceChecker("space", expectation, messages);
28
29   return (root, result) => {
30     const validOptions = validateOptions(result, ruleName, {
31       actual: expectation,
32       possible: [
33         "always",
34         "never",
35         "always-single-line",
36         "never-single-line",
37         "always-multi-line",
38         "never-multi-line"
39       ]
40     });
41     if (!validOptions) {
42       return;
43     }
44
45     // Check both kinds of statement: rules and at-rules
46     root.walkRules(check);
47     root.walkAtRules(check);
48
49     function check(statement) {
50       // Return early if blockless or has empty block
51       if (!hasBlock(statement) || hasEmptyBlock(statement)) {
52         return;
53       }
54
55       const source = blockString(statement);
56       const statementString = statement.toString();
57
58       let index = statementString.length - 2;
59       if (statementString[index - 1] === "\r") {
60         index -= 1;
61       }
62
63       checker.before({
64         source,
65         index: source.length - 1,
66         err: msg => {
67           report({
68             message: msg,
69             node: statement,
70             index,
71             result,
72             ruleName
73           });
74         }
75       });
76     }
77   };
78 };
79
80 rule.ruleName = ruleName;
81 rule.messages = messages;
82 module.exports = rule;