Skip to content

Commit 4013f69

Browse files
authored
Merge pull request #141 from tardiva/dont-duplicate-check
Update unWrapSelectors function to prevent wrong warnings.
2 parents 520600a + 680afe5 commit 4013f69

File tree

2 files changed

+18
-19
lines changed

2 files changed

+18
-19
lines changed

lib/get-selectors.js

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,10 @@ function hasOnlyAllowedAtRules(node) {
3333
return containsAllowed && !containsNotAllowed;
3434
}
3535

36-
function getComponentRootRule(node) {
37-
while (node.root() !== node.parent) {
38-
node = node.parent;
39-
}
40-
return node;
41-
}
42-
43-
function unWrapSelectors(parent, rule) {
36+
function unWrapSelectors(rule) {
4437
let selectors = [];
45-
parent.walkRules(node => {
46-
// Only unwrap as far as the current rule being linted
47-
if (node.selector !== rule.selector) {
48-
return;
49-
}
50-
node.selectors.forEach(selector => {
51-
selectors = selectors.concat(resolveNestedSelector(selector, node));
52-
});
38+
rule.selectors.forEach(selector => {
39+
selectors = selectors.concat(resolveNestedSelector(selector, rule));
5340
});
5441
return selectors;
5542
}
@@ -62,9 +49,7 @@ function getSelectors(rule) {
6249
}
6350

6451
if (isNestedRule(rule)) {
65-
const componentRootRule = getComponentRootRule(rule);
66-
const nestedSelectors = unWrapSelectors(componentRootRule, rule);
67-
return nestedSelectors;
52+
return unWrapSelectors(rule);
6853
}
6954

7055
return rule.selectors;

test/nesting.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ describe('getSelectors', () => {
6767
assert.deepEqual(getSelectors(rule), ['.Component.is-active']);
6868
});
6969

70+
it('should unwrap selector only once', () => {
71+
const firstRule = postcss.rule({selector: '.Component-d'});
72+
const secondRule = postcss.rule({selector: '&.is-active'});
73+
const firstHover = postcss.rule({selector: '&:hover'});
74+
const secondHover = postcss.rule({selector: '&:hover'});
75+
firstRule.append(firstHover);
76+
secondRule.append(secondHover);
77+
componentRoot.append(firstRule);
78+
componentRoot.append(secondRule);
79+
assert.deepEqual(getSelectors(firstHover), [
80+
'.Component .Component-d:hover',
81+
]);
82+
});
83+
7084
it('should unwrap multiple levels of nested rulesets and skip rules with no declarations', () => {
7185
const descendant = postcss.rule({selector: '.Component-d'});
7286
const hover = postcss.rule({selector: '&:hover'});

0 commit comments

Comments
 (0)