"#app :where(:where(.foo[data-v-test])) { color: red;
}"
`)
+
+ expect(compileScoped(`#app :is(:where(.foo)) { color: red; }`))
+ .toMatchInlineSnapshot(`
+ "#app :is(:where(.foo[data-v-test])) { color: red;
+ }"
+ `)
+
+ expect(compileScoped(`#app :where(:is(.foo)) { color: red; }`))
+ .toMatchInlineSnapshot(`
+ "#app :where(:is(.foo[data-v-test])) { color: red;
+ }"
+ `)
})
test('media query', () => {
if (
(n.type !== 'pseudo' && n.type !== 'combinator') ||
- (n.type === 'pseudo' &&
- (n.value === ':is' || n.value === ':where') &&
+ (isPseudoClassIsOrWhere(n) &&
(!node ||
n.nodes.some(
s =>
// 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
!s.nodes.some(x => x.type === 'pseudo'),
)))
}
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 =>
rewriteSelector(id, rule, value, selectorRoot, deep, slotted),
)
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) {
if (!parentNode.nodes) return
const nodes = parentNode.nodes.filter(