UNPKG

1.62 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
7const parseSelector = require('../../utils/parseSelector');
8const report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const validateOptions = require('../../utils/validateOptions');
11
12const ruleName = 'selector-id-pattern';
13
14const messages = ruleMessages(ruleName, {
15 expected: (selectorValue, pattern) =>
16 `Expected ID selector "#${selectorValue}" to match pattern "${pattern}"`,
17});
18
19function rule(pattern) {
20 return (root, result) => {
21 const validOptions = validateOptions(result, ruleName, {
22 actual: pattern,
23 possible: [_.isRegExp, _.isString],
24 });
25
26 if (!validOptions) {
27 return;
28 }
29
30 const normalizedPattern = _.isString(pattern) ? new RegExp(pattern) : pattern;
31
32 // TODO: Issue #4985
33 // eslint-disable-next-line no-shadow
34 root.walkRules((rule) => {
35 if (!isStandardSyntaxRule(rule)) {
36 return;
37 }
38
39 const selector = rule.selector;
40
41 parseSelector(selector, result, rule, (fullSelector) => {
42 fullSelector.walk((selectorNode) => {
43 if (selectorNode.type !== 'id') {
44 return;
45 }
46
47 const value = selectorNode.value;
48 const sourceIndex = selectorNode.sourceIndex;
49
50 if (normalizedPattern.test(value)) {
51 return;
52 }
53
54 report({
55 result,
56 ruleName,
57 message: messages.expected(value, pattern),
58 node: rule,
59 index: sourceIndex,
60 });
61 });
62 });
63 });
64 };
65}
66
67rule.ruleName = ruleName;
68rule.messages = messages;
69module.exports = rule;