Skip to content

Conversation

btea
Copy link
Contributor

@btea btea commented May 5, 2023

Summary by CodeRabbit

  • Bug Fixes

    • Improved handling of complex and nested selectors using ::v-deep, :deep, ::v-slotted, and ::v-global pseudo-selectors in scoped CSS, ensuring proper application of the scoped attribute in cases with multiple or combined selectors.
  • Tests

    • Added new test cases to verify correct scoping for multiple and nested selectors within special pseudo-selectors, increasing coverage for advanced CSS scenarios.

@btea btea force-pushed the feat/deep-selector-support-multiple branch from 1eddacf to b2bc080 Compare May 10, 2024 04:48
Copy link

github-actions bot commented May 10, 2024

Size Report

Bundles

File Size Gzip Brotli
runtime-dom.global.prod.js 101 kB 38.4 kB 34.5 kB
vue.global.prod.js 159 kB 58.5 kB 52.1 kB

Usages

Name Size Gzip Brotli
createApp (CAPI only) 46.5 kB 18.2 kB 16.7 kB
createApp 54.5 kB 21.2 kB 19.4 kB
createSSRApp 58.7 kB 22.9 kB 20.9 kB
defineCustomElement 59.5 kB 22.8 kB 20.8 kB
overall 68.5 kB 26.4 kB 24 kB

@haoqunjiang haoqunjiang added version: minor 🍰 p2-nice-to-have Priority 2: this is not breaking anything but nice to have it addressed. labels Jun 11, 2024
@edison1105 edison1105 added the ready for review This PR requires more reviews label Oct 16, 2024
Copy link

pkg-pr-new bot commented Oct 17, 2024

Open in StackBlitz

@vue/compiler-core

npm i https://pkg.pr.new/@vue/compiler-core@8232

@vue/compiler-dom

npm i https://pkg.pr.new/@vue/compiler-dom@8232

@vue/compiler-sfc

npm i https://pkg.pr.new/@vue/compiler-sfc@8232

@vue/compiler-ssr

npm i https://pkg.pr.new/@vue/compiler-ssr@8232

@vue/reactivity

npm i https://pkg.pr.new/@vue/reactivity@8232

@vue/runtime-core

npm i https://pkg.pr.new/@vue/runtime-core@8232

@vue/runtime-dom

npm i https://pkg.pr.new/@vue/runtime-dom@8232

@vue/server-renderer

npm i https://pkg.pr.new/@vue/server-renderer@8232

@vue/shared

npm i https://pkg.pr.new/@vue/shared@8232

vue

npm i https://pkg.pr.new/vue@8232

@vue/compat

npm i https://pkg.pr.new/@vue/compat@8232

commit: 13ca7e1

@btea btea marked this pull request as draft October 17, 2024 13:36
@btea btea marked this pull request as ready for review October 17, 2024 14:19
@btea btea marked this pull request as draft January 5, 2025 04:12
@btea btea marked this pull request as ready for review January 5, 2025 04:25
Copy link

coderabbitai bot commented Jul 21, 2025

Walkthrough

The changes expand the selector rewriting logic in the style scoping plugin to support multiple and nested selectors within special pseudo-selectors like :deep, :slotted, and :global. Corresponding test cases are added to verify correct scoping behavior for these complex selector scenarios.

Changes

Files Change Summary
packages/compiler-sfc/src/style/pluginScoped.ts Refactored rewriteSelector to handle multiple nodes for attribute injection, supporting complex and nested selectors.
packages/compiler-sfc/tests/compileStyle.spec.ts Added test cases for multiple and nested selector handling in :deep, :slotted, and :global pseudo-selectors.

Sequence Diagram(s)

sequenceDiagram
    participant TestRunner
    participant CompilerSFC
    participant StylePluginScoped

    TestRunner->>CompilerSFC: Compile style block with complex selectors
    CompilerSFC->>StylePluginScoped: Call rewriteSelector(selector)
    StylePluginScoped->>StylePluginScoped: Process pseudo-selectors (:deep, :slotted, :global)
    StylePluginScoped-->>CompilerSFC: Return rewritten selector(s) with scoped attributes
    CompilerSFC-->>TestRunner: Output compiled CSS
Loading

Estimated code review effort

4 (60–120 minutes)

Possibly related PRs

Suggested labels

ready to merge

Poem

In the garden of selectors deep,
Where pseudo-classes twist and creep,
The rabbits hop with careful glee,
Adding scopes for all to see.
Now with tests and code anew,
Complex styles are handled true!
🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/compiler-sfc/src/style/pluginScoped.ts (1)

215-215: Variable shadowing could cause confusion.

The local nextNodes variable shadows the outer scope variable declared at line 104. While this appears intentional for local scope management, consider renaming it to avoid potential confusion (e.g., slottedNextNodes).

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e60edc0 and 13ca7e1.

📒 Files selected for processing (2)
  • packages/compiler-sfc/__tests__/compileStyle.spec.ts (6 hunks)
  • packages/compiler-sfc/src/style/pluginScoped.ts (6 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test / e2e-test
🔇 Additional comments (7)
packages/compiler-sfc/src/style/pluginScoped.ts (4)

102-104: Good design for supporting multiple selectors.

The introduction of nodes array for collecting multiple injection points and nextNodes for managing subsequent nodes is a clean approach to support multiple selectors within pseudo-selectors.


257-257: Correct fix for multiple global selectors.

The use of spread operator to include all inner nodes is the correct approach for supporting multiple selectors within :global().


297-299: Proper attribute injection for multiple nodes.

The implementation correctly collects all nodes that need attribute injection and applies the scoped attributes to each one. The logic handles both single and multiple injection points appropriately.

Also applies to: 334-346


135-181: Missing edge-case tests for :deep/::v-deep – please verify.

I couldn’t find any existing tests covering empty or malformed :deep()/::v-deep() selectors (including comma-separated edge cases). The selector-cloning logic is complex and warrants explicit coverage.

• Add tests for:
:deep() and ::v-deep() with no arguments
– Multiple, comma-separated entries (e.g. :deep(.a, .b))
– Inputs with leading/trailing whitespace or unexpected syntax

Ensure these scenarios behave as intended and prevent regressions.

packages/compiler-sfc/__tests__/compileStyle.spec.ts (3)

129-201: Comprehensive test coverage for deep selectors.

The test cases thoroughly cover various scenarios for multiple selectors in :deep/::v-deep:

  • Simple comma-separated selectors
  • Selectors with descendant combinators
  • Complex nested structures
  • Edge cases with 4+ selectors

Good test design!


209-248: Good test coverage for slotted selectors.

The tests appropriately verify that multiple selectors work correctly with :slotted/::v-slotted, including proper application of the -s suffix to the scoped attribute.


257-295: Excellent edge case testing for global selectors.

The tests effectively verify that :global/::v-global correctly:

  1. Supports multiple comma-separated selectors
  2. Ignores selectors that appear before the global pseudo-selector
  3. Ignores selectors that appear after the global pseudo-selector

These edge cases are crucial for maintaining the expected behavior of global selectors.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🍰 p2-nice-to-have Priority 2: this is not breaking anything but nice to have it addressed. ready for review This PR requires more reviews scope: sfc version: minor
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

4 participants