chore: merge main into next#10104
Conversation
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>
…th matching setter (#10037)
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>
…me cases (#9757) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
🦋 Changeset detectedLatest commit: 63995d1 The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 packages
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 |
WalkthroughThis 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
Suggested reviewers
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
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 | 🟡 MinorExpand 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"]) becauseinner_string_textstrips 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 | 🟠 MajorAdd a snapshot test for
JsSvelteSnippetRootcomment 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
srcis 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()returnsNone, 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
OnceLockcache is initialised with the first caller'sroot_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 usingAttributeNameKeywould 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
⛔ Files ignored due to path filters (89)
Cargo.lockis excluded by!**/*.lockand included by**crates/biome_cli/src/execute/migrate/eslint_any_rule_to_biome.rsis excluded by!**/migrate/eslint_any_rule_to_biome.rsand included by**crates/biome_configuration/src/analyzer/linter/rules.rsis excluded by!**/rules.rsand included by**crates/biome_configuration/src/generated/domain_selector.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_configuration/src/generated/linter_options_check.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_css_formatter/tests/specs/prettier/css/atword/atword.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/front-matter/custom-parser.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/front-matter/embedded-language-formatting/yaml.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/front-matter/empty.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/empty-props.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/test.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-mixins.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested-props.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nesting.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-simple-vars.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/comment_after.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/dirty.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/empty_newlines.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/ignore.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed-2.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/only_comments.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/with_comments.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/without-newline-after.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/yaml/yaml.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/scss/comments/at-rule.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/scss/comments/if-eslit-at-rule-decloration.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/scss/comments/lists.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/scss/map/comment.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/scss/map/keys.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/scss/expression/map-comments.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/scss/expression/map-context.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/scss/expression/map-expansion.scss.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/scss/expression/map-values.scss.snapis excluded by!**/*.snapand included by**crates/biome_diagnostics_categories/src/categories.rsis excluded by!**/categories.rsand included by**crates/biome_html_formatter/tests/specs/html/interpolation/interpolation.html.snapis excluded by!**/*.snapand included by**crates/biome_html_formatter/tests/specs/html/svelte/html.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_formatter/tests/specs/html/svelte/preserve_newline_nontext_children.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_formatter/tests/specs/html/vue/inner-template.vue.snapis excluded by!**/*.snapand included by**crates/biome_html_formatter/tests/specs/html/whitespace/preserve-newline-nontext-children.html.snapis excluded by!**/*.snapand included by**crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/hello-world.html.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/at_block_invalid_block_type.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type_and_closing_brace.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/template_invalid_block_type.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type.svelte.snapis excluded by!**/*.snapand included by**crates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type_and_closing_brace.svelte.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsx.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/invalid.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/valid.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noConstAssign/validSvelteStoreWrite.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalid.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidBuiltinGlobalStoreDereference.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDoubleDollarStoreDereference.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.svelte.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidTypeOnlyStoreDereference.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-invalid.svelte.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-valid.svelte.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.svelte.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validDollarPrefixedIdentifier.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noMisleadingReturnType/valid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalid.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.jsx.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.android.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.ios.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.js.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.jsx.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/suspicious/noImportAssign/validSvelteStoreWrite.svelte.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_factory/src/generated/node_factory.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_js_factory/src/generated/syntax_factory.rsis excluded by!**/generated/**,!**/generated/**and included by**crates/biome_js_formatter/tests/specs/prettier/js/arrays/tuple-and-record.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/arrows-bind/arrows-bind.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/arrows/tuple-and-record.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/async-do-expressions/async-do-expressions.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-do-expressions.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decimal.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/do-expressions.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-default-from.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-bind.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-static.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-reflection.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-blocks.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/partial-application.js.snapis excluded by!**/*.snapand included by**crates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/pipeline-operator-fsharp.js.snapis excluded by!**/*.snapand 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.ymlCargo.tomlDockerfile.benchmarkcrates/biome_analyze/CONTRIBUTING.mdcrates/biome_aria_metadata/build.rscrates/biome_css_analyze/src/lint/complexity/no_important_styles.rscrates/biome_css_analyze/src/lint/correctness/no_invalid_grid_areas.rscrates/biome_css_analyze/src/lint/suspicious/no_duplicate_custom_properties.rscrates/biome_css_analyze/src/lint/suspicious/no_duplicate_properties.rscrates/biome_css_analyze/src/lint/suspicious/no_duplicate_selectors_keyframe_block.rscrates/biome_css_analyze/src/lint/suspicious/no_empty_block.rscrates/biome_css_formatter/src/comments.rscrates/biome_css_formatter/src/scss/auxiliary/list_expression.rscrates/biome_css_formatter/src/scss/auxiliary/map_expression.rscrates/biome_css_formatter/src/scss/auxiliary/map_expression_pair.rscrates/biome_css_formatter/src/scss/auxiliary/parenthesized_expression.rscrates/biome_css_formatter/src/scss/lists/map_expression_pair_list.rscrates/biome_css_formatter/src/utils/mod.rscrates/biome_css_formatter/src/utils/scss_expression.rscrates/biome_css_formatter/src/utils/scss_map.rscrates/biome_css_formatter/tests/specs/prettier/css/atword/atword.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/cursor/test.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/front-matter/custom-parser.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/front-matter/embedded-language-formatting/yaml.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/front-matter/empty.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/empty-props.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-8-improment/test.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-mixins.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested-props.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nested.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-nesting.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/postcss-plugins/postcss-simple-vars.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/comment_after.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/dirty.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/empty.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/empty_newlines.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/ignore.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed-2.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/malformed.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/only_comments.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/with_comments.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/without-newline-after.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier/css/yaml/yaml.css.prettier-snapcrates/biome_css_formatter/tests/specs/prettier_ignored_testscrates/biome_css_formatter/tests/specs/scss/expression/map-comments.scsscrates/biome_css_formatter/tests/specs/scss/expression/map-context.scsscrates/biome_css_formatter/tests/specs/scss/expression/map-expansion.scsscrates/biome_css_formatter/tests/specs/scss/expression/map-values.scsscrates/biome_formatter_test/src/check_reformat.rscrates/biome_formatter_test/src/diff_report.rscrates/biome_formatter_test/src/spec.rscrates/biome_formatter_test/src/test_prettier_snapshot.rscrates/biome_formatter_test/src/utils.rscrates/biome_graphql_formatter/tests/specs/prettier_ignored_testscrates/biome_grit_patterns/src/grit_target_language/js_target_language/generated_mappings.rscrates/biome_html_formatter/src/html/auxiliary/element.rscrates/biome_html_formatter/src/html/auxiliary/opening_element.rscrates/biome_html_formatter/src/html/lists/element_list.rscrates/biome_html_formatter/tests/quick_test.rscrates/biome_html_formatter/tests/specs/html/svelte/preserve_newline_nontext_children.sveltecrates/biome_html_formatter/tests/specs/html/vue/inner-template.vuecrates/biome_html_formatter/tests/specs/html/whitespace/preserve-newline-nontext-children.htmlcrates/biome_html_formatter/tests/specs/prettier_ignored_testscrates/biome_html_parser/src/syntax/svelte.rscrates/biome_html_parser/tests/html_specs/error/svelte/at_block_invalid_block_type.sveltecrates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type.sveltecrates/biome_html_parser/tests/html_specs/error/svelte/at_block_missing_block_type_and_closing_brace.sveltecrates/biome_html_parser/tests/html_specs/error/svelte/template_invalid_block_type.sveltecrates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type.sveltecrates/biome_html_parser/tests/html_specs/error/svelte/template_missing_block_type_and_closing_brace.sveltecrates/biome_js_analyze/src/lint/a11y/use_aria_props_supported_by_role.rscrates/biome_js_analyze/src/lint/complexity/no_useless_escape_in_regex.rscrates/biome_js_analyze/src/lint/complexity/no_useless_undefined_initialization.rscrates/biome_js_analyze/src/lint/complexity/use_date_now.rscrates/biome_js_analyze/src/lint/complexity/use_numeric_literals.rscrates/biome_js_analyze/src/lint/correctness/no_global_dirname_filename.rscrates/biome_js_analyze/src/lint/correctness/no_undeclared_dependencies.rscrates/biome_js_analyze/src/lint/correctness/no_undeclared_variables.rscrates/biome_js_analyze/src/lint/correctness/no_unresolved_imports.rscrates/biome_js_analyze/src/lint/correctness/no_void_elements_with_children.rscrates/biome_js_analyze/src/lint/correctness/no_vue_duplicate_keys.rscrates/biome_js_analyze/src/lint/correctness/use_single_js_doc_asterisk.rscrates/biome_js_analyze/src/lint/nursery/no_duplicated_spread_props.rscrates/biome_js_analyze/src/lint/nursery/no_jsx_leaked_dollar.rscrates/biome_js_analyze/src/lint/nursery/no_loop_func.rscrates/biome_js_analyze/src/lint/nursery/no_misleading_return_type.rscrates/biome_js_analyze/src/lint/nursery/no_react_native_deep_imports.rscrates/biome_js_analyze/src/lint/nursery/no_react_native_literal_colors.rscrates/biome_js_analyze/src/lint/nursery/no_react_native_raw_text.rscrates/biome_js_analyze/src/lint/nursery/no_unnecessary_template_expression.rscrates/biome_js_analyze/src/lint/nursery/use_dom_node_text_content.rscrates/biome_js_analyze/src/lint/nursery/use_dom_query_selector.rscrates/biome_js_analyze/src/lint/nursery/use_react_native_platform_components.rscrates/biome_js_analyze/src/lint/nursery/use_regexp_test.rscrates/biome_js_analyze/src/lint/style/no_restricted_globals.rscrates/biome_js_analyze/src/lint/style/use_trim_start_end.rscrates/biome_js_analyze/src/lint/suspicious/no_alert.rscrates/biome_js_analyze/src/lint/suspicious/no_duplicate_jsx_props.rscrates/biome_js_analyze/src/lint/suspicious/no_import_cycles.rscrates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rscrates/biome_js_analyze/src/services/semantic.rscrates/biome_js_analyze/src/syntax/correctness/no_duplicate_private_class_members.rscrates/biome_js_analyze/tests/spec_tests.rscrates/biome_js_analyze/tests/specs/a11y/noInteractiveElementToNoninteractiveRole/valid.jsxcrates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/invalid.jscrates/biome_js_analyze/tests/specs/complexity/noUselessEscapeInRegex/valid.jscrates/biome_js_analyze/tests/specs/correctness/noConstAssign/validSvelteStoreWrite.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalid.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidBuiltinGlobalStoreDereference.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.jscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDollarPrefixedConfiguredGlobal.options.jsoncrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidDoubleDollarStoreDereference.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.svelte.jscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidStoreDereference.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/invalidTypeOnlyStoreDereference.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-invalid.sveltecrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/stores-valid.sveltecrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.options.jsoncrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validCheckTypesGlobals.sveltecrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validDollarPrefixedIdentifier.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.jscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validStoreDereference.svelte.tscrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.options.jsoncrates/biome_js_analyze/tests/specs/correctness/noUndeclaredVariables/validSvelteGlobalStoreDereference.svelte.tscrates/biome_js_analyze/tests/specs/nursery/noMisleadingReturnType/valid.tscrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalid.jscrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.jsxcrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/invalidWithOptions/invalid.options.jsoncrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.android.jscrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.ios.jscrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/valid.jscrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.jsxcrates/biome_js_analyze/tests/specs/nursery/useReactNativePlatformComponents/validWithOptions/valid.options.jsoncrates/biome_js_analyze/tests/specs/suspicious/noImportAssign/validSvelteStoreWrite.svelte.tscrates/biome_js_formatter/src/comments.rscrates/biome_js_formatter/src/generated.rscrates/biome_js_formatter/src/js/any/root.rscrates/biome_js_formatter/src/js/auxiliary/mod.rscrates/biome_js_formatter/src/js/auxiliary/svelte_snippet_root.rscrates/biome_js_formatter/tests/specs/prettier/js/arrays/tuple-and-record.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/arrows-bind/arrows-bind.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/arrows/tuple-and-record.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/async-do-expressions/async-do-expressions.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-do-expressions.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/async-generators.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/bigint.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-properties.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/class-static-block.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decimal.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorator-auto-accessors.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/decorators.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/deferred-import-evaluation.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/destructuring-private.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/do-expressions.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/dynamic-import.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/explicit-resource-management.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-default-from.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/export-namespace-from.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-bind.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/function-sent.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-dynamic.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-assertions-static.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-dynamic.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-attributes-static.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-meta.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/import-reflection.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/jsx.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/logical-assignment-operators.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-blocks.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/module-string-names.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/nullish-coalescing-operator.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/numeric-separator.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/object-rest-spread.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-catch-binding.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining-assignment.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/optional-chaining.js.prettier-snapcrates/biome_js_formatter/tests/specs/prettier/js/babel-plugins/partial-application.js.prettier-snapcrates/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
| type Signals = Option<Box<[Self::State]>>; | ||
| type Options = ForLoopCountReferencesOptions; |
There was a problem hiding this comment.
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.
| 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.
| 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(_) | ||
| ) | ||
| }) | ||
| } |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
🧩 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.
| 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.
| 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, | ||
| } |
There was a problem hiding this comment.
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",🤖 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.
| type Query = Ast<AnyJsImportLike>; | ||
| type State = RuleState; | ||
| type Signals = Vec<Self::State>; | ||
| type Options = UseReactNativePlatformComponentsOptions; | ||
|
|
||
| fn run(ctx: &RuleContext<Self>) -> Self::Signals { |
There was a problem hiding this comment.
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.
| RuleDiagnostic::new( | ||
| rule_category!(), | ||
| state.span, | ||
| markup! { | ||
| "Use "{suggested_name}" instead of "{member_name}"." | ||
| }, | ||
| ) | ||
| .note(markup! { | ||
| {member_name}" is an alias for "{suggested_name}"." | ||
| }), |
There was a problem hiding this comment.
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).
Summary
Merge main into next
Important
Don't use squash merge (feel free to merge, off to bed)
Test Plan
Docs