UNPKG

2.19 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');
8const ruleMessages = require('../../utils/ruleMessages');
9const validateOptions = require('../../utils/validateOptions');
10
11const ruleName = 'selector-descendant-combinator-no-non-space';
12
13const messages = ruleMessages(ruleName, {
14 rejected: (nonSpaceCharacter) => `Unexpected "${nonSpaceCharacter}"`,
15});
16
17function rule(expectation, options, context) {
18 return (root, result) => {
19 const validOptions = validateOptions(result, ruleName, {
20 actual: expectation,
21 });
22
23 if (!validOptions) {
24 return;
25 }
26
27 root.walkRules((rule) => {
28 if (!isStandardSyntaxRule(rule)) {
29 return;
30 }
31
32 let hasFixed = false;
33 const selector = rule.raws.selector ? rule.raws.selector.raw : rule.selector;
34
35 // Return early for selectors containing comments
36 // TODO: renable when parser and stylelint are compatible
37 if (selector.includes('/*')) return;
38
39 const fixedSelector = parseSelector(selector, result, rule, (fullSelector) => {
40 fullSelector.walkCombinators((combinatorNode) => {
41 if (combinatorNode.value !== ' ') {
42 return;
43 }
44
45 const value = combinatorNode.toString();
46
47 if (
48 value.includes(' ') ||
49 value.includes('\t') ||
50 value.includes('\n') ||
51 value.includes('\r')
52 ) {
53 if (context.fix && /^\s+$/.test(value)) {
54 hasFixed = true;
55 combinatorNode.raws.value = ' ';
56 combinatorNode.rawSpaceBefore = combinatorNode.rawSpaceBefore.replace(/^\s+/, '');
57 combinatorNode.rawSpaceAfter = combinatorNode.rawSpaceAfter.replace(/\s+$/, '');
58
59 return;
60 }
61
62 report({
63 result,
64 ruleName,
65 message: messages.rejected(value),
66 node: rule,
67 index: combinatorNode.sourceIndex,
68 });
69 }
70 });
71 });
72
73 if (hasFixed) {
74 if (!rule.raws.selector) {
75 rule.selector = fixedSelector;
76 } else {
77 rule.raws.selector.raw = fixedSelector;
78 }
79 }
80 });
81 };
82}
83
84rule.ruleName = ruleName;
85rule.messages = messages;
86module.exports = rule;