UNPKG

1.91 kBJavaScriptView Raw
1'use strict';
2
3const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
4const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
5const parseSelector = require('../../utils/parseSelector');
6const report = require('../../utils/report');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9const vendor = require('../../utils/vendor');
10const { isRegExp, isString } = require('../../utils/validateTypes');
11
12const ruleName = 'selector-pseudo-class-disallowed-list';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (selector) => `Unexpected pseudo-class "${selector}"`,
16});
17
18const meta = {
19 url: 'https://stylelint.io/user-guide/rules/list/selector-pseudo-class-disallowed-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.walkRules((ruleNode) => {
35 if (!isStandardSyntaxRule(ruleNode)) {
36 return;
37 }
38
39 const selector = ruleNode.selector;
40
41 if (!selector.includes(':')) {
42 return;
43 }
44
45 parseSelector(selector, result, ruleNode, (selectorTree) => {
46 selectorTree.walkPseudos((pseudoNode) => {
47 const value = pseudoNode.value;
48
49 // Ignore pseudo-elements
50
51 if (value.slice(0, 2) === '::') {
52 return;
53 }
54
55 const name = value.slice(1);
56
57 if (!matchesStringOrRegExp(vendor.unprefixed(name), primary)) {
58 return;
59 }
60
61 report({
62 index: pseudoNode.sourceIndex,
63 message: messages.rejected(name),
64 node: ruleNode,
65 result,
66 ruleName,
67 });
68 });
69 });
70 });
71 };
72};
73
74rule.primaryOptionArray = true;
75
76rule.ruleName = ruleName;
77rule.messages = messages;
78rule.meta = meta;
79module.exports = rule;