.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / unit-whitelist / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const atRuleParamIndex = require("../../utils/atRuleParamIndex");
5 const declarationValueIndex = require("../../utils/declarationValueIndex");
6 const getUnitFromValueNode = require("../../utils/getUnitFromValueNode");
7 const optionsMatches = require("../../utils/optionsMatches");
8 const report = require("../../utils/report");
9 const ruleMessages = require("../../utils/ruleMessages");
10 const validateObjectWithStringArrayProps = require("../../utils/validateObjectWithStringArrayProps");
11 const validateOptions = require("../../utils/validateOptions");
12 const valueParser = require("postcss-value-parser");
13
14 const ruleName = "unit-whitelist";
15
16 const messages = ruleMessages(ruleName, {
17   rejected: unit => `Unexpected unit "${unit}"`
18 });
19
20 const rule = function(whitelistInput, options) {
21   const whitelist = [].concat(whitelistInput);
22   return (root, result) => {
23     const validOptions = validateOptions(
24       result,
25       ruleName,
26       {
27         actual: whitelist,
28         possible: [_.isString]
29       },
30       {
31         optional: true,
32         actual: options,
33         possible: {
34           ignoreProperties: validateObjectWithStringArrayProps
35         }
36       }
37     );
38     if (!validOptions) {
39       return;
40     }
41
42     function check(node, value, getIndex) {
43       // make sure multiplication operations (*) are divided - not handled
44       // by postcss-value-parser
45       value = value.replace(/\*/g, ",");
46       valueParser(value).walk(function(valueNode) {
47         // Ignore wrong units within `url` function
48         if (
49           valueNode.type === "function" &&
50           valueNode.value.toLowerCase() === "url"
51         ) {
52           return false;
53         }
54
55         const unit = getUnitFromValueNode(valueNode);
56
57         if (!unit || (unit && whitelist.indexOf(unit.toLowerCase()) !== -1)) {
58           return;
59         }
60
61         if (
62           options &&
63           optionsMatches(
64             options["ignoreProperties"],
65             unit.toLowerCase(),
66             node.prop
67           )
68         ) {
69           return;
70         }
71
72         report({
73           index: getIndex(node) + valueNode.sourceIndex,
74           message: messages.rejected(unit),
75           node,
76           result,
77           ruleName
78         });
79       });
80     }
81
82     root.walkAtRules(/^media$/i, atRule =>
83       check(atRule, atRule.params, atRuleParamIndex)
84     );
85     root.walkDecls(decl => check(decl, decl.value, declarationValueIndex));
86   };
87 };
88
89 rule.primaryOptionArray = true;
90
91 rule.ruleName = ruleName;
92 rule.messages = messages;
93 module.exports = rule;