UNPKG

1.92 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const isStandardSyntaxRule = require('../utils/isStandardSyntaxRule');
6const parseSelector = require('../utils/parseSelector');
7const report = require('../utils/report');
8
9module.exports = function (opts) {
10 let hasFixed;
11
12 opts.root.walkRules((rule) => {
13 if (!isStandardSyntaxRule(rule)) {
14 return;
15 }
16
17 hasFixed = false;
18 const selector = rule.raws.selector ? rule.raws.selector.raw : rule.selector;
19
20 const fixedSelector = parseSelector(selector, opts.result, rule, (selectorTree) => {
21 selectorTree.walkCombinators((node) => {
22 // Ignore spaced descendant combinator
23 if (/\s/.test(node.value)) {
24 return;
25 }
26
27 // Check the exist of node in prev of the combinator.
28 // in case some that aren't the first begin with combinators (nesting syntax)
29 if (opts.locationType === 'before' && !node.prev()) {
30 return;
31 }
32
33 const parentParentNode = node.parent && node.parent.parent;
34
35 // Ignore pseudo-classes selector like `.foo:nth-child(2n + 1) {}`
36 if (parentParentNode && parentParentNode.type === 'pseudo') {
37 return;
38 }
39
40 const sourceIndex = node.sourceIndex;
41 const index =
42 node.value.length > 1 && opts.locationType === 'before'
43 ? sourceIndex
44 : sourceIndex + node.value.length - 1;
45
46 check(selector, node, index, rule, sourceIndex);
47 });
48 });
49
50 if (hasFixed) {
51 if (!rule.raws.selector) {
52 rule.selector = fixedSelector;
53 } else {
54 rule.raws.selector.raw = fixedSelector;
55 }
56 }
57 });
58
59 function check(source, combinator, index, node, sourceIndex) {
60 opts.locationChecker({
61 source,
62 index,
63 errTarget: combinator.value,
64 err: (m) => {
65 if (opts.fix && opts.fix(combinator)) {
66 hasFixed = true;
67
68 return;
69 }
70
71 report({
72 message: m,
73 node,
74 index: sourceIndex,
75 result: opts.result,
76 ruleName: opts.checkedRuleName,
77 });
78 },
79 });
80 }
81};