Skip to content

feat(parse/html/vue): parse v-for better#8620

Merged
dyc3 merged 1 commit intomainfrom
dyc3/vue-parse-v-for
Apr 27, 2026
Merged

feat(parse/html/vue): parse v-for better#8620
dyc3 merged 1 commit intomainfrom
dyc3/vue-parse-v-for

Conversation

@dyc3
Copy link
Copy Markdown
Contributor

@dyc3 dyc3 commented Dec 29, 2025

Summary

This PR adds support for parsing v-for values. It covers:

  • the simple case "foo in arr"
  • index/key "(foo, index, key) in arr"
  • destructuring assignments "{ foo } in arr", "[foo, bar] in arr"
  • range iteration "n in 10"
  • any js expression to the right of the in/of operator

To keep this PR a bit more reviewable these are the things I chose not to implement here:

<div v-for="/*foo*/ i in 10" />
<div v-for="
  // yes, this is real valid syntax
  i in 10
" />

Generated mostly with gpt 5.5

closes #8062

Test Plan

added snapshot tests

Docs

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 29, 2025

🦋 Changeset detected

Latest commit: 5d2d449

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@biomejs/biome Patch
@biomejs/cli-win32-x64 Patch
@biomejs/cli-win32-arm64 Patch
@biomejs/cli-darwin-x64 Patch
@biomejs/cli-darwin-arm64 Patch
@biomejs/cli-linux-x64 Patch
@biomejs/cli-linux-arm64 Patch
@biomejs/cli-linux-x64-musl Patch
@biomejs/cli-linux-arm64-musl Patch
@biomejs/wasm-web Patch
@biomejs/wasm-bundler Patch
@biomejs/wasm-nodejs Patch
@biomejs/backend-jsonrpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions Bot added A-Parser Area: parser A-Formatter Area: formatter A-Tooling Area: internal tools L-HTML Language: HTML and super languages labels Dec 29, 2025
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 29, 2025

Parser conformance results on

js/262

Test result main count This PR count Difference
Total 53183 53183 0
Passed 51965 51965 0
Failed 1176 1176 0
Panics 42 42 0
Coverage 97.71% 97.71% 0.00%

jsx/babel

Test result main count This PR count Difference
Total 38 38 0
Passed 37 37 0
Failed 1 1 0
Panics 0 0 0
Coverage 97.37% 97.37% 0.00%

markdown/commonmark

Test result main count This PR count Difference
Total 652 652 0
Passed 652 652 0
Failed 0 0 0
Panics 0 0 0
Coverage 100.00% 100.00% 0.00%

symbols/microsoft

Test result main count This PR count Difference
Total 5467 5467 0
Passed 1915 1915 0
Failed 3552 3552 0
Panics 0 0 0
Coverage 35.03% 35.03% 0.00%

ts/babel

Test result main count This PR count Difference
Total 640 640 0
Passed 569 569 0
Failed 71 71 0
Panics 0 0 0
Coverage 88.91% 88.91% 0.00%

ts/microsoft

Test result main count This PR count Difference
Total 18876 18876 0
Passed 13010 13010 0
Failed 5865 5865 0
Panics 1 1 0
Coverage 68.92% 68.92% 0.00%

@dyc3 dyc3 force-pushed the dyc3/vue-parse-v-for branch from 90c4e37 to 600692a Compare April 26, 2026 16:06
@github-actions github-actions Bot added A-Project Area: project A-Linter Area: linter labels Apr 26, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 26, 2026

Merging this PR will not alter performance

✅ 67 untouched benchmarks
⏩ 189 skipped benchmarks1


Comparing dyc3/vue-parse-v-for (5d2d449) with main (491b171)

Open in CodSpeed

Footnotes

  1. 189 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@dyc3 dyc3 marked this pull request as ready for review April 26, 2026 17:01
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 26, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d01d47f6-37a3-4a32-9368-7fb6781b0eac

📥 Commits

Reviewing files that changed from the base of the PR and between 94477fe and 5d2d449.

⛔ Files ignored due to path filters (30)
  • crates/biome_html_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/dynamic-slot-arg.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-else-if.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-html-text.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-mixed-complex.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (58)
  • .changeset/parse-vue-v-for-expressions.md
  • crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
  • crates/biome_html_formatter/src/generated.rs
  • crates/biome_html_formatter/src/html/any/attribute_initializer.rs
  • crates/biome_html_formatter/src/shared.rs
  • crates/biome_html_formatter/src/vue/any/mod.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding_list_element.rs
  • crates/biome_html_formatter/src/vue/any/v_for_destructured_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/mod.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_array_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_identifier_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_in_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_object_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_of_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_rest_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_element.rs
  • crates/biome_html_formatter/src/vue/lists/mod.rs
  • crates/biome_html_formatter/src/vue/lists/v_for_binding_list.rs
  • crates/biome_html_formatter/src/vue/mod.rs
  • crates/biome_html_formatter/src/vue/value/mod.rs
  • crates/biome_html_formatter/src/vue/value/v_for_value.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue
  • crates/biome_html_parser/src/lexer/mod.rs
  • crates/biome_html_parser/src/parser.rs
  • crates/biome_html_parser/src/syntax/astro.rs
  • crates/biome_html_parser/src/syntax/mod.rs
  • crates/biome_html_parser/src/syntax/parse_error.rs
  • crates/biome_html_parser/src/syntax/svelte.rs
  • crates/biome_html_parser/src/syntax/vue.rs
  • crates/biome_html_parser/src/token_source.rs
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue
  • crates/biome_html_syntax/src/attribute_ext.rs
  • crates/biome_service/src/file_handlers/html/parse_embedded_nodes.rs
  • xtask/codegen/html.ungram
  • xtask/codegen/src/generate_nodes.rs
  • xtask/codegen/src/generate_syntax_kinds.rs
  • xtask/codegen/src/html_kinds_src.rs
  • xtask/codegen/src/js_kinds_src.rs
✅ Files skipped from review due to trivial changes (38)
  • crates/biome_html_formatter/src/vue/lists/mod.rs
  • .changeset/parse-vue-v-for-expressions.md
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue
  • crates/biome_html_formatter/src/vue/mod.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue
  • crates/biome_html_formatter/src/vue/value/mod.rs
  • crates/biome_html_formatter/src/html/any/attribute_initializer.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue
  • crates/biome_html_parser/src/token_source.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_in_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_of_operator.rs
  • crates/biome_html_parser/src/syntax/parse_error.rs
  • crates/biome_html_formatter/src/vue/any/v_for_destructured_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_rest_binding.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_array_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding_list_element.rs
  • crates/biome_html_formatter/src/vue/any/mod.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue
  • crates/biome_html_formatter/src/vue/auxiliary/mod.rs
  • xtask/codegen/html.ungram
  • crates/biome_html_formatter/src/vue/any/v_for_operator.rs
  • crates/biome_html_formatter/src/generated.rs
🚧 Files skipped from review as they are similar to previous changes (13)
  • crates/biome_html_formatter/src/shared.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_element.rs
  • crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_identifier_binding.rs
  • crates/biome_html_syntax/src/attribute_ext.rs
  • xtask/codegen/src/js_kinds_src.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_object_binding.rs
  • crates/biome_html_formatter/src/vue/lists/v_for_binding_list.rs
  • crates/biome_html_parser/src/syntax/svelte.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue
  • crates/biome_html_parser/src/syntax/mod.rs
  • xtask/codegen/src/html_kinds_src.rs
  • crates/biome_html_parser/src/lexer/mod.rs

Walkthrough

This PR implements structured parsing and formatting for Vue v-for directive values, transforming them from generic attribute strings into properly analysed AST nodes. New lexer contexts tokenize binding/operator/expression segments separately, the parser enforces structured v-for syntax (binding + operator + iterable expression), and the formatter wires up output for all new node types. Linting rules now avoid evaluating v-for-derived attribute values. Multiple test fixtures validate parsing, formatting, and error recovery across destructuring, operators, and complex expressions.

Possibly related PRs

Suggested reviewers

  • ematipico
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(parse/html/vue): parse v-for better' clearly describes the main enhancement—improved Vue v-for directive parsing.
Description check ✅ Passed The description explains the motivation, covers what was implemented (simple case, index/key, destructuring, range iteration, JS expressions), lists intentional omissions, discloses AI assistance, and references the closed issue.
Linked Issues check ✅ Passed All code changes directly address issue #8062: enhanced lexer contexts for v-for tokenisation, new parser entry point and binding grammar, formatter rules for all v-for AST nodes, and linter support for non-redundant alt checks with v-for values.
Out of Scope Changes check ✅ Passed All changes remain within the stated scope. No nested destructuring, comment support, or embedded binding service rework was introduced—only the core v-for parsing/formatting/linting enhancements described in #8062.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dyc3/vue-parse-v-for

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@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: 5

🧹 Nitpick comments (1)
crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue (1)

1-3: Add one genuine RHS expression case to this parser fixture.

Line 1-3 currently validate identifier iterables only; adding one expression here would better lock parser behaviour for the “arbitrary expression” path.

Suggested fixture addition
 <div v-for="item in items">{{ item }}</div>
 <div v-for="item in visibleItems">{{ item }}</div>
 <div v-for="item in fallbackItems">{{ item }}</div>
+<div v-for="item in list.map((value) => value.id)">{{ item }}</div>

As per coding guidelines, "parsers require test files covering valid and error cases".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue`
around lines 1 - 3, Add a new v-for fixture that uses a genuine non-identifier
RHS expression to exercise the “arbitrary expression” path: insert a line
alongside the existing <div v-for="item in items">, <div v-for="item in
visibleItems"> and <div v-for="item in fallbackItems"> such as <div v-for="item
in items.slice(0, 3)">{{ item }}</div> (i.e., update the v-for attribute to use
items.slice(0,3) or a similar expression) so the parser is tested against a real
expression RHS rather than only identifier iterables.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.changeset/parse-vue-v-for-expressions.md:
- Line 5: Update the changeset sentence "Added support for parsing Vue `v-for`
directives more accurately." to follow the bug-fix format by prefixing with
"Fixed [`#ISSUE_NUMBER`](ISSUE_URL):" and then append a short inline parser
example showing input and expected output (e.g., a one-line code example of a
v-for expression and its parsed result) to illustrate the change; ensure the
edited line includes the exact phrase used in the diff and add the example
immediately after the sentence so it appears in the release notes.

In `@crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs`:
- Line 86: Add snapshot tests exercising the new VueVForValue skip:
create/extend the rule's valid and invalid fixtures to include cases combining
an <img alt> with a v-for/v-bind alt (e.g., :alt="item.description" v-for="item
in items") so the match arm AnyHtmlAttributeInitializer::VueVForValue(_) is
exercised; update the rule's spec snapshots to assert this case is treated as
valid (skipped) and that other alt/v-for combinations still behave as before.

In `@crates/biome_html_parser/src/syntax/parse_error.rs`:
- Around line 150-155: The error message produced by
expected_vue_v_for_expression currently says "Expected an iterable expression
after the v-for operator." — update the wording to avoid implying only iterables
are valid by changing the main message to e.g. "Expected a collection or range
expression after the v-for operator." and adjust the helper hint passed to
with_hint (currently markup!("Add the collection or expression to iterate
over.")) to something like "Add the collection or range expression to iterate
over." Locate and update these strings in the expected_vue_v_for_expression
function that calls p.err_builder(..., range) and .with_hint(...).

In `@crates/biome_html_syntax/src/attr_ext.rs`:
- Around line 24-29: The find_by_name helper currently compares attribute names
with a case-sensitive equality, causing it to miss valid HTML attribute
spellings; update the comparison inside the closure in the find_by_name function
(where it matches AnyHtmlAttribute::HtmlAttribute and calls attribute.name() and
name.value_token().ok()?.text_trimmed()) to use an ASCII case-insensitive
comparison such as .eq_ignore_ascii_case(name_to_lookup) instead of == so names
like "ALT" or "DaTa-TestId" are matched.
- Around line 12-16: The code in the Self::HtmlString branch currently uses
.value_token().map(|token|
inner_string_text(&token).into()).unwrap_or_default(), which converts a missing
token into Some(""); change it so a missing or non-extractable token yields None
instead of an empty string by removing unwrap_or_default and letting the Option
propagate (i.e., return .value_token().map(|token|
inner_string_text(&token).into()) so that HtmlString without a value_token
returns None). Ensure references to inner_string_text and value_token remain
unchanged.

---

Nitpick comments:
In
`@crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue`:
- Around line 1-3: Add a new v-for fixture that uses a genuine non-identifier
RHS expression to exercise the “arbitrary expression” path: insert a line
alongside the existing <div v-for="item in items">, <div v-for="item in
visibleItems"> and <div v-for="item in fallbackItems"> such as <div v-for="item
in items.slice(0, 3)">{{ item }}</div> (i.e., update the v-for attribute to use
items.slice(0,3) or a similar expression) so the parser is tested against a real
expression RHS rather than only identifier iterables.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fbfa9fc5-f0b5-4198-8dda-1512c9261cfb

📥 Commits

Reviewing files that changed from the base of the PR and between 895e809 and 600692a.

⛔ Files ignored due to path filters (30)
  • crates/biome_html_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/dynamic-slot-arg.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-else-if.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-html-text.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-mixed-complex.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (58)
  • .changeset/parse-vue-v-for-expressions.md
  • crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
  • crates/biome_html_formatter/src/generated.rs
  • crates/biome_html_formatter/src/html/any/attribute_initializer.rs
  • crates/biome_html_formatter/src/shared.rs
  • crates/biome_html_formatter/src/vue/any/mod.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding_list_element.rs
  • crates/biome_html_formatter/src/vue/any/v_for_destructured_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/mod.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_array_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_identifier_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_in_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_object_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_of_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_rest_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_element.rs
  • crates/biome_html_formatter/src/vue/lists/mod.rs
  • crates/biome_html_formatter/src/vue/lists/v_for_binding_list.rs
  • crates/biome_html_formatter/src/vue/mod.rs
  • crates/biome_html_formatter/src/vue/value/mod.rs
  • crates/biome_html_formatter/src/vue/value/v_for_value.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue
  • crates/biome_html_parser/src/lexer/mod.rs
  • crates/biome_html_parser/src/syntax/astro.rs
  • crates/biome_html_parser/src/syntax/mod.rs
  • crates/biome_html_parser/src/syntax/parse_error.rs
  • crates/biome_html_parser/src/syntax/svelte.rs
  • crates/biome_html_parser/src/syntax/vue.rs
  • crates/biome_html_parser/src/token_source.rs
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue
  • crates/biome_html_syntax/src/attr_ext.rs
  • crates/biome_html_syntax/src/attribute_ext.rs
  • crates/biome_service/src/file_handlers/html/parse_embedded_nodes.rs
  • xtask/codegen/html.ungram
  • xtask/codegen/src/generate_nodes.rs
  • xtask/codegen/src/generate_syntax_kinds.rs
  • xtask/codegen/src/html_kinds_src.rs
  • xtask/codegen/src/js_kinds_src.rs

Comment thread .changeset/parse-vue-v-for-expressions.md Outdated
Comment thread crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
Comment thread crates/biome_html_parser/src/syntax/parse_error.rs
Comment thread crates/biome_html_syntax/src/attr_ext.rs Outdated
Comment thread crates/biome_html_syntax/src/attr_ext.rs Outdated
Copy link
Copy Markdown
Member

@ematipico ematipico left a comment

Choose a reason for hiding this comment

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

The code looks very clean. I left a few nits

Comment thread crates/biome_html_parser/src/syntax/vue.rs Outdated
Comment thread crates/biome_html_parser/src/syntax/vue.rs Outdated
Comment thread crates/biome_html_parser/src/syntax/vue.rs Outdated
Comment thread crates/biome_html_parser/src/lexer/mod.rs
Comment thread crates/biome_html_formatter/src/vue/auxiliary/v_for_identifier_binding.rs Outdated
@dyc3 dyc3 force-pushed the dyc3/vue-parse-v-for branch 2 times, most recently from 94477fe to 22dc4bc Compare April 27, 2026 11:02
Copy link
Copy Markdown
Contributor

@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.

🧹 Nitpick comments (1)
crates/biome_html_parser/src/syntax/vue.rs (1)

275-275: Consider pub(crate) for visibility consistency.

Other parse_* functions in this file are pub(crate). Since this is invoked from within the same crate (crates/biome_html_parser/src/syntax/mod.rs), pub(crate) would suffice.

♻️ Suggested change
-pub fn parse_vue_v_for_value(p: &mut HtmlParser) -> ParsedSyntax {
+pub(crate) fn parse_vue_v_for_value(p: &mut HtmlParser) -> ParsedSyntax {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_html_parser/src/syntax/vue.rs` at line 275, The function
parse_vue_v_for_value is declared pub but is only used within the crate; change
its visibility to pub(crate) to match other parse_* functions in the file and
keep visibility consistent (update the signature of parse_vue_v_for_value to
pub(crate) fn parse_vue_v_for_value(...)); ensure there are no external callers
outside the crate that rely on it—if there are, either leave public or adjust
those call sites accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@crates/biome_html_parser/src/syntax/vue.rs`:
- Line 275: The function parse_vue_v_for_value is declared pub but is only used
within the crate; change its visibility to pub(crate) to match other parse_*
functions in the file and keep visibility consistent (update the signature of
parse_vue_v_for_value to pub(crate) fn parse_vue_v_for_value(...)); ensure there
are no external callers outside the crate that rely on it—if there are, either
leave public or adjust those call sites accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3822b0ea-6183-40de-99e6-6e9b0f06d183

📥 Commits

Reviewing files that changed from the base of the PR and between 600692a and 94477fe.

⛔ Files ignored due to path filters (30)
  • crates/biome_html_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/dynamic-slot-arg.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-else-if.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-html-text.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-mixed-complex.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_html_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (59)
  • .changeset/parse-vue-v-for-expressions.md
  • crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
  • crates/biome_html_formatter/src/generated.rs
  • crates/biome_html_formatter/src/html/any/attribute_initializer.rs
  • crates/biome_html_formatter/src/shared.rs
  • crates/biome_html_formatter/src/vue/any/mod.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_binding_list_element.rs
  • crates/biome_html_formatter/src/vue/any/v_for_destructured_binding.rs
  • crates/biome_html_formatter/src/vue/any/v_for_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/mod.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_array_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_identifier_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_in_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_object_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_of_operator.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_rest_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_element.rs
  • crates/biome_html_formatter/src/vue/lists/mod.rs
  • crates/biome_html_formatter/src/vue/lists/v_for_binding_list.rs
  • crates/biome_html_formatter/src/vue/mod.rs
  • crates/biome_html_formatter/src/vue/value/mod.rs
  • crates/biome_html_formatter/src/vue/value/v_for_value.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue
  • crates/biome_html_parser/src/lexer/mod.rs
  • crates/biome_html_parser/src/parser.rs
  • crates/biome_html_parser/src/syntax/astro.rs
  • crates/biome_html_parser/src/syntax/mod.rs
  • crates/biome_html_parser/src/syntax/parse_error.rs
  • crates/biome_html_parser/src/syntax/svelte.rs
  • crates/biome_html_parser/src/syntax/vue.rs
  • crates/biome_html_parser/src/token_source.rs
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue
  • crates/biome_html_syntax/src/attr_ext.rs
  • crates/biome_html_syntax/src/attribute_ext.rs
  • crates/biome_service/src/file_handlers/html/parse_embedded_nodes.rs
  • xtask/codegen/html.ungram
  • xtask/codegen/src/generate_nodes.rs
  • xtask/codegen/src/generate_syntax_kinds.rs
  • xtask/codegen/src/html_kinds_src.rs
  • xtask/codegen/src/js_kinds_src.rs
✅ Files skipped from review due to trivial changes (29)
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/simple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/iterable-expressions.vue
  • crates/biome_html_formatter/src/vue/mod.rs
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-destructuring.vue
  • .changeset/parse-vue-v-for-expressions.md
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/iterable-expressions.vue
  • crates/biome_html_syntax/src/attribute_ext.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/tuple.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/expressions.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/invalid-tuples.vue
  • xtask/codegen/src/js_kinds_src.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/quotes-and-of.vue
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/missing-parts.vue
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_rest_binding.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/src/html/any/attribute_initializer.rs
  • crates/biome_html_parser/tests/html_specs/error/vue/v-for/unterminated.vue
  • crates/biome_html_formatter/src/vue/any/mod.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/simple.vue
  • crates/biome_html_formatter/src/vue/lists/mod.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/tuple.vue
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/with-directives.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/with-directives.vue
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/destructuring.vue
  • crates/biome_html_formatter/src/vue/any/v_for_binding.rs
  • crates/biome_html_formatter/tests/specs/html/vue/v-for/quotes-and-of.vue
  • crates/biome_html_formatter/src/vue/any/v_for_binding_list_element.rs
  • crates/biome_html_formatter/src/vue/auxiliary/mod.rs
  • crates/biome_html_formatter/src/vue/any/v_for_destructured_binding.rs
🚧 Files skipped from review as they are similar to previous changes (16)
  • crates/biome_html_formatter/src/vue/value/mod.rs
  • crates/biome_html_analyze/src/lint/a11y/no_redundant_alt.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for/expressions.vue
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_tuple_element.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_in_operator.rs
  • crates/biome_service/src/file_handlers/html/parse_embedded_nodes.rs
  • xtask/codegen/src/generate_syntax_kinds.rs
  • crates/biome_html_parser/src/token_source.rs
  • crates/biome_html_formatter/src/vue/value/v_for_value.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_object_binding.rs
  • crates/biome_html_formatter/src/vue/auxiliary/v_for_array_binding.rs
  • xtask/codegen/html.ungram
  • crates/biome_html_formatter/src/vue/any/v_for_operator.rs
  • crates/biome_html_parser/tests/html_specs/ok/vue/v-for-single-quote-and-of.vue
  • crates/biome_html_parser/src/syntax/mod.rs
  • crates/biome_html_formatter/src/generated.rs

@dyc3 dyc3 force-pushed the dyc3/vue-parse-v-for branch from 22dc4bc to 5d2d449 Compare April 27, 2026 11:06
@dyc3 dyc3 merged commit 8df8f73 into main Apr 27, 2026
32 checks passed
@dyc3 dyc3 deleted the dyc3/vue-parse-v-for branch April 27, 2026 11:35
@github-actions github-actions Bot mentioned this pull request Apr 27, 2026
dyc3 added a commit that referenced this pull request Apr 27, 2026
<!--
  IMPORTANT!!
  If you generated this PR with the help of any AI assistance, please disclose it in the PR.
  https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#ai-assistance-notice
-->

<!--
	Thanks for submitting a Pull Request! We appreciate you spending the time to work on these changes.
	Please provide enough information so that others can review your PR.
	Once created, your PR will be automatically labeled according to changed files.
	Learn more about contributing: https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md
-->

## Summary

v-for parsing now handles nested destructuring

follow up to #8620

<!-- Explain the **motivation** for making this change. What existing problem does the pull request solve?-->

<!-- Link any relevant issues if necessary or include a transcript of any Discord discussion. -->

<!-- If you create a user-facing change, please write a changeset: https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#writing-a-changeset (your changeset is often a good starting point for this summary as well) -->

## Test Plan

<!-- What demonstrates that your implementation is correct? -->

## Docs

<!-- If you're submitting a new rule or action (or an option for them), the documentation is part of the code. Make sure rules and actions have example usages, and that all options are documented. -->

<!-- For other features, please submit a documentation PR to the `next` branch of our website: https://github.com/biomejs/website/. Link the PR here once it's ready. -->
dyc3 added a commit that referenced this pull request Apr 27, 2026
<!--
  IMPORTANT!!
  If you generated this PR with the help of any AI assistance, please disclose it in the PR.
  https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#ai-assistance-notice
-->

<!--
	Thanks for submitting a Pull Request! We appreciate you spending the time to work on these changes.
	Please provide enough information so that others can review your PR.
	Once created, your PR will be automatically labeled according to changed files.
	Learn more about contributing: https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md
-->

## Summary

follow up to #8620

closes #9075

<!-- Explain the **motivation** for making this change. What existing problem does the pull request solve?-->

<!-- Link any relevant issues if necessary or include a transcript of any Discord discussion. -->

<!-- If you create a user-facing change, please write a changeset: https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#writing-a-changeset (your changeset is often a good starting point for this summary as well) -->

## Test Plan

<!-- What demonstrates that your implementation is correct? -->

## Docs

<!-- If you're submitting a new rule or action (or an option for them), the documentation is part of the code. Make sure rules and actions have example usages, and that all options are documented. -->

<!-- For other features, please submit a documentation PR to the `next` branch of our website: https://github.com/biomejs/website/. Link the PR here once it's ready. -->
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Client that referenced this pull request May 4, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.13` -> `2.4.14`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.13/2.4.14) |

---

### Release Notes

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

### [`v2.4.14`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2414)

[Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14)

##### Patch Changes

- [#&#8203;9393](biomejs/biome#9393) [`491b171`](biomejs/biome@491b171) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.

- [#&#8203;10157](biomejs/biome#10157) [`eefc5ab`](biomejs/biome@eefc5ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;7882](biomejs/biome#7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.

- [#&#8203;10054](biomejs/biome#10054) [`0e9f569`](biomejs/biome@0e9f569) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.

  A function annotated `: object` returning an object literal:

  ```ts
  function f(): object {
    return { retry: true };
  }
  ```

- [#&#8203;10116](biomejs/biome#10116) [`53269eb`](biomejs/biome@53269eb) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;6201](biomejs/biome#6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.

- [#&#8203;10092](biomejs/biome#10092) [`33d8543`](biomejs/biome@33d8543) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;9097](biomejs/biome#9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.

  Given the following `organizeImports` options:

  ```json
  {
    "groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
  }
  ```

  The following code...

  ```js
  // Comment
  import "package";
  import "./file.js";
  ```

  ...was organized as:

  ```diff
  +
    // Comment
    import "package";
  +
    import "./file.js";
  ```

  A blank line was added even though the group ':NODE:' doesn't match any imports here.
  `:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
  The code is now organized as:

  ```diff
    // Comment
    import "package";
  +
    import "./file.js";
  ```

- [#&#8203;10138](biomejs/biome#10138) [`a10b6c1`](biomejs/biome@a10b6c1) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.

- [#&#8203;9922](biomejs/biome#9922) [`7acf1e0`](biomejs/biome@7acf1e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.

  Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.

- [#&#8203;10010](biomejs/biome#10010) [`f3e76ab`](biomejs/biome@f3e76ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.

- [#&#8203;10176](biomejs/biome#10176) [`8a40ef8`](biomejs/biome@8a40ef8) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10011](biomejs/biome#10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.

- [#&#8203;10163](biomejs/biome#10163) [`6867e96`](biomejs/biome@6867e96) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9884](biomejs/biome#9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.

- [#&#8203;10079](biomejs/biome#10079) [`d29dd19`](biomejs/biome@d29dd19) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@&#8203;const}` blocks. Assignments in `{@&#8203;const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.

- [#&#8203;10080](biomejs/biome#10080) [`5d8fdac`](biomejs/biome@5d8fdac) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.

  For example, the following snippets are now parsed correctly:

  ```svelte
  {#each numbers as number, index (number.toString())}
    <p>{number}</p>
  {/each}

  {#each numbers as number (key(number))}
    <p>{number}</p>
  {/each}
  ```

- [#&#8203;10140](biomejs/biome#10140) [`e7024b9`](biomejs/biome@e7024b9) Thanks [@&#8203;solithcy](https://github.com/solithcy)! - Fixed [#&#8203;10135](biomejs/biome#10135): Biome no longer crashes on missing Svelte template expressions.

  The following code snippet longer panics:

  ```svelte
  {#if }
   <p>^ this would previously crash</p>
  {/if}
  {@&#8203;const }
  <p>    ^ this would also crash</p>
  ```

- [#&#8203;10111](biomejs/biome#10111) [`7818009`](biomejs/biome@7818009) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9997](biomejs/biome#9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.

  The following snippet is no longer flagged as a duplicate:

  ```css
  .Example {
    padding: 0;
  }

  @&#8203;scope (.theme-dark) {
    .Example {
      color: white;
    }
  }
  ```

- [#&#8203;9926](biomejs/biome#9926) [`d62b331`](biomejs/biome@d62b331) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.

  For example, this code:

  ```js
  const min = a < b ? a : b;
  ```

  is much more readable when rewritten as:

  ```js
  const min = Math.min(a, b);
  ```

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.

- [#&#8203;10125](biomejs/biome#10125) [`a55a0b6`](biomejs/biome@a55a0b6) Thanks [@&#8203;bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.

- [#&#8203;10117](biomejs/biome#10117) [`895e809`](biomejs/biome@895e809) Thanks [@&#8203;denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.

  New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.

  New known value functions: `superellipse()`, `squircle()`.

- [#&#8203;8620](biomejs/biome#8620) [`8df8f73`](biomejs/biome@8df8f73) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;8062](biomejs/biome#8062): Added support for parsing Vue `v-for` directives more accurately.

- [#&#8203;10191](biomejs/biome#10191) [`aa055cd`](biomejs/biome@aa055cd) Thanks [@&#8203;guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9099](biomejs/biome#9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.

  For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:

  ```svelte
  <div>
    {name}<!-- comment -->
  </div>
  ```

  Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:

  ```html
  <div>
    <span>text</span>
  </div>
  ```

- [#&#8203;10105](biomejs/biome#10105) [`e7c1a6d`](biomejs/biome@e7c1a6d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10039](biomejs/biome#10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.

  The following patterns are now correctly flagged:

  ```ts
  const AnonClass = class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  };

  export default class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  }
  ```

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10178](biomejs/biome#10178) [`7b05a89`](biomejs/biome@7b05a89) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10177](biomejs/biome#10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.

- [#&#8203;10155](biomejs/biome#10155) [`0d4595d`](biomejs/biome@0d4595d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10045](biomejs/biome#10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
  The following snippet is now correctly formatted, matching Prettier.

  ```css
  input:not(
    :where(
      [type="submit"],
      [type="checkbox"],
      [type="radio"],
      [type="button"],
      [type="reset"]
    )
  ) {
    inline-size: 100%;
  }
  ```

- [#&#8203;10112](biomejs/biome#10112) [`6f0251e`](biomejs/biome@6f0251e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10110](biomejs/biome#10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10083](biomejs/biome#10083) [`4a664c1`](biomejs/biome@4a664c1) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.

  Fixed [#&#8203;9482](biomejs/biome#9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.

  Fixed [#&#8203;7812](biomejs/biome#7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.

- [#&#8203;9286](biomejs/biome#9286) [`52695cf`](biomejs/biome@52695cf) Thanks [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#&#8203;6316](biomejs/biome#6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.

- [#&#8203;10188](biomejs/biome#10188) [`ae659dd`](biomejs/biome@ae659dd) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9450](biomejs/biome#9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.

  ```diff
   <template>
     <UModal>
  -    <template #body> <p>content</p> </template>
  +    <template #body>
  +      <p>content</p>
  +    </template>
     </UModal>
   </template>
  ```

- [#&#8203;10118](biomejs/biome#10118) [`c6edcb4`](biomejs/biome@c6edcb4) Thanks [@&#8203;Netail](https://github.com/Netail)! - Fixed [#&#8203;10024](biomejs/biome#10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/2
OIRNOIR pushed a commit to OIRNOIR/Cloudflared-Runner that referenced this pull request May 4, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.13` -> `2.4.14`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.13/2.4.14) |

---

### Release Notes

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

### [`v2.4.14`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2414)

[Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14)

##### Patch Changes

- [#&#8203;9393](biomejs/biome#9393) [`491b171`](biomejs/biome@491b171) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.

- [#&#8203;10157](biomejs/biome#10157) [`eefc5ab`](biomejs/biome@eefc5ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;7882](biomejs/biome#7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.

- [#&#8203;10054](biomejs/biome#10054) [`0e9f569`](biomejs/biome@0e9f569) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.

  A function annotated `: object` returning an object literal:

  ```ts
  function f(): object {
    return { retry: true };
  }
  ```

- [#&#8203;10116](biomejs/biome#10116) [`53269eb`](biomejs/biome@53269eb) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;6201](biomejs/biome#6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.

- [#&#8203;10092](biomejs/biome#10092) [`33d8543`](biomejs/biome@33d8543) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;9097](biomejs/biome#9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.

  Given the following `organizeImports` options:

  ```json
  {
    "groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
  }
  ```

  The following code...

  ```js
  // Comment
  import "package";
  import "./file.js";
  ```

  ...was organized as:

  ```diff
  +
    // Comment
    import "package";
  +
    import "./file.js";
  ```

  A blank line was added even though the group ':NODE:' doesn't match any imports here.
  `:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
  The code is now organized as:

  ```diff
    // Comment
    import "package";
  +
    import "./file.js";
  ```

- [#&#8203;10138](biomejs/biome#10138) [`a10b6c1`](biomejs/biome@a10b6c1) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.

- [#&#8203;9922](biomejs/biome#9922) [`7acf1e0`](biomejs/biome@7acf1e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.

  Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.

- [#&#8203;10010](biomejs/biome#10010) [`f3e76ab`](biomejs/biome@f3e76ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.

- [#&#8203;10176](biomejs/biome#10176) [`8a40ef8`](biomejs/biome@8a40ef8) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10011](biomejs/biome#10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.

- [#&#8203;10163](biomejs/biome#10163) [`6867e96`](biomejs/biome@6867e96) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9884](biomejs/biome#9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.

- [#&#8203;10079](biomejs/biome#10079) [`d29dd19`](biomejs/biome@d29dd19) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@&#8203;const}` blocks. Assignments in `{@&#8203;const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.

- [#&#8203;10080](biomejs/biome#10080) [`5d8fdac`](biomejs/biome@5d8fdac) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.

  For example, the following snippets are now parsed correctly:

  ```svelte
  {#each numbers as number, index (number.toString())}
    <p>{number}</p>
  {/each}

  {#each numbers as number (key(number))}
    <p>{number}</p>
  {/each}
  ```

- [#&#8203;10140](biomejs/biome#10140) [`e7024b9`](biomejs/biome@e7024b9) Thanks [@&#8203;solithcy](https://github.com/solithcy)! - Fixed [#&#8203;10135](biomejs/biome#10135): Biome no longer crashes on missing Svelte template expressions.

  The following code snippet longer panics:

  ```svelte
  {#if }
   <p>^ this would previously crash</p>
  {/if}
  {@&#8203;const }
  <p>    ^ this would also crash</p>
  ```

- [#&#8203;10111](biomejs/biome#10111) [`7818009`](biomejs/biome@7818009) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9997](biomejs/biome#9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.

  The following snippet is no longer flagged as a duplicate:

  ```css
  .Example {
    padding: 0;
  }

  @&#8203;scope (.theme-dark) {
    .Example {
      color: white;
    }
  }
  ```

- [#&#8203;9926](biomejs/biome#9926) [`d62b331`](biomejs/biome@d62b331) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.

  For example, this code:

  ```js
  const min = a < b ? a : b;
  ```

  is much more readable when rewritten as:

  ```js
  const min = Math.min(a, b);
  ```

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.

- [#&#8203;10125](biomejs/biome#10125) [`a55a0b6`](biomejs/biome@a55a0b6) Thanks [@&#8203;bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.

- [#&#8203;10117](biomejs/biome#10117) [`895e809`](biomejs/biome@895e809) Thanks [@&#8203;denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.

  New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.

  New known value functions: `superellipse()`, `squircle()`.

- [#&#8203;8620](biomejs/biome#8620) [`8df8f73`](biomejs/biome@8df8f73) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;8062](biomejs/biome#8062): Added support for parsing Vue `v-for` directives more accurately.

- [#&#8203;10191](biomejs/biome#10191) [`aa055cd`](biomejs/biome@aa055cd) Thanks [@&#8203;guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9099](biomejs/biome#9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.

  For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:

  ```svelte
  <div>
    {name}<!-- comment -->
  </div>
  ```

  Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:

  ```html
  <div>
    <span>text</span>
  </div>
  ```

- [#&#8203;10105](biomejs/biome#10105) [`e7c1a6d`](biomejs/biome@e7c1a6d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10039](biomejs/biome#10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.

  The following patterns are now correctly flagged:

  ```ts
  const AnonClass = class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  };

  export default class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  }
  ```

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10178](biomejs/biome#10178) [`7b05a89`](biomejs/biome@7b05a89) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10177](biomejs/biome#10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.

- [#&#8203;10155](biomejs/biome#10155) [`0d4595d`](biomejs/biome@0d4595d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10045](biomejs/biome#10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
  The following snippet is now correctly formatted, matching Prettier.

  ```css
  input:not(
    :where(
      [type="submit"],
      [type="checkbox"],
      [type="radio"],
      [type="button"],
      [type="reset"]
    )
  ) {
    inline-size: 100%;
  }
  ```

- [#&#8203;10112](biomejs/biome#10112) [`6f0251e`](biomejs/biome@6f0251e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10110](biomejs/biome#10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10083](biomejs/biome#10083) [`4a664c1`](biomejs/biome@4a664c1) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.

  Fixed [#&#8203;9482](biomejs/biome#9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.

  Fixed [#&#8203;7812](biomejs/biome#7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.

- [#&#8203;9286](biomejs/biome#9286) [`52695cf`](biomejs/biome@52695cf) Thanks [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#&#8203;6316](biomejs/biome#6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.

- [#&#8203;10188](biomejs/biome#10188) [`ae659dd`](biomejs/biome@ae659dd) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9450](biomejs/biome#9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.

  ```diff
   <template>
     <UModal>
  -    <template #body> <p>content</p> </template>
  +    <template #body>
  +      <p>content</p>
  +    </template>
     </UModal>
   </template>
  ```

- [#&#8203;10118](biomejs/biome#10118) [`c6edcb4`](biomejs/biome@c6edcb4) Thanks [@&#8203;Netail](https://github.com/Netail)! - Fixed [#&#8203;10024](biomejs/biome#10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/Cloudflared-Runner/pulls/7
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request May 5, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.4.13` -> `2.4.14`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.13/2.4.14) |

---

### Release Notes

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

### [`v2.4.14`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2414)

[Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14)

##### Patch Changes

- [#&#8203;9393](biomejs/biome#9393) [`491b171`](biomejs/biome@491b171) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.

- [#&#8203;10157](biomejs/biome#10157) [`eefc5ab`](biomejs/biome@eefc5ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;7882](biomejs/biome#7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.

- [#&#8203;10054](biomejs/biome#10054) [`0e9f569`](biomejs/biome@0e9f569) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.

  A function annotated `: object` returning an object literal:

  ```ts
  function f(): object {
    return { retry: true };
  }
  ```

- [#&#8203;10116](biomejs/biome#10116) [`53269eb`](biomejs/biome@53269eb) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;6201](biomejs/biome#6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.

- [#&#8203;10092](biomejs/biome#10092) [`33d8543`](biomejs/biome@33d8543) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;9097](biomejs/biome#9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.

  Given the following `organizeImports` options:

  ```json
  {
    "groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
  }
  ```

  The following code...

  ```js
  // Comment
  import "package";
  import "./file.js";
  ```

  ...was organized as:

  ```diff
  +
    // Comment
    import "package";
  +
    import "./file.js";
  ```

  A blank line was added even though the group ':NODE:' doesn't match any imports here.
  `:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
  The code is now organized as:

  ```diff
    // Comment
    import "package";
  +
    import "./file.js";
  ```

- [#&#8203;10138](biomejs/biome#10138) [`a10b6c1`](biomejs/biome@a10b6c1) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.

- [#&#8203;9922](biomejs/biome#9922) [`7acf1e0`](biomejs/biome@7acf1e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.

  Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.

- [#&#8203;10010](biomejs/biome#10010) [`f3e76ab`](biomejs/biome@f3e76ab) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.

- [#&#8203;10176](biomejs/biome#10176) [`8a40ef8`](biomejs/biome@8a40ef8) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10011](biomejs/biome#10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.

- [#&#8203;10163](biomejs/biome#10163) [`6867e96`](biomejs/biome@6867e96) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9884](biomejs/biome#9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.

- [#&#8203;10079](biomejs/biome#10079) [`d29dd19`](biomejs/biome@d29dd19) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@&#8203;const}` blocks. Assignments in `{@&#8203;const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.

- [#&#8203;10080](biomejs/biome#10080) [`5d8fdac`](biomejs/biome@5d8fdac) Thanks [@&#8203;Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.

  For example, the following snippets are now parsed correctly:

  ```svelte
  {#each numbers as number, index (number.toString())}
    <p>{number}</p>
  {/each}

  {#each numbers as number (key(number))}
    <p>{number}</p>
  {/each}
  ```

- [#&#8203;10140](biomejs/biome#10140) [`e7024b9`](biomejs/biome@e7024b9) Thanks [@&#8203;solithcy](https://github.com/solithcy)! - Fixed [#&#8203;10135](biomejs/biome#10135): Biome no longer crashes on missing Svelte template expressions.

  The following code snippet longer panics:

  ```svelte
  {#if }
   <p>^ this would previously crash</p>
  {/if}
  {@&#8203;const }
  <p>    ^ this would also crash</p>
  ```

- [#&#8203;10111](biomejs/biome#10111) [`7818009`](biomejs/biome@7818009) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;9997](biomejs/biome#9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.

  The following snippet is no longer flagged as a duplicate:

  ```css
  .Example {
    padding: 0;
  }

  @&#8203;scope (.theme-dark) {
    .Example {
      color: white;
    }
  }
  ```

- [#&#8203;9926](biomejs/biome#9926) [`d62b331`](biomejs/biome@d62b331) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.

  For example, this code:

  ```js
  const min = a < b ? a : b;
  ```

  is much more readable when rewritten as:

  ```js
  const min = Math.min(a, b);
  ```

- [#&#8203;10115](biomejs/biome#10115) [`d428d76`](biomejs/biome@d428d76) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.

- [#&#8203;10125](biomejs/biome#10125) [`a55a0b6`](biomejs/biome@a55a0b6) Thanks [@&#8203;bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.

- [#&#8203;10117](biomejs/biome#10117) [`895e809`](biomejs/biome@895e809) Thanks [@&#8203;denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.

  New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.

  New known value functions: `superellipse()`, `squircle()`.

- [#&#8203;8620](biomejs/biome#8620) [`8df8f73`](biomejs/biome@8df8f73) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;8062](biomejs/biome#8062): Added support for parsing Vue `v-for` directives more accurately.

- [#&#8203;10191](biomejs/biome#10191) [`aa055cd`](biomejs/biome@aa055cd) Thanks [@&#8203;guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9099](biomejs/biome#9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.

  For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:

  ```svelte
  <div>
    {name}<!-- comment -->
  </div>
  ```

  Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:

  ```html
  <div>
    <span>text</span>
  </div>
  ```

- [#&#8203;10105](biomejs/biome#10105) [`e7c1a6d`](biomejs/biome@e7c1a6d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10039](biomejs/biome#10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.

  The following patterns are now correctly flagged:

  ```ts
  const AnonClass = class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  };

  export default class {
    #prop = 123;
    constructor() {
      console.log(this.#prop);
    }
  }
  ```

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10178](biomejs/biome#10178) [`7b05a89`](biomejs/biome@7b05a89) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10177](biomejs/biome#10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.

- [#&#8203;10155](biomejs/biome#10155) [`0d4595d`](biomejs/biome@0d4595d) Thanks [@&#8203;jiwon79](https://github.com/jiwon79)! - Fixed [#&#8203;10045](biomejs/biome#10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
  The following snippet is now correctly formatted, matching Prettier.

  ```css
  input:not(
    :where(
      [type="submit"],
      [type="checkbox"],
      [type="radio"],
      [type="button"],
      [type="reset"]
    )
  ) {
    inline-size: 100%;
  }
  ```

- [#&#8203;10112](biomejs/biome#10112) [`6f0251e`](biomejs/biome@6f0251e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10110](biomejs/biome#10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.

- [#&#8203;10141](biomejs/biome#10141) [`46a77d0`](biomejs/biome@46a77d0) Thanks [@&#8203;minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.

- [#&#8203;10083](biomejs/biome#10083) [`4a664c1`](biomejs/biome@4a664c1) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.

  Fixed [#&#8203;9482](biomejs/biome#9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.

  Fixed [#&#8203;7812](biomejs/biome#7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.

- [#&#8203;9286](biomejs/biome#9286) [`52695cf`](biomejs/biome@52695cf) Thanks [@&#8203;Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#&#8203;6316](biomejs/biome#6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.

- [#&#8203;10188](biomejs/biome#10188) [`ae659dd`](biomejs/biome@ae659dd) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.

- [#&#8203;9757](biomejs/biome#9757) [`2c62594`](biomejs/biome@2c62594) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;9450](biomejs/biome#9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.

  ```diff
   <template>
     <UModal>
  -    <template #body> <p>content</p> </template>
  +    <template #body>
  +      <p>content</p>
  +    </template>
     </UModal>
   </template>
  ```

- [#&#8203;10118](biomejs/biome#10118) [`c6edcb4`](biomejs/biome@c6edcb4) Thanks [@&#8203;Netail](https://github.com/Netail)! - Fixed [#&#8203;10024](biomejs/biome#10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Formatter Area: formatter A-Linter Area: linter A-Parser Area: parser A-Project Area: project A-Tooling Area: internal tools L-HTML Language: HTML and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

📎 Parse v-for directives more precisely.

2 participants