Skip to content

chore: merge main into next#10104

Merged
Netail merged 23 commits into
nextfrom
chore/main-into-next
Apr 24, 2026
Merged

chore: merge main into next#10104
Netail merged 23 commits into
nextfrom
chore/main-into-next

Conversation

@Netail

@Netail Netail commented Apr 23, 2026

Copy link
Copy Markdown
Member

Summary

Merge main into next

Important

Don't use squash merge (feel free to merge, off to bed)

Test Plan

Docs

Netail and others added 23 commits April 19, 2026 15:18
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…0033)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

Co-authored-by: dyc3 <1808807+dyc3@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…es (#10084)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Carson McManus <carson.mcmanus1@gmail.com>
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com>
…me cases (#9757)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
@changeset-bot

changeset-bot Bot commented Apr 23, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 63995d1

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

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

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

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

@github-actions github-actions Bot added A-CLI Area: CLI A-Project Area: project A-Linter Area: linter A-Parser Area: parser A-Formatter Area: formatter A-Tooling Area: internal tools labels Apr 23, 2026
@github-actions github-actions Bot added L-JavaScript Language: JavaScript and super languages L-CSS Language: CSS and super languages L-JSON Language: JSON and super languages A-Diagnostic Area: diagnostocis L-HTML Language: HTML and super languages L-Grit Language: GritQL L-Markdown Language: Markdown labels Apr 23, 2026
@codspeed-hq

codspeed-hq Bot commented Apr 23, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 249 untouched benchmarks


Comparing chore/main-into-next (63995d1) with next (71a21f0)

Open in CodSpeed

@coderabbitai

coderabbitai Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

This is a comprehensive release-preparation PR that finalizes version 2.4.13 of Biome. It removes changeset entries for completed features, updates nursery lint rules with release versions, deletes Prettier snapshot test fixtures to reduce maintenance overhead, and implements a test-ignore system. The changes span lint rule metadata updates, CSS/HTML formatter refinements (including SCSS map formatting and HTML newline preservation), GitHub Actions workflow bumps, semantic model improvements for Svelte store resolution, and various test/documentation updates.

Possibly related PRs

Suggested labels

A-Linter, A-Formatter, A-CLI, L-JavaScript, L-CSS, L-HTML, A-Diagnostic, L-TypeScript

Suggested reviewers

  • ematipico
  • dyc3
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/main-into-next

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
crates/biome_js_analyze/src/lint/suspicious/no_alert.rs (1)

59-65: ⚠️ Potential issue | 🟡 Minor

Expand snapshot tests for computed-member access with additional variants.

Test coverage for window["alert"] exists and works correctly, but snapshots are missing single-quote bracket notation (window['confirm'], window['prompt']) and cannot handle escaped variants (window["\x61lert"]) because inner_string_text strips quotes without decoding escape sequences. Consider adding single-quote cases to the invalid.js snapshot test.

Note: The rule metadata at lines 59–65 is unchanged; no snapshot tests are needed for RuleSource variants.

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

In `@crates/biome_js_analyze/src/lint/suspicious/no_alert.rs` around lines 59 -
65, Add single-quote computed-member cases to the invalid snapshot for the
noAlert rule: extend the existing invalid.js snapshot tests to include
window['confirm'] and window['prompt'] (and their variants mirroring the
existing double-quote tests) so the rule covers single-quote bracket notation;
do not change the RuleSource metadata in NoAlert and leave inner_string_text
behavior as-is for now.
crates/biome_js_formatter/src/comments.rs (1)

620-626: ⚠️ Potential issue | 🟠 Major

Add a snapshot test for JsSvelteSnippetRoot comment placement.

Line 625 explicitly handles this root type, but there's no test fixture validating the comment placement behaviour. Formatter changes require snapshot tests per the coding guidelines.

Consider adding a test case in crates/biome_js_formatter/tests/specs/ that exercises comment placement on a Svelte snippet root, similar to how other root types would be tested.

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

In `@crates/biome_js_formatter/src/comments.rs` around lines 620 - 626, Add a
snapshot test that exercises comment placement for the JsSvelteSnippetRoot case
handled by handle_root_comments: create a new fixture under
crates/biome_js_formatter/tests/specs/ containing a Svelte snippet with comments
around the root (leading/trailing/inline) and assert the formatter output
matches a snapshot; name the test similar to existing root-type tests and ensure
it runs the formatter on the snippet to capture comment placement for
JsSvelteSnippetRoot so future changes will be caught.
🧹 Nitpick comments (7)
crates/biome_html_formatter/tests/quick_test.rs (1)

14-14: Empty test source.

The src is currently an empty string, which means running this test won't exercise any meaningful formatter behaviour. This is likely fine if it's just a cleanup after debugging, but you may want to add a placeholder comment or sample HTML for future debugging sessions.

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

In `@crates/biome_html_formatter/tests/quick_test.rs` at line 14, The test defines
an empty source string `src` in quick_test.rs which doesn't exercise the
formatter; update the `src` variable in the `quick_test` to contain a small
representative HTML snippet or at least a placeholder comment (e.g., a simple
"<div>test</div>" or "<!-- placeholder -->") so the formatter is exercised when
the test runs and will be useful for future debugging; edit the `src` assignment
accordingly.
crates/biome_js_analyze/src/lint/suspicious/no_import_cycles.rs (1)

208-210: Silent skip on invalid path - acceptable but worth noting.

If as_path() returns None, this silently omits the path from the diagnostic note. In practice this shouldn't occur since cycle detection validates paths, but a debug log here could help diagnose unexpected edge cases.

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

In `@crates/biome_js_analyze/src/lint/suspicious/no_import_cycles.rs` around lines
208 - 210, When iterating over cycle paths and calling path.as_path(), add a
debug log in the else branch so invalid/None paths are recorded for
troubleshooting; locate the loop using path and as_path() (in
no_import_cycles.rs) and replace the silent continue with a short debug
statement (e.g., tracing::debug! or log::debug!) that includes contextual
identifiers (the path variable, cycle id or index, and any diagnostic note id)
and then continue, so unexpected None cases are visible in debug logs without
changing control flow.
crates/biome_js_analyze/src/lint/complexity/use_date_now.rs (1)

192-196: Optional tidy-up: keep method filtering in one place.

The method gate is currently checked twice (boolean pre-check + fallback match). A single match-first mapping would be simpler to maintain.

Proposed refactor
-    let member_name = callee.get_callee_member_name()?.token_text_trimmed();
-    if member_name != "getTime" && member_name != "valueOf"
-        || call_expr.is_optional()
-        || call_expr.arguments().ok()?.args().len() > 0
-    {
-        return None;
-    }
+    let member_name = callee.get_callee_member_name()?.token_text_trimmed();
+    let issue_kind = match member_name.text() {
+        "getTime" => UseDateNowIssueKind::ReplaceGetTimeMethod,
+        "valueOf" => UseDateNowIssueKind::ReplaceValueOfMethod,
+        _ => return None,
+    };
+    if call_expr.is_optional() || call_expr.arguments().ok()?.args().len() > 0 {
+        return None;
+    }
@@
-    Some((
-        AnyJsExpression::cast_ref(call_expr.syntax())?,
-        match member_name.text() {
-            "getTime" => UseDateNowIssueKind::ReplaceGetTimeMethod,
-            "valueOf" => UseDateNowIssueKind::ReplaceValueOfMethod,
-            _ => return None,
-        },
-    ))
+    Some((AnyJsExpression::cast_ref(call_expr.syntax())?, issue_kind))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_js_analyze/src/lint/complexity/use_date_now.rs` around lines 192
- 196, The code currently checks the allowed method twice; consolidate into a
single match that maps member_name.text() to an Option<UseDateNowIssueKind>
instead of doing a boolean pre-check plus a fallback match. Update the logic in
use_date_now.rs where member_name.text() is inspected so the match directly
returns Some(UseDateNowIssueKind::ReplaceGetTimeMethod) for "getTime",
Some(UseDateNowIssueKind::ReplaceValueOfMethod) for "valueOf", and None
otherwise, removing the separate method-gate boolean check and keeping all other
behavior unchanged.
crates/biome_formatter_test/src/diff_report.rs (1)

195-199: Simplify the clone.

(*file_name).clone() is unnecessarily verbose — file_name.clone() does the same.

✨ Suggested simplification
             let single_file_metric_data = SingleFileMetricData {
                 diff,
-                filename: (*file_name).clone(),
+                filename: file_name.clone(),
                 single_file_compatibility: ratio,
             };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_formatter_test/src/diff_report.rs` around lines 195 - 199, The
construction of SingleFileMetricData uses an unnecessary deref-and-clone;
replace the verbose (*file_name).clone() with the simpler file_name.clone() when
setting the filename in the SingleFileMetricData initializer to make the code
clearer and idiomatic (refer to SingleFileMetricData and the file_name
variable).
crates/biome_formatter_test/src/test_prettier_snapshot.rs (1)

95-109: Static cache assumes single formatter per test binary.

The OnceLock cache is initialised with the first caller's root_path. Since each formatter crate compiles to its own test binary, this works fine — but if tests were ever consolidated, only the first formatter's ignore list would be used.

A brief comment noting this assumption would help future maintainers.

📝 Suggested comment
+/// Loads and caches ignored test patterns from the `prettier_ignored_tests` file.
+///
+/// Note: Uses a process-wide cache, assuming each formatter crate runs in its own
+/// test binary. If multiple formatters share a binary, only the first `root_path` is used.
 fn load_ignored_tests(root_path: &Utf8Path) -> &'static [String] {
     static CACHE: OnceLock<Vec<String>> = OnceLock::new();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_formatter_test/src/test_prettier_snapshot.rs` around lines 95 -
109, Add a brief comment inside load_ignored_tests describing that the static
OnceLock CACHE captures the ignore-list once using the first caller's root_path,
so the implementation assumes one formatter/test binary per process and will not
reflect different root_path values if tests are consolidated; reference the
CACHE static and root_path parameter so future maintainers understand the
limitation and why the OnceLock was chosen.
crates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rs (1)

63-67: Tiny tidy-up: reuse the fetched token and drop the inline question.
Not a blocker, but this trims one extra lookup and keeps the code path sharper.

♻️ Suggested tweak
-        let name = binding.name_token().ok()?;
-        let name = name.text_trimmed();
-
-        // should this also cover web/node js globals?
-        if crate::globals::is_js_language_global(name) {
+        let name_token = binding.name_token().ok()?;
+        let name = name_token.text_trimmed();
+        if crate::globals::is_js_language_global(name) {
             Some(State {
-                shadowed_name: binding.name_token().ok()?.token_text_trimmed(),
+                shadowed_name: name_token.token_text_trimmed(),
             })
         } else {
             None
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rs`
around lines 63 - 67, Fetch the token once into a local variable and reuse it
instead of calling binding.name_token().ok()? twice: call
binding.name_token().ok()? and bind it to e.g. let name_token = ... before the
is_js_language_global(name) check, then use name_token.token_text_trimmed() when
constructing State; keep the is_js_language_global(name) guard but remove the
duplicate lookup/inline question expression to avoid the extra call.
crates/biome_js_analyze/src/lint/suspicious/no_duplicate_jsx_props.rs (1)

67-97: Avoid the O(n²) duplicate scan.

The nested walk plus processed_names.contains(...) makes duplicate detection quadratic on prop-heavy elements. A keyed grouping map using AttributeNameKey would keep the new normalisation and get this back to a single pass.

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

In `@crates/biome_js_analyze/src/lint/suspicious/no_duplicate_jsx_props.rs` around
lines 67 - 97, The current nested loops in the block that builds
duplicated_attributes (using processed_names and attribute_name_key over
attributes) are O(n²); replace that with a single-pass grouping: create a
HashMap<AttributeNameKey, Vec<Attribute>> (or Vec<&Attribute>) and iterate
attributes once, using attribute_name_key(attr) to compute the key and pushing
the attr into the map bucket; after the pass, collect map values with len() > 1
into duplicated_attributes and return that. Keep references to
attribute_name_key, attributes, duplicated_attributes and processed_names
(remove processed_names) so the normalization logic stays unchanged.
🤖 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_analyze/CONTRIBUTING.md`:
- Around line 1010-1011: The declared Signals type is wrong for the example:
change Signals from Option<Box<[Self::State]>> to Box<[Self::State]> (or
alternatively wrap the return in Some(...)); specifically update the Signals
type definition to match what write_ranges.into_boxed_slice() returns
(Box<[TextRange]>) so ForLoopCountReferencesOptions and uses of Self::State
align with the example, or if you really want optional signals, return
Some(write_ranges.into_boxed_slice()) where write_ranges.into_boxed_slice() is
currently returned.

In `@crates/biome_css_formatter/src/scss/auxiliary/map_expression_pair.rs`:
- Around line 63-77: The function value_manages_its_own_breaking currently
treats AnyScssExpression::ScssParenthesizedExpression(_) as self-breaking;
change value_manages_its_own_breaking so ScssParenthesizedExpression is only
considered self-breaking when its inner payload is a list or a map (not a
scalar). In practice, update the matches for ScssParenthesizedExpression in both
the top-level match and the unwrap_single_expression_item closure to inspect the
inner expression/item and only return true when that inner expression/item is a
ScssListExpression or ScssMapExpression (use the existing
unwrap_single_expression_item logic and the AnyScssExpressionItem variants to
identify list/map payloads).

In `@crates/biome_js_analyze/src/lint/correctness/use_single_js_doc_asterisk.rs`:
- Line 200: The closure used with take_while is using the bitwise-NOT operator
instead of inequality (`!b == b'*'`), so update both occurrences (the closure
inside the iterator in use_single_js_doc_asterisk.rs that currently does
line.as_bytes().iter().take_while(|&&b| !b == b'*')...) to use `b != b'*'`
(e.g., take_while(|&&b| b != b'*')) so the iterator correctly stops at an
asterisk; apply the same fix to the other occurrence around line 217.

In
`@crates/biome_js_analyze/src/lint/nursery/use_react_native_platform_components.rs`:
- Around line 99-107: The rule metadata for UseReactNativePlatformComponents
currently sets version: "2.4.13" which makes it appear released; update the
version field to "next" in the declare_lint_rule! block (the
UseReactNativePlatformComponents declaration) so new nursery rules remain marked
as unreleased on the next branch, leaving all other fields (name, language,
sources, domains, recommended, severity) unchanged.
- Around line 111-116: The rule currently queries per AnyJsImportLike so
has_android/has_ios only see the current import; change the scope to inspect all
imports in the file and compute has_conflict across the file. Concretely, update
the Query from Ast<AnyJsImportLike> to a file-level query (e.g.,
Ast<AnyJsModule> or the AST node that represents the whole module/program) or,
inside run (fn run(ctx: &RuleContext<Self>)), iterate ctx.root() / ctx.program()
to collect all AnyJsImportLike nodes in the module, compute has_android and
has_ios across that collection (not per-import), and then derive has_conflict
once; also apply the same aggregation fix to the logic referenced around lines
142-149 so both checks use the per-file aggregated flags instead of per-import
flags.

In `@crates/biome_js_analyze/src/lint/style/use_trim_start_end.rs`:
- Around line 111-120: The diagnostic note text in the
RuleDiagnostic::new(...).note(...) markup is missing an opening quotation mark
before {member_name}, causing malformed output; update the markup! block inside
the .note call to include the opening quote so it reads something like
"\"{member_name}\" is an alias for \"{suggested_name}\"" (keep use of the
existing {member_name} and {suggested_name} tokens and the markup! macro).

---

Outside diff comments:
In `@crates/biome_js_analyze/src/lint/suspicious/no_alert.rs`:
- Around line 59-65: Add single-quote computed-member cases to the invalid
snapshot for the noAlert rule: extend the existing invalid.js snapshot tests to
include window['confirm'] and window['prompt'] (and their variants mirroring the
existing double-quote tests) so the rule covers single-quote bracket notation;
do not change the RuleSource metadata in NoAlert and leave inner_string_text
behavior as-is for now.

In `@crates/biome_js_formatter/src/comments.rs`:
- Around line 620-626: Add a snapshot test that exercises comment placement for
the JsSvelteSnippetRoot case handled by handle_root_comments: create a new
fixture under crates/biome_js_formatter/tests/specs/ containing a Svelte snippet
with comments around the root (leading/trailing/inline) and assert the formatter
output matches a snapshot; name the test similar to existing root-type tests and
ensure it runs the formatter on the snippet to capture comment placement for
JsSvelteSnippetRoot so future changes will be caught.

---

Nitpick comments:
In `@crates/biome_formatter_test/src/diff_report.rs`:
- Around line 195-199: The construction of SingleFileMetricData uses an
unnecessary deref-and-clone; replace the verbose (*file_name).clone() with the
simpler file_name.clone() when setting the filename in the SingleFileMetricData
initializer to make the code clearer and idiomatic (refer to
SingleFileMetricData and the file_name variable).

In `@crates/biome_formatter_test/src/test_prettier_snapshot.rs`:
- Around line 95-109: Add a brief comment inside load_ignored_tests describing
that the static OnceLock CACHE captures the ignore-list once using the first
caller's root_path, so the implementation assumes one formatter/test binary per
process and will not reflect different root_path values if tests are
consolidated; reference the CACHE static and root_path parameter so future
maintainers understand the limitation and why the OnceLock was chosen.

In `@crates/biome_html_formatter/tests/quick_test.rs`:
- Line 14: The test defines an empty source string `src` in quick_test.rs which
doesn't exercise the formatter; update the `src` variable in the `quick_test` to
contain a small representative HTML snippet or at least a placeholder comment
(e.g., a simple "<div>test</div>" or "<!-- placeholder -->") so the formatter is
exercised when the test runs and will be useful for future debugging; edit the
`src` assignment accordingly.

In `@crates/biome_js_analyze/src/lint/complexity/use_date_now.rs`:
- Around line 192-196: The code currently checks the allowed method twice;
consolidate into a single match that maps member_name.text() to an
Option<UseDateNowIssueKind> instead of doing a boolean pre-check plus a fallback
match. Update the logic in use_date_now.rs where member_name.text() is inspected
so the match directly returns Some(UseDateNowIssueKind::ReplaceGetTimeMethod)
for "getTime", Some(UseDateNowIssueKind::ReplaceValueOfMethod) for "valueOf",
and None otherwise, removing the separate method-gate boolean check and keeping
all other behavior unchanged.

In `@crates/biome_js_analyze/src/lint/suspicious/no_duplicate_jsx_props.rs`:
- Around line 67-97: The current nested loops in the block that builds
duplicated_attributes (using processed_names and attribute_name_key over
attributes) are O(n²); replace that with a single-pass grouping: create a
HashMap<AttributeNameKey, Vec<Attribute>> (or Vec<&Attribute>) and iterate
attributes once, using attribute_name_key(attr) to compute the key and pushing
the attr into the map bucket; after the pass, collect map values with len() > 1
into duplicated_attributes and return that. Keep references to
attribute_name_key, attributes, duplicated_attributes and processed_names
(remove processed_names) so the normalization logic stays unchanged.

In `@crates/biome_js_analyze/src/lint/suspicious/no_import_cycles.rs`:
- Around line 208-210: When iterating over cycle paths and calling
path.as_path(), add a debug log in the else branch so invalid/None paths are
recorded for troubleshooting; locate the loop using path and as_path() (in
no_import_cycles.rs) and replace the silent continue with a short debug
statement (e.g., tracing::debug! or log::debug!) that includes contextual
identifiers (the path variable, cycle id or index, and any diagnostic note id)
and then continue, so unexpected None cases are visible in debug logs without
changing control flow.

In `@crates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rs`:
- Around line 63-67: Fetch the token once into a local variable and reuse it
instead of calling binding.name_token().ok()? twice: call
binding.name_token().ok()? and bind it to e.g. let name_token = ... before the
is_js_language_global(name) check, then use name_token.token_text_trimmed() when
constructing State; keep the is_js_language_global(name) guard but remove the
duplicate lookup/inline question expression to avoid the extra call.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ba462665-6778-4907-b808-1fb553047b12

📥 Commits

Reviewing files that changed from the base of the PR and between 71a21f0 and 63995d1.

⛔ Files ignored due to path filters (89)
  • Cargo.lock is excluded by !**/*.lock and included by **
  • crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rs is excluded by !**/migrate/eslint_any_rule_to_biome.rs and included by **
  • crates/biome_configuration/src/analyzer/linter/rules.rs is excluded by !**/rules.rs and included by **
  • crates/biome_configuration/src/generated/domain_selector.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_configuration/src/generated/linter_options_check.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/atword/atword.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/custom-parser.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/embedded-language-formatting/yaml.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/empty.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/empty-props.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/test.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-mixins.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested-props.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nesting.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-simple-vars.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/comment_after.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/dirty.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty_newlines.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/ignore.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed-2.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/only_comments.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/with_comments.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/without-newline-after.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/yaml.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/scss/comments/at-rule.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/scss/comments/if-eslit-at-rule-decloration.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/scss/comments/lists.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/scss/map/comment.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/prettier/scss/map/keys.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/scss/expression/map-comments.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/scss/expression/map-context.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/scss/expression/map-expansion.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_formatter/tests/specs/scss/expression/map-values.scss.snap is excluded by !**/*.snap and included by **
  • crates/biome_diagnostics_categories/src/categories.rs is excluded by !**/categories.rs and included by **
  • crates/biome_html_formatter/tests/specs/html/interpolation/interpolation.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/html.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/preserve_newline_nontext_children.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/vue/inner-template.vue.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/whitespace/preserve-newline-nontext-children.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/hello-world.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_invalid_block_type.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type_and_closing_brace.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_invalid_block_type.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type_and_closing_brace.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/invalid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noConstAssign/validSvelteStoreWrite.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalid.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidBuiltinGlobalStoreDereference.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDoubleDollarStoreDereference.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.svelte.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidTypeOnlyStoreDereference.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-invalid.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-valid.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validDollarPrefixedIdentifier.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/noMisleadingReturnType/valid.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.android.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.ios.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.jsx.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_analyze/tests/specs/suspicious/noImportAssign/validSvelteStoreWrite.svelte.ts.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_js_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/arrays/tuple-and-record.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows-bind/arrows-bind.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows/tuple-and-record.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/async-do-expressions/async-do-expressions.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-do-expressions.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decimal.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/do-expressions.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-default-from.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-bind.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-static.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-reflection.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-blocks.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/partial-application.js.snap is excluded by !**/*.snap and included by **
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/pipeline-operator-fsharp.js.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (211)
  • .changeset/add-no-unnecessary-template-expression.md
  • .changeset/cool-memes-juggle.md
  • .changeset/cruel-pans-kick.md
  • .changeset/fair-goats-scream.md
  • .changeset/few-jeans-pick.md
  • .changeset/fix-issue-9994-styled-css.md
  • .changeset/floppy-lines-write.md
  • .changeset/frogs-like-green.md
  • .changeset/hot-foxes-refuse.md
  • .changeset/hungry-meals-wash.md
  • .changeset/mighty-news-taste.md
  • .changeset/moody-waves-bake.md
  • .changeset/no-react-native-literal-colors.md
  • .changeset/no-react-native-raw-text.md
  • .changeset/purple-grapes-leave.md
  • .changeset/rude-crabs-mix.md
  • .changeset/shaggy-planets-yawn.md
  • .changeset/tasty-wings-bake.md
  • .changeset/tidy-planes-stay.md
  • .changeset/warm-roses-dream.md
  • .claude/skills/lint-rule-development/SKILL.md
  • .github/workflows/autofix.yml
  • .github/workflows/benchmark.yml
  • .github/workflows/beta.yml
  • .github/workflows/beta_js_api.yml
  • .github/workflows/main.yml
  • .github/workflows/preview.yml
  • .github/workflows/pull_request.yml
  • .github/workflows/pull_request_js.yml
  • .github/workflows/pull_request_node.yml
  • .github/workflows/release.yml
  • .github/workflows/release_cli.yml
  • .github/workflows/release_js_api.yml
  • .github/workflows/repository_dispatch.yml
  • Cargo.toml
  • Dockerfile.benchmark
  • crates/biome_analyze/CONTRIBUTING.md
  • crates/biome_aria_metadata/build.rs
  • crates/biome_css_analyze/src/lint/complexity/no_important_styles.rs
  • crates/biome_css_analyze/src/lint/correctness/no_invalid_grid_areas.rs
  • crates/biome_css_analyze/src/lint/suspicious/no_duplicate_custom_properties.rs
  • crates/biome_css_analyze/src/lint/suspicious/no_duplicate_properties.rs
  • crates/biome_css_analyze/src/lint/suspicious/no_duplicate_selectors_keyframe_block.rs
  • crates/biome_css_analyze/src/lint/suspicious/no_empty_block.rs
  • crates/biome_css_formatter/src/comments.rs
  • crates/biome_css_formatter/src/scss/auxiliary/list_expression.rs
  • crates/biome_css_formatter/src/scss/auxiliary/map_expression.rs
  • crates/biome_css_formatter/src/scss/auxiliary/map_expression_pair.rs
  • crates/biome_css_formatter/src/scss/auxiliary/parenthesized_expression.rs
  • crates/biome_css_formatter/src/scss/lists/map_expression_pair_list.rs
  • crates/biome_css_formatter/src/utils/mod.rs
  • crates/biome_css_formatter/src/utils/scss_expression.rs
  • crates/biome_css_formatter/src/utils/scss_map.rs
  • crates/biome_css_formatter/tests/specs/prettier/css/atword/atword.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/cursor/test.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/custom-parser.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/embedded-language-formatting/yaml.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/empty.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/empty-props.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/test.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-mixins.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested-props.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nesting.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-simple-vars.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/comment_after.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/dirty.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty_newlines.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/ignore.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed-2.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/only_comments.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/with_comments.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/without-newline-after.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/yaml.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier_ignored_tests
  • crates/biome_css_formatter/tests/specs/scss/expression/map-comments.scss
  • crates/biome_css_formatter/tests/specs/scss/expression/map-context.scss
  • crates/biome_css_formatter/tests/specs/scss/expression/map-expansion.scss
  • crates/biome_css_formatter/tests/specs/scss/expression/map-values.scss
  • crates/biome_formatter_test/src/check_reformat.rs
  • crates/biome_formatter_test/src/diff_report.rs
  • crates/biome_formatter_test/src/spec.rs
  • crates/biome_formatter_test/src/test_prettier_snapshot.rs
  • crates/biome_formatter_test/src/utils.rs
  • crates/biome_graphql_formatter/tests/specs/prettier_ignored_tests
  • crates/biome_grit_patterns/src/grit_target_language/js_target_language/generated_mappings.rs
  • crates/biome_html_formatter/src/html/auxiliary/element.rs
  • crates/biome_html_formatter/src/html/auxiliary/opening_element.rs
  • crates/biome_html_formatter/src/html/lists/element_list.rs
  • crates/biome_html_formatter/tests/quick_test.rs
  • crates/biome_html_formatter/tests/specs/html/svelte/preserve_newline_nontext_children.svelte
  • crates/biome_html_formatter/tests/specs/html/vue/inner-template.vue
  • crates/biome_html_formatter/tests/specs/html/whitespace/preserve-newline-nontext-children.html
  • crates/biome_html_formatter/tests/specs/prettier_ignored_tests
  • crates/biome_html_parser/src/syntax/svelte.rs
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_invalid_block_type.svelte
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type.svelte
  • crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type_and_closing_brace.svelte
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_invalid_block_type.svelte
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type.svelte
  • crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type_and_closing_brace.svelte
  • crates/biome_js_analyze/src/lint/a11y/use_aria_props_supported_by_role.rs
  • crates/biome_js_analyze/src/lint/complexity/no_useless_escape_in_regex.rs
  • crates/biome_js_analyze/src/lint/complexity/no_useless_undefined_initialization.rs
  • crates/biome_js_analyze/src/lint/complexity/use_date_now.rs
  • crates/biome_js_analyze/src/lint/complexity/use_numeric_literals.rs
  • crates/biome_js_analyze/src/lint/correctness/no_global_dirname_filename.rs
  • crates/biome_js_analyze/src/lint/correctness/no_undeclared_dependencies.rs
  • crates/biome_js_analyze/src/lint/correctness/no_undeclared_variables.rs
  • crates/biome_js_analyze/src/lint/correctness/no_unresolved_imports.rs
  • crates/biome_js_analyze/src/lint/correctness/no_void_elements_with_children.rs
  • crates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rs
  • crates/biome_js_analyze/src/lint/correctness/use_single_js_doc_asterisk.rs
  • crates/biome_js_analyze/src/lint/nursery/no_duplicated_spread_props.rs
  • crates/biome_js_analyze/src/lint/nursery/no_jsx_leaked_dollar.rs
  • crates/biome_js_analyze/src/lint/nursery/no_loop_func.rs
  • crates/biome_js_analyze/src/lint/nursery/no_misleading_return_type.rs
  • crates/biome_js_analyze/src/lint/nursery/no_react_native_deep_imports.rs
  • crates/biome_js_analyze/src/lint/nursery/no_react_native_literal_colors.rs
  • crates/biome_js_analyze/src/lint/nursery/no_react_native_raw_text.rs
  • crates/biome_js_analyze/src/lint/nursery/no_unnecessary_template_expression.rs
  • crates/biome_js_analyze/src/lint/nursery/use_dom_node_text_content.rs
  • crates/biome_js_analyze/src/lint/nursery/use_dom_query_selector.rs
  • crates/biome_js_analyze/src/lint/nursery/use_react_native_platform_components.rs
  • crates/biome_js_analyze/src/lint/nursery/use_regexp_test.rs
  • crates/biome_js_analyze/src/lint/style/no_restricted_globals.rs
  • crates/biome_js_analyze/src/lint/style/use_trim_start_end.rs
  • crates/biome_js_analyze/src/lint/suspicious/no_alert.rs
  • crates/biome_js_analyze/src/lint/suspicious/no_duplicate_jsx_props.rs
  • crates/biome_js_analyze/src/lint/suspicious/no_import_cycles.rs
  • crates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rs
  • crates/biome_js_analyze/src/services/semantic.rs
  • crates/biome_js_analyze/src/syntax/correctness/no_duplicate_private_class_members.rs
  • crates/biome_js_analyze/tests/spec_tests.rs
  • crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx
  • crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/invalid.js
  • crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/valid.js
  • crates/biome_js_analyze/tests/specs/correctness/noConstAssign/validSvelteStoreWrite.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalid.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidBuiltinGlobalStoreDereference.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.js
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.options.json
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDoubleDollarStoreDereference.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.svelte.js
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidTypeOnlyStoreDereference.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-invalid.svelte
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-valid.svelte
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.options.json
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.svelte
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validDollarPrefixedIdentifier.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.js
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.ts
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.options.json
  • crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.ts
  • crates/biome_js_analyze/tests/specs/nursery/noMisleadingReturnType/valid.ts
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalid.js
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.jsx
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.options.json
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.android.js
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.ios.js
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.js
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.jsx
  • crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.options.json
  • crates/biome_js_analyze/tests/specs/suspicious/noImportAssign/validSvelteStoreWrite.svelte.ts
  • crates/biome_js_formatter/src/comments.rs
  • crates/biome_js_formatter/src/generated.rs
  • crates/biome_js_formatter/src/js/any/root.rs
  • crates/biome_js_formatter/src/js/auxiliary/mod.rs
  • crates/biome_js_formatter/src/js/auxiliary/svelte_snippet_root.rs
  • crates/biome_js_formatter/tests/specs/prettier/js/arrays/tuple-and-record.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows-bind/arrows-bind.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows/tuple-and-record.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/async-do-expressions/async-do-expressions.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-do-expressions.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-generators.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/bigint.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-properties.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-static-block.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decimal.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorator-auto-accessors.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorators.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/deferred-import-evaluation.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/destructuring-private.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/do-expressions.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/dynamic-import.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/explicit-resource-management.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-default-from.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-namespace-from.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-bind.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-sent.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-dynamic.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-static.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-dynamic.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-static.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-meta.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-reflection.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/jsx.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/logical-assignment-operators.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-blocks.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-string-names.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/nullish-coalescing-operator.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/numeric-separator.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/object-rest-spread.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-catch-binding.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining-assignment.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/partial-application.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/pipeline-operator-fsharp.js.prettier-snap
💤 Files with no reviewable changes (81)
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty.css.prettier-snap
  • .changeset/hot-foxes-refuse.md
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/empty.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty_newlines.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/atword/atword.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/only_comments.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/with_comments.css.prettier-snap
  • .changeset/floppy-lines-write.md
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/yaml.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/comment_after.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/cursor/test.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested-props.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-dynamic.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorator-auto-accessors.js.prettier-snap
  • .changeset/fix-issue-9994-styled-css.md
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows-bind/arrows-bind.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining-assignment.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-dynamic.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decimal.js.prettier-snap
  • .changeset/cruel-pans-kick.md
  • .changeset/fair-goats-scream.md
  • .changeset/few-jeans-pick.md
  • .changeset/mighty-news-taste.md
  • .changeset/rude-crabs-mix.md
  • .changeset/shaggy-planets-yawn.md
  • .changeset/tidy-planes-stay.md
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/test.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-simple-vars.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed-2.css.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/empty-props.css.prettier-snap
  • .changeset/add-no-unnecessary-template-expression.md
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-static.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/deferred-import-evaluation.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/partial-application.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-static.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nesting.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-properties.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-blocks.js.prettier-snap
  • crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-namespace-from.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/jsx.js.prettier-snap
  • .changeset/cool-memes-juggle.md
  • crates/biome_js_formatter/tests/specs/prettier/js/arrays/tuple-and-record.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/object-rest-spread.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/do-expressions.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/explicit-resource-management.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-bind.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-catch-binding.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-string-names.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/nullish-coalescing-operator.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/logical-assignment-operators.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-sent.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-do-expressions.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/without-newline-after.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-meta.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/dirty.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-generators.js.prettier-snap
  • .changeset/no-react-native-literal-colors.md
  • crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-mixins.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/numeric-separator.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/dynamic-import.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/destructuring-private.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/custom-parser.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/pipeline-operator-fsharp.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/bigint.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/yaml/ignore.css.prettier-snap
  • crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/invalid.js
  • crates/biome_js_formatter/tests/specs/prettier/js/arrows/tuple-and-record.js.prettier-snap
  • .changeset/moody-waves-bake.md
  • .changeset/no-react-native-raw-text.md
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorators.js.prettier-snap
  • .changeset/hungry-meals-wash.md
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-reflection.js.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-default-from.js.prettier-snap
  • crates/biome_css_formatter/tests/specs/prettier/css/front-matter/embedded-language-formatting/yaml.css.prettier-snap
  • crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-static-block.js.prettier-snap
  • .changeset/frogs-like-green.md
  • crates/biome_js_formatter/tests/specs/prettier/js/async-do-expressions/async-do-expressions.js.prettier-snap

Comment on lines +1010 to +1011
type Signals = Option<Box<[Self::State]>>;
type Options = ForLoopCountReferencesOptions;

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.

⚠️ Potential issue | 🔴 Critical

Type mismatch: the example code won't compile.

The Signals type is defined as Option<Box<[Self::State]>>, but line 1031 returns write_ranges.into_boxed_slice() which is Box<[TextRange]> without the Option wrapper.

Based on the documentation at lines 998-1002, when using multiple signals, the type should be Box<[Self::State]> directly, not wrapped in Option.

🔧 Proposed fix
     type Query = Semantic<JsForStatement>;
     type State = TextRange;
-    type Signals = Option<Box<[Self::State]>>;
+    type Signals = Box<[Self::State]>;
     type Options = ForLoopCountReferencesOptions;

Alternatively, if you intend to support returning no signals, wrap the return at line 1031:

-        write_ranges.into_boxed_slice()
+        Some(write_ranges.into_boxed_slice())

However, the first approach aligns better with the documentation's intent.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
type Signals = Option<Box<[Self::State]>>;
type Options = ForLoopCountReferencesOptions;
type Signals = Box<[Self::State]>;
type Options = ForLoopCountReferencesOptions;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_analyze/CONTRIBUTING.md` around lines 1010 - 1011, The declared
Signals type is wrong for the example: change Signals from
Option<Box<[Self::State]>> to Box<[Self::State]> (or alternatively wrap the
return in Some(...)); specifically update the Signals type definition to match
what write_ranges.into_boxed_slice() returns (Box<[TextRange]>) so
ForLoopCountReferencesOptions and uses of Self::State align with the example, or
if you really want optional signals, return
Some(write_ranges.into_boxed_slice()) where write_ranges.into_boxed_slice() is
currently returned.

Comment on lines +63 to +77
fn value_manages_its_own_breaking(value: &AnyScssExpression) -> bool {
matches!(
value,
AnyScssExpression::ScssListExpression(_)
| AnyScssExpression::ScssMapExpression(_)
| AnyScssExpression::ScssParenthesizedExpression(_)
) || unwrap_single_expression_item(value).is_some_and(|item| {
matches!(
item,
biome_css_syntax::AnyScssExpressionItem::ScssListExpression(_)
| biome_css_syntax::AnyScssExpressionItem::ScssMapExpression(_)
| biome_css_syntax::AnyScssExpressionItem::ScssParenthesizedExpression(_)
)
})
}

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.

⚠️ Potential issue | 🟡 Minor

Don't treat every parenthesised value as self-breaking.

ScssParenthesizedExpression(_) also matches scalar cases like (value). Those cannot introduce their own internal break, so this returns true too early and skips the new wrap-after-: path for long keys. The result is that a pair such as ("very long key": (value)) stays glued together when it should be allowed to wrap after the colon. Please restrict this branch to parenthesised values whose payload is a list or a map.

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

In `@crates/biome_css_formatter/src/scss/auxiliary/map_expression_pair.rs` around
lines 63 - 77, The function value_manages_its_own_breaking currently treats
AnyScssExpression::ScssParenthesizedExpression(_) as self-breaking; change
value_manages_its_own_breaking so ScssParenthesizedExpression is only considered
self-breaking when its inner payload is a list or a map (not a scalar). In
practice, update the matches for ScssParenthesizedExpression in both the
top-level match and the unwrap_single_expression_item closure to inspect the
inner expression/item and only return true when that inner expression/item is a
ScssListExpression or ScssMapExpression (use the existing
unwrap_single_expression_item logic and the AnyScssExpressionItem variants to
identify list/map payloads).

.take_while(|&&b| !char_is_asterisk(b))
.count()
+ 1
line.as_bytes().iter().take_while(|&&b| !b == b'*').count() + 1

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.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify no accidental "bitwise-NOT as inequality" pattern remains in Rust files.
# Expected after fix: no matches.
rg -n --type rust -C2 "!\\s*[a-zA-Z_][a-zA-Z0-9_]*\\s*==\\s*b'\\*'"

Repository: biomejs/biome

Length of output: 1148


Fix bitwise-NOT–as-inequality bug on lines 200 and 217

!b == b'*' uses bitwise NOT (inverts the byte), not inequality. Should be b != b'*' to skip non-asterisk characters.

Suggested patch
 fn get_first_asterisk_index(line: &str) -> usize {
-    line.as_bytes().iter().take_while(|&&b| !b == b'*').count() + 1
+    line.as_bytes().iter().take_while(|&&b| b != b'*').count() + 1
 }
@@
-            if bytes.first().is_some_and(|&b| !b == b'*') {
+            if bytes.first().is_some_and(|&b| b != b'*') {
                 return None;
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
line.as_bytes().iter().take_while(|&&b| !b == b'*').count() + 1
line.as_bytes().iter().take_while(|&&b| b != b'*').count() + 1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_js_analyze/src/lint/correctness/use_single_js_doc_asterisk.rs`
at line 200, The closure used with take_while is using the bitwise-NOT operator
instead of inequality (`!b == b'*'`), so update both occurrences (the closure
inside the iterator in use_single_js_doc_asterisk.rs that currently does
line.as_bytes().iter().take_while(|&&b| !b == b'*')...) to use `b != b'*'`
(e.g., take_while(|&&b| b != b'*')) so the iterator correctly stops at an
asterisk; apply the same fix to the other occurrence around line 217.

Comment on lines +99 to +107
pub UseReactNativePlatformComponents {
version: "2.4.13",
name: "useReactNativePlatformComponents",
language: "js",
sources: &[RuleSource::EslintReactNative("split-platform-components").inspired()],
domains: &[RuleDomain::ReactNative],
recommended: true,
severity: Severity::Error,
}

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.

⚠️ Potential issue | 🟠 Major

Use next for this new nursery rule.

2.4.13 makes the rule look already released. For a fresh nursery rule on the next branch, the metadata should stay on version: "next" until promotion.

🧭 Suggested tweak
-        version: "2.4.13",
+        version: "next",
Based on learnings: Applies to crates/biome_analyze/**/src/**/nursery/**/*.rs : Use semantic versioning in the 'version' field of declare_lint_rule! macro; new rules must use 'next' as the version
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@crates/biome_js_analyze/src/lint/nursery/use_react_native_platform_components.rs`
around lines 99 - 107, The rule metadata for UseReactNativePlatformComponents
currently sets version: "2.4.13" which makes it appear released; update the
version field to "next" in the declare_lint_rule! block (the
UseReactNativePlatformComponents declaration) so new nursery rules remain marked
as unreleased on the next branch, leaving all other fields (name, language,
sources, domains, recommended, severity) unchanged.

Comment on lines +111 to +116
type Query = Ast<AnyJsImportLike>;
type State = RuleState;
type Signals = Vec<Self::State>;
type Options = UseReactNativePlatformComponentsOptions;

fn run(ctx: &RuleContext<Self>) -> Self::Signals {

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.

⚠️ Potential issue | 🟠 Major

Mixed-platform detection is scoped to one import statement.

Because the query runs per AnyJsImportLike, has_android and has_ios only see names from the current statement. If a file imports an Android component in one statement and an iOS component in another, has_conflict never flips even though the rule text says the whole file should be rejected.

Also applies to: 142-149

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

In
`@crates/biome_js_analyze/src/lint/nursery/use_react_native_platform_components.rs`
around lines 111 - 116, The rule currently queries per AnyJsImportLike so
has_android/has_ios only see the current import; change the scope to inspect all
imports in the file and compute has_conflict across the file. Concretely, update
the Query from Ast<AnyJsImportLike> to a file-level query (e.g.,
Ast<AnyJsModule> or the AST node that represents the whole module/program) or,
inside run (fn run(ctx: &RuleContext<Self>)), iterate ctx.root() / ctx.program()
to collect all AnyJsImportLike nodes in the module, compute has_android and
has_ios across that collection (not per-import), and then derive has_conflict
once; also apply the same aggregation fix to the logic referenced around lines
142-149 so both checks use the per-file aggregated flags instead of per-import
flags.

Comment on lines +111 to +120
RuleDiagnostic::new(
rule_category!(),
state.span,
markup! {
"Use "{suggested_name}" instead of "{member_name}"."
},
)
.note(markup! {
{member_name}" is an alias for "{suggested_name}"."
}),

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.

⚠️ Potential issue | 🟡 Minor

Fix the stray quote in the note text.

Line 119 renders without an opening quote, so the note comes out a bit wonky in the diagnostic output.

✏️ Quick fix
             .note(markup! {
-                {member_name}" is an alias for "{suggested_name}"."
+                "\"" {member_name} "\" is an alias for \"" {suggested_name} "\"."
             }),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_js_analyze/src/lint/style/use_trim_start_end.rs` around lines
111 - 120, The diagnostic note text in the RuleDiagnostic::new(...).note(...)
markup is missing an opening quotation mark before {member_name}, causing
malformed output; update the markup! block inside the .note call to include the
opening quote so it reads something like "\"{member_name}\" is an alias for
\"{suggested_name}\"" (keep use of the existing {member_name} and
{suggested_name} tokens and the markup! macro).

@Netail Netail changed the title chore: some improvements (#10050) Merge main into next Apr 23, 2026
@Netail Netail changed the title Merge main into next merge main into next Apr 23, 2026
@Netail Netail changed the title merge main into next chore: merge main into next Apr 23, 2026
@Netail Netail merged commit 065eb0c into next Apr 24, 2026
41 of 43 checks passed
@Netail Netail deleted the chore/main-into-next branch April 24, 2026 07:35
@github-actions github-actions Bot mentioned this pull request Apr 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CLI Area: CLI A-Diagnostic Area: diagnostocis A-Formatter Area: formatter A-Linter Area: linter A-Parser Area: parser A-Project Area: project A-Tooling Area: internal tools L-CSS Language: CSS and super languages L-Grit Language: GritQL L-HTML Language: HTML and super languages L-JavaScript Language: JavaScript and super languages L-JSON Language: JSON and super languages L-Markdown Language: Markdown

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants