.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / declaration-block-trailing-semicolon / index.js
1 "use strict";
2
3 const hasBlock = require("../../utils/hasBlock");
4 const report = require("../../utils/report");
5 const ruleMessages = require("../../utils/ruleMessages");
6 const validateOptions = require("../../utils/validateOptions");
7
8 const ruleName = "declaration-block-trailing-semicolon";
9
10 const messages = ruleMessages(ruleName, {
11   expected: "Expected a trailing semicolon",
12   rejected: "Unexpected trailing semicolon"
13 });
14
15 const rule = function(expectation) {
16   return (root, result) => {
17     const validOptions = validateOptions(result, ruleName, {
18       actual: expectation,
19       possible: ["always", "never"]
20     });
21     if (!validOptions) {
22       return;
23     }
24
25     root.walkAtRules(atRule => {
26       if (atRule.parent === root) {
27         return;
28       }
29       if (atRule !== atRule.parent.last) {
30         return;
31       }
32       if (hasBlock(atRule)) {
33         return;
34       }
35       checkLastNode(atRule);
36     });
37
38     root.walkDecls(decl => {
39       if (decl !== decl.parent.last) {
40         return;
41       }
42       checkLastNode(decl);
43     });
44
45     function checkLastNode(node) {
46       let message;
47
48       if (expectation === "always") {
49         if (node.parent.raws.semicolon) {
50           return;
51         }
52         message = messages.expected;
53       }
54       if (expectation === "never") {
55         if (!node.parent.raws.semicolon) {
56           return;
57         }
58         message = messages.rejected;
59       }
60
61       report({
62         message,
63         node,
64         index: node.toString().trim().length - 1,
65         result,
66         ruleName
67       });
68     }
69   };
70 };
71
72 rule.ruleName = ruleName;
73 rule.messages = messages;
74 module.exports = rule;