From: daiwei Date: Sat, 5 Apr 2025 02:27:27 +0000 (+0800) Subject: fix(compile-sfc): auto add nesting combinators for ::v-deep in scoped CSS X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f0f944d8326463be97610096c4730ddaa7e3178;p=thirdparty%2Fvuejs%2Fcore.git fix(compile-sfc): auto add nesting combinators for ::v-deep in scoped CSS --- diff --git a/packages/compiler-sfc/__tests__/compileStyle.spec.ts b/packages/compiler-sfc/__tests__/compileStyle.spec.ts index b76414364d..ff5ca2a952 100644 --- a/packages/compiler-sfc/__tests__/compileStyle.spec.ts +++ b/packages/compiler-sfc/__tests__/compileStyle.spec.ts @@ -140,6 +140,18 @@ color: red } }" `) + expect(compileScoped(`.foo { :deep(.bar) { color: red; }}`)) + .toMatchInlineSnapshot(` + ".foo { + &[data-v-test] .bar { color: red; + }}" + `) + expect(compileScoped(`.foo { & :deep(.bar) { color: red; }}`)) + .toMatchInlineSnapshot(` + ".foo { + &[data-v-test] .bar { color: red; + }}" + `) }) test('::v-slotted', () => { diff --git a/packages/compiler-sfc/src/style/pluginScoped.ts b/packages/compiler-sfc/src/style/pluginScoped.ts index d0aaddd767..b0854a22e4 100644 --- a/packages/compiler-sfc/src/style/pluginScoped.ts +++ b/packages/compiler-sfc/src/style/pluginScoped.ts @@ -133,6 +133,29 @@ function rewriteSelector( selector.insertAfter(last, ss) last = ss }) + + // if css nesting is used, we need to insert a nesting combinator + // before the ::v-deep node + // .foo { ::v-deep(.bar) } -> .foo { &[xxxxxxx] .bar } + const isNestedRule = rule.parent && rule.parent.type === 'rule' + if (isNestedRule && n.parent) { + let hasNestingCombinator = false + let index = n.parent.index(n) - 1 + while (index >= 0) { + const prev = n.parent.at(index) + if (!prev) break + if (prev.type === 'nesting') { + hasNestingCombinator = true + break + } + index-- + } + if (!hasNestingCombinator) { + node = selectorParser.nesting() + selector.insertBefore(n, node) + } + } + // insert a space combinator before if it doesn't already have one const prev = selector.at(selector.index(n) - 1) if (!prev || !isSpaceCombinator(prev)) {