UNPKG

1.53 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) =>
16 `Expected ID selector "#${selectorValue}" to match specified 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 root.walkRules((rule) => {
33 if (!isStandardSyntaxRule(rule)) {
34 return;
35 }
36
37 const selector = rule.selector;
38
39 parseSelector(selector, result, rule, (fullSelector) => {
40 fullSelector.walk((selectorNode) => {
41 if (selectorNode.type !== 'id') {
42 return;
43 }
44
45 const value = selectorNode.value;
46 const sourceIndex = selectorNode.sourceIndex;
47
48 if (normalizedPattern.test(value)) {
49 return;
50 }
51
52 report({
53 result,
54 ruleName,
55 message: messages.expected(value),
56 node: rule,
57 index: sourceIndex,
58 });
59 });
60 });
61 });
62 };
63}
64
65rule.ruleName = ruleName;
66rule.messages = messages;
67module.exports = rule;