From 5f81b26c56986c430df7888f921119b2f37e3d32 Mon Sep 17 00:00:00 2001 From: Doctorwu Date: Wed, 20 Mar 2024 10:33:33 +0800 Subject: [PATCH] fix(compiler-sfc): fix universal selector scope close #10548 --- .../compiler-sfc/__tests__/compileStyle.spec.ts | 11 +++++++++++ packages/compiler-sfc/src/style/pluginScoped.ts | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/compiler-sfc/__tests__/compileStyle.spec.ts b/packages/compiler-sfc/__tests__/compileStyle.spec.ts index 1f9ae67225b..c79e200ddb7 100644 --- a/packages/compiler-sfc/__tests__/compileStyle.spec.ts +++ b/packages/compiler-sfc/__tests__/compileStyle.spec.ts @@ -390,4 +390,15 @@ describe('SFC style preprocessors', () => { expect(res.errors.length).toBe(0) }) + + test('should mount scope on correct selector when have universal selector', () => { + expect(compileScoped(`* { color: red; }`)).toMatchInlineSnapshot(` + "[data-v-test] { color: red; + }" + `) + expect(compileScoped(`.foo * { color: red; }`)).toMatchInlineSnapshot(` + ".foo[data-v-test] * { color: red; + }" + `) + }) }) diff --git a/packages/compiler-sfc/src/style/pluginScoped.ts b/packages/compiler-sfc/src/style/pluginScoped.ts index c5e01896130..dd512d36f41 100644 --- a/packages/compiler-sfc/src/style/pluginScoped.ts +++ b/packages/compiler-sfc/src/style/pluginScoped.ts @@ -170,10 +170,23 @@ function rewriteSelector( } } + if (n.type === 'universal') { + const prev = selector.at(selector.index(n) - 1) + const next = selector.at(selector.index(n) + 1) + if (!prev && !next) { + node = selectorParser.combinator({ + value: '', + }) + selector.insertBefore(n, node) + selector.removeChild(n) + } + } + if ( (n.type !== 'pseudo' && n.type !== 'combinator') || (n.type === 'pseudo' && (n.value === ':is' || n.value === ':where')) ) { + if (n.type === 'universal' && node) return node = n } })