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");
14 const ruleName = "unit-no-unknown";
16 const messages = ruleMessages(ruleName, {
17 rejected: unit => `Unexpected unknown unit "${unit}"`
20 const rule = function(actual, options) {
21 return (root, result) => {
22 const validOptions = validateOptions(
29 ignoreUnits: [_.isString]
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
46 valueNode.type === "function" &&
47 valueNode.value.toLowerCase() === "url"
52 const unit = getUnitFromValueNode(valueNode);
57 if (optionsMatches(options, "ignoreUnits", unit)) {
61 if (keywordSets.units.has(unit.toLowerCase())) {
66 index: getIndex(node) + valueNode.sourceIndex,
67 message: messages.rejected(unit),
75 root.walkAtRules(/^media$/i, atRule =>
76 check(atRule, atRule.params, atRuleParamIndex)
78 root.walkDecls(decl => check(decl, decl.value, declarationValueIndex));
82 rule.ruleName = ruleName;
83 rule.messages = messages;
84 module.exports = rule;