UNPKG

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