8000 feat(biome_service): support applying GritQL plugin rewrites via --write by chocky335 · Pull Request #9073 · biomejs/biome · GitHub
[go: up one dir, main page]

Skip to content

feat(biome_service): support applying GritQL plugin rewrites via --write - #9073

Merged
arendjr merged 39 commits into
biomejs:nextfrom
chocky335:feat/fixable-gritql-plugins
Mar 19, 2026
Merged

arendjr merged 39 commits into
biomejs:nextfrom
chocky335:feat/fixable-gritql-plugins

Conversation

@chocky335
@chocky335 chocky335 commented Feb 14, 2026 •
Copy link
Copy Markdown
Contributor

Summary

AI assistance was used during development.

Closes #5687.

Completes support for fixable GritQL plugin rewrites by wiring plugin rewrite text edits through biome check --write for JavaScript, CSS, and JSON.

register_diagnostic() now supports optional fix_kind:

  • default behavior (or fix_kind = "unsafe"): rewrite is an unsafe fix and requires --write --unsafe
  • fix_kind = "safe": rewrite is treated as safe and can be applied with --write
language js

`console.log($msg)` as $call where {
    register_diagnostic(
        span = $call,
        message = "Use console.info instead of console.log.",
        severity = "warn",
        fix_kind = "safe"
    ),
    $call => `console.info($msg)`
}

Test Plan

CLI integration tests in biome_cli/tests/commands/check.rs:

Test What it verifies
check_plugin_apply_rewrite --write --unsafe applies a plugin rewrite
check_plugin_rewrite_no_write Without --write, diagnostic shown but file not modified
check_plugin_rewrite_write_without_unsafe --write without --unsafe does not apply unsafe fix
check_plugin_multiple_rewrites Multiple matches in one file are all rewritten
check_plugin_apply_rewrite_css CSS plugin rewrite applied via --write --unsafe
check_plugin_apply_rewrite_json JSON plugin rewrite applied via --write --unsafe
check_plugin_safe_fix_write Safe plugin rewrite is applied with --write
check_plugin_safe_fix_no_write Safe plugin rewrite is suggested but not applied without --write
plugin_rewrite_pull_diagnostics LSP publishes plugin diagnostic as Warning with code "plugin"

Additional local verification:

cargo test -p biome_grit_patterns
cargo test -p biome_cli check_plugin_rewrite_write_without_unsafe
cargo test -p biome_cli check_plugin_apply_rewrite_css
cargo test -p biome_cli check_plugin_apply_rewrite_json
cargo test -p biome_cli check_plugin_safe_fix_write
cargo test -p biome_lsp plugin_rewrite_pull_diagnostics

Docs

Documentation updates have been submitted: biomejs/website#3988

@changeset-bot
changeset-bot Bot commented Feb 14, 2026 •
Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f5d2570

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

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

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-CLI Area: CLI A-Project Area: project A-Linter Area: linter L-Grit Language: GritQL labels Feb 14, 2026
@coderabbitai
coderabbitai Bot commented Feb 14, 2026 •
Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds support for fixable GritQL plugin rewrites. Introduces public types PluginActionData, PluginDiagnosticEntry, and PluginEvalResult, and changes AnalyzerPlugin::evaluate to return PluginEvalResult. Threads plugin-produced rewrite data through plugin loaders, analyzer signals, and the fix‑all flow by adding optional text_edit handling and root nodes. Implements linearization (linearize_binding, apply_effects) to materialise rewrite effects. Updates JS/CSS/JSON file handlers, CLI/LSP tests and numerous unit tests to record and apply plugin text edits and to enforce safe/unsafe rewrite semantics.

Possibly related PRs

Suggested labels

L-JSON, L-CSS

Suggested reviewers

  • dyc3
  • arendjr
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: adding support for applying GritQL plugin rewrites through the --write flag in biome_service.
Description check ✅ Passed The PR description is well-detailed and directly related to the changeset, explaining the feature, test plan, and implementation of fixable GritQL plugin rewrites.
Linked Issues check ✅ Passed The PR successfully implements the core requirements from #5687: GritQL plugins now emit fixable diagnostics, support fix metadata via fix_kind parameter, and rewrites can be applied via --write with --unsafe for unsafe fixes.
Out of Scope Changes check ✅ Passed All changes are scoped to implementing fixable GritQL plugin rewrites: analyzer plugin trait updates, text-edit handling in file handlers, linearization logic for rewrite effects, and comprehensive CLI/LSP tests.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Tip

You can validate your CodeRabbit configuration file in your editor.

If your editor has YAML language server, you can enable auto-completion and validation by adding # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json at the top of your CodeRabbit configuration file.

@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@crates/biome_grit_patterns/src/linearization.rs`:
- Around line 47-50: The code in linearize_binding uses expect("binding should
have a range") on binding.range(language), which can legitimately be None for
some Binding variants (e.g. File or Constant); replace the panicking expect with
proper error propagation by returning a GritResult::Err when range is None.
Specifically, in function linearize_binding locate the two places that call
binding.range(language) and instead handle the Option by using ok_or_else(...)
or match to produce a descriptive GritError (or use ? after converting with
.ok_or(...)), then use the obtained byte_range for
replacements.push((byte_range.start, byte_range.end, cached_text.clone())).
Ensure both occurrences (the one around replacements.push((byte_range.start,
byte_range.end, cached_text.clone())) and the second occurrence later in the
function) are changed to propagate a GritResult error instead of panicking.

In `@crates/biome_service/src/file_handlers/mod.r
10000
s`:
- Around line 845-853: record_text_edit_fix currently ignores the boolean
returned by growth_guard.check(), so runaway plugin rewrites can bypass the same
conflict detection used in process_action; update record_text_edit_fix to call
growth_guard.check(new_text_len) and handle a false result the same way as
process_action (e.g., return a Result and propagate/return a
ConflictingRuleFixesError or run the same error path), or perform the check
before pushing the FixAction and abort (return Err) when check returns false;
reference the function names record_text_edit_fix and growth_guard.check (and
mirror process_action's error handling) so the file growth guard behavior is
consistent.
🧹 Nitpick comments (7)
crates/biome_cli/tests/commands/check.rs (1)

3489-3531: Missing result assertion.

The other two new tests assert result.is_ok(), but this one silently drops the result status. Since the plugin emits a warning-level diagnostic and no --write is passed, it would be good to assert the expected outcome (likely is_err) for clarity and to catch regressions.

Proposed fix
     let (fs, result) = run_cli_with_server_workspace(
         fs,
         &mut console,
         Args::from(["check", file_path.as_str()].as_slice()),
     );
 
+    assert!(result.is_err(), "run_cli returned {result:?}");
     assert_file_contents(&fs, file_path, "console.log(\"hello\");\n");
crates/biome_plugin_loader/src/analyzer_grit_plugin.rs (2)

74-99: Consider extracting the duplicated closure into a helper.

The three match arms perform identical work (grab range + text + send-node), differing only in the downcast type. This is a pre-existing pattern, but the new fields make the duplication more visible.

Not blocking — just a future readability win.


140-146: All rewrite effects are converted to actions — even if the diagnostic has no span.

If a Grit pattern produces a rewrite effect but register_diagnostic was never called (or was called without a span), the action still gets created with the root-level source_range. This seems intentional for the current design, but worth noting that the action's source_range always covers the entire root node, not the matched sub-expression.

crates/biome_analyze/src/analyzer_plugin.rs (1)

127-153: Each diagnostic signal receives a clone of all actions — O(N×M) duplication.

When a plugin produces N diagnostics and M rewrite effects, every signal gets all M actions cloned onto it. For 3 console.log matches this means 3 signals × 3 actions = 9 AnalyzerActions emitted, even though only 3 are meaningful.

The fix-all loop and no-op guard likely handle this correctly, but:

  1. It's wasteful (N full Vec clones).
  2. It can confuse action counts in diagnostics/UX.

A future improvement could pair each diagnostic with its corresponding action(s) — e.g. by correlating the diagnostic span with the rewrite's source range.

Not blocking this PR, but worth tracking.

crates/biome_analyze/src/signals.rs (1)

188-196: Good doc comment on text_edit.

One small note: the unwrap_or_default() at the end of the or_else chain (lines 229 and 243) means a completely empty (TextRange::default(), TextEdit::default()) is produced if neither path yields a result. This is a safe fallback but could mask bugs where an action was expected to carry edits. Probably fine for now — just flagging.

crates/biome_grit_patterns/src/linearization.rs (1)

84-91: Overlapping or out-of-order replacements silently produce garbled output.

If two replacements overlap (i.e. *start < cursor after processing the previous replacement), the gap copy is silently skipped but the replacement text is still appended, leading to corrupted output. Consider adding a diagnostic or assertion when *start < cursor.

Defensive guard
     for (start, end, replacement) in &replacements {
+        if *start < cursor {
+            // Overlapping replacements — skip or error
+            continue;
+        }
         // Copy the gap from cursor to this replacement.
         if *start > cursor {
             result.push_str(&source[cursor..*start]);
         }
crates/biome_grit_patterns/src/grit_resolved_pattern.rs (1)

593-671: linearized_text() — clean delegation across all variants.

One small observation: the List variant joins with "," (no space) on line 636, while the Map variant joins with ", " (with space) on line 653. The text() method (line 772) also uses "," for lists and ", " for maps, so this is at least internally consistent. Just flagging in case the comma-only separator for lists was unintentional.

@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@crates/biome_service/src/file_handlers/mod.rs`:
- Around line 845-872: record_text_edit_fix currently pushes FixAction with
rule_name: None which makes the ConflictingRuleFixesError list empty when recent
actions are all plugin edits; update record_text_edit_fix (and the FixAction
creation) or the error-collection logic so the error preserves context: either
set a synthetic rule_name when creating the FixAction (e.g.,
Some("plugin:<plugin-id>" or Some("plugin:anonymous")) so these edits appear in
the reversed .iter().rev().filter_map(...) collection, or keep rule_name as None
but change the error construction after growth_guard.check to also count
anonymous actions and include a summary string like "plugin_edits:N" in the
rules vector passed to ConflictingRuleFixesError (modify the block that builds
rules from self.actions.iter().rev().take(10) to collect both Some(rule_name)
values and a count of None entries and include that synthetic entry in the
resulting Vec).
🧹 Nitpick comments (2)
crates/biome_grit_patterns/src/linearization.rs (2)

84-91: Defensive guard for overlapping replacements.

If two replacements ever overlap (i.e. *start < cursor), the current loop silently stitches garbled text. get_top_level_effects should prevent this by contract, but a debug_assert! or skip would be cheap insurance against subtle bugs during future refactors.

Suggested defensive check
     for (start, end, replacement) in &replacements {
-        // Copy the gap from cursor to this replacement.
-        if *start > cursor {
+        // Skip overlapping replacements (should not happen with top-level effects).
+        if *start < cursor {
+            debug_assert!(false, "overlapping replacements detected: start={start}, cursor={cursor}");
+            continue;
+        }
+        if *start > cursor {
             result.push_str(&source[cursor..*start]);
         }

11-16: Consider extracting args into a struct to avoid the too_many_arguments suppression.

Seven parameters is a lot to thread around. A small context struct (e.g. LinearizationContext { language, effects, files, memo, logs }) would tidy call sites and remove the need for #[expect(clippy::too_many_arguments)]. No rush — just something to keep in mind if the signature grows further.

@chocky335
Copy link
Copy Markdown
Contributor Author

@siketyan @dyc3 @arendjr Please review

@codspeed
codspeed Bot commented Feb 20, 2026 •
Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 58 untouched benchmarks
⏩ 156 skipped benchmarks1


Comparing chocky335:feat/fixable-gritql-plugins (f5d2570) with next (ce65710)2

Open in CodSpeed

Footnotes

  1. 156 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. ↩

  2. No successful run was found on next (4d251d4) during the generation of this report, so ce65710 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩

@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
crates/biome_grit_patterns/src/linearization.rs (1)

122-122: source.len() as u32 silently truncates for files > 4 GiB.

Unlikely to matter in practice, but a u32::try_from with a propagated error (or at least a debug_assert) would make the invariant explicit.

♻️ Suggested change
-    let range = CodeRange::new(0, source.len() as u32, source);
+    let len = u32::try_from(source.len()).map_err(|_| {
+        GritPatternError::new("source file too large for GritQL linearisation (> 4 GiB)")
+    })?;
+    let range = CodeRange::new(0, len, source);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_grit_patterns/src/linearization.rs` at line 122, The current
cast in the CodeRange construction silently truncates large files; replace
`source.len() as u32` with a checked conversion using
`u32::try_from(source.len())` and propagate the error (or return a Result) to
avoid silent truncation—i.e., compute `let len = u32::try_from(source.len())?;
let range = CodeRange::new(0, len, source);` (if changing the signature isn’t
feasible, at minimum add `debug_assert!(source.len() <= u32::MAX as usize)`
before calling `CodeRange::new` to make the invariant explicit).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_grit_patterns/src/linearization.rs`:
- Around line 87-96: The debug_assert! in linearization that currently checks
"*start >= cursor" must be turned into a runtime error so overlapping
replacements fail in release builds: replace the debug_assert! with an explicit
check (e.g., if *start < cursor) that returns a GritResult::Err (or the crate's
appropriate GritError) with a clear message including start and cursor; keep the
subsequent copying logic (the if *start > cursor branch,
result.push_str(replacement), and cursor = *end) unchanged so normal
non-overlapping behavior remains intact.
- Around line 44-59: The debug_assert that checks for overlapping replacements
should be replaced with a hard error return: when you detect an overlap (i.e.,
*start < cursor) in the code that builds `replacements` and moves `cursor`,
return a GritResult::Err (construct a GritPatternError with a clear message
about overlapping replacements and include the affected byte ranges) instead of
relying on debug-only asserts so release builds don't silently drop bytes; also
make the cycle-detection sentinel robust by handling memo.get(br) == Some(None)
explicitly—when you see Some(None) (the in-progress marker inserted by
`memo.insert(br.clone(), None)`), `continue` to short-circuit recursion rather
than relying on `get_top_level_effects` to filter it out so you avoid re-entry
and potential infinite recursion.

---

Nitpick comments:
In `@crates/biome_grit_patterns/src/linearization.rs`:
- Line 122: The current cast in the CodeRange construction silently truncates
large files; replace `source.len() as u32` with a checked conversion using
`u32::try_from(source.len())` and propagate the error (or return a Result) to
avoid silent truncation—i.e., compute `let len = u32::try_from(source.len())?;
let range = CodeRange::new(0, len, source);` (if changing the signature isn’t
feasible, at minimum add `debug_assert!(source.len() <= u32::MAX as usize)`
before calling `CodeRange::new` to make the invariant explicit).

@arendjr arendjr left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Amazing work, thank you!

@ematipico ematipico left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is exciting! Thank you @chocky335 for the PR. I left some comments. Here is what needs to be done to bring the PR to the finish line:

  • Please restore our PR template. In fact, by wiping it out, you missed an important part: documentation. You'll need to send a PR to biomejs/website, against the next branch
  • This is a new feature, so the PR needs to go to the next branch as per the contribution guidelines
  • We should at least add an LSP test, so we can validate that the diagnostics are correctly emitted
  • The CLI test covers only JavaScript, and I bet CSS and JSON don't work, as highlighted in one of my messages. I believe it's best to add tests for those too.

It's not clear why users need --unsafe, but it would be nice to have a test with --write only, and the snapshost should show that there's an unsafe fix from the plugin

Comment thread .changeset/fixable-gritql-plugins.md Resolved
Comment thread crates/biome_analyze/src/signals.rs Resolved
Comment thread crates/biome_analyze/src/signals.rs Resolved
Comment thread crates/biome_analyze/src/signals.rs Resolved
@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
crates/biome_grit_patterns/src/linearization.rs (1)

5-5: ResolvedPattern is still unused.

It's never referenced by name; effect.pattern.linearized_text(…) at line 67 resolves via the type system without requiring the import. just l would catch this.

🗑️ Proposed fix
-use grit_pattern_matcher::pattern::{FileRegistry, ResolvedPattern, get_top_level_effects};
+use grit_pattern_matcher::pattern::{FileRegistry, get_top_level_effects};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_grit_patterns/src/linearization.rs` at line 5, The import list
in linearization.rs includes ResolvedPattern but it is never referenced; remove
ResolvedPattern from the use statement (leaving FileRegistry and
get_top_level_effects) so the unused import is eliminated and the compiler
warning goes away; locate the use line that currently mentions ResolvedPattern
and delete that identifier from the comma-separated import list.
🧹 Nitpick comments (1)
crates/biome_grit_patterns/src/linearization.rs (1)

66-79: Consider checking binding.range() before calling linearized_text.

linearized_text is called unconditionally (and mutates memo) even when binding.range(language) will return None and force an early Err at line 76. Resolving the range first lets you skip the recursive call entirely for File/Empty/Constant bindings.

♻️ Proposed refactor
+        // Resolve range early; skip expensive linearization for bindings without one.
+        let byte_range = binding.range(language).ok_or_else(|| {
+            GritPatternError::new("failed to apply rewrite: binding has no byte range")
+        })?;
+
         // Recursively linearize the replacement pattern.
         let res = effect
             .pattern
             .linearized_text(language, effects, files, memo, false, logs)?;

         if let Some(ref br) = binding_range
             && matches!(effect.kind, EffectKind::Rewrite)
         {
             memo.insert(br.clone(), Some(res.to_string()));
         }

-        let byte_range = binding.range(language).ok_or_else(|| {
-            GritPatternError::new("failed to apply rewrite: binding has no byte range")
-        })?;
         replacements.push((byte_range.start, byte_range.end, res.into_owned()));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_grit_patterns/src/linearization.rs` around lines 66 - 79, Check
binding.range(language) first and return early if it is None so you avoid
calling effect.pattern.linearized_text(...) unnecessarily; move the byte_range
lookup (binding.range) above the linearized_text call, only call linearized_text
when you have a valid byte_range, and only insert into memo (binding_range and
memo.insert(...)) after computing res in the cases where EffectKind::Rewrite
applies and the binding has a range; this prevents recursing for
File/Empty/Constant bindings and keeps replacements.push((byte_range.start,
byte_range.end, res.into_owned())) safe.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_plugin_loader/src/analyzer_grit_plugin.rs`:
- Around line 146-173: Diagnostics are currently zipped with actions in order,
which can mispair rewrites when log/missing-span diagnostics are present; change
the logic that builds entries by first splitting diagnostics into "real"
diagnostics that can accept an action (e.g., those with a valid span or that
originated from query diagnostics) and "other" diagnostics (logs/missing span),
then drain actions and assign them only to the real diagnostics (update
PluginActionData.applicability as done with action_iter), and finally
reconstruct the full entries list by mapping real diagnostics to
PluginDiagnosticEntry { diagnostic, action } and other diagnostics to
PluginDiagnosticEntry { diagnostic, action: None } preserving original order;
update code around variables result.effects, actions, diagnostics, action_iter
and PluginDiagnosticEntry to implement this stable pairing.

---

Duplicate comments:
In `@crates/biome_grit_patterns/src/linearization.rs`:
- Line 5: The import list in linearization.rs includes ResolvedPattern but it is
never referenced; remove ResolvedPattern from the use statement (leaving
FileRegistry and get_top_level_effects) so the unused import is eliminated and
the compiler warning goes away; locate the use line that currently mentions
ResolvedPattern and delete that identifier from the comma-separated import list.

---

Nitpick comments:
In `@crates/biome_grit_patterns/src/linearization.rs`:
- Around line 66-79: Check binding.range(language) first and return early if it
is None so you avoid calling effect.pattern.linearized_text(...) unnecessarily;
move the byte_range lookup (binding.range) above the linearized_text call, only
call linearized_text when you have a valid byte_range, and only insert into memo
(binding_range and memo.insert(...)) after computing res in the cases where
EffectKind::Rewrite applies and the binding has a range; this prevents recursing
for File/Empty/Constant bindings and keeps replacements.push((byte_range.start,
byte_range.end, res.into_owned())) safe.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8826fa and 4cffff9.

⛔ Files ignored due to path filters (2)
  • crates/biome_cli/tests/snapshots/main_commands_check/check_plugin_invalid_fix_kind.snap is excluded by !**/*.snap and included by **
  • crates/biome_cli/tests/snapshots/main_commands_check/check_plugin_invalid_severity.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (3)
  • crates/biome_cli/tests/commands/check.rs
  • crates/biome_grit_patterns/src/linearization.rs
  • crates/biome_plugin_loader/src/analyzer_grit_plugin.rs

@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_plugin_loader/src/analyzer_grit_plugin.rs`:
- Around line 153-168: The current check uses entries (which includes log-only
entries) to detect missing spans and can produce false positives; change the
logic to only inspect diagnostic entries before adding the
PluginDiagnosticEntry. Concretely, collect or iterate the diagnostic iterator
(diag_entries) separately (e.g., into a vec or by peeking its items) and run the
is_none() span check on those diagnostic entries only; only if that
diagnostic-only check returns true, push the PluginDiagnosticEntry (the
RuleDiagnostic message referencing name) into entries, leaving log_entries
untouched.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4cffff9 and 72df848.

📒 Files selected for processing (1)
  • crates/biome_plugin_loader/src/analyzer_grit_plugin.rs

@coderabbitai coderabbitai Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
crates/biome_plugin_loader/src/analyzer_grit_plugin.rs (1)

121-131: Potential memory bloat from cloning full source text per action.
Each rewrite clones original_text, so many rewrites in large files can balloon memory. Consider sharing the text or storing it once and referencing it.

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

In `@crates/biome_plugin_loader/src/analyzer_grit_plugin.rs` around lines 121 -
131, The code clones full original_text for every PluginActionData, causing
memory bloat; fix by sharing the text (e.g., create a single Arc<String> or
Rc<String> from original_text before building actions and store that in
PluginActionData.original_text instead of String) and update the creation site
inside the GritQueryEffect::Rewrite handling (where actions/let mut actions is
built) to use Arc::clone(&shared_text) so only cheap clones occur; also adjust
PluginActionData's original_text type to Arc<String> (or &str with appropriate
lifetimes) to avoid per-action String allocations.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_plugin_loader/src/analyzer_grit_plugin.rs`:
- Around line 233-245: The match in analyzer_grit_plugin.rs that sets the
default diagnostic severity currently returns Severity::Error when severity is
None; change that default to the enum's default variant (Severity::Information)
so register_diagnostic() aligns with the Severity enum's #[default]. Update the
None arm in the match that assigns to the local variable named severity (the
block starting with "let severity = match severity.as_ref()") to use
Severity::Information instead of Severity::Error.

---

Nitpick comments:
In `@crates/biome_plugin_loader/src/analyzer_grit_plugin.rs`:
- Around line 121-131: The code clones full original_text for every
PluginActionData, causing memory bloat; fix by sharing the text (e.g., create a
single Arc<String> or Rc<String> from original_text before building actions and
store that in PluginActionData.original_text instead of String) and update the
creation site inside the GritQueryEffect::Rewrite handling (where actions/let
mut actions is built) to use Arc::clone(&shared_text) so only cheap clones
occur; also adjust PluginActionData's original_text type to Arc<String> (or &str
with appropriate lifetimes) to avoid per-action String allocations.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 72df848 and 11f2bc5.

📒 Files selected for processing (1)
  • crates/biome_plugin_loader/src/analyzer_grit_plugin.rs

@arendjr
arendjr commented Feb 25, 2026
Copy link
Copy Markdown
Contributor

@morgante do you maybe have some time looking at this PR? When I was porting to Biome, some of the rewrite logic from Grit also went over my head 😅

Comment thread .changeset/fixable-gritql-plugins.md Resolved
@ematipico ematipico added this to the Biome v2.5 milestone Feb 25, 2026
@ematipico
ematipico requested a review from morgante February 25, 2026 22:02
@ematipico ematipico left a 10BC8 comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would like @morgante 's review in this one

@morgante
Copy link
Copy Markdown
Contributor

I can take a look this weekend.

chocky335 and others added 5 commits March 14, 2026 00:24
…-plugins

# Conflicts:
#	crates/biome_analyze/src/analyzer_plugin.rs
#	crates/biome_analyze/src/lib.rs
#	crates/biome_cli/tests/commands/check.rs
- Remove Limit arm from extract_contains_inner to prevent limit bypass
- Guard Sequential extraction to single-step only
- Add input_matches is_none guard matching exec_step behavior
- Reset state.effects after applying rewrites
@chocky335
Copy link
Copy Markdown
Contributor Author

@morgante any luck here?

@arendjr
arendjr commented Mar 19, 2026
Copy link
Copy Markdown
Contributor

Seeing how the PR does have good test coverage, and the conflicts are resolved now, let's merge this.

@arendjr
arendjr merged commit 74b20ee into biomejs:next Mar 19, 2026
33 checks passed
@morgante
Copy link
Copy Markdown
Contributor

Sorry for the delay! I did skim through it and found no major issues.

@github-actions github-actions Bot mentioned this pull request Jun 4, 2026
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request Jun 19, 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 | minor | [`2.4.16` -> `2.5.0`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.16/2.5.0) |

---

### Release Notes

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

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

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

##### Minor Changes

- [#&#8203;9539](https://github.com/biomejs/biome/pull/9539) [`f0615fd`](https://github.com/biomejs/biome/commit/f0615fdae80fa7257fc1d0448d2027cb1acff46e) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added a new reporter called `concise`. When `--reporter=concise` is passed the commands `format`, `lint`, `check` and `ci`, the diagnostics are printed in a compact manner:

  ```
  ! index.ts:2:10: lint/correctness/noUnusedImports: Several of these imports are unused.
  ! main.ts:9:7: lint/correctness/noUnusedVariables: This variable f is unused.
  × index.ts:8:5: lint/suspicious/noImplicitAnyLet: This variable implicitly has the any type.
  × main.ts:2:10: lint/suspicious/noRedeclare: Shouldn't redeclare 'z'. Consider to delete it or rename it.
  ```

- [#&#8203;9495](https://github.com/biomejs/biome/pull/9495) [`2056b23`](https://github.com/biomejs/biome/commit/2056b23812a17f9c9a9015e5b725faecb04647b5) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Added the [`useKeyWithClickEvents`](https://biomejs.dev/linter/rules/use-key-with-click-events/) a11y lint rule for HTML files (`.html`, `.vue`, `.svelte`, `.astro`). This is a port of the existing JSX rule. The rule enforces that elements with an `onclick` handler also have at least one keyboard event handler (`onkeydown`, `onkeyup`, or `onkeypress`) to ensure keyboard accessibility.

  Inherently keyboard-accessible elements (`<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, `<option>`) are excluded, as are elements hidden from assistive technologies (`aria-hidden`) or with `role="presentation"` / `role="none"`.

  ```html
  <!-- Invalid: no keyboard handler -->
  <div >Click me</div>

  <!-- Valid: has keyboard handler -->
  <div  >Click me</div>

  <!-- Valid: inherently keyboard-accessible -->
  <button >Submit</button>
  ```

- [#&#8203;9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes/) for HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used in `class="..."` (or `className`) attributes that are not defined in any `<style>` block or linked stylesheet reachable from the file.

  ```html
  <!-- .typo is used but never defined -->
  <html>
    <head>
      <style>
        .button {
          color: blue;
        }
      </style>
    </head>
    <body>
      <div class="button typo"></div>
    </body>
  </html>
  ```

- [#&#8203;9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUnusedClasses`](https://biomejs.dev/linter/rules/no-unused-classes/) for CSS. The rule detects CSS class selectors that are never referenced in any HTML or JSX file that imports the stylesheet. This is a project-domain rule that requires the module graph.

  ```css
  /* styles.css — .ghost is never used in any importing file */
  .button {
    color: blue;
  }
  .ghost {
    color: red;
  }
  ```

  ```jsx
  /* App.jsx */
  import "./styles.css";
  export default () => <div className="button" />;
  ```

- [#&#8203;9546](https://github.com/biomejs/biome/pull/9546) [`6567efa`](https://github.com/biomejs/biome/commit/6567efa51ba074436b017e49b1d2d369e7252e74) Thanks [@&#8203;nhedger](https://github.com/nhedger)! - Added a `biome upgrade` command for standalone installations. It upgrades Homebrew installs with `brew upgrade biome`, updates manually installed binaries from the latest GitHub release, and tells npm users to upgrade with their package manager instead.

- [#&#8203;9716](https://github.com/biomejs/biome/pull/9716) [`701767a`](https://github.com/biomejs/biome/commit/701767a3c4de8bce032933588ef2b6e5e252919f) Thanks [@&#8203;faizkhairi](https://github.com/faizkhairi)! - Added the HTML version of the [`useHeadingContent`](https://biomejs.dev/linter/rules/use-heading-content/) rule. The rule now enforces that heading elements (`h1`-`h6`) have content accessible to screen readers in HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: empty heading -->
  <h1></h1>

  <!-- Invalid: heading hidden from screen readers -->
  <h1 aria-hidden="true">invisible content</h1>

  <!-- Valid: heading with text content -->
  <h1>heading</h1>

  <!-- Valid: heading with accessible name -->
  <h1 aria-label="Screen reader content"></h1>
  ```

- [#&#8203;9582](https://github.com/biomejs/biome/pull/9582) [`f437ef8`](https://github.com/biomejs/biome/commit/f437ef8b6b0eb8f909d523950cf2c543042083d5) Thanks [@&#8203;rahuld109](https://github.com/rahuld109)! - Added the HTML version of the [`useKeyWithMouseEvents`](https://biomejs.dev/linter/rules/use-key-with-mouse-events/) rule. The rule now enforces that `onmouseover` is accompanied by `onfocus` and `onmouseout` is accompanied by `onblur` in HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: onmouseover without onfocus -->
  <div ></div>

  <!-- Valid: onmouseover paired with onfocus -->
  <div  ></div>
  ```

- [#&#8203;9275](https://github.com/biomejs/biome/pull/9275) [`1fdbcee`](https://github.com/biomejs/biome/commit/1fdbceea62d373f24da9c1e5cc0cdd169b573e84) Thanks [@&#8203;ff1451](https://github.com/ff1451)! - Added the new assist action [`useSortedTypeFields`](https://biomejs.dev/assist/actions/use-sorted-type-fields/), which sorts the fields of GraphQL object types, interface types and input object types alphabetically, e.g. `name, age, id` becomes `age, id, name`.

- [#&#8203;10561](https://github.com/biomejs/biome/pull/10561) [`78075b7`](https://github.com/biomejs/biome/commit/78075b7c7cb7490c730a96f4ee9776c9e77826e7) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added a new `style` option to [useExportType](https://biomejs.dev/linter/rules/use-export-type/),
  which enforces a style for exporting types.
  This is the same option as the one provided by `useImportType`.

- [#&#8203;8987](https://github.com/biomejs/biome/pull/8987) [`d16e32b`](https://github.com/biomejs/biome/commit/d16e32b5b971a4ed9cd3bf5098782c8b752af69a) Thanks [@&#8203;DerTimonius](https://github.com/DerTimonius)! - Ported the [`useValidAnchor`](https://biomejs.dev/linter/rules/use-valid-anchor/) rule to HTML. This rule enforces that all anchors are valid and that they are navigable elements.

- [#&#8203;9533](https://github.com/biomejs/biome/pull/9533) [`4d251d4`](https://github.com/biomejs/biome/commit/4d251d489cfd33a83e42d425476f8d6c66b72d9b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - The `init` command now prints the Biome logo.

- [#&#8203;10069](https://github.com/biomejs/biome/pull/10069) [`0eb9310`](https://github.com/biomejs/biome/commit/0eb93109e1f9bfbb20744961681b4f0b9b781ad5) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/), which enforces that static, visible elements (such as `<div>`) that have click handlers use the valid role attribute.

  **Invalid**:

  ```html
  <div ></div>
  ```

- [#&#8203;9134](https://github.com/biomejs/biome/pull/9134) [`2a43488`](https://github.com/biomejs/biome/commit/2a434882746d31e1bd3c8e0d711372a539ce88f8) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added the assist action [`useSortedPackageJson`](https://biomejs.dev/assist/actions/use-sorted-package-json).

  This action organizes package.json fields according to the same conventions as the popular [sort-package-json](https://github.com/keithamus/sort-package-json) tool.

- [#&#8203;9309](https://github.com/biomejs/biome/pull/9309) [`7daa18b`](https://github.com/biomejs/biome/commit/7daa18b07f7ab348942f4cb83b475e6a4b3d1125) Thanks [@&#8203;Bertie690](https://github.com/Bertie690)! - The `allowDoubleNegation` option has been added to [`noImplicitCoercions`](https://biomejs.dev/linter/rules/no-implicit-coercions) to allow ignoring double negations inside code.

  With the option enabled, the following example is considered valid and is ignored by the rule:

  ```js
  const truthy = !!value;
  ```

- [#&#8203;9700](https://github.com/biomejs/biome/pull/9700) [`894f3fb`](https://github.com/biomejs/biome/commit/894f3fb4c664b12ff9abd1527b535621fe4e22f6) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - The Biome Language server now supports the "go-to definition" feature.

  When the cursor of the mouse is hovering an entity (variable, CSS class, type, etc.), and the command <kbd>CTRL</kbd> + click is triggered, the editor jumps to where this entity is defined, if the language server can find it.

  Here's what Biome is able to resolve:

  - Variables and types used in JavaScript modules, defined in the same file or imported from another module.
  - JSX Components used in JavaScript modules, defined in the same file or imported from another module.
  - CSS classes used in JSX and HTML-ish files (Vue, Svelte and Astro), and defined in CSS files.
  - Components used in HTML-ish files and defined in other HTML-ish.
  - Variables used in HTML-ish files and defined in the same file or imported from another module (JavaScript or HTML-ish).

- [#&#8203;10070](https://github.com/biomejs/biome/pull/10070) [`bae0710`](https://github.com/biomejs/biome/commit/bae071050f5a9c335b4483ee384f21ac1e6f0b4d) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added the `:STYLE:` group matcher for [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) that matches style imports.

  For example, the following configuration...

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": {
              "groups": ["**", "!:STYLE:"],
              "sortBareImports": true
            }
          }
        }
      }
    }
  }
  ```

  ...places style imports last:

  ```diff
  - import "./style.css"
    import A from "./a.js"
  + import "./style.css"
  ```

- [#&#8203;9170](https://github.com/biomejs/biome/pull/9170) [`e3107de`](https://github.com/biomejs/biome/commit/e3107deedcff0f02b61702c6645d89e8d8635b49) Thanks [@&#8203;mdrobny](https://github.com/mdrobny)! - Added `bundleDependencies` option to [NoUndeclaredDependencies](https://biomejs.dev/linter/rules/no-undeclared-dependencies) rule.

  This rule now supports imports of packages that are defined only in `bundleDependencies` and `bundledDependencies` arrays.

- [#&#8203;9547](https://github.com/biomejs/biome/pull/9547) [`01f8473`](https://github.com/biomejs/biome/commit/01f847317820f805698e1b8ba9eaa8fa6c26205c) Thanks [@&#8203;mujpao](https://github.com/mujpao)! - Added new assist rule [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) for HTML, porting the existing JSX rule. This rule enforces sorted HTML attributes.

  **Invalid**

  ```html
  <input type="text" id="name" name="name" />
  ```

- [#&#8203;9366](https://github.com/biomejs/biome/pull/9366) [`2ca1117`](https://github.com/biomejs/biome/commit/2ca1117f1e63f6cd99c0ce8d4b82475625838e2e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the `html.parser.vue` configuration option. When enabled, it adds support for the parsing of Vue in `.html` files. Most Vue users don't need to enable this option since Vue files typically use the `.vue` extension, but it can be useful for projects that embed Vue syntax in regular HTML files.

- [#&#8203;9073](https://github.com/biomejs/biome/pull/9073) [`74b20ee`](https://github.com/biomejs/biome/commit/74b20eee556c9acc72ad5ea335b1bf0983d2eb2e) Thanks [@&#8203;chocky335](https://github.com/chocky335)! - Added support for applying GritQL plugin rewrites as code actions. GritQL plugins that use the rewrite operator (`=>`) now produce fixable diagnostics for JavaScript, CSS, and JSON files. By default, plugin rewrites are treated as unsafe fixes and require `--write --unsafe` to apply. Plugin authors can pass `fix_kind = "safe"` to `register_diagnostic()` to mark a fix as safe, allowing it to be applied with just `--write`.

  **Example plugin** (`useConsoleInfo.grit`):

  ```grit
  language js

  `console.log($msg)` as $call where {
      register_diagnostic(span = $call, message = "Use console.info instead of console.log.", severity = "warn", fix_kind = "safe"),
      $call => `console.info($msg)`
  }
  ```

  Running `biome check --write` applies safe rewrites. Unsafe rewrites (the default, or `fix_kind = "unsafe"`) still require `--write --unsafe`.

- [#&#8203;9384](https://github.com/biomejs/biome/pull/9384) [`f4c9edc`](https://github.com/biomejs/biome/commit/f4c9edca8f8772a1e65d9e6701fdc3f604a9f3fe) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added the `sortBareImports` option to [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/),
  which allows bare imports to be sorted within other imports when set to `false`.

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": { "sortBareImports": true }
          }
        }
      }
    }
  }
  ```

  ```diff
  - import "b";
    import "a";
  + import "b";
    import { A } from "a";
  + import "./file";
    import { Local } from "./file";
  - import "./file";
  ```

- [#&#8203;8731](https://github.com/biomejs/biome/pull/8731) [`e7872bf`](https://github.com/biomejs/biome/commit/e7872bffba88f60d6c3cb6d0c2dd7a25452a0205) Thanks [@&#8203;siketyan](https://github.com/siketyan)! - Added the watch mode (`--watch`) to the CLI for `check`/`format`/`lint` commands. By enabling this option, Biome will re-run the check automatically when any file in the workspace has changed after the first run.

- [#&#8203;10106](https://github.com/biomejs/biome/pull/10106) [`9b35f78`](https://github.com/biomejs/biome/commit/9b35f78e183edf44a3d8b7077ebb0c548a7e92f5) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Biome can now format and lint `.svg` files.

- [#&#8203;9967](https://github.com/biomejs/biome/pull/9967) [`e9b6c17`](https://github.com/biomejs/biome/commit/e9b6c17cd6f7e870aea68da3b6c6474aa1a9b4f6) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added HTML support for [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/). Biome now reports HTML files that exceed the configured line limit, including when `skipBlankLines` is enabled.

- [#&#8203;9491](https://github.com/biomejs/biome/pull/9491) [`b3eb63c`](https://github.com/biomejs/biome/commit/b3eb63c7e19e6ebd41e463289de098bb003686e1) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noAriaUnsupportedElements`](https://biomejs.dev/linter/rules/no-aria-unsupported-elements/). This rule enforces that elements that do not support ARIA roles, states, and properties (`meta`, `html`, `script`, `style`) do not have `role` or `aria-*` attributes.

  ```html
  <!-- Invalid: meta does not support aria attributes -->
  <meta charset="UTF-8" role="meta" />
  ```

- [#&#8203;9306](https://github.com/biomejs/biome/pull/9306) [`afd57a6`](https://github.com/biomejs/biome/commit/afd57a634bdb6b0b161dc8a2522ac460503569b1) Thanks [@&#8203;viraxslot](https://github.com/viraxslot)! - Added the [`noNoninteractiveTabindex`](https://biomejs.dev/linter/rules/no-noninteractive-tabindex/) lint rule for HTML. This rule enforces that `tabindex` is not used on non-interactive elements, as it can cause usability issues for keyboard users.

  ```html
  <div tabindex="0">Invalid: non-interactive element</div>
  `
  ```

- [#&#8203;9276](https://github.com/biomejs/biome/pull/9276) [`6d041d9`](https://github.com/biomejs/biome/commit/6d041d919e06595553093e084e6aad0d39fb8109) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noRedundantRoles`](https://biomejs.dev/linter/rules/no-redundant-roles/). This rule enforces that explicit `role` attributes are not the same as the implicit/default role of an HTML element. It supports HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: role="button" is redundant on <button> -->
  <button role="button"></button>
  ```

- [#&#8203;9813](https://github.com/biomejs/biome/pull/9813) [`69aadc2`](https://github.com/biomejs/biome/commit/69aadc27741bb8a74c926e14a2a9777064cb1e03) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added a new linter configuration called `preset`. With the new option, users can enable different kinds of rules at once.

  The following presets are available:

  - `"recommended"`: it enables all Biome-recommended rules, or recommended rules of a group;
  - `"all"`: it enables all Biome rules, or enables all rules of a group;
  - `"none"`: it disables all Biome rules, or disable all rules of a group.

  You can enable recommended rules:

  ```json
  {
    "linter": {
      "rules": {
        "preset": "recommended"
      }
    }
  }
  ```

  You can enable **all rules** at once:

  ```json5
  {
    linter: {
      rules: {
        preset: "all", // enables all rules
      },
    },
  }
  ```

  Or enable all rules for a group:

  ```json5
  {
    linter: {
      rules: {
        style: {
          preset: "all", // enables all rules in the style group
        },
      },
    },
  }
  ```

  This new option, however, doesn't affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature.

  This new option is meant to replace `recommended`, so make sure to run the `migrate` command.

- [#&#8203;10022](https://github.com/biomejs/biome/pull/10022) [`3422d71`](https://github.com/biomejs/biome/commit/3422d71bc5e9d7f07fd4e7509566427e1591d760) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementToInteractiveRole`](https://biomejs.dev/linter/rules/no-noninteractive-element-to-interactive-role/), which enforces that interactive ARIA roles are not assigned to non-interactive HTML elements.

  **Invalid**:

  ```html
  <h1 role="checkbox"></h1>
  ```

- [#&#8203;8396](https://github.com/biomejs/biome/pull/8396) [`13785fc`](https://github.com/biomejs/biome/commit/13785fc8f4be068eccff84a8ad90ac8530d5c992) Thanks [@&#8203;apple-yagi](https://github.com/apple-yagi)! - Biome now supports pnpm catalogs (default and named) when resolving dependencies for linting. This behavior is opt-in and requires setting `javascript.resolver.experimentalPnpmCatalogs` to `true`.

- [#&#8203;10028](https://github.com/biomejs/biome/pull/10028) [`1009414`](https://github.com/biomejs/biome/commit/100941409f3ec5e6653e92b2cfbb4100df1becb0) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/), which enforces that non-interactive ARIA roles are not assigned to interactive HTML elements.

  **Invalid**:

  ```html
  <input role="img" />
  ```

- [#&#8203;9853](https://github.com/biomejs/biome/pull/9853) [`816302f`](https://github.com/biomejs/biome/commit/816302f8c8c9862585c283fce22ffd1817dedf9f) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the new assist action [`useSortedSelectionSet`](https://biomejs.dev/assist/actions/use-sorted-selection-set/), which sorts GraphQL selection sets alphabetically, e.g. `name, age, id` becomes `age, id, name`.

  **Invalid**:

  ```graphql
  query {
    name
    age
    id
  }
  ```

- [#&#8203;10074](https://github.com/biomejs/biome/pull/10074) [`9c7c6eb`](https://github.com/biomejs/biome/commit/9c7c6eb99f6880aa87ae0e7aff357e978361c4a3) Thanks [@&#8203;georgephillips](https://github.com/georgephillips)! - Added a `kind` field to the `ImportMatcher` used by the [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) assist action. The new field selects imports by their syntactic kind and currently supports `bare` (matching side-effect imports such as `import "polyfill"`) with optional `!` negation (`!bare`). The matcher composes with the existing `type` and `source` fields, so users can express patterns such as "only bare imports that import a CSS file" (`{ "kind": "bare", "source": "**/*.css" }`).

  For example, with the following configuration:

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": {
              "sortBareImports": true,
              "groups": [
                { "kind": "!bare" },
                ":BLANK_LINE:",
                { "kind": "bare" }
              ]
            }
          }
        }
      }
    }
  }
  ```

  ...the following code:

  ```ts
  import "./register-my-component";
  import { render } from "react-dom";
  import "./polyfill";
  import { Button } from "@&#8203;/components/Button";
  ```

  ...is organized as:

  ```ts
  import { render } from "react-dom";
  import { Button } from "@&#8203;/components/Button";

  import "./polyfill";
  import "./register-my-component";
  ```

- [#&#8203;9171](https://github.com/biomejs/biome/pull/9171) [`ce65710`](https://github.com/biomejs/biome/commit/ce65710f591eb2676df6833e9cd00e310981692b) Thanks [@&#8203;chocky335](https://github.com/chocky335)! - Added `includes` option for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.

  ```json
  {
    "plugins": [
      "global-plugin.grit",
      {
        "path": "scoped-plugin.grit",
        "includes": ["src/**/*.ts", "!**/*.test.ts"]
      }
    ]
  }
  ```

- [#&#8203;9617](https://github.com/biomejs/biome/pull/9617) [`dcb99ef`](https://github.com/biomejs/biome/commit/dcb99ef0305d8431af40b526c449316bb8a70efa) Thanks [@&#8203;faizkhairi](https://github.com/faizkhairi)! - Ported [`useAriaActivedescendantWithTabindex`](https://biomejs.dev/linter/rules/use-aria-activedescendant-with-tabindex/) a11y rule to HTML.

- [#&#8203;9496](https://github.com/biomejs/biome/pull/9496) [`1dfb829`](https://github.com/biomejs/biome/commit/1dfb8291a0a2340e7c9220f9126317a7490ec466) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Added HTML support for the [`noAriaHiddenOnFocusable`](https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable/) accessibility lint rule, which enforces that `aria-hidden="true"` is not set on focusable elements. Focusable elements include native interactive elements (`<button>`, `<input>`, `<select>`, `<textarea>`), elements with `href` (`<a>`, `<area>`), elements with `tabindex >= 0`, and editing hosts (`contenteditable`). Includes an unsafe fix to remove the `aria-hidden` attribute.

  ```html
  <!-- Invalid: aria-hidden on a focusable element -->
  <button aria-hidden="true">Submit</button>

  <!-- Valid: aria-hidden on a non-focusable element -->
  <div aria-hidden="true">decorative content</div>
  ```

- [#&#8203;9792](https://github.com/biomejs/biome/pull/9792) [`f516854`](https://github.com/biomejs/biome/commit/f51685404f015a5c6f0fc87b9070ac5d9f0a7b6b) Thanks [@&#8203;Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Added the [`useSemanticElements`](https://biomejs.dev/linter/rules/use-semantic-elements/) lint rule for HTML. The rule now detects the use of `role` attributes in HTML elements and suggests using semantic elements instead.

  For example, the following code is now flagged:

  ```html
  <div role="navigation"></div>
  ```

  The rule suggests using `<nav>` instead.

- [#&#8203;9761](https://github.com/biomejs/biome/pull/9761) [`cbbb7d5`](https://github.com/biomejs/biome/commit/cbbb7d5bf21d8fb6db275da7adcc03c034538635) Thanks [@&#8203;Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Ported the [`useValidAriaProps`](https://biomejs.dev/linter/rules/use-valid-aria-props/) lint rule to HTML. This rule checks that all `aria-*` attributes used in HTML elements are valid ARIA attributes as defined by the WAI-ARIA specification.

- [#&#8203;9928](https://github.com/biomejs/biome/pull/9928) [`aa82576`](https://github.com/biomejs/biome/commit/aa82576ff66e03924e07729051ac9bfc59cd5aa1) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Ported [`useValidAriaValues`](https://biomejs.dev/linter/rules/use-valid-aria-values/) to HTML. Biome now validates static `aria-*` attribute values in HTML elements against WAI-ARIA types, catching invalid values such as `aria-hidden="yes"`.

- [#&#8203;10562](https://github.com/biomejs/biome/pull/10562) [`6642895`](https://github.com/biomejs/biome/commit/66428957e6ca393a802f365b8e643438f19a3039) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Promoted 73 nursery rules to stable groups.

  Four rules were renamed as part of the promotion:

  - `noFloatingClasses` is now [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/), because the rule checks any discarded `new` expression, not only classes.
  - `noMultiStr` is now [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/).
  - `useFind` is now [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/).
  - `useSpread` is now [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/), because the rule enforces spread call arguments over `Function.apply()`, not array or object spread.

##### Correctness

Promoted the following rules to the `correctness` group:

- [`noBeforeInteractiveScriptOutsideDocument`](https://biomejs.dev/linter/rules/no-before-interactive-script-outside-document/)
- [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/)
- [`useInlineScriptId`](https://biomejs.dev/linter/rules/use-inline-script-id/) (recommended, Next.js domain)
- [`noVueVIfWithVFor`](https://biomejs.dev/linter/rules/no-vue-v-if-with-v-for/) (recommended, Vue domain)
- [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/) (recommended, Vue domain)
- [`useVueValidVElse`](https://biomejs.dev/linter/rules/use-vue-valid-v-else/) (recommended, Vue domain)
- [`useVueValidVElseIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-else-if/) (recommended, Vue domain)
- [`useVueValidVHtml`](https://biomejs.dev/linter/rules/use-vue-valid-v-html/) (recommended, Vue domain)
- [`useVueValidVIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-if/) (recommended, Vue domain)
- [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) (recommended, Vue domain)
- [`useVueValidVText`](https://biomejs.dev/linter/rules/use-vue-valid-v-text/) (recommended, Vue domain)
- [`useVueValidTemplateRoot`](https://biomejs.dev/linter/rules/use-vue-valid-template-root/) (recommended, Vue domain)
- [`useVueValidVCloak`](https://biomejs.dev/linter/rules/use-vue-valid-v-cloak/) (recommended, Vue domain)
- [`useVueValidVOnce`](https://biomejs.dev/linter/rules/use-vue-valid-v-once/) (recommended, Vue domain)
- [`useVueValidVPre`](https://biomejs.dev/linter/rules/use-vue-valid-v-pre/) (recommended, Vue domain)
- [`useVueVForKey`](https://biomejs.dev/linter/rules/use-vue-v-for-key/) (recommended, Vue domain)
- [`noDuplicateAttributes`](https://biomejs.dev/linter/rules/no-duplicate-attributes/) (recommended)
- [`noDuplicateArgumentNames`](https://biomejs.dev/linter/rules/no-duplicate-argument-names/) (recommended)
- [`noDuplicateInputFieldNames`](https://biomejs.dev/linter/rules/no-duplicate-input-field-names/) (recommended)
- [`noDuplicateVariableNames`](https://biomejs.dev/linter/rules/no-duplicate-variable-names/) (recommended)
- [`noDuplicateEnumValueNames`](https://biomejs.dev/linter/rules/no-duplicate-enum-value-names/) (recommended)
- [`useLoneAnonymousOperation`](https://biomejs.dev/linter/rules/use-lone-anonymous-operation/) (recommended)

##### Suspicious

Promoted the following rules to the `suspicious` group:

- [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/)
- [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/)
- [`noParametersOnlyUsedInRecursion`](https://biomejs.dev/linter/rules/no-parameters-only-used-in-recursion/)
- [`noUnknownAttribute`](https://biomejs.dev/linter/rules/no-unknown-attribute/)
- [`useArraySortCompare`](https://biomejs.dev/linter/rules/use-array-sort-compare/)
- [`noForIn`](https://biomejs.dev/linter/rules/no-for-in/)
- [`noDuplicatedSpreadProps`](https://biomejs.dev/linter/rules/no-duplicated-spread-props/)
- [`noEqualsToNull`](https://biomejs.dev/linter/rules/no-equals-to-null/)
- [`noProto`](https://biomejs.dev/linter/rules/no-proto/) (recommended)
- [`noUndeclaredEnvVars`](https://biomejs.dev/linter/rules/no-undeclared-env-vars/) (recommended, Turborepo domain)
- [`noReturnAssign`](https://biomejs.dev/linter/rules/no-return-assign/) (default severity: `error`)
- [`noDuplicateEnumValues`](https://biomejs.dev/linter/rules/no-duplicate-enum-values/) (recommended)
- [`noVueArrowFuncInWatch`](https://biomejs.dev/linter/rules/no-vue-arrow-func-in-watch/) (recommended, Vue domain)
- [`noNestedPromises`](https://biomejs.dev/linter/rules/no-nested-promises/)
- [`noLeakedRender`](https://biomejs.dev/linter/rules/no-leaked-render/)
- [`noDeprecatedMediaType`](https://biomejs.dev/linter/rules/no-deprecated-media-type/) (recommended)
- [`noDuplicateGraphqlOperationName`](https://biomejs.dev/linter/rules/no-duplicate-graphql-operation-name/)
- [`useRequiredScripts`](https://biomejs.dev/linter/rules/use-required-scripts/)

##### Style

Promoted the following rules to the `style` group:

- [`useVueMultiWordComponentNames`](https://biomejs.dev/linter/rules/use-vue-multi-word-component-names/) (recommended, Vue domain)
- [`useVueDefineMacrosOrder`](https://biomejs.dev/linter/rules/use-vue-define-macros-order/)
- [`noIncrementDecrement`](https://biomejs.dev/linter/rules/no-increment-decrement/)
- [`noContinue`](https://biomejs.dev/linter/rules/no-continue/)
- [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/)
- [`noTernary`](https://biomejs.dev/linter/rules/no-ternary/)
- [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/)
- [`noMultiAssign`](https://biomejs.dev/linter/rules/no-multi-assign/)
- [`noExcessiveClassesPerFile`](https://biomejs.dev/linter/rules/no-excessive-classes-per-file/)
- [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/)
- [`noVueOptionsApi`](https://biomejs.dev/linter/rules/no-vue-options-api/)
- [`useErrorCause`](https://biomejs.dev/linter/rules/use-error-cause/)
- [`useConsistentEnumValueType`](https://biomejs.dev/linter/rules/use-consistent-enum-value-type/)
- [`useConsistentMethodSignatures`](https://biomejs.dev/linter/rules/use-consistent-method-signatures/)
- [`useGlobalThis`](https://biomejs.dev/linter/rules/use-global-this/) (default severity: `warn`)
- [`useDestructuring`](https://biomejs.dev/linter/rules/use-destructuring/)
- [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/) (recommended, Vue domain)
- [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/) (recommended, Vue domain)
- [`useVueConsistentVOnStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-on-style/) (recommended, Vue domain)
- [`noHexColors`](https://biomejs.dev/linter/rules/no-hex-colors/)
- [`useConsistentGraphqlDescriptions`](https://biomejs.dev/linter/rules/use-consistent-graphql-descriptions/)
- [`noRootType`](https://biomejs.dev/linter/rules/no-root-type/)
- [`useLoneExecutableDefinition`](https://biomejs.dev/linter/rules/use-lone-executable-definition/)
- [`useInputName`](https://biomejs.dev/linter/rules/use-input-name/)

##### Complexity

Promoted the following rules to the `complexity` group:

- [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/)
- [`noRedundantDefaultExport`](https://biomejs.dev/linter/rules/no-redundant-default-export/) (default severity: `warn`)
- [`noUselessReturn`](https://biomejs.dev/linter/rules/no-useless-return/)
- [`noDivRegex`](https://biomejs.dev/linter/rules/no-div-regex/)

##### Performance

Promoted the following rules to the `performance` group:

- [`noSyncScripts`](https://biomejs.dev/linter/rules/no-sync-scripts/)
- [`noJsxPropsBind`](https://biomejs.dev/linter/rules/no-jsx-props-bind/)
- [`useVueVapor`](https://biomejs.dev/linter/rules/use-vue-vapor/)

##### Security

Promoted the following rules to the `security` group:

- [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) (recommended)

##### A11y

Promoted the following rules to the `a11y` group:

- [`noAmbiguousAnchorText`](https://biomejs.dev/linter/rules/no-ambiguous-anchor-text/) (recommended)

- [#&#8203;10121](https://github.com/biomejs/biome/pull/10121) [`450f8e1`](https://github.com/biomejs/biome/commit/450f8e1c0a46e8c867a63a0842deaa50dee95176) Thanks [@&#8203;jongwan56](https://github.com/jongwan56)! - Biome now applies Git's local exclude file when VCS ignore files are enabled. Files listed in `.git/info/exclude` are skipped the same way as files listed in `.gitignore`, including in linked worktrees.

- [#&#8203;9397](https://github.com/biomejs/biome/pull/9397) [`d5913c9`](https://github.com/biomejs/biome/commit/d5913c9d57b771b0b1c0097f8014017878cc14c2) Thanks [@&#8203;mvarendorff](https://github.com/mvarendorff)! - Added `ignore` option to the [noUnusedVariables](https://biomejs.dev/linter/rules/no-unused-variables/) rule. The option allows excluding identifiers by providing a list of ignored names. It also allows excluding kinds of identifiers from this rule entirely, which may be useful when loading classes dynamically.

  For example, unused classes as well as all unused variables, functions, etc. called "unused" may be ignored entirely with the following configuration:

  ```json
  {
    "ignore": {
      "*": ["unused"],
      "class": ["*"]
    }
  }
  ```

- [#&#8203;10089](https://github.com/biomejs/biome/pull/10089) [`71a21f0`](https://github.com/biomejs/biome/commit/71a21f0ab4fd32739331d3b3068c6c1ae6392290) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the lint rule [`noLabelWithoutControl`](https://biomejs.dev/linter/rules/no-label-without-control/) to HTML, which enforces that a label element or component has a text label and an associated input.

  ```html
  <label></label>
  ```

- [#&#8203;10015](https://github.com/biomejs/biome/pull/10015) [`1828261`](https://github.com/biomejs/biome/commit/182826178de9c1b23bad2e997c3567a9d5176ba2) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`useAriaPropsSupportedByRole`](https://biomejs.dev/linter/rules/use-aria-props-supported-by-role/), which enforces that ARIA properties are valid for the roles that are supported by the element.

  ```html
  <a href="#" aria-checked></a>
  ```

- [#&#8203;10234](https://github.com/biomejs/biome/pull/10234) [`1a51569`](https://github.com/biomejs/biome/commit/1a51569229936b9ad1191d081ed6742e8342badd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added the `delimiterSpacing` formatter option. This option inserts spaces inside delimiters (after the opening delimiter and before the closing delimiter) when the content fits on a single line. Empty delimiters are not affected, and no space is added before the opening delimiter. The specific delimiters affected depend on the language. It can be configured globally via `formatter.delimiterSpacing` or per-language via `javascript.formatter.delimiterSpacing`, `json.formatter.delimiterSpacing`, and `css.formatter.delimiterSpacing`. Defaults to `false`.

  ```diff
  - callFn(foo)
  + callFn( foo )
  ```

  ```diff
  - const arr = [1, 2, 3];
  + const arr = [ 1, 2, 3 ];
  ```

  ##### JavaScript

  When enabled, Biome inserts spaces inside parentheses (e.g., `foo( a, b )`), square brackets (e.g., `[ a, b ]`), template literal interpolations (e.g., `${ expr }`), and the logical NOT operator (e.g., `! x`, but in chains only after the last one: `!! x`). Only applies when the content fits on a single line. Empty delimiters and the space before the opening delimiter are not affected.

  ```diff
  - if (condition) {}
  + if ( condition ) {}
  ```

  ```diff
  - `Hello ${name}!`
  + `Hello ${ name }!`
  ```

  ##### JSX

  When enabled, Biome inserts spaces inside JSX expression braces (e.g., `attr={ value }`) and spread attributes (e.g., `{ ...props }`). Only applies when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - <Foo bar={value} />
  + <Foo bar={ value } />
  ```

  ##### TypeScript

  When enabled, Biome inserts spaces inside TypeScript angle brackets (e.g., `foo< T >()`), indexed access types (e.g., `T[ K ]`), mapped types, tuple types, type parameters, and index signatures. Only applies when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - type Result = Map<string, number>;
  + type Result = Map< string, number >;
  ```

  ##### JSON

  When enabled, Biome inserts spaces inside square brackets when the content fits on a single line. Empty brackets are not affected.

  ```diff
  - [1, 2, 3]
  + [ 1, 2, 3 ]
  ```

  ##### CSS

  When enabled, Biome inserts spaces inside parentheses and square brackets when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - rgba(0, 0, 0, 1)
  + rgba( 0, 0, 0, 1 )
  ```

  ```diff
  - [data-attr]
  + [ data-attr ]
  ```

- [#&#8203;10461](https://github.com/biomejs/biome/pull/10461) [`6bac1c3`](https://github.com/biomejs/biome/commit/6bac1c3457d396215e4daed5fc59eaf23b42f4eb) Thanks [@&#8203;TXWSLYF](https://github.com/TXWSLYF)! - Implements [#&#8203;9445](https://github.com/biomejs/biome/issues/9445). Added the `allowImplicit` option to [`useIterableCallbackReturn`](https://biomejs.dev/linter/rules/use-iterable-callback-return/). When enabled, callbacks can use `return;` to implicitly return `undefined`, matching ESLint's `array-callback-return` rule.

- [#&#8203;9571](https://github.com/biomejs/biome/pull/9571) [`5a8eb75`](https://github.com/biomejs/biome/commit/5a8eb755fe07b38760d2b72ec46e24cd108f6619) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added configurable options to the [`useNumericSeparators`](https://biomejs.dev/linter/rules/use-numeric-separators/) rule. Users can now customize the minimum number of digits required before adding separators and the group length for each type of numeric literal (`binary`, `octal`, `decimal`, `hexadecimal`).

  ```json
  {
    "linter": {
      "rules": {
        "style": {
          "useNumericSeparators": {
            "level": "error",
            "options": {
              "decimal": {
                "minimumDigits": 7,
                "groupLength": 3
              },
              "hexadecimal": {
                "minimumDigits": 4,
                "groupLength": 2
              }
            }
          }
        }
      }
    }
  }
  ```

- [#&#8203;10067](https://github.com/biomejs/biome/pull/10067) [`6064312`](https://github.com/biomejs/biome/commit/60643120b5593104b311e184cf9581b9c7c2254d) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the lint rule [`useFocusableInteractive`](https://biomejs.dev/linter/rules/use-focusable-interactive/) to HTML, which enforces elements with an interactive role and interaction handler to be focusable.

  **Invalid**:

  ```html
  <div role="button"></div>
  ```

- [#&#8203;10026](https://github.com/biomejs/biome/pull/10026) [`fb42ac4`](https://github.com/biomejs/biome/commit/fb42ac42079ec7b8e699a507bce332f4446ac7f2) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementInteractions`](https://biomejs.dev/linter/rules/no-noninteractive-element-interactions/), which disallows use event handlers on non-interactive elements.

  **Invalid**:

  ```html
  <div >button</div>
  ```

- [#&#8203;10000](https://github.com/biomejs/biome/pull/10000) [`2093e3e`](https://github.com/biomejs/biome/commit/2093e3ee2a615abecae159d35a5a17fe0df5f506) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the new assist action [`useSortedEnumMembers`](https://biomejs.dev/assist/actions/use-sorted-enum-members/), which sorts TypeScript & GraphQL enum members.

  **Invalid**:

  ```graphql
  enum Role {
    SUPER_ADMIN
    ADMIN
    USER
    GOD
  }
  ```

- [#&#8203;10013](https://github.com/biomejs/biome/pull/10013) [`ad01d3d`](https://github.com/biomejs/biome/commit/ad01d3d882276b070433822f01cdf6afed63ca4e) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/), which enforces using valid values for the `autocomplete` attribute on `input` elements.

  ```html
  <input autocomplete="incorrect" />
  ```

##### Patch Changes

- [#&#8203;10498](https://github.com/biomejs/biome/pull/10498) [`995c1ff`](https://github.com/biomejs/biome/commit/995c1ffeca039787c93370fed8b970a057e9c073) Thanks [@&#8203;citadelgrad](https://github.com/citadelgrad)! - Added the nursery rule [`useReactFunctionComponentDefinition`](https://biomejs.dev/linter/rules/use-react-function-component-definition), which enforces a consistent function type for named React function components.

  For example, the following snippet triggers the rule by default.

  ```jsx
  const MyComponent = (props) => {
    return <div>{props.name}</div>;
  };
  ```

- [#&#8203;9974](https://github.com/biomejs/biome/pull/9974) [`ff635a9`](https://github.com/biomejs/biome/commit/ff635a90da3567a9006ae947b6c5983d87dfbb9f) Thanks [@&#8203;pkallos](https://github.com/pkallos)! - Added `ignoreMixedLogicalExpressions` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/), partially addressing [#&#8203;9232](https://github.com/biomejs/biome/issues/9232). When enabled, Biome ignores `||` and `||=` mixed with `&&` in the same expression tree.

- [#&#8203;10503](https://github.com/biomejs/biome/pull/10503) [`c656679`](https://github.com/biomejs/biome/commit/c656679d1f9e725a42e5d60fb3b9e76bb03d7f88) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Added the new nursery rule `useSvelteReq
10BC8
uireEachKey`, a Svelte lint rule that reports `{#each}` blocks with item bindings that are missing a key.

- [#&#8203;10516](https://github.com/biomejs/biome/pull/10516) [`0f29b83`](https://github.com/biomejs/biome/commit/0f29b8361ba3cd11bdbfb91f8ff722184cfadf08) Thanks [@&#8203;Dotify71](https://github.com/Dotify71)! - Added [`useIncludes`](https://biomejs.dev/linter/rules/use-includes/) to the nursery group. This rule flags comparisons of `String.prototype.indexOf()` or `Array.prototype.indexOf()` against `-1` and suggests replacing them with the clearer `includes()` / `!includes()` form.

- [#&#8203;10487](https://github.com/biomejs/biome/pull/10487) [`0c03ee3`](https://github.com/biomejs/biome/commit/0c03ee3deee068220175c3599e6bc3c4ed8ad247) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed a Svelte parser error that incorrectly required a binding variable after `{:then}` and `{:catch}`. Biome now correctly accepts `{:then}` and `{:catch}` without a binding, as well as the `{#await expr then}` and `{#await expr catch}` shorthand forms.

- [#&#8203;10566](https://github.com/biomejs/biome/pull/10566) [`a4a294c`](https://github.com/biomejs/biome/commit/a4a294c3c1128fc5b38634262d499d3d2601bf3b) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/): The rule now only reports diagnostics in Vue files and ignores SVG elements.

- [#&#8203;10565](https://github.com/biomejs/biome/pull/10565) [`72ccf3b`](https://github.com/biomejs/biome/commit/72ccf3b042c4258f9871ff5b99d87f879cecccde) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/): The rule no longer reports argument-less `v-bind` directives because they cannot be converted to shorthand syntax.

- [#&#8203;10591](https://github.com/biomejs/biome/pull/10591) [`6e8557b`](https://github.com/biomejs/biome/commit/6e8557b1b8e49ce2383f6089a46624eb030178ad) Thanks [@&#8203;xsourabhsharma](https://github.com/xsourabhsharma)! - Fixed [#&#8203;10563](https://github.com/biomejs/biome/issues/10563): Biome now parses comma-separated CSS Modules `composes` values, such as `composes: classA from "./a.css", classB from "./b.css";`.

- [#&#8203;10603](https://github.com/biomejs/biome/pull/10603) [`174b21b`](https://github.com/biomejs/biome/commit/174b21b52993fc3e0237ceefe97c0d71c9b5264e) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting for `grid-template-areas` declarations with comments before multiline values. Biome now keeps grid area rows aligned instead of adding an extra declaration-boundary indent.

  ```diff
   .grid {
     grid-template-areas:
   /* row */
  -      "header header"
  -      "footer footer";
  +    "header header"
  +    "footer footer";
   }
  ```

- [#&#8203;10542](https://github.com/biomejs/biome/pull/10542) [`c3f07f7`](https://github.com/biomejs/biome/commit/c3f07f773edeb7f098c778392c5e2d6bb92b78fb) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10513](https://github.com/biomejs/biome/issues/10513): Biome no longer rejects literal `\u` sequences in quoted HTML attribute values.

- [#&#8203;10108](https://github.com/biomejs/biome/pull/10108) [`24e51d6`](https://github.com/biomejs/biome/commit/24e51d6edebaee0ffb938bc20633d9c3403110c9) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Fixed [#&#8203;6611](https://github.com/biomejs/biome/issues/6611): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) now uses type information to detect more redundant conditions, including `?.`, `??`, `||`, `&&`, comparisons against `null`/`undefined` on non-nullish operands, and `case` clauses that can never match the `switch` value.

- [#&#8203;10568](https://github.com/biomejs/biome/pull/10568) [`eb1ed0e`](https://github.com/biomejs/biome/commit/eb1ed0e90395a07e64ee763fe15ae00fb77682e0) Thanks [@&#8203;harsha-cpp](https://github.com/harsha-cpp)! - Fixed [#&#8203;10564](https://github.com/biomejs/biome/issues/10564): `useAriaPropsForRole` no longer reports false positives for Vue v-bind shorthand bindings (`:aria-checked`, `:aria-level`, etc.).

- [#&#8203;10570](https://github.com/biomejs/biome/pull/10570) [`2ceb4fe`](https://github.com/biomejs/biome/commit/2ceb4fe437b77b08a60ad48efde2a6c311b7d2e3) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Improved [`noTsIgnore`](https://biomejs.dev/linter/rules/no-ts-ignore/).
  The rule now reports more precisely the range of the `@ts-ignore` comment.

- [#&#8203;10520](https://github.com/biomejs/biome/pull/10520) [`b55d10f`](https://github.com/biomejs/biome/commit/b55d10f5e8f3099b3f246911ca19cc79758d55e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10519](https://github.com/biomejs/biome/issues/10519): Vue `v-on` event handlers with multiple inline statements are now parsed consistently with Vue.

- [#&#8203;10204](https://github.com/biomejs/biome/pull/10204) [`ebbf0bd`](https://github.com/biomejs/biome/commit/ebbf0bd382059936ac00de29fc58931728f854d9) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Improved the performance of the Biome linter. The improvements are more visible in bigger projects that have more than \~1k files. Early tests showed that in a code base with \~2k files, Biome took less than 26% of time to finish the command.

- [#&#8203;10546](https://github.com/biomejs/biome/pull/10546) [`e39bb2c`](https://github.com/biomejs/biome/commit/e39bb2c23063ad0384a12e01d666909fd6b26735) Thanks [@&#8203;tim-we](https://github.com/tim-we)! - Fixed [`#10536`](https://github.com/biomejs/biome/issues/10536): [noUnknownFunction](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flagged CSS `contrast-color()` as unknown. `contrast-color()` is Baseline 2026.

- [#&#8203;8012](https://github.com/biomejs/biome/pull/8012) [`2be0264`](https://github.com/biomejs/biome/commit/2be02648a090153a93cf71fb63ef68feefd495c2) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - Improved the performance of the formatter in some cases. The formatter is now up to \~20% faster at formatting files.

- [#&#8203;10467](https://github.com/biomejs/biome/pull/10467) [`9a5855e`](https://github.com/biomejs/biome/commit/9a5855e4191c98149f8278289569b2272b992684) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added a new nursery rule [`noRestrictedDependencies`](https://biomejs.dev/linter/rules/no-restricted-dependencies/), which flags imports and `package.json` dependency entries that have better alternatives in e18e's module replacement data.

  For example, the package `globby` is reported because there's a better alternative:

  ```js
  import glob from "globby";
  ```

  ```json
  {
    "dependencies": {
      "globby": "x.x.x"
    }
  }
  ```

- [#&#8203;10470](https://github.com/biomejs/biome/pull/10470) [`84b43c5`](https://github.com/biomejs/biome/commit/84b43c5969569cb3eea3d51ea6c602276723306b) Thanks [@&#8203;ShaharAviram1](https://github.com/ShaharAviram1)! - Fixed [#&#8203;10447](https://github.com/biomejs/biome/issues/10447): now the rule [`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env) detects the use of `env` when it's imported from `process` and `node:process`.

- [#&#8203;10556](https://github.com/biomejs/biome/pull/10556) [`7ff6b16`](https://github.com/biomejs/biome/commit/7ff6b165f2f62a0836446dee889d9868f12fb06e) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;10492](https://github.com/biomejs/biome/issues/10492): Biome no longer crashes with a stack overflow on certain code when a type-aware rule such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/), [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/), or [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) is enabled. For example, the following code used to crash Biome:

  ```js
  function f(visitor) {
    let ctrl = visitor();
    for (const x of [0]) ctrl = ctrl();
  }
  ```

- [#&#8203;10532](https://github.com/biomejs/biome/pull/10532) [`1da3c75`](https://github.com/biomejs/biome/commit/1da3c7573cdb1d097fc1773fee686140d95f3f35) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - CSS declarations with comments before `:` or after `!important` now preserve spaces before `:` and `;`.

  ```diff
   .selector {
  -  padding/* name */: 1px;
  -  color: red !important /* note */;
  +  padding/* name */ : 1px;
  +  color: red !important /* note */ ;
   }
  ```

- [#&#8203;10491](https://github.com/biomejs/biome/pull/10491) [`a1b5834`](https://github.com/biomejs/biome/commit/a1b5834d4968fd518cc4adfa0e8b4b65b2232637) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed the Svelte parser rejecting `{#each}` blocks where the binding uses object destructuring with property renaming, e.g. `{#each items as { id, component: Filter }}`. Biome now correctly parses and formats these rename bindings.

- [#&#8203;10490](https://github.com/biomejs/biome/pull/10490) [`99bc7df`](https://github.com/biomejs/biome/commit/99bc7df1d1cbb599e9713da56c29763cd04bb53c) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed the CSS parser rejecting comma-separated selector lists inside `:global()` and `:local()` pseudo-class functions. Biome now correctly parses `:global(.foo, .bar)`.

- [#&#8203;10543](https://github.com/biomejs/biome/pull/10543) [`c394fae`](https://github.com/biomejs/biome/commit/c394faeaa27f9f7db8ba075afc6657c0245d8276) Thanks [@&#8203;mangod12](https://github.com/mangod12)! - Fixed [#&#8203;10477](https://github.com/biomejs/biome/issues/10477): The RDJSON reporter now emits code replacement text for fix suggestions instead of the human-readable fix description.

- [#&#8203;10530](https://github.com/biomejs/biome/pull/10530) [`e8e1e6a`](https://github.com/biomejs/biome/commit/e8e1e6aa1b39d1e19d33c12d4b56d6d3fd01a7ce) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;10493](https://github.com/biomejs/biome/issues/10493): [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/) now correctly separates types from a default named import when all imports are types and the `style` option is set to `separatedType`.

- [#&#8203;10555](https://github.com/biomejs/biome/pull/10555) [`263c7cc`](https://github.com/biomejs/biome/commit/263c7ccd12cd8c0d4527fdf4797c652a223df012) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Improved Svelte lint rule accuracy for quoted attribute values containing `{expression}` interpolations.
  - [`noRedundantAlt`](https://biomejs.dev/linter/rules/no-redundant-alt/) no longer emits false positives when the alt text contains an interpolation, e.g. `alt="image of {person}"`.
  - [`useButtonType`](https://biomejs.dev/linter/rules/use-button-type/) no longer emits false positives for dynamic button types written as `type="{dynamicType}"`.
  - [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) no longer emits false positives for dynamic hrefs such as `href="{url}"`.

- [#&#8203;10489](https://github.com/biomejs/biome/pull/10489) [`96ef9a4`](https://github.com/biomejs/biome/commit/96ef9a4c2647a71d917485f6791e151cf8b88c96) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed Svelte `{#each}` parser incorrectly rejecting TypeScript `as const` type assertions in the iterable expression. Biome now correctly parses `{#each arr as const as item}`.

- [#&#8203;10539](https://github.com/biomejs/biome/pull/10539) [`935c59a`](https://github.com/biomejs/biome/commit/935c59a6657022c37c9b9933c66cc29c236e5aff) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved how diagnostics print long lines of code, for example minified files where the entire source code is printed in one line.

</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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMjQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIyNC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/18
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Client that referenced this pull request Jun 20, 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 | minor | [`2.4.16` -> `2.5.0`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.16/2.5.0) |

---

### Release Notes

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

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

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

##### Minor Changes

- [#&#8203;9539](https://github.com/biomejs/biome/pull/9539) [`f0615fd`](https://github.com/biomejs/biome/commit/f0615fdae80fa7257fc1d0448d2027cb1acff46e) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added a new reporter called `concise`. When `--reporter=concise` is passed the commands `format`, `lint`, `check` and `ci`, the diagnostics are printed in a compact manner:

  ```
  ! index.ts:2:10: lint/correctness/noUnusedImports: Several of these imports are unused.
  ! main.ts:9:7: lint/correctness/noUnusedVariables: This variable f is unused.
  × index.ts:8:5: lint/suspicious/noImplicitAnyLet: This variable implicitly has the any type.
  × main.ts:2:10: lint/suspicious/noRedeclare: Shouldn't redeclare 'z'. Consider to delete it or rename it.
  ```

- [#&#8203;9495](https://github.com/biomejs/biome/pull/9495) [`2056b23`](https://github.com/biomejs/biome/commit/2056b23812a17f9c9a9015e5b725faecb04647b5) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Added the [`useKeyWithClickEvents`](https://biomejs.dev/linter/rules/use-key-with-click-events/) a11y lint rule for HTML files (`.html`, `.vue`, `.svelte`, `.astro`). This is a port of the existing JSX rule. The rule enforces that elements with an `onclick` handler also have at least one keyboard event handler (`onkeydown`, `onkeyup`, or `onkeypress`) to ensure keyboard accessibility.

  Inherently keyboard-accessible elements (`<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, `<option>`) are excluded, as are elements hidden from assistive technologies (`aria-hidden`) or with `role="presentation"` / `role="none"`.

  ```html
  <!-- Invalid: no keyboard handler -->
  <div >Click me</div>

  <!-- Valid: has keyboard handler -->
  <div  >Click me</div>

  <!-- Valid: inherently keyboard-accessible -->
  <button >Submit</button>
  ```

- [#&#8203;9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes/) for HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used in `class="..."` (or `className`) attributes that are not defined in any `<style>` block or linked stylesheet reachable from the file.

  ```html
  <!-- .typo is used but never defined -->
  <html>
    <head>
      <style>
        .button {
          color: blue;
        }
      </style>
    </head>
    <body>
      <div class="button typo"></div>
    </body>
  </html>
  ```

- [#&#8203;9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUnusedClasses`](https://biomejs.dev/linter/rules/no-unused-classes/) for CSS. The rule detects CSS class selectors that are never referenced in any HTML or JSX file that imports the stylesheet. This is a project-domain rule that requires the module graph.

  ```css
  /* styles.css — .ghost is never used in any importing file */
  .button {
    color: blue;
  }
  .ghost {
    color: red;
  }
  ```

  ```jsx
  /* App.jsx */
  import "./styles.css";
  export default () => <div className="button" />;
  ```

- [#&#8203;9546](https://github.com/biomejs/biome/pull/9546) [`6567efa`](https://github.com/biomejs/biome/commit/6567efa51ba074436b017e49b1d2d369e7252e74) Thanks [@&#8203;nhedger](https://github.com/nhedger)! - Added a `biome upgrade` command for standalone installations. It upgrades Homebrew installs with `brew upgrade biome`, updates manually installed binaries from the latest GitHub release, and tells npm users to upgrade with their package manager instead.

- [#&#8203;9716](https://github.com/biomejs/biome/pull/9716) [`701767a`](https://github.com/biomejs/biome/commit/701767a3c4de8bce032933588ef2b6e5e252919f) Thanks [@&#8203;faizkhairi](https://github.com/faizkhairi)! - Added the HTML version of the [`useHeadingContent`](https://biomejs.dev/linter/rules/use-heading-content/) rule. The rule now enforces that heading elements (`h1`-`h6`) have content accessible to screen readers in HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: empty heading -->
  <h1></h1>

  <!-- Invalid: heading hidden from screen readers -->
  <h1 aria-hidden="true">invisible content</h1>

  <!-- Valid: heading with text content -->
  <h1>heading</h1>

  <!-- Valid: heading with accessible name -->
  <h1 aria-label="Screen reader content"></h1>
  ```

- [#&#8203;9582](https://github.com/biomejs/biome/pull/9582) [`f437ef8`](https://github.com/biomejs/biome/commit/f437ef8b6b0eb8f909d523950cf2c543042083d5) Thanks [@&#8203;rahuld109](https://github.com/rahuld109)! - Added the HTML version of the [`useKeyWithMouseEvents`](https://biomejs.dev/linter/rules/use-key-with-mouse-events/) rule. The rule now enforces that `onmouseover` is accompanied by `onfocus` and `onmouseout` is accompanied by `onblur` in HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: onmouseover without onfocus -->
  <div ></div>

  <!-- Valid: onmouseover paired with onfocus -->
  <div  ></div>
  ```

- [#&#8203;9275](https://github.com/biomejs/biome/pull/9275) [`1fdbcee`](https://github.com/biomejs/biome/commit/1fdbceea62d373f24da9c1e5cc0cdd169b573e84) Thanks [@&#8203;ff1451](https://github.com/ff1451)! - Added the new assist action [`useSortedTypeFields`](https://biomejs.dev/assist/actions/use-sorted-type-fields/), which sorts the fields of GraphQL object types, interface types and input object types alphabetically, e.g. `name, age, id` becomes `age, id, name`.

- [#&#8203;10561](https://github.com/biomejs/biome/pull/10561) [`78075b7`](https://github.com/biomejs/biome/commit/78075b7c7cb7490c730a96f4ee9776c9e77826e7) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added a new `style` option to [useExportType](https://biomejs.dev/linter/rules/use-export-type/),
  which enforces a style for exporting types.
  This is the same option as the one provided by `useImportType`.

- [#&#8203;8987](https://github.com/biomejs/biome/pull/8987) [`d16e32b`](https://github.com/biomejs/biome/commit/d16e32b5b971a4ed9cd3bf5098782c8b752af69a) Thanks [@&#8203;DerTimonius](https://github.com/DerTimonius)! - Ported the [`useValidAnchor`](https://biomejs.dev/linter/rules/use-valid-anchor/) rule to HTML. This rule enforces that all anchors are valid and that they are navigable elements.

- [#&#8203;9533](https://github.com/biomejs/biome/pull/9533) [`4d251d4`](https://github.com/biomejs/biome/commit/4d251d489cfd33a83e42d425476f8d6c66b72d9b) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - The `init` command now prints the Biome logo.

- [#&#8203;10069](https://github.com/biomejs/biome/pull/10069) [`0eb9310`](https://github.com/biomejs/biome/commit/0eb93109e1f9bfbb20744961681b4f0b9b781ad5) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/), which enforces that static, visible elements (such as `<div>`) that have click handlers use the valid role attribute.

  **Invalid**:

  ```html
  <div ></div>
  ```

- [#&#8203;9134](https://github.com/biomejs/biome/pull/9134) [`2a43488`](https://github.com/biomejs/biome/commit/2a434882746d31e1bd3c8e0d711372a539ce88f8) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added the assist action [`useSortedPackageJson`](https://biomejs.dev/assist/actions/use-sorted-package-json).

  This action organizes package.json fields according to the same conventions as the popular [sort-package-json](https://github.com/keithamus/sort-package-json) tool.

- [#&#8203;9309](https://github.com/biomejs/biome/pull/9309) [`7daa18b`](https://github.com/biomejs/biome/commit/7daa18b07f7ab348942f4cb83b475e6a4b3d1125) Thanks [@&#8203;Bertie690](https://github.com/Bertie690)! - The `allowDoubleNegation` option has been added to [`noImplicitCoercions`](https://biomejs.dev/linter/rules/no-implicit-coercions) to allow ignoring double negations inside code.

  With the option enabled, the following example is considered valid and is ignored by the rule:

  ```js
  const truthy = !!value;
  ```

- [#&#8203;9700](https://github.com/biomejs/biome/pull/9700) [`894f3fb`](https://github.com/biomejs/biome/commit/894f3fb4c664b12ff9abd1527b535621fe4e22f6) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - The Biome Language server now supports the "go-to definition" feature.

  When the cursor of the mouse is hovering an entity (variable, CSS class, type, etc.), and the command <kbd>CTRL</kbd> + click is triggered, the editor jumps to where this entity is defined, if the language server can find it.

  Here's what Biome is able to resolve:

  - Variables and types used in JavaScript modules, defined in the same file or imported from another module.
  - JSX Components used in JavaScript modules, defined in the same file or imported from another module.
  - CSS classes used in JSX and HTML-ish files (Vue, Svelte and Astro), and defined in CSS files.
  - Components used in HTML-ish files and defined in other HTML-ish.
  - Variables used in HTML-ish files and defined in the same file or imported from another module (JavaScript or HTML-ish).

- [#&#8203;10070](https://github.com/biomejs/biome/pull/10070) [`bae0710`](https://github.com/biomejs/biome/commit/bae071050f5a9c335b4483ee384f21ac1e6f0b4d) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added the `:STYLE:` group matcher for [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) that matches style imports.

  For example, the following configuration...

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": {
              "groups": ["**", "!:STYLE:"],
              "sortBareImports": true
            }
          }
        }
      }
    }
  }
  ```

  ...places style imports last:

  ```diff
  - import "./style.css"
    import A from "./a.js"
  + import "./style.css"
  ```

- [#&#8203;9170](https://github.com/biomejs/biome/pull/9170) [`e3107de`](https://github.com/biomejs/biome/commit/e3107deedcff0f02b61702c6645d89e8d8635b49) Thanks [@&#8203;mdrobny](https://github.com/mdrobny)! - Added `bundleDependencies` option to [NoUndeclaredDependencies](https://biomejs.dev/linter/rules/no-undeclared-dependencies) rule.

  This rule now supports imports of packages that are defined only in `bundleDependencies` and `bundledDependencies` arrays.

- [#&#8203;9547](https://github.com/biomejs/biome/pull/9547) [`01f8473`](https://github.com/biomejs/biome/commit/01f847317820f805698e1b8ba9eaa8fa6c26205c) Thanks [@&#8203;mujpao](https://github.com/mujpao)! - Added new assist rule [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) for HTML, porting the existing JSX rule. This rule enforces sorted HTML attributes.

  **Invalid**

  ```html
  <input type="text" id="name" name="name" />
  ```

- [#&#8203;9366](https://github.com/biomejs/biome/pull/9366) [`2ca1117`](https://github.com/biomejs/biome/commit/2ca1117f1e63f6cd99c0ce8d4b82475625838e2e) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added the `html.parser.vue` configuration option. When enabled, it adds support for the parsing of Vue in `.html` files. Most Vue users don't need to enable this option since Vue files typically use the `.vue` extension, but it can be useful for projects that embed Vue syntax in regular HTML files.

- [#&#8203;9073](https://github.com/biomejs/biome/pull/9073) [`74b20ee`](https://github.com/biomejs/biome/commit/74b20eee556c9acc72ad5ea335b1bf0983d2eb2e) Thanks [@&#8203;chocky335](https://github.com/chocky335)! - Added support for applying GritQL plugin rewrites as code actions. GritQL plugins that use the rewrite operator (`=>`) now produce fixable diagnostics for JavaScript, CSS, and JSON files. By default, plugin rewrites are treated as unsafe fixes and require `--write --unsafe` to apply. Plugin authors can pass `fix_kind = "safe"` to `register_diagnostic()` to mark a fix as safe, allowing it to be applied with just `--write`.

  **Example plugin** (`useConsoleInfo.grit`):

  ```grit
  language js

  `console.log($msg)` as $call where {
      register_diagnostic(span = $call, message = "Use console.info instead of console.log.", severity = "warn", fix_kind = "safe"),
      $call => `console.info($msg)`
  }
  ```

  Running `biome check --write` applies safe rewrites. Unsafe rewrites (the default, or `fix_kind = "unsafe"`) still require `--write --unsafe`.

- [#&#8203;9384](https://github.com/biomejs/biome/pull/9384) [`f4c9edc`](https://github.com/biomejs/biome/commit/f4c9edca8f8772a1e65d9e6701fdc3f604a9f3fe) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Added the `sortBareImports` option to [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/),
  which allows bare imports to be sorted within other imports when set to `false`.

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": { "sortBareImports": true }
          }
        }
      }
    }
  }
  ```

  ```diff
  - import "b";
    import "a";
  + import "b";
    import { A } from "a";
  + import "./file";
    import { Local } from "./file";
  - import "./file";
  ```

- [#&#8203;8731](https://github.com/biomejs/biome/pull/8731) [`e7872bf`](https://github.com/biomejs/biome/commit/e7872bffba88f60d6c3cb6d0c2dd7a25452a0205) Thanks [@&#8203;siketyan](https://github.com/siketyan)! - Added the watch mode (`--watch`) to the CLI for `check`/`format`/`lint` commands. By enabling this option, Biome will re-run the check automatically when any file in the workspace has changed after the first run.

- [#&#8203;10106](https://github.com/biomejs/biome/pull/10106) [`9b35f78`](https://github.com/biomejs/biome/commit/9b35f78e183edf44a3d8b7077ebb0c548a7e92f5) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Biome can now format and lint `.svg` files.

- [#&#8203;9967](https://github.com/biomejs/biome/pull/9967) [`e9b6c17`](https://github.com/biomejs/biome/commit/e9b6c17cd6f7e870aea68da3b6c6474aa1a9b4f6) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added HTML support for [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/). Biome now reports HTML files that exceed the configured line limit, including when `skipBlankLines` is enabled.

- [#&#8203;9491](https://github.com/biomejs/biome/pull/9491) [`b3eb63c`](https://github.com/biomejs/biome/commit/b3eb63c7e19e6ebd41e463289de098bb003686e1) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noAriaUnsupportedElements`](https://biomejs.dev/linter/rules/no-aria-unsupported-elements/). This rule enforces that elements that do not support ARIA roles, states, and properties (`meta`, `html`, `script`, `style`) do not have `role` or `aria-*` attributes.

  ```html
  <!-- Invalid: meta does not support aria attributes -->
  <meta charset="UTF-8" role="meta" />
  ```

- [#&#8203;9306](https://github.com/biomejs/biome/pull/9306) [`afd57a6`](https://github.com/biomejs/biome/commit/afd57a634bdb6b0b161dc8a2522ac460503569b1) Thanks [@&#8203;viraxslot](https://github.com/viraxslot)! - Added the [`noNoninteractiveTabindex`](https://biomejs.dev/linter/rules/no-noninteractive-tabindex/) lint rule for HTML. This rule enforces that `tabindex` is not used on non-interactive elements, as it can cause usability issues for keyboard users.

  ```html
  <div tabindex="0">Invalid: non-interactive element</div>
  `
  ```

- [#&#8203;9276](https://github.com/biomejs/biome/pull/9276) [`6d041d9`](https://github.com/biomejs/biome/commit/6d041d919e06595553093e084e6aad0d39fb8109) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noRedundantRoles`](https://biomejs.dev/linter/rules/no-redundant-roles/). This rule enforces that explicit `role` attributes are not the same as the implicit/default role of an HTML element. It supports HTML, Vue, Svelte, and Astro files.

  ```html
  <!-- Invalid: role="button" is redundant on <button> -->
  <button role="button"></button>
  ```

- [#&#8203;9813](https://github.com/biomejs/biome/pull/9813) [`69aadc2`](https://github.com/biomejs/biome/commit/69aadc27741bb8a74c926e14a2a9777064cb1e03) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added a new linter configuration called `preset`. With the new option, users can enable different kinds of rules at once.

  The following presets are available:

  - `"recommended"`: it enables all Biome-recommended rules, or recommended rules of a group;
  - `"all"`: it enables all Biome rules, or enables all rules of a group;
  - `"none"`: it disables all Biome rules, or disable all rules of a group.

  You can enable recommended rules:

  ```json
  {
    "linter": {
      "rules": {
        "preset": "recommended"
      }
    }
  }
  ```

  You can enable **all rules** at once:

  ```json5
  {
    linter: {
      rules: {
        preset: "all", // enables all rules
      },
    },
  }
  ```

  Or enable all rules for a group:

  ```json5
  {
    linter: {
      rules: {
        style: {
          preset: "all", // enables all rules in the style group
        },
      },
    },
  }
  ```

  This new option, however, doesn't affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature.

  This new option is meant to replace `recommended`, so make sure to run the `migrate` command.

- [#&#8203;10022](https://github.com/biomejs/biome/pull/10022) [`3422d71`](https://github.com/biomejs/biome/commit/3422d71bc5e9d7f07fd4e7509566427e1591d760) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementToInteractiveRole`](https://biomejs.dev/linter/rules/no-noninteractive-element-to-interactive-role/), which enforces that interactive ARIA roles are not assigned to non-interactive HTML elements.

  **Invalid**:

  ```html
  <h1 role="checkbox"></h1>
  ```

- [#&#8203;8396](https://github.com/biomejs/biome/pull/8396) [`13785fc`](https://github.com/biomejs/biome/commit/13785fc8f4be068eccff84a8ad90ac8530d5c992) Thanks [@&#8203;apple-yagi](https://github.com/apple-yagi)! - Biome now supports pnpm catalogs (default and named) when resolving dependencies for linting. This behavior is opt-in and requires setting `javascript.resolver.experimentalPnpmCatalogs` to `true`.

- [#&#8203;10028](https://github.com/biomejs/biome/pull/10028) [`1009414`](https://github.com/biomejs/biome/commit/100941409f3ec5e6653e92b2cfbb4100df1becb0) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/), which enforces that non-interactive ARIA roles are not assigned to interactive HTML elements.

  **Invalid**:

  ```html
  <input role="img" />
  ```

- [#&#8203;9853](https://github.com/biomejs/biome/pull/9853) [`816302f`](https://github.com/biomejs/biome/commit/816302f8c8c9862585c283fce22ffd1817dedf9f) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the new assist action [`useSortedSelectionSet`](https://biomejs.dev/assist/actions/use-sorted-selection-set/), which sorts GraphQL selection sets alphabetically, e.g. `name, age, id` becomes `age, id, name`.

  **Invalid**:

  ```graphql
  query {
    name
    age
    id
  }
  ```

- [#&#8203;10074](https://github.com/biomejs/biome/pull/10074) [`9c7c6eb`](https://github.com/biomejs/biome/commit/9c7c6eb99f6880aa87ae0e7aff357e978361c4a3) Thanks [@&#8203;georgephillips](https://github.com/georgephillips)! - Added a `kind` field to the `ImportMatcher` used by the [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) assist action. The new field selects imports by their syntactic kind and currently supports `bare` (matching side-effect imports such as `import "polyfill"`) with optional `!` negation (`!bare`). The matcher composes with the existing `type` and `source` fields, so users can express patterns such as "only bare imports that import a CSS file" (`{ "kind": "bare", "source": "**/*.css" }`).

  For example, with the following configuration:

  ```json
  {
    "assist": {
      "actions": {
        "source": {
          "organizeImports": {
            "level": "on",
            "options": {
              "sortBareImports": true,
              "groups": [
                { "kind": "!bare" },
                ":BLANK_LINE:",
                { "kind": "bare" }
              ]
            }
          }
        }
      }
    }
  }
  ```

  ...the following code:

  ```ts
  import "./register-my-component";
  import { render } from "react-dom";
  import "./polyfill";
  import { Button } from "@&#8203;/components/Button";
  ```

  ...is organized as:

  ```ts
  import { render } from "react-dom";
  import { Button } from "@&#8203;/components/Button";

  import "./polyfill";
  import "./register-my-component";
  ```

- [#&#8203;9171](https://github.com/biomejs/biome/pull/9171) [`ce65710`](https://github.com/biomejs/biome/commit/ce65710f591eb2676df6833e9cd00e310981692b) Thanks [@&#8203;chocky335](https://github.com/chocky335)! - Added `includes` option for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.

  ```json
  {
    "plugins": [
      "global-plugin.grit",
      {
        "path": "scoped-plugin.grit",
        "includes": ["src/**/*.ts", "!**/*.test.ts"]
      }
    ]
  }
  ```

- [#&#8203;9617](https://github.com/biomejs/biome/pull/9617) [`dcb99ef`](https://github.com/biomejs/biome/commit/dcb99ef0305d8431af40b526c449316bb8a70efa) Thanks [@&#8203;faizkhairi](https://github.com/faizkhairi)! - Ported [`useAriaActivedescendantWithTabindex`](https://biomejs.dev/linter/rules/use-aria-activedescendant-with-tabindex/) a11y rule to HTML.

- [#&#8203;9496](https://github.com/biomejs/biome/pull/9496) [`1dfb829`](https://github.com/biomejs/biome/commit/1dfb8291a0a2340e7c9220f9126317a7490ec466) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Added HTML support for the [`noAriaHiddenOnFocusable`](https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable/) accessibility lint rule, which enforces that `aria-hidden="true"` is not set on focusable elements. Focusable elements include native interactive elements (`<button>`, `<input>`, `<select>`, `<textarea>`), elements with `href` (`<a>`, `<area>`), elements with `tabindex >= 0`, and editing hosts (`contenteditable`). Includes an unsafe fix to remove the `aria-hidden` attribute.

  ```html
  <!-- Invalid: aria-hidden on a focusable element -->
  <button aria-hidden="true">Submit</button>

  <!-- Valid: aria-hidden on a non-focusable element -->
  <div aria-hidden="true">decorative content</div>
  ```

- [#&#8203;9792](https://github.com/biomejs/biome/pull/9792) [`f516854`](https://github.com/biomejs/biome/commit/f51685404f015a5c6f0fc87b9070ac5d9f0a7b6b) Thanks [@&#8203;Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Added the [`useSemanticElements`](https://biomejs.dev/linter/rules/use-semantic-elements/) lint rule for HTML. The rule now detects the use of `role` attributes in HTML elements and suggests using semantic elements instead.

  For example, the following code is now flagged:

  ```html
  <div role="navigation"></div>
  ```

  The rule suggests using `<nav>` instead.

- [#&#8203;9761](https://github.com/biomejs/biome/pull/9761) [`cbbb7d5`](https://github.com/biomejs/biome/commit/cbbb7d5bf21d8fb6db275da7adcc03c034538635) Thanks [@&#8203;Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Ported the [`useValidAriaProps`](https://biomejs.dev/linter/rules/use-valid-aria-props/) lint rule to HTML. This rule checks that all `aria-*` attributes used in HTML elements are valid ARIA attributes as defined by the WAI-ARIA specification.

- [#&#8203;9928](https://github.com/biomejs/biome/pull/9928) [`aa82576`](https://github.com/biomejs/biome/commit/aa82576ff66e03924e07729051ac9bfc59cd5aa1) Thanks [@&#8203;aviraldua93](https://github.com/aviraldua93)! - Ported [`useValidAriaValues`](https://biomejs.dev/linter/rules/use-valid-aria-values/) to HTML. Biome now validates static `aria-*` attribute values in HTML elements against WAI-ARIA types, catching invalid values such as `aria-hidden="yes"`.

- [#&#8203;10562](https://github.com/biomejs/biome/pull/10562) [`6642895`](https://github.com/biomejs/biome/commit/66428957e6ca393a802f365b8e643438f19a3039) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Promoted 73 nursery rules to stable groups.

  Four rules were renamed as part of the promotion:

  - `noFloatingClasses` is now [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/), because the rule checks any discarded `new` expression, not only classes.
  - `noMultiStr` is now [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/).
  - `useFind` is now [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/).
  - `useSpread` is now [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/), because the rule enforces spread call arguments over `Function.apply()`, not array or object spread.

##### Correctness

Promoted the following rules to the `correctness` group:

- [`noBeforeInteractiveScriptOutsideDocument`](https://biomejs.dev/linter/rules/no-before-interactive-script-outside-document/)
- [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/)
- [`useInlineScriptId`](https://biomejs.dev/linter/rules/use-inline-script-id/) (recommended, Next.js domain)
- [`noVueVIfWithVFor`](https://biomejs.dev/linter/rules/no-vue-v-if-with-v-for/) (recommended, Vue domain)
- [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/) (recommended, Vue domain)
- [`useVueValidVElse`](https://biomejs.dev/linter/rules/use-vue-valid-v-else/) (recommended, Vue domain)
- [`useVueValidVElseIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-else-if/) (recommended, Vue domain)
- [`useVueValidVHtml`](https://biomejs.dev/linter/rules/use-vue-valid-v-html/) (recommended, Vue domain)
- [`useVueValidVIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-if/) (recommended, Vue domain)
- [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) (recommended, Vue domain)
- [`useVueValidVText`](https://biomejs.dev/linter/rules/use-vue-valid-v-text/) (recommended, Vue domain)
- [`useVueValidTemplateRoot`](https://biomejs.dev/linter/rules/use-vue-valid-template-root/) (recommended, Vue domain)
- [`useVueValidVCloak`](https://biomejs.dev/linter/rules/use-vue-valid-v-cloak/) (recommended, Vue domain)
- [`useVueValidVOnce`](https://biomejs.dev/linter/rules/use-vue-valid-v-once/) (recommended, Vue domain)
- [`useVueValidVPre`](https://biomejs.dev/linter/rules/use-vue-valid-v-pre/) (recommended, Vue domain)
- [`useVueVForKey`](https://biomejs.dev/linter/rules/use-vue-v-for-key/) (recommended, Vue domain)
- [`noDuplicateAttributes`](https://biomejs.dev/linter/rules/no-duplicate-attributes/) (recommended)
- [`noDuplicateArgumentNames`](https://biomejs.dev/linter/rules/no-duplicate-argument-names/) (recommended)
- [`noDuplicateInputFieldNames`](https://biomejs.dev/linter/rules/no-duplicate-input-field-names/) (recommended)
- [`noDuplicateVariableNames`](https://biomejs.dev/linter/rules/no-duplicate-variable-names/) (recommended)
- [`noDuplicateEnumValueNames`](https://biomejs.dev/linter/rules/no-duplicate-enum-value-names/) (recommended)
- [`useLoneAnonymousOperation`](https://biomejs.dev/linter/rules/use-lone-anonymous-operation/) (recommended)

##### Suspicious

Promoted the following rules to the `suspicious` group:

- [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/)
- [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/)
- [`noParametersOnlyUsedInRecursion`](https://biomejs.dev/linter/rules/no-parameters-only-used-in-recursion/)
- [`noUnknownAttribute`](https://biomejs.dev/linter/rules/no-unknown-attribute/)
- [`useArraySortCompare`](https://biomejs.dev/linter/rules/use-array-sort-compare/)
- [`noForIn`](https://biomejs.dev/linter/rules/no-for-in/)
- [`noDuplicatedSpreadProps`](https://biomejs.dev/linter/rules/no-duplicated-spread-props/)
- [`noEqualsToNull`](https://biomejs.dev/linter/rules/no-equals-to-null/)
- [`noProto`](https://biomejs.dev/linter/rules/no-proto/) (recommended)
- [`noUndeclaredEnvVars`](https://biomejs.dev/linter/rules/no-undeclared-env-vars/) (recommended, Turborepo domain)
- [`noReturnAssign`](https://biomejs.dev/linter/rules/no-return-assign/) (default severity: `error`)
- [`noDuplicateEnumValues`](https://biomejs.dev/linter/rules/no-duplicate-enum-values/) (recommended)
- [`noVueArrowFuncInWatch`](https://biomejs.dev/linter/rules/no-vue-arrow-func-in-watch/) (recommended, Vue domain)
- [`noNestedPromises`](https://biomejs.dev/linter/rules/no-nested-promises/)
- [`noLeakedRender`](https://biomejs.dev/linter/rules/no-leaked-render/)
- [`noDeprecatedMediaType`](https://biomejs.dev/linter/rules/no-deprecated-media-type/) (recommended)
- [`noDuplicateGraphqlOperationName`](https://biomejs.dev/linter/rules/no-duplicate-graphql-operation-name/)
- [`useRequiredScripts`](https://biomejs.dev/linter/rules/use-required-scripts/)

##### Style

Promoted the following rules to the `style` group:

- [`useVueMultiWordComponentNames`](https://biomejs.dev/linter/rules/use-vue-multi-word-component-names/) (recommended, Vue domain)
- [`useVueDefineMacrosOrder`](https://biomejs.dev/linter/rules/use-vue-define-macros-order/)
- [`noIncrementDecrement`](https://biomejs.dev/linter/rules/no-increment-decrement/)
- [`noContinue`](https://biomejs.dev/linter/rules/no-continue/)
- [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/)
- [`noTernary`](https://biomejs.dev/linter/rules/no-ternary/)
- [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/)
- [`noMultiAssign`](https://biomejs.dev/linter/rules/no-multi-assign/)
- [`noExcessiveClassesPerFile`](https://biomejs.dev/linter/rules/no-excessive-classes-per-file/)
- [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/)
- [`noVueOptionsApi`](https://biomejs.dev/linter/rules/no-vue-options-api/)
- [`useErrorCause`](https://biomejs.dev/linter/rules/use-error-cause/)
- [`useConsistentEnumValueType`](https://biomejs.dev/linter/rules/use-consistent-enum-value-type/)
- [`useConsistentMethodSignatures`](https://biomejs.dev/linter/rules/use-consistent-method-signatures/)
- [`useGlobalThis`](https://biomejs.dev/linter/rules/use-global-this/) (default severity: `warn`)
- [`useDestructuring`](https://biomejs.dev/linter/rules/use-destructuring/)
- [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/) (recommended, Vue domain)
- [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/) (recommended, Vue domain)
- [`useVueConsistentVOnStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-on-style/) (recommended, Vue domain)
- [`noHexColors`](https://biomejs.dev/linter/rules/no-hex-colors/)
- [`useConsistentGraphqlDescriptions`](https://biomejs.dev/linter/rules/use-consistent-graphql-descriptions/)
- [`noRootType`](https://biomejs.dev/linter/rules/no-root-type/)
- [`useLoneExecutableDefinition`](https://biomejs.dev/linter/rules/use-lone-executable-definition/)
- [`useInputName`](https://biomejs.dev/linter/rules/use-input-name/)

##### Complexity

Promoted the following rules to the `complexity` group:

- [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/)
- [`noRedundantDefaultExport`](https://biomejs.dev/linter/rules/no-redundant-default-export/) (default severity: `warn`)
- [`noUselessReturn`](https://biomejs.dev/linter/rules/no-useless-return/)
- [`noDivRegex`](https://biomejs.dev/linter/rules/no-div-regex/)

##### Performance

Promoted the following rules to the `performance` group:

- [`noSyncScripts`](https://biomejs.dev/linter/rules/no-sync-scripts/)
- [`noJsxPropsBind`](https://biomejs.dev/linter/rules/no-jsx-props-bind/)
- [`useVueVapor`](https://biomejs.dev/linter/rules/use-vue-vapor/)

##### Security

Promoted the following rules to the `security` group:

- [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) (recommended)

##### A11y

Promoted the following rules to the `a11y` group:

- [`noAmbiguousAnchorText`](https://biomejs.dev/linter/rules/no-ambiguous-anchor-text/) (recommended)

- [#&#8203;10121](https://github.com/biomejs/biome/pull/10121) [`450f8e1`](https://github.com/biomejs/biome/commit/450f8e1c0a46e8c867a63a0842deaa50dee95176) Thanks [@&#8203;jongwan56](https://github.com/jongwan56)! - Biome now applies Git's local exclude file when VCS ignore files are enabled. Files listed in `.git/info/exclude` are skipped the same way as files listed in `.gitignore`, including in linked worktrees.

- [#&#8203;9397](https://github.com/biomejs/biome/pull/9397) [`d5913c9`](https://github.com/biomejs/biome/commit/d5913c9d57b771b0b1c0097f8014017878cc14c2) Thanks [@&#8203;mvarendorff](https://github.com/mvarendorff)! - Added `ignore` option to the [noUnusedVariables](https://biomejs.dev/linter/rules/no-unused-variables/) rule. The option allows excluding identifiers by providing a list of ignored names. It also allows excluding kinds of identifiers from this rule entirely, which may be useful when loading classes dynamically.

  For example, unused classes as well as all unused variables, functions, etc. called "unused" may be ignored entirely with the following configuration:

  ```json
  {
    "ignore": {
      "*": ["unused"],
      "class": ["*"]
    }
  }
  ```

- [#&#8203;10089](https://github.com/biomejs/biome/pull/10089) [`71a21f0`](https://github.com/biomejs/biome/commit/71a21f0ab4fd32739331d3b3068c6c1ae6392290) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the lint rule [`noLabelWithoutControl`](https://biomejs.dev/linter/rules/no-label-without-control/) to HTML, which enforces that a label element or component has a text label and an associated input.

  ```html
  <label></label>
  ```

- [#&#8203;10015](https://github.com/biomejs/biome/pull/10015) [`1828261`](https://github.com/biomejs/biome/commit/182826178de9c1b23bad2e997c3567a9d5176ba2) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`useAriaPropsSupportedByRole`](https://biomejs.dev/linter/rules/use-aria-props-supported-by-role/), which enforces that ARIA properties are valid for the roles that are supported by the element.

  ```html
  <a href="#" aria-checked></a>
  ```

- [#&#8203;10234](https://github.com/biomejs/biome/pull/10234) [`1a51569`](https://github.com/biomejs/biome/commit/1a51569229936b9ad1191d081ed6742e8342badd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Added the `delimiterSpacing` formatter option. This option inserts spaces inside delimiters (after the opening delimiter and before the closing delimiter) when the content fits on a single line. Empty delimiters are not affected, and no space is added before the opening delimiter. The specific delimiters affected depend on the language. It can be configured globally via `formatter.delimiterSpacing` or per-language via `javascript.formatter.delimiterSpacing`, `json.formatter.delimiterSpacing`, and `css.formatter.delimiterSpacing`. Defaults to `false`.

  ```diff
  - callFn(foo)
  + callFn( foo )
  ```

  ```diff
  - const arr = [1, 2, 3];
  + const arr = [ 1, 2, 3 ];
  ```

  ##### JavaScript

  When enabled, Biome inserts spaces inside parentheses (e.g., `foo( a, b )`), square brackets (e.g., `[ a, b ]`), template literal interpolations (e.g., `${ expr }`), and the logical NOT operator (e.g., `! x`, but in chains only after the last one: `!! x`). Only applies when the content fits on a single line. Empty delimiters and the space before the opening delimiter are not affected.

  ```diff
  - if (condition) {}
  + if ( condition ) {}
  ```

  ```diff
  - `Hello ${name}!`
  + `Hello ${ name }!`
  ```

  ##### JSX

  When enabled, Biome inserts spaces inside JSX expression braces (e.g., `attr={ value }`) and spread attributes (e.g., `{ ...props }`). Only applies when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - <Foo bar={value} />
  + <Foo bar={ value } />
  ```

  ##### TypeScript

  When enabled, Biome inserts spaces inside TypeScript angle brackets (e.g., `foo< T >()`), indexed access types (e.g., `T[ K ]`), mapped types, tuple types, type parameters, and index signatures. Only applies when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - type Result = Map<string, number>;
  + type Result = Map< string, number >;
  ```

  ##### JSON

  When enabled, Biome inserts spaces inside square brackets when the content fits on a single line. Empty brackets are not affected.

  ```diff
  - [1, 2, 3]
  + [ 1, 2, 3 ]
  ```

  ##### CSS

  When enabled, Biome inserts spaces inside parentheses and square brackets when the content fits on a single line. Empty delimiters are not affected.

  ```diff
  - rgba(0, 0, 0, 1)
  + rgba( 0, 0, 0, 1 )
  ```

  ```diff
  - [data-attr]
  + [ data-attr ]
  ```

- [#&#8203;10461](https://github.com/biomejs/biome/pull/10461) [`6bac1c3`](https://github.com/biomejs/biome/commit/6bac1c3457d396215e4daed5fc59eaf23b42f4eb) Thanks [@&#8203;TXWSLYF](https://github.com/TXWSLYF)! - Implements [#&#8203;9445](https://github.com/biomejs/biome/issues/9445). Added the `allowImplicit` option to [`useIterableCallbackReturn`](https://biomejs.dev/linter/rules/use-iterable-callback-return/). When enabled, callbacks can use `return;` to implicitly return `undefined`, matching ESLint's `array-callback-return` rule.

- [#&#8203;9571](https://github.com/biomejs/biome/pull/9571) [`5a8eb75`](https://github.com/biomejs/biome/commit/5a8eb755fe07b38760d2b72ec46e24cd108f6619) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Added configurable options to the [`useNumericSeparators`](https://biomejs.dev/linter/rules/use-numeric-separators/) rule. Users can now customize the minimum number of digits required before adding separators and the group length for each type of numeric literal (`binary`, `octal`, `decimal`, `hexadecimal`).

  ```json
  {
    "linter": {
      "rules": {
        "style": {
          "useNumericSeparators": {
            "level": "error",
            "options": {
              "decimal": {
                "minimumDigits": 7,
                "groupLength": 3
              },
              "hexadecimal": {
                "minimumDigits": 4,
                "groupLength": 2
              }
            }
          }
        }
      }
    }
  }
  ```

- [#&#8203;10067](https://github.com/biomejs/biome/pull/10067) [`6064312`](https://github.com/biomejs/biome/commit/60643120b5593104b311e184cf9581b9c7c2254d) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the lint rule [`useFocusableInteractive`](https://biomejs.dev/linter/rules/use-focusable-interactive/) to HTML, which enforces elements with an interactive role and interaction handler to be focusable.

  **Invalid**:

  ```html
  <div role="button"></div>
  ```

- [#&#8203;10026](https://github.com/biomejs/biome/pull/10026) [`fb42ac4`](https://github.com/biomejs/biome/commit/fb42ac42079ec7b8e699a507bce332f4446ac7f2) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementInteractions`](https://biomejs.dev/linter/rules/no-noninteractive-element-interactions/), which disallows use event handlers on non-interactive elements.

  **Invalid**:

  ```html
  <div >button</div>
  ```

- [#&#8203;10000](https://github.com/biomejs/biome/pull/10000) [`2093e3e`](https://github.com/biomejs/biome/commit/2093e3ee2a615abecae159d35a5a17fe0df5f506) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the new assist action [`useSortedEnumMembers`](https://biomejs.dev/assist/actions/use-sorted-enum-members/), which sorts TypeScript & GraphQL enum members.

  **Invalid**:

  ```graphql
  enum Role {
    SUPER_ADMIN
    ADMIN
    USER
    GOD
  }
  ```

- [#&#8203;10013](https://github.com/biomejs/biome/pull/10013) [`ad01d3d`](https://github.com/biomejs/biome/commit/ad01d3d882276b070433822f01cdf6afed63ca4e) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added the HTML lint rule [`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/), which enforces using valid values for the `autocomplete` attribute on `input` elements.

  ```html
  <input autocomplete="incorrect" />
  ```

##### Patch Changes

- [#&#8203;10498](https://github.com/biomejs/biome/pull/10498) [`995c1ff`](https://github.com/biomejs/biome/commit/995c1ffeca039787c93370fed8b970a057e9c073) Thanks [@&#8203;citadelgrad](https://github.com/citadelgrad)! - Added the nursery rule [`useReactFunctionComponentDefinition`](https://biomejs.dev/linter/rules/use-react-function-component-definition), which enforces a consistent function type for named React function components.

  For example, the following snippet triggers the rule by default.

  ```jsx
  const MyComponent = (props) => {
    return <div>{props.name}</div>;
  };
  ```

- [#&#8203;9974](https://github.com/biomejs/biome/pull/9974) [`ff635a9`](https://github.com/biomejs/biome/commit/ff635a90da3567a9006ae947b6c5983d87dfbb9f) Thanks [@&#8203;pkallos](https://github.com/pkallos)! - Added `ignoreMixedLogicalExpressions` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/), partially addressing [#&#8203;9232](https://github.com/biomejs/biome/issues/9232). When enabled, Biome ignores `||` and `||=` mixed with `&&` in the same expression tree.

- [#&#8203;10503](https://github.com/biomejs/biome/pull/10503) [`c656679`](https://github.com/biomejs/biome/commit/c656679d1f9e725a42e5d60fb3b9e76bb03d7f88) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Added the new nursery rule `useSvelteRequireEachKey`, a Svelte lint rule that reports `{#each}` blocks with item bindings that are missing a key.

- [#&#8203;10516](https://github.com/biomejs/biome/pull/10516) [`0f29b83`](https://github.com/biomejs/biome/commit/0f29b8361ba3cd11bdbfb91f8ff722184cfadf08) Thanks [@&#8203;Dotify71](https://github.com/Dotify71)! - Added [`useIncludes`](https://biomejs.dev/linter/rules/use-includes/) to the nursery group. This rule flags comparisons of `String.prototype.indexOf()` or `Array.prototype.indexOf()` against `-1` and suggests replacing them with the clearer `includes()` / `!includes()` form.

- [#&#8203;10487](https://github.com/biomejs/biome/pull/10487) [`0c03ee3`](https://github.com/biomejs/biome/commit/0c03ee3deee068220175c3599e6bc3c4ed8ad247) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed a Svelte parser error that incorrectly required a binding variable after `{:then}` and `{:catch}`. Biome now correctly accepts `{:then}` and `{:catch}` without a binding, as well as the `{#await expr then}` and `{#await expr catch}` shorthand forms.

- [#&#8203;10566](https://github.com/biomejs/biome/pull/10566) [`a4a294c`](https://github.com/biomejs/biome/commit/a4a294c3c1128fc5b38634262d499d3d2601bf3b) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/): The rule now only reports diagnostics in Vue files and ignores SVG elements.

- [#&#8203;10565](https://github.com/biomejs/biome/pull/10565) [`72ccf3b`](https://github.com/biomejs/biome/commit/72ccf3b042c4258f9871ff5b99d87f879cecccde) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/): The rule no longer reports argument-less `v-bind` directives because they cannot be converted to shorthand syntax.

- [#&#8203;10591](https://github.com/biomejs/biome/pull/10591) [`6e8557b`](https://github.com/biomejs/biome/commit/6e8557b1b8e49ce2383f6089a46624eb030178ad) Thanks [@&#8203;xsourabhsharma](https://github.com/xsourabhsharma)! - Fixed [#&#8203;10563](https://github.com/biomejs/biome/issues/10563): Biome now parses comma-separated CSS Modules `composes` values, such as `composes: classA from "./a.css", classB from "./b.css";`.

- [#&#8203;10603](https://github.com/biomejs/biome/pull/10603) [`174b21b`](https://github.com/biomejs/biome/commit/174b21b52993fc3e0237ceefe97c0d71c9b5264e) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting for `grid-template-areas` declarations with comments before multiline values. Biome now keeps grid area rows aligned instead of adding an extra declaration-boundary indent.

  ```diff
   .grid {
     grid-template-areas:
   /* row */
  -      "header header"
  -      "footer footer";
  +    "header header"
  +    "footer footer";
   }
  ```

- [#&#8203;10542](https://github.com/biomejs/biome/pull/10542) [`c3f07f7`](https://github.com/biomejs/biome/commit/c3f07f773edeb7f098c778392c5e2d6bb92b78fb) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10513](https://github.com/biomejs/biome/issues/10513): Biome no longer rejects literal `\u` sequences in quoted HTML attribute values.

- [#&#8203;10108](https://github.com/biomejs/biome/pull/10108) [`24e51d6`](https://github.com/biomejs/biome/commit/24e51d6edebaee0ffb938bc20633d9c3403110c9) Thanks [@&#8203;IxxyDev](https://github.com/IxxyDev)! - Fixed [#&#8203;6611](https://github.com/biomejs/biome/issues/6611): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) now uses type information to detect more redundant conditions, including `?.`, `??`, `||`, `&&`, comparisons against `null`/`undefined` on non-nullish operands, and `case` clauses that can never match the `switch` value.

- [#&#8203;10568](https://github.com/biomejs/biome/pull/10568) [`eb1ed0e`](https://github.com/biomejs/biome/commit/eb1ed0e90395a07e64ee763fe15ae00fb77682e0) Thanks [@&#8203;harsha-cpp](https://github.com/harsha-cpp)! - Fixed [#&#8203;10564](https://github.com/biomejs/biome/issues/10564): `useAriaPropsForRole` no longer reports false positives for Vue v-bind shorthand bindings (`:aria-checked`, `:aria-level`, etc.).

- [#&#8203;10570](https://github.com/biomejs/biome/pull/10570) [`2ceb4fe`](https://github.com/biomejs/biome/commit/2ceb4fe437b77b08a60ad48efde2a6c311b7d2e3) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Improved [`noTsIgnore`](https://biomejs.dev/linter/rules/no-ts-ignore/).
  The rule now reports more precisely the range of the `@ts-ignore` comment.

- [#&#8203;10520](https://github.com/biomejs/biome/pull/10520) [`b55d10f`](https://github.com/biomejs/biome/commit/b55d10f5e8f3099b3f246911ca19cc79758d55e0) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Fixed [#&#8203;10519](https://github.com/biomejs/biome/issues/10519): Vue `v-on` event handlers with multiple inline statements are now parsed consistently with Vue.

- [#&#8203;10204](https://github.com/biomejs/biome/pull/10204) [`ebbf0bd`](https://github.com/biomejs/biome/commit/ebbf0bd382059936ac00de29fc58931728f854d9) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Improved the performance of the Biome linter. The improvements are more visible in bigger projects that have more than \~1k files. Early tests showed that in a code base with \~2k files, Biome took less than 26% of time to finish the command.

- [#&#8203;10546](https://github.com/biomejs/biome/pull/10546) [`e39bb2c`](https://github.com/biomejs/biome/commit/e39bb2c23063ad0384a12e01d666909fd6b26735) Thanks [@&#8203;tim-we](https://github.com/tim-we)! - Fixed [`#10536`](https://github.com/biomejs/biome/issues/10536): [noUnknownFunction](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flagged CSS `contrast-color()` as unknown. `contrast-color()` is Baseline 2026.

- [#&#8203;8012](https://github.com/biomejs/biome/pull/8012) [`2be0264`](https://github.com/biomejs/biome/commit/2be02648a090153a93cf71fb63ef68feefd495c2) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - Improved the performance of the formatter in some cases. The formatter is now up to \~20% faster at formatting files.

- [#&#8203;10467](https://github.com/biomejs/biome/pull/10467) [`9a5855e`](https://github.com/biomejs/biome/commit/9a5855e4191c98149f8278289569b2272b992684) Thanks [@&#8203;Netail](https://github.com/Netail)! - Added a new nursery rule [`noRestrictedDependencies`](https://biomejs.dev/linter/rules/no-restricted-dependencies/), which flags imports and `package.json` dependency entries that have better alternatives in e18e's module replacement data.

  For example, the package `globby` is reported because there's a better alternative:

  ```js
  import glob from "globby";
  ```

  ```json
  {
    "dependencies": {
      "globby": "x.x.x"
    }
  }
  ```

- [#&#8203;10470](https://github.com/biomejs/biome/pull/10470) [`84b43c5`](https://github.com/biomejs/biome/commit/84b43c5969569cb3eea3d51ea6c602276723306b) Thanks [@&#8203;ShaharAviram1](https://github.com/ShaharAviram1)! - Fixed [#&#8203;10447](https://github.com/biomejs/biome/issues/10447): now the rule [`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env) detects the use of `env` when it's imported from `process` and `node:process`.

- [#&#8203;10556](https://github.com/biomejs/biome/pull/10556) [`7ff6b16`](https://github.com/biomejs/biome/commit/7ff6b165f2f62a0836446dee889d9868f12fb06e) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;10492](https://github.com/biomejs/biome/issues/10492): Biome no longer crashes with a stack overflow on certain code when a type-aware rule such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/), [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/), or [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) is enabled. For example, the following code used to crash Biome:

  ```js
  function f(visitor) {
    let ctrl = visitor();
    for (const x of [0]) ctrl = ctrl();
  }
  ```

- [#&#8203;10532](https://github.com/biomejs/biome/pull/10532) [`1da3c75`](https://github.com/biomejs/biome/commit/1da3c7573cdb1d097fc1773fee686140d95f3f35) Thanks [@&#8203;denbezrukov](https://github.com/denbezrukov)! - CSS declarations with comments before `:` or after `!important` now preserve spaces before `:` and `;`.

  ```diff
   .selector {
  -  padding/* name */: 1px;
  -  color: red !important /* note */;
  +  padding/* name */ : 1px;
  +  color: red !important /* note */ ;
   }
  ```

- [#&#8203;10491](https://github.com/biomejs/biome/pull/10491) [`a1b5834`](https://github.com/biomejs/biome/commit/a1b5834d4968fd518cc4adfa0e8b4b65b2232637) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed the Svelte parser rejecting `{#each}` blocks where the binding uses object destructuring with property renaming, e.g. `{#each items as { id, component: Filter }}`. Biome now correctly parses and formats these rename bindings.

- [#&#8203;10490](https://github.com/biomejs/biome/pull/10490) [`99bc7df`](https://github.com/biomejs/biome/commit/99bc7df1d1cbb599e9713da56c29763cd04bb53c) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed the CSS parser rejecting comma-separated selector lists inside `:global()` and `:local()` pseudo-class functions. Biome now correctly parses `:global(.foo, .bar)`.

- [#&#8203;10543](https://github.com/biomejs/biome/pull/10543) [`c394fae`](https://github.com/biomejs/biome/commit/c394faeaa27f9f7db8ba075afc6657c0245d8276) Thanks [@&#8203;mangod12](https://github.com/mangod12)! - Fixed [#&#8203;10477](https://github.com/biomejs/biome/issues/10477): The RDJSON reporter now emits code replacement text for fix suggestions instead of the human-readable fix description.

- [#&#8203;10530](https://github.com/biomejs/biome/pull/10530) [`e8e1e6a`](https://github.com/biomejs/biome/commit/e8e1e6aa1b39d1e19d33c12d4b56d6d3fd01a7ce) Thanks [@&#8203;Conaclos](https://github.com/Conaclos)! - Fixed [#&#8203;10493](https://github.com/biomejs/biome/issues/10493): [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/) now correctly separates types from a default named import when all imports are types and the `style` option is set to `separatedType`.

- [#&#8203;10555](https://github.com/biomejs/biome/pull/10555) [`263c7cc`](https://github.com/biomejs/biome/commit/263c7ccd12cd8c0d4527fdf4797c652a223df012) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Improved Svelte lint rule accuracy for quoted attribute values containing `{expression}` interpolations.
  - [`noRedundantAlt`](https://biomejs.dev/linter/rules/no-redundant-alt/) no longer emits false positives when the alt text contains an interpolation, e.g. `alt="image of {person}"`.
  - [`useButtonType`](https://biomejs.dev/linter/rules/use-button-type/) no longer emits false positives for dynamic button types written as `type="{dynamicType}"`.
  - [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) no longer emits false positives for dynamic hrefs such as `href="{url}"`.

- [#&#8203;10489](https://github.com/biomejs/biome/pull/10489) [`96ef9a4`](https://github.com/biomejs/biome/commit/96ef9a4c2647a71d917485f6791e151cf8b88c96) Thanks [@&#8203;Mokto](https://github.com/Mokto)! - Fixed Svelte `{#each}` parser incorrectly rejecting TypeScript `as const` type assertions in the iterable expression. Biome now correctly parses `{#each arr as const as item}`.

- [#&#8203;10539](https://github.com/biomejs/biome/pull/10539) [`935c59a`](https://github.com/biomejs/biome/commit/935c59a6657022c37c9b9933c66cc29c236e5aff) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved how diagnostics print long lines of code, for example minified files where the entire source code is printed in one line.

</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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMjQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIyNC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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

Labels

A-CLI Area: CLI A-Linter Area: linter A-LSP Area: language server protocol A-Project Area: project L-Grit Language: GritQL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

📎 Implement fixable GritQL plugins

4 participants

0