Skip to content

Commit 3433c7d

Browse files
committed
fix: infinite loop relating to :not pseudo-classes
- ignore :hover pseudo-class selectors within :not pseudo-class selector lists Closes #20
1 parent eeed116 commit 3433c7d

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

index.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,22 @@ const selectorProcessor = selectorParser(selectors => {
44
let hoverSelectors = []
55

66
selectors.walk(selector => {
7-
if (selector.type === 'pseudo' && `${selector}` === ':hover') {
8-
hoverSelectors.push(`${selector.parent}`)
7+
if (
8+
selector.type === 'pseudo' &&
9+
selector.toString() === ':hover' &&
10+
selector.parent.value !== ':not' &&
11+
selector.parent.toString() !== ':hover'
12+
) {
13+
hoverSelectors.push(selector.parent.toString())
914
}
1015
})
1116

1217
let nonHoverSelectors = selectors.reduce((acc, selector) => {
13-
if (hoverSelectors.includes(`${selector}`)) {
18+
if (hoverSelectors.includes(selector.toString())) {
1419
return acc
1520
}
1621

17-
return [...acc, `${selector}`]
22+
return [...acc, selector.toString()]
1823
}, [])
1924

2025
return { hoverSelectors, nonHoverSelectors }
@@ -69,6 +74,10 @@ module.exports = ({
6974
nonHoverSelectors = []
7075
} = selectorProcessor.transformSync(rule.selector, { lossless: false })
7176

77+
if (hoverSelectors.length === 0) {
78+
return
79+
}
80+
7281
let mediaQuery = createMediaQuery(
7382
rule.clone({ selectors: hoverSelectors }),
7483
{ AtRule }
@@ -93,7 +102,7 @@ module.exports = ({
93102
)
94103
}
95104

96-
if (nonHoverSelectors.length) {
105+
if (nonHoverSelectors.length > 0) {
97106
rule.replaceWith(rule.clone({ selectors: nonHoverSelectors }))
98107

99108
return

index.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ describe('basic usage', () => {
6868
'@media (hover: hover) {:is(button,[role="button"]):hover { background-color: transparent; } }'
6969
)
7070
})
71+
72+
it('ignores :hover pseudo-class selectors within :not pseudo-class selector lists', () => {
73+
run(
74+
'.list__item:not(:hover, .is-editing) .show-on-hover { visibility: hidden }',
75+
'.list__item:not(:hover, .is-editing) .show-on-hover { visibility: hidden }'
76+
)
77+
})
7178
})
7279

7380
describe('when `fallback: true`', () => {

0 commit comments

Comments
 (0)