UNPKG

1.9 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const declarationValueIndex = require('../../utils/declarationValueIndex');
5const getUnitFromValueNode = require('../../utils/getUnitFromValueNode');
6const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
7const postcss = require('postcss');
8const report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const validateOptions = require('../../utils/validateOptions');
11const valueParser = require('postcss-value-parser');
12
13const ruleName = 'declaration-property-unit-blacklist';
14
15const messages = ruleMessages(ruleName, {
16 rejected: (property, unit) => `Unexpected unit "${unit}" for property "${property}"`,
17});
18
19function rule(blacklist) {
20 return (root, result) => {
21 const validOptions = validateOptions(result, ruleName, {
22 actual: blacklist,
23 possible: [_.isObject],
24 });
25
26 if (!validOptions) {
27 return;
28 }
29
30 root.walkDecls((decl) => {
31 const prop = decl.prop;
32 const 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((node) => {
45 // Ignore wrong units within `url` function
46 if (node.type === 'function' && node.value.toLowerCase() === 'url') {
47 return false;
48 }
49
50 if (node.type === 'string') {
51 return;
52 }
53
54 const unit = getUnitFromValueNode(node);
55
56 if (!unit || (unit && !propBlacklist.includes(unit.toLowerCase()))) {
57 return;
58 }
59
60 report({
61 message: messages.rejected(prop, unit),
62 node: decl,
63 index: declarationValueIndex(decl) + node.sourceIndex,
64 result,
65 ruleName,
66 });
67 });
68 });
69 };
70}
71
72rule.ruleName = ruleName;
73rule.messages = messages;
74module.exports = rule;