UNPKG

1.8 kBJavaScriptView Raw
1'use strict';
2
3const functionArgumentsSearch = require('../../utils/functionArgumentsSearch');
4const getSchemeFromUrl = require('../../utils/getSchemeFromUrl');
5const isStandardSyntaxUrl = require('../../utils/isStandardSyntaxUrl');
6const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
7const report = require('../../utils/report');
8const ruleMessages = require('../../utils/ruleMessages');
9const validateOptions = require('../../utils/validateOptions');
10const { isRegExp, isString } = require('../../utils/validateTypes');
11
12const ruleName = 'function-url-scheme-allowed-list';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (scheme) => `Unexpected URL scheme "${scheme}:"`,
16});
17
18const meta = {
19 url: 'https://stylelint.io/user-guide/rules/list/function-url-scheme-allowed-list',
20};
21
22/** @type {import('stylelint').Rule} */
23const rule = (primary) => {
24 return (root, result) => {
25 const validOptions = validateOptions(result, ruleName, {
26 actual: primary,
27 possible: [isString, isRegExp],
28 });
29
30 if (!validOptions) {
31 return;
32 }
33
34 root.walkDecls((decl) => {
35 functionArgumentsSearch(decl.toString().toLowerCase(), 'url', (args, index) => {
36 const unspacedUrlString = args.trim();
37
38 if (!isStandardSyntaxUrl(unspacedUrlString)) {
39 return;
40 }
41
42 const urlString = unspacedUrlString.replace(/^['"]+|['"]+$/g, '');
43 const scheme = getSchemeFromUrl(urlString);
44
45 if (scheme === null) {
46 return;
47 }
48
49 if (matchesStringOrRegExp(scheme, primary)) {
50 return;
51 }
52
53 report({
54 message: messages.rejected(scheme),
55 node: decl,
56 index,
57 result,
58 ruleName,
59 });
60 });
61 });
62 };
63};
64
65rule.primaryOptionArray = true;
66
67rule.ruleName = ruleName;
68rule.messages = messages;
69rule.meta = meta;
70module.exports = rule;