3 const atRuleParamIndex = require("../../utils/atRuleParamIndex");
4 const declarationValueIndex = require("../../utils/declarationValueIndex");
5 const getUnitFromValueNode = require("../../utils/getUnitFromValueNode");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const validateOptions = require("../../utils/validateOptions");
9 const valueParser = require("postcss-value-parser");
11 const ruleName = "unit-case";
13 const messages = ruleMessages(ruleName, {
14 expected: (actual, expected) => `Expected "${actual}" to be "${expected}"`
17 const rule = function(expectation) {
18 return (root, result) => {
19 const validOptions = validateOptions(result, ruleName, {
21 possible: ["lower", "upper"]
27 function check(node, value, getIndex) {
28 // make sure multiplication operations (*) are divided - not handled
29 // by postcss-value-parser
30 value = value.replace(/\*/g, ",");
31 valueParser(value).walk(valueNode => {
32 // Ignore wrong units within `url` function
34 valueNode.type === "function" &&
35 valueNode.value.toLowerCase() === "url"
40 const unit = getUnitFromValueNode(valueNode);
47 expectation === "lower" ? unit.toLowerCase() : unit.toUpperCase();
49 if (unit === expectedUnit) {
54 index: getIndex(node) + valueNode.sourceIndex,
55 message: messages.expected(unit, expectedUnit),
63 root.walkAtRules(/^media$/i, atRule =>
64 check(atRule, atRule.params, atRuleParamIndex)
66 root.walkDecls(decl => check(decl, decl.value, declarationValueIndex));
70 rule.ruleName = ruleName;
71 rule.messages = messages;
72 module.exports = rule;