UNPKG

1.52 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const declarationValueIndex = require('../../utils/declarationValueIndex');
5const isStandardSyntaxFunction = require('../../utils/isStandardSyntaxFunction');
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 = 'function-blacklist';
14
15const messages = ruleMessages(ruleName, {
16 rejected: (name) => `Unexpected function "${name}"`,
17});
18
19function rule(blacklist) {
20 return (root, result) => {
21 const validOptions = validateOptions(result, ruleName, {
22 actual: blacklist,
23 possible: [_.isString, _.isRegExp],
24 });
25
26 if (!validOptions) {
27 return;
28 }
29
30 root.walkDecls((decl) => {
31 const value = decl.value;
32
33 valueParser(value).walk((node) => {
34 if (node.type !== 'function') {
35 return;
36 }
37
38 if (!isStandardSyntaxFunction(node)) {
39 return;
40 }
41
42 if (!matchesStringOrRegExp(postcss.vendor.unprefixed(node.value), blacklist)) {
43 return;
44 }
45
46 report({
47 message: messages.rejected(node.value),
48 node: decl,
49 index: declarationValueIndex(decl) + node.sourceIndex,
50 result,
51 ruleName,
52 });
53 });
54 });
55 };
56}
57
58rule.primaryOptionArray = true;
59
60rule.ruleName = ruleName;
61rule.messages = messages;
62module.exports = rule;