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");
14 const ruleName = "unit-whitelist";
16 const messages = ruleMessages(ruleName, {
17 rejected: unit => `Unexpected unit "${unit}"`
20 const rule = function(whitelistInput, options) {
21 const whitelist = [].concat(whitelistInput);
22 return (root, result) => {
23 const validOptions = validateOptions(
28 possible: [_.isString]
34 ignoreProperties: validateObjectWithStringArrayProps
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
49 valueNode.type === "function" &&
50 valueNode.value.toLowerCase() === "url"
55 const unit = getUnitFromValueNode(valueNode);
57 if (!unit || (unit && whitelist.indexOf(unit.toLowerCase()) !== -1)) {
64 options["ignoreProperties"],
73 index: getIndex(node) + valueNode.sourceIndex,
74 message: messages.rejected(unit),
82 root.walkAtRules(/^media$/i, atRule =>
83 check(atRule, atRule.params, atRuleParamIndex)
85 root.walkDecls(decl => check(decl, decl.value, declarationValueIndex));
89 rule.primaryOptionArray = true;
91 rule.ruleName = ruleName;
92 rule.messages = messages;
93 module.exports = rule;