|
@@ -222,13 +222,12 @@ function rewriteSelector(
|
|
|
|
|
|
|
|
if (
|
|
if (
|
|
|
(n.type !== 'pseudo' && n.type !== 'combinator') ||
|
|
(n.type !== 'pseudo' && n.type !== 'combinator') ||
|
|
|
- (n.type === 'pseudo' &&
|
|
|
|
|
- (n.value === ':is' || n.value === ':where') &&
|
|
|
|
|
|
|
+ (isPseudoClassIsOrWhere(n) &&
|
|
|
(!node ||
|
|
(!node ||
|
|
|
n.nodes.some(
|
|
n.nodes.some(
|
|
|
s =>
|
|
s =>
|
|
|
// has nested :is or :where
|
|
// has nested :is or :where
|
|
|
- s.nodes.some(x => x.type === n.type && x.value === n.value) ||
|
|
|
|
|
|
|
+ s.nodes.some(x => isPseudoClassIsOrWhere(x)) ||
|
|
|
// has non-pseudo selector
|
|
// has non-pseudo selector
|
|
|
!s.nodes.some(x => x.type === 'pseudo'),
|
|
!s.nodes.some(x => x.type === 'pseudo'),
|
|
|
)))
|
|
)))
|
|
@@ -250,8 +249,7 @@ function rewriteSelector(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (node) {
|
|
if (node) {
|
|
|
- const { type, value } = node as selectorParser.Node
|
|
|
|
|
- if (type === 'pseudo' && (value === ':is' || value === ':where')) {
|
|
|
|
|
|
|
+ if (isPseudoClassIsOrWhere(node)) {
|
|
|
;(node as selectorParser.Pseudo).nodes.forEach(value =>
|
|
;(node as selectorParser.Pseudo).nodes.forEach(value =>
|
|
|
rewriteSelector(id, rule, value, selectorRoot, deep, slotted),
|
|
rewriteSelector(id, rule, value, selectorRoot, deep, slotted),
|
|
|
)
|
|
)
|
|
@@ -288,6 +286,14 @@ function isSpaceCombinator(node: selectorParser.Node) {
|
|
|
return node.type === 'combinator' && /^\s+$/.test(node.value)
|
|
return node.type === 'combinator' && /^\s+$/.test(node.value)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function isPseudoClassIsOrWhere(
|
|
|
|
|
+ node: selectorParser.Node,
|
|
|
|
|
+): node is selectorParser.Pseudo {
|
|
|
|
|
+ return (
|
|
|
|
|
+ node.type === 'pseudo' && (node.value === ':is' || node.value === ':where')
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function extractAndWrapNodes(parentNode: Rule | AtRule) {
|
|
function extractAndWrapNodes(parentNode: Rule | AtRule) {
|
|
|
if (!parentNode.nodes) return
|
|
if (!parentNode.nodes) return
|
|
|
const nodes = parentNode.nodes.filter(
|
|
const nodes = parentNode.nodes.filter(
|