UNPKG

1.59 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const functionArgumentsSearch = require('../../utils/functionArgumentsSearch');
5const getSchemeFromUrl = require('../../utils/getSchemeFromUrl');
6const isStandardSyntaxUrl = require('../../utils/isStandardSyntaxUrl');
7const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
8const report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const validateOptions = require('../../utils/validateOptions');
11
12const ruleName = 'function-url-scheme-blacklist';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (scheme) => `Unexpected URL scheme "${scheme}:"`,
16});
17
18function rule(blacklist) {
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: blacklist,
22 possible: [_.isString, _.isRegExp],
23 });
24
25 if (!validOptions) {
26 return;
27 }
28
29 root.walkDecls((decl) => {
30 functionArgumentsSearch(decl.toString().toLowerCase(), 'url', (args, index) => {
31 const unspacedUrlString = _.trim(args, ' ');
32
33 if (!isStandardSyntaxUrl(unspacedUrlString)) {
34 return;
35 }
36
37 const urlString = _.trim(unspacedUrlString, '\'"');
38 const scheme = getSchemeFromUrl(urlString);
39
40 if (scheme === null) {
41 return;
42 }
43
44 if (!matchesStringOrRegExp(scheme, blacklist)) {
45 return;
46 }
47
48 report({
49 message: messages.rejected(scheme),
50 node: decl,
51 index,
52 result,
53 ruleName,
54 });
55 });
56 });
57 };
58}
59
60rule.primaryOptionArray = true;
61
62rule.ruleName = ruleName;
63rule.messages = messages;
64module.exports = rule;