This commit is contained in:
thecodewarrior 2025-05-05 20:38:37 +00:00 committed by GitHub
commit 9d26feeaf4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 4 deletions

View File

@ -493,7 +493,31 @@ describe('SFC style preprocessors', () => {
}" }"
`) `)
expect(compileScoped(`.foo * { color: red; }`)).toMatchInlineSnapshot(` expect(compileScoped(`.foo * { color: red; }`)).toMatchInlineSnapshot(`
".foo[data-v-test] * { color: red; ".foo[data-v-test] [data-v-test] { color: red;
}"
`)
expect(compileScoped(`.foo :active { color: red; }`))
.toMatchInlineSnapshot(`
".foo[data-v-test] :active { color: red;
}"
`)
expect(compileScoped(`.foo *:active { color: red; }`))
.toMatchInlineSnapshot(`
".foo[data-v-test] [data-v-test]:active { color: red;
}"
`)
expect(compileScoped(`.foo * .bar { color: red; }`)).toMatchInlineSnapshot(`
".foo * .bar[data-v-test] { color: red;
}"
`)
expect(compileScoped(`:last-child * { color: red; }`))
.toMatchInlineSnapshot(`
"[data-v-test]:last-child [data-v-test] { color: red;
}"
`)
expect(compileScoped(`:last-child *:active { color: red; }`))
.toMatchInlineSnapshot(`
"[data-v-test]:last-child [data-v-test]:active { color: red;
}" }"
`) `)
}) })

View File

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