.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / unit-case / index.js
1 "use strict";
2
3 const atRuleParamIndex = require("../../utils/atRuleParamIndex");
4 const declarationValueIndex = require("../../utils/declarationValueIndex");
5 const getUnitFromValueNode = require("../../utils/getUnitFromValueNode");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const validateOptions = require("../../utils/validateOptions");
9 const valueParser = require("postcss-value-parser");
10
11 const ruleName = "unit-case";
12
13 const messages = ruleMessages(ruleName, {
14   expected: (actual, expected) => `Expected "${actual}" to be "${expected}"`
15 });
16
17 const rule = function(expectation) {
18   return (root, result) => {
19     const validOptions = validateOptions(result, ruleName, {
20       actual: expectation,
21       possible: ["lower", "upper"]
22     });
23     if (!validOptions) {
24       return;
25     }
26
27     function check(node, value, getIndex) {
28       // make sure multiplication operations (*) are divided - not handled
29       // by postcss-value-parser
30       value = value.replace(/\*/g, ",");
31       valueParser(value).walk(valueNode => {
32         // Ignore wrong units within `url` function
33         if (
34           valueNode.type === "function" &&
35           valueNode.value.toLowerCase() === "url"
36         ) {
37           return false;
38         }
39
40         const unit = getUnitFromValueNode(valueNode);
41
42         if (!unit) {
43           return;
44         }
45
46         const expectedUnit =
47           expectation === "lower" ? unit.toLowerCase() : unit.toUpperCase();
48
49         if (unit === expectedUnit) {
50           return;
51         }
52
53         report({
54           index: getIndex(node) + valueNode.sourceIndex,
55           message: messages.expected(unit, expectedUnit),
56           node,
57           result,
58           ruleName
59         });
60       });
61     }
62
63     root.walkAtRules(/^media$/i, atRule =>
64       check(atRule, atRule.params, atRuleParamIndex)
65     );
66     root.walkDecls(decl => check(decl, decl.value, declarationValueIndex));
67   };
68 };
69
70 rule.ruleName = ruleName;
71 rule.messages = messages;
72 module.exports = rule;