.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / block-opening-brace-space-before / index.js
1 "use strict";
2
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");
13
14 const ruleName = "block-opening-brace-space-before";
15
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'
27 });
28
29 const rule = function(expectation, options) {
30   const checker = whitespaceChecker("space", expectation, messages);
31   return (root, result) => {
32     const validOptions = validateOptions(
33       result,
34       ruleName,
35       {
36         actual: expectation,
37         possible: [
38           "always",
39           "never",
40           "always-single-line",
41           "never-single-line",
42           "always-multi-line",
43           "never-multi-line"
44         ]
45       },
46       {
47         actual: options,
48         possible: {
49           ignoreAtRules: [_.isString]
50         },
51         optional: true
52       }
53     );
54     if (!validOptions) {
55       return;
56     }
57
58     // Check both kinds of statements: rules and at-rules
59     root.walkRules(check);
60     root.walkAtRules(check);
61
62     function check(statement) {
63       // Return early if blockless or has an empty block
64       if (!hasBlock(statement) || hasEmptyBlock(statement)) {
65         return;
66       }
67
68       // Return early if at-rule is to be ignored
69       if (optionsMatches(options, "ignoreAtRules", statement.name)) {
70         return;
71       }
72
73       const source = beforeBlockString(statement);
74       const beforeBraceNoRaw = beforeBlockString(statement, {
75         noRawBefore: true
76       });
77
78       let index = beforeBraceNoRaw.length - 1;
79       if (beforeBraceNoRaw[index - 1] === "\r") {
80         index -= 1;
81       }
82
83       checker.before({
84         source,
85         index: source.length,
86         lineCheckStr: blockString(statement),
87         err: m => {
88           report({
89             message: m,
90             node: statement,
91             index,
92             result,
93             ruleName
94           });
95         }
96       });
97     }
98   };
99 };
100
101 rule.ruleName = ruleName;
102 rule.messages = messages;
103 module.exports = rule;