UNPKG

1.9 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const declarationValueIndex = require('../../utils/declarationValueIndex');
7const getUnitFromValueNode = require('../../utils/getUnitFromValueNode');
8const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
9const report = require('../../utils/report');
10const ruleMessages = require('../../utils/ruleMessages');
11const validateOptions = require('../../utils/validateOptions');
12const valueParser = require('postcss-value-parser');
13const vendor = require('../../utils/vendor');
14
15const ruleName = 'declaration-property-unit-allowed-list';
16
17const messages = ruleMessages(ruleName, {
18 rejected: (property, unit) => `Unexpected unit "${unit}" for property "${property}"`,
19});
20
21function rule(list) {
22 return (root, result) => {
23 const validOptions = validateOptions(result, ruleName, {
24 actual: list,
25 possible: [_.isObject],
26 });
27
28 if (!validOptions) {
29 return;
30 }
31
32 root.walkDecls((decl) => {
33 const prop = decl.prop;
34 const value = decl.value;
35
36 const unprefixedProp = vendor.unprefixed(prop);
37
38 const propList = _.find(list, (units, propIdentifier) =>
39 matchesStringOrRegExp(unprefixedProp, propIdentifier),
40 );
41
42 if (!propList) {
43 return;
44 }
45
46 valueParser(value).walk((node) => {
47 // Ignore wrong units within `url` function
48 if (node.type === 'function' && node.value.toLowerCase() === 'url') {
49 return false;
50 }
51
52 if (node.type === 'string') {
53 return;
54 }
55
56 const unit = getUnitFromValueNode(node);
57
58 if (!unit || (unit && propList.indexOf(unit.toLowerCase())) !== -1) {
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
74rule.ruleName = ruleName;
75rule.messages = messages;
76module.exports = rule;