|
|
@@ -102,6 +102,7 @@ function rewriteSelector(
|
|
|
slotted = false,
|
|
|
) {
|
|
|
let node: selectorParser.Node | null = null
|
|
|
+ let starNode: selectorParser.Node | null = null
|
|
|
let shouldInject = !deep
|
|
|
// find the last child node to insert attribute selector
|
|
|
selector.each(n => {
|
|
|
@@ -216,17 +217,21 @@ function rewriteSelector(
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
- // .foo * -> .foo[xxxxxxx] *
|
|
|
- if (node) return
|
|
|
+ // store the universal selector so it can be rewritten later
|
|
|
+ // .foo * -> .foo[xxxxxxx] [xxxxxxx]
|
|
|
+ starNode = n
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
- (n.type !== 'pseudo' && n.type !== 'combinator') ||
|
|
|
+ (n.type !== 'pseudo' &&
|
|
|
+ n.type !== 'combinator' &&
|
|
|
+ n.type !== 'universal') ||
|
|
|
(n.type === 'pseudo' &&
|
|
|
(n.value === ':is' || n.value === ':where') &&
|
|
|
!node)
|
|
|
) {
|
|
|
node = n
|
|
|
+ starNode = null
|
|
|
}
|
|
|
})
|
|
|
|
|
|
@@ -274,6 +279,20 @@ function rewriteSelector(
|
|
|
quoteMark: `"`,
|
|
|
}),
|
|
|
)
|
|
|
+ // Used for trailing universal selectors (#12906)
|
|
|
+ // `.foo * {}` -> `.foo[xxxxxxx] [xxxxxxx] {}`
|
|
|
+ if (starNode) {
|
|
|
+ selector.insertBefore(
|
|
|
+ starNode,
|
|
|
+ selectorParser.attribute({
|
|
|
+ attribute: idToAdd,
|
|
|
+ value: idToAdd,
|
|
|
+ raws: {},
|
|
|
+ quoteMark: `"`,
|
|
|
+ }),
|
|
|
+ )
|
|
|
+ selector.removeChild(starNode)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|