.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / declaration-property-unit-blacklist / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const declarationValueIndex = require("../../utils/declarationValueIndex");
5 const getUnitFromValueNode = require("../../utils/getUnitFromValueNode");
6 const matchesStringOrRegExp = require("../../utils/matchesStringOrRegExp");
7 const postcss = require("postcss");
8 const report = require("../../utils/report");
9 const ruleMessages = require("../../utils/ruleMessages");
10 const validateOptions = require("../../utils/validateOptions");
11 const valueParser = require("postcss-value-parser");
12
13 const ruleName = "declaration-property-unit-blacklist";
14
15 const messages = ruleMessages(ruleName, {
16   rejected: (property, unit) =>
17     `Unexpected unit "${unit}" for property "${property}"`
18 });
19
20 const rule = function(blacklist) {
21   return (root, result) => {
22     const validOptions = validateOptions(result, ruleName, {
23       actual: blacklist,
24       possible: [_.isObject]
25     });
26     if (!validOptions) {
27       return;
28     }
29
30     root.walkDecls(decl => {
31       const prop = decl.prop,
32         value = decl.value;
33
34       const unprefixedProp = postcss.vendor.unprefixed(prop);
35
36       const propBlacklist = _.find(blacklist, (list, propIdentifier) =>
37         matchesStringOrRegExp(unprefixedProp, propIdentifier)
38       );
39
40       if (!propBlacklist) {
41         return;
42       }
43
44       valueParser(value).walk(function(node) {
45         // Ignore wrong units within `url` function
46         if (node.type === "function" && node.value.toLowerCase() === "url") {
47           return false;
48         }
49         if (node.type === "string") {
50           return;
51         }
52
53         const unit = getUnitFromValueNode(node);
54
55         if (
56           !unit ||
57           (unit && propBlacklist.indexOf(unit.toLowerCase()) === -1)
58         ) {
59           return;
60         }
61
62         report({
63           message: messages.rejected(prop, unit),
64           node: decl,
65           index: declarationValueIndex(decl) + node.sourceIndex,
66           result,
67           ruleName
68         });
69       });
70     });
71   };
72 };
73
74 rule.ruleName = ruleName;
75 rule.messages = messages;
76 module.exports = rule;