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